Compare commits
8 Commits
f87515a453
...
v0.13.0
Author | SHA1 | Date | |
---|---|---|---|
bc28fe186f | |||
19062e27f0 | |||
322ad2d3c4 | |||
9e34636c29 | |||
b4b13dc3ca | |||
e5a6132b9d | |||
d71cbbd0b6 | |||
0a85957c50 |
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@ -28,7 +28,7 @@ jobs:
|
|||||||
go-version: 1.18
|
go-version: 1.18
|
||||||
- name: Import GPG key
|
- name: Import GPG key
|
||||||
id: import_gpg
|
id: import_gpg
|
||||||
uses: crazy-max/ghaction-import-gpg@v5.2.0
|
uses: crazy-max/ghaction-import-gpg@v5.3.0
|
||||||
with:
|
with:
|
||||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
passphrase: ${{ secrets.PASSPHRASE }}
|
passphrase: ${{ secrets.PASSPHRASE }}
|
||||||
|
10
Makefile
10
Makefile
@ -1,9 +1,11 @@
|
|||||||
TEST?=./gitea
|
TEST?=./gitea
|
||||||
GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor)
|
GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor)
|
||||||
|
ARCH?=$$(uname -m)
|
||||||
|
KERNEL?=$$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||||
|
|
||||||
GOFMT ?= gofmt -s
|
GOFMT ?= gofmt -s
|
||||||
|
|
||||||
VERSION = 0.12.2
|
VERSION = 0.13.0
|
||||||
|
|
||||||
test: fmt-check
|
test: fmt-check
|
||||||
go test -i $(TEST) || exit 1
|
go test -i $(TEST) || exit 1
|
||||||
@ -34,8 +36,8 @@ build:
|
|||||||
go build -ldflags="-X 'main.Version=${VERSION}'" -o terraform-provider-gitea_${VERSION}
|
go build -ldflags="-X 'main.Version=${VERSION}'" -o terraform-provider-gitea_${VERSION}
|
||||||
install: build
|
install: build
|
||||||
@echo installing to
|
@echo installing to
|
||||||
@echo ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/linux_amd64/terraform-provider-gitea_${VERSION}
|
@echo ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/${KERNEL}_${ARCH}/terraform-provider-gitea_${VERSION}
|
||||||
@mkdir -p ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/linux_amd64
|
@mkdir -p ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/${KERNEL}_${ARCH}
|
||||||
@mv terraform-provider-gitea_${VERSION} ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/linux_amd64/terraform-provider-gitea_${VERSION}
|
@mv terraform-provider-gitea_${VERSION} ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/${KERNEL}_${ARCH}/terraform-provider-gitea_${VERSION}
|
||||||
doc:
|
doc:
|
||||||
tfplugindocs
|
tfplugindocs
|
||||||
|
@ -17,7 +17,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "Lerentis/gitea"
|
source = "Lerentis/gitea"
|
||||||
version = "0.12.2"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "Lerentis/gitea"
|
source = "Lerentis/gitea"
|
||||||
version = "0.12.2"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ description: |-
|
|||||||
Per default this repository will be initializiled with the provided configuration (gitignore, License etc.).
|
Per default this repository will be initializiled with the provided configuration (gitignore, License etc.).
|
||||||
If the username property is set to a organisation name, the provider will try to look if this organisation exists and create the repository under the organisation scope.
|
If the username property is set to a organisation name, the provider will try to look if this organisation exists and create the repository under the organisation scope.
|
||||||
Repository migrations have some properties that are not available to regular repositories. These are all prefixed with migration_.
|
Repository migrations have some properties that are not available to regular repositories. These are all prefixed with migration_.
|
||||||
|
Codeberg.org does currently not allow mirrors to be created. See FAQ Section of CodeBerg for more information: https://docs.codeberg.org/getting-started/faq/#why-am-i-not-allowed-to-set-up-an-automatic-mirror
|
||||||
---
|
---
|
||||||
|
|
||||||
# gitea_repository (Resource)
|
# gitea_repository (Resource)
|
||||||
@ -17,6 +18,7 @@ Per default this repository will be initializiled with the provided configuratio
|
|||||||
If the `username` property is set to a organisation name, the provider will try to look if this organisation exists and create the repository under the organisation scope.
|
If the `username` property is set to a organisation name, the provider will try to look if this organisation exists and create the repository under the organisation scope.
|
||||||
|
|
||||||
Repository migrations have some properties that are not available to regular repositories. These are all prefixed with `migration_`.
|
Repository migrations have some properties that are not available to regular repositories. These are all prefixed with `migration_`.
|
||||||
|
Codeberg.org does currently not allow mirrors to be created. See FAQ Section of CodeBerg for more information: https://docs.codeberg.org/getting-started/faq/#why-am-i-not-allowed-to-set-up-an-automatic-mirror
|
||||||
|
|
||||||
## Example Usage
|
## Example Usage
|
||||||
|
|
||||||
|
@ -34,6 +34,26 @@ resource "gitea_team" "test_team" {
|
|||||||
permission = "write"
|
permission = "write"
|
||||||
members = [gitea_user.test.username]
|
members = [gitea_user.test.username]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "gitea_repository" "test" {
|
||||||
|
username = gitea_org.test_org.name
|
||||||
|
name = "test"
|
||||||
|
private = true
|
||||||
|
issue_labels = "Default"
|
||||||
|
license = "MIT"
|
||||||
|
gitignores = "Go"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "gitea_team" "test_team_restricted" {
|
||||||
|
name = "Restricted Devs"
|
||||||
|
organisation = gitea_org.test_org.name
|
||||||
|
description = "Restricted Devs of Test Org"
|
||||||
|
permission = "write"
|
||||||
|
members = [gitea_user.test.username]
|
||||||
|
include_all_repositories = false
|
||||||
|
repositories = [gitea_repository.test.name]
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- schema generated by tfplugindocs -->
|
<!-- schema generated by tfplugindocs -->
|
||||||
@ -52,6 +72,7 @@ resource "gitea_team" "test_team" {
|
|||||||
- `members` (List of String) List of Users that should be part of this team
|
- `members` (List of String) List of Users that should be part of this team
|
||||||
- `permission` (String) Permissions associated with this Team
|
- `permission` (String) Permissions associated with this Team
|
||||||
Can be `none`, `read`, `write`, `admin` or `owner`
|
Can be `none`, `read`, `write`, `admin` or `owner`
|
||||||
|
- `repositories` (List of String) List of Repositories that should be part of this team
|
||||||
- `units` (String) List of types of Repositories that should be allowed to be created from Team members.
|
- `units` (String) List of types of Repositories that should be allowed to be created from Team members.
|
||||||
Can be `repo.code`, `repo.issues`, `repo.ext_issues`, `repo.wiki`, `repo.pulls`, `repo.releases`, `repo.projects` and/or `repo.ext_wiki`
|
Can be `repo.code`, `repo.issues`, `repo.ext_issues`, `repo.wiki`, `repo.pulls`, `repo.releases`, `repo.projects` and/or `repo.ext_wiki`
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "terraform.local/lerentis/gitea"
|
source = "terraform.local/lerentis/gitea"
|
||||||
version = "0.12.2"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "Lerentis/gitea"
|
source = "Lerentis/gitea"
|
||||||
version = "0.12.2"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,3 +19,23 @@ resource "gitea_team" "test_team" {
|
|||||||
permission = "write"
|
permission = "write"
|
||||||
members = [gitea_user.test.username]
|
members = [gitea_user.test.username]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "gitea_repository" "test" {
|
||||||
|
username = gitea_org.test_org.name
|
||||||
|
name = "test"
|
||||||
|
private = true
|
||||||
|
issue_labels = "Default"
|
||||||
|
license = "MIT"
|
||||||
|
gitignores = "Go"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "gitea_team" "test_team_restricted" {
|
||||||
|
name = "Restricted Devs"
|
||||||
|
organisation = gitea_org.test_org.name
|
||||||
|
description = "Restricted Devs of Test Org"
|
||||||
|
permission = "write"
|
||||||
|
members = [gitea_user.test.username]
|
||||||
|
include_all_repositories = false
|
||||||
|
repositories = [gitea_repository.test.name]
|
||||||
|
}
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package gitea
|
package gitea
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
|
"github.com/hashicorp/terraform-plugin-log/tflog"
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -108,15 +111,21 @@ func resourceRepoCreate(d *schema.ResourceData, meta interface{}) (err error) {
|
|||||||
|
|
||||||
var repo *gitea.Repository
|
var repo *gitea.Repository
|
||||||
var resp *gitea.Response
|
var resp *gitea.Response
|
||||||
var orgRepo bool
|
var orgRepo, hasAdmin bool
|
||||||
|
|
||||||
_, resp, err = client.GetOrg(d.Get(repoOwner).(string))
|
_, resp, err = client.GetOrg(d.Get(repoOwner).(string))
|
||||||
|
|
||||||
if resp.StatusCode == 404 {
|
if resp.StatusCode == 404 {
|
||||||
_, err := searchUserByName(client, d.Get(repoOwner).(string))
|
_, err := searchUserByName(client, d.Get(repoOwner).(string))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "could not be found") {
|
||||||
return errors.New(fmt.Sprintf("Creation of repository cound not proceed as owner %s is not present in gitea", d.Get(repoOwner).(string)))
|
return errors.New(fmt.Sprintf("Creation of repository cound not proceed as owner %s is not present in gitea", d.Get(repoOwner).(string)))
|
||||||
}
|
}
|
||||||
|
tflog.Warn(context.Background(), "Error query for users. Assuming missing permissions and proceding with user permissions")
|
||||||
|
hasAdmin = false
|
||||||
|
} else {
|
||||||
|
hasAdmin = true
|
||||||
|
}
|
||||||
orgRepo = false
|
orgRepo = false
|
||||||
} else {
|
} else {
|
||||||
orgRepo = true
|
orgRepo = true
|
||||||
@ -180,7 +189,11 @@ func resourceRepoCreate(d *schema.ResourceData, meta interface{}) (err error) {
|
|||||||
if orgRepo {
|
if orgRepo {
|
||||||
repo, _, err = client.CreateOrgRepo(d.Get(repoOwner).(string), opts)
|
repo, _, err = client.CreateOrgRepo(d.Get(repoOwner).(string), opts)
|
||||||
} else {
|
} else {
|
||||||
|
if hasAdmin {
|
||||||
repo, _, err = client.AdminCreateRepo(d.Get(repoOwner).(string), opts)
|
repo, _, err = client.AdminCreateRepo(d.Get(repoOwner).(string), opts)
|
||||||
|
} else {
|
||||||
|
repo, _, err = client.CreateRepo(opts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -580,6 +593,8 @@ func resourceGiteaRepository() *schema.Resource {
|
|||||||
"Per default this repository will be initializiled with the provided configuration (gitignore, License etc.).\n" +
|
"Per default this repository will be initializiled with the provided configuration (gitignore, License etc.).\n" +
|
||||||
"If the `username` property is set to a organisation name, the provider will try to look if this organisation exists " +
|
"If the `username` property is set to a organisation name, the provider will try to look if this organisation exists " +
|
||||||
"and create the repository under the organisation scope.\n\n" +
|
"and create the repository under the organisation scope.\n\n" +
|
||||||
"Repository migrations have some properties that are not available to regular repositories. These are all prefixed with `migration_`.",
|
"Repository migrations have some properties that are not available to regular repositories. These are all prefixed with `migration_`.\n" +
|
||||||
|
"Codeberg.org does currently not allow mirrors to be created. See FAQ Section of CodeBerg for more information: " +
|
||||||
|
"https://docs.codeberg.org/getting-started/faq/#why-am-i-not-allowed-to-set-up-an-automatic-mirror",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package gitea
|
package gitea
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -18,6 +19,7 @@ const (
|
|||||||
TeamIncludeAllReposFlag string = "include_all_repositories"
|
TeamIncludeAllReposFlag string = "include_all_repositories"
|
||||||
TeamUnits string = "units"
|
TeamUnits string = "units"
|
||||||
TeamMembers string = "members"
|
TeamMembers string = "members"
|
||||||
|
TeamRepositories string = "repositories"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceTeamRead(d *schema.ResourceData, meta interface{}) (err error) {
|
func resourceTeamRead(d *schema.ResourceData, meta interface{}) (err error) {
|
||||||
@ -75,12 +77,14 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) {
|
|||||||
units = append(units, gitea.RepoUnitProjects)
|
units = append(units, gitea.RepoUnitProjects)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
includeAllRepos := d.Get(TeamIncludeAllReposFlag).(bool)
|
||||||
|
|
||||||
opts := gitea.CreateTeamOption{
|
opts := gitea.CreateTeamOption{
|
||||||
Name: d.Get(TeamName).(string),
|
Name: d.Get(TeamName).(string),
|
||||||
Description: d.Get(TeamDescription).(string),
|
Description: d.Get(TeamDescription).(string),
|
||||||
Permission: gitea.AccessMode(d.Get(TeamPermissions).(string)),
|
Permission: gitea.AccessMode(d.Get(TeamPermissions).(string)),
|
||||||
CanCreateOrgRepo: d.Get(TeamCreateRepoFlag).(bool),
|
CanCreateOrgRepo: d.Get(TeamCreateRepoFlag).(bool),
|
||||||
IncludesAllRepositories: d.Get(TeamIncludeAllReposFlag).(bool),
|
IncludesAllRepositories: includeAllRepos,
|
||||||
Units: units,
|
Units: units,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,6 +105,13 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !includeAllRepos {
|
||||||
|
err = setTeamRepositories(team, d, meta, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err = setTeamResourceData(team, d)
|
err = setTeamResourceData(team, d)
|
||||||
|
|
||||||
return
|
return
|
||||||
@ -181,6 +192,13 @@ func resourceTeamUpdate(d *schema.ResourceData, meta interface{}) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !includeAllRepos {
|
||||||
|
err = setTeamRepositories(team, d, meta, true)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
team, _, _ = client.GetTeam(id)
|
team, _, _ = client.GetTeam(id)
|
||||||
|
|
||||||
err = setTeamResourceData(team, d)
|
err = setTeamResourceData(team, d)
|
||||||
@ -218,6 +236,7 @@ func setTeamResourceData(team *gitea.Team, d *schema.ResourceData) (err error) {
|
|||||||
d.Set(TeamUnits, d.Get(TeamUnits).(string))
|
d.Set(TeamUnits, d.Get(TeamUnits).(string))
|
||||||
d.Set(TeamOrg, d.Get(TeamOrg).(string))
|
d.Set(TeamOrg, d.Get(TeamOrg).(string))
|
||||||
d.Set(TeamMembers, d.Get(TeamMembers))
|
d.Set(TeamMembers, d.Get(TeamMembers))
|
||||||
|
d.Set(TeamRepositories, d.Get(TeamRepositories))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,7 +309,75 @@ func resourceGiteaTeam() *schema.Resource {
|
|||||||
Computed: true,
|
Computed: true,
|
||||||
Description: "List of Users that should be part of this team",
|
Description: "List of Users that should be part of this team",
|
||||||
},
|
},
|
||||||
|
"repositories": {
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Elem: &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
},
|
||||||
|
Optional: true,
|
||||||
|
Required: false,
|
||||||
|
Computed: true,
|
||||||
|
Description: "List of Repositories that should be part of this team",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Description: "`gitea_team` manages Team that are part of an organisation.",
|
Description: "`gitea_team` manages Team that are part of an organisation.",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setTeamRepositories(team *gitea.Team, d *schema.ResourceData, meta interface{}, update bool) (err error) {
|
||||||
|
client := meta.(*gitea.Client)
|
||||||
|
|
||||||
|
org := d.Get(TeamOrg).(string)
|
||||||
|
|
||||||
|
repositories := make(map[string]bool)
|
||||||
|
for _, repo := range d.Get(TeamRepositories).([]interface{}) {
|
||||||
|
if repo != "" {
|
||||||
|
repositories[repo.(string)] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if update {
|
||||||
|
page := 1
|
||||||
|
|
||||||
|
for {
|
||||||
|
var existingRepositories []*gitea.Repository
|
||||||
|
existingRepositories, _, err = client.ListTeamRepositories(team.ID, gitea.ListTeamRepositoriesOptions{
|
||||||
|
ListOptions: gitea.ListOptions{
|
||||||
|
Page: page,
|
||||||
|
PageSize: 50,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("[ERROR] Error listeng team repositories: %s", err))
|
||||||
|
}
|
||||||
|
if len(existingRepositories) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, exr := range existingRepositories {
|
||||||
|
_, exists := repositories[exr.Name]
|
||||||
|
if exists {
|
||||||
|
repositories[exr.Name] = false
|
||||||
|
} else {
|
||||||
|
_, err = client.RemoveTeamRepository(team.ID, org, exr.Name)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("[ERROR] Error removing team repository %q: %s", exr.Name, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for repo, flag := range repositories {
|
||||||
|
if flag {
|
||||||
|
_, err = client.AddTeamRepository(team.ID, org, repo)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("[ERROR] Error adding team repository %q: %s", repo, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
2
go.mod
2
go.mod
@ -5,6 +5,7 @@ go 1.18
|
|||||||
require (
|
require (
|
||||||
code.gitea.io/sdk/gitea v0.15.1
|
code.gitea.io/sdk/gitea v0.15.1
|
||||||
github.com/hashicorp/terraform-plugin-docs v0.14.1
|
github.com/hashicorp/terraform-plugin-docs v0.14.1
|
||||||
|
github.com/hashicorp/terraform-plugin-log v0.8.0
|
||||||
github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1
|
github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,7 +36,6 @@ require (
|
|||||||
github.com/hashicorp/terraform-exec v0.18.1 // indirect
|
github.com/hashicorp/terraform-exec v0.18.1 // indirect
|
||||||
github.com/hashicorp/terraform-json v0.16.0 // indirect
|
github.com/hashicorp/terraform-json v0.16.0 // indirect
|
||||||
github.com/hashicorp/terraform-plugin-go v0.14.3 // indirect
|
github.com/hashicorp/terraform-plugin-go v0.14.3 // indirect
|
||||||
github.com/hashicorp/terraform-plugin-log v0.8.0 // indirect
|
|
||||||
github.com/hashicorp/terraform-registry-address v0.1.0 // indirect
|
github.com/hashicorp/terraform-registry-address v0.1.0 // indirect
|
||||||
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect
|
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect
|
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect
|
||||||
|
Reference in New Issue
Block a user