Compare commits
	
		
			14 Commits
		
	
	
		
			v0.11.2
			...
			6ce5f8bf9f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 6ce5f8bf9f | ||
|  | 1c80699599 | ||
|  | 84c9110a24 | ||
|  | ad2692136f | ||
| 4f33464489 | |||
| 2c787bd532 | |||
| feacbf5a3f | |||
| d6160c596b | |||
| 9799416352 | |||
| 8095c2a513 | |||
|  | 14c1a11417 | ||
|  | 8a805faa72 | ||
|  | 32ad02fa73 | ||
| edd03aca2f | 
| @@ -30,6 +30,7 @@ steps: | |||||||
|   - name: build |   - name: build | ||||||
|     image: goreleaser/goreleaser |     image: goreleaser/goreleaser | ||||||
|     commands: |     commands: | ||||||
|  |       - curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin v0.64.0 | ||||||
|       - goreleaser build --snapshot |       - goreleaser build --snapshot | ||||||
|     when: |     when: | ||||||
|       event: |       event: | ||||||
| @@ -59,6 +60,7 @@ steps: | |||||||
|       GPG_PRIVATE_KEY_BASE64: |       GPG_PRIVATE_KEY_BASE64: | ||||||
|         from_secret: GPG_PRIVATE_KEY_BASE64 |         from_secret: GPG_PRIVATE_KEY_BASE64 | ||||||
|     commands: |     commands: | ||||||
|  |       - curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin v0.64.0 | ||||||
|       - apk add gpg-agent |       - apk add gpg-agent | ||||||
|       - gpg-agent --daemon --default-cache-ttl 7200 |       - gpg-agent --daemon --default-cache-ttl 7200 | ||||||
|       - echo $GPG_PRIVATE_KEY_BASE64 | base64 -d | gpg --import --batch --no-tty |       - echo $GPG_PRIVATE_KEY_BASE64 | base64 -d | gpg --import --batch --no-tty | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -18,27 +18,26 @@ jobs: | |||||||
|   goreleaser: |   goreleaser: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - |       - name: Checkout | ||||||
|         name: Checkout |  | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v3 | ||||||
|       - |       - name: Unshallow | ||||||
|         name: Unshallow |  | ||||||
|         run: git fetch --prune --unshallow |         run: git fetch --prune --unshallow | ||||||
|       - |       - name: Set up Go | ||||||
|         name: Set up Go |         uses: actions/setup-go@v4 | ||||||
|         uses: actions/setup-go@v3 |  | ||||||
|         with: |         with: | ||||||
|           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.2.0 | ||||||
|         with: |         with: | ||||||
|           gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} |           gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} | ||||||
|           passphrase: ${{ secrets.PASSPHRASE }} |           passphrase: ${{ secrets.PASSPHRASE }} | ||||||
|       - |       - name: setup-syft | ||||||
|         name: Run GoReleaser |         run: | | ||||||
|         uses: goreleaser/goreleaser-action@v4.1.0 |           curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | \ | ||||||
|  |           sh -s -- -b /usr/local/bin v0.64.0 | ||||||
|  |       - name: Run GoReleaser | ||||||
|  |         uses: goreleaser/goreleaser-action@v4.2.0 | ||||||
|         with: |         with: | ||||||
|           version: latest |           version: latest | ||||||
|           args: release --rm-dist |           args: release --rm-dist | ||||||
|   | |||||||
| @@ -41,6 +41,8 @@ checksum: | |||||||
|       name_template: '{{ .ProjectName }}_{{ .Version }}_manifest.json' |       name_template: '{{ .ProjectName }}_{{ .Version }}_manifest.json' | ||||||
|   name_template: '{{ .ProjectName }}_{{ .Version }}_SHA256SUMS' |   name_template: '{{ .ProjectName }}_{{ .Version }}_SHA256SUMS' | ||||||
|   algorithm: sha256 |   algorithm: sha256 | ||||||
|  | sboms: | ||||||
|  |   - artifacts: archive | ||||||
| signs: | signs: | ||||||
|   - artifacts: checksum |   - artifacts: checksum | ||||||
|     args: |     args: | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor) | |||||||
|  |  | ||||||
| GOFMT ?= gofmt -s | GOFMT ?= gofmt -s | ||||||
|  |  | ||||||
| VERSION = 0.11.2 | VERSION = 0.12.2 | ||||||
|  |  | ||||||
| test: fmt-check | test: fmt-check | ||||||
| 	go test -i $(TEST) || exit 1 | 	go test -i $(TEST) || exit 1 | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ terraform { | |||||||
|   required_providers { |   required_providers { | ||||||
|     gitea = { |     gitea = { | ||||||
|       source = "Lerentis/gitea" |       source = "Lerentis/gitea" | ||||||
|       version = "0.11.2" |       version = "0.12.2" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ terraform { | |||||||
|   required_providers { |   required_providers { | ||||||
|     gitea = { |     gitea = { | ||||||
|       source = "Lerentis/gitea" |       source = "Lerentis/gitea" | ||||||
|       version = "0.11.1" |       version = "0.12.2" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										63
									
								
								docs/resources/repository_key.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								docs/resources/repository_key.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | --- | ||||||
|  | # generated by https://github.com/hashicorp/terraform-plugin-docs | ||||||
|  | page_title: "gitea_repository_key Resource - terraform-provider-gitea" | ||||||
|  | subcategory: "" | ||||||
|  | description: |- | ||||||
|  |   gitea_repository_key manages a deploy key for a single gitea_repository. | ||||||
|  |   Every key needs a unique name and unique key, i.e. no key can be added twice to the same repo | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # gitea_repository_key (Resource) | ||||||
|  |  | ||||||
|  | `gitea_repository_key` manages a deploy key for a single gitea_repository. | ||||||
|  |  | ||||||
|  | Every key needs a unique name and unique key, i.e. no key can be added twice to the same repo | ||||||
|  |  | ||||||
|  | ## Example Usage | ||||||
|  |  | ||||||
|  | ```terraform | ||||||
|  | terraform { | ||||||
|  |   required_providers { | ||||||
|  |     tls = { | ||||||
|  |       source = "hashicorp/tls" | ||||||
|  |       version = "4.0.4" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | resource "tls_private_key" "example" { | ||||||
|  |   type = "RSA" | ||||||
|  |   rsa_bits = 4096 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | resource "gitea_repository" "example" { | ||||||
|  |   name = "example" | ||||||
|  |   private = true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | resource "gitea_repository_key" "example" { | ||||||
|  |   repository = gitea_repository.example.id | ||||||
|  |   title = "Example Deploy Key" | ||||||
|  |   read_only = true | ||||||
|  |   key = tls_private_key.example.public_key_openssh | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | <!-- schema generated by tfplugindocs --> | ||||||
|  | ## Schema | ||||||
|  |  | ||||||
|  | ### Required | ||||||
|  |  | ||||||
|  | - `key` (String) Armored SSH key to add | ||||||
|  | - `repository` (Number) The ID of the repository where the deploy key belongs to | ||||||
|  | - `title` (String) Name of the deploy key | ||||||
|  |  | ||||||
|  | ### Optional | ||||||
|  |  | ||||||
|  | - `read_only` (Boolean) Whether this key has read or read/write access | ||||||
|  |  | ||||||
|  | ### Read-Only | ||||||
|  |  | ||||||
|  | - `id` (String) The ID of this resource. | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -101,6 +101,24 @@ resource "gitea_token" "test_token" { | |||||||
|   name     = "test-token" |   name     = "test-token" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | resource "gitea_repository" "test_existing_user" { | ||||||
|  |   username     = "testuser2" | ||||||
|  |   name         = "testExistingUser" | ||||||
|  |   private      = true | ||||||
|  |   issue_labels = "Default" | ||||||
|  |   license      = "MIT" | ||||||
|  |   gitignores   = "Go" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //resource "gitea_repository" "test_bs_user" { | ||||||
|  | //  username     = "manualTest" | ||||||
|  | //  name         = "testBullshitUser" | ||||||
|  | //  private      = true | ||||||
|  | //  issue_labels = "Default" | ||||||
|  | //  license      = "MIT" | ||||||
|  | //  gitignores   = "Go" | ||||||
|  | //} | ||||||
|  |  | ||||||
| output "token" { | output "token" { | ||||||
|   value = resource.gitea_token.test_token.token |   value = resource.gitea_token.test_token.token | ||||||
|   sensitive = true |   sensitive = true | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ terraform { | |||||||
|   required_providers { |   required_providers { | ||||||
|     gitea = { |     gitea = { | ||||||
|       source = "terraform.local/lerentis/gitea" |       source = "terraform.local/lerentis/gitea" | ||||||
|       version = "0.11.2" |       version = "0.12.2" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ terraform { | |||||||
|   required_providers { |   required_providers { | ||||||
|     gitea = { |     gitea = { | ||||||
|       source = "Lerentis/gitea" |       source = "Lerentis/gitea" | ||||||
|       version = "0.11.1" |       version = "0.12.2" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								examples/resources/gitea_repository_key/resource.tf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								examples/resources/gitea_repository_key/resource.tf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | terraform { | ||||||
|  |   required_providers { | ||||||
|  |     tls = { | ||||||
|  |       source = "hashicorp/tls" | ||||||
|  |       version = "4.0.4" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | resource "tls_private_key" "example" { | ||||||
|  |   type = "RSA" | ||||||
|  |   rsa_bits = 4096 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | resource "gitea_repository" "example" { | ||||||
|  |   name = "example" | ||||||
|  |   private = true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | resource "gitea_repository_key" "example" { | ||||||
|  |   repository = gitea_repository.example.id | ||||||
|  |   title = "Example Deploy Key" | ||||||
|  |   read_only = true | ||||||
|  |   key = tls_private_key.example.public_key_openssh | ||||||
|  | } | ||||||
| @@ -116,7 +116,7 @@ func dataSourceGiteaRepoRead(d *schema.ResourceData, meta interface{}) error { | |||||||
| 	} | 	} | ||||||
| 	username := strings.ToLower(usernameData.(string)) | 	username := strings.ToLower(usernameData.(string)) | ||||||
|  |  | ||||||
| 	nameData, nameOk := d.GetOk("username") | 	nameData, nameOk := d.GetOk("name") | ||||||
| 	if !nameOk { | 	if !nameOk { | ||||||
| 		return fmt.Errorf("name of repo must be passed") | 		return fmt.Errorf("name of repo must be passed") | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -83,6 +83,7 @@ func Provider() *schema.Provider { | |||||||
| 			"gitea_team":           resourceGiteaTeam(), | 			"gitea_team":           resourceGiteaTeam(), | ||||||
| 			"gitea_git_hook":       resourceGiteaGitHook(), | 			"gitea_git_hook":       resourceGiteaGitHook(), | ||||||
| 			"gitea_token":          resourceGiteaToken(), | 			"gitea_token":          resourceGiteaToken(), | ||||||
|  | 			"gitea_repository_key": resourceGiteaRepositoryKey(), | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		ConfigureFunc: providerConfigure, | 		ConfigureFunc: providerConfigure, | ||||||
|   | |||||||
| @@ -58,7 +58,8 @@ func resourceOrgRead(d *schema.ResourceData, meta interface{}) (err error) { | |||||||
| 	org, err = searchOrgByClientId(client, id) | 	org, err = searchOrgByClientId(client, id) | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		d.SetId("") | ||||||
|  | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = setOrgResourceData(org, d) | 	err = setOrgResourceData(org, d) | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package gitea | package gitea | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strconv" | 	"strconv" | ||||||
|  |  | ||||||
| @@ -48,6 +49,34 @@ const ( | |||||||
| 	migrationLFSEndpoint         string = "migration_lfs_endpoint" | 	migrationLFSEndpoint         string = "migration_lfs_endpoint" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func searchUserByName(c *gitea.Client, name string) (res *gitea.User, err error) { | ||||||
|  | 	page := 1 | ||||||
|  |  | ||||||
|  | 	for { | ||||||
|  | 		users, _, err := c.AdminListUsers(gitea.AdminListUsersOptions{ | ||||||
|  | 			ListOptions: gitea.ListOptions{ | ||||||
|  | 				Page:     page, | ||||||
|  | 				PageSize: 50, | ||||||
|  | 			}, | ||||||
|  | 		}) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if len(users) == 0 { | ||||||
|  | 			return nil, fmt.Errorf("User with name %s could not be found", name) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		for _, user := range users { | ||||||
|  | 			if user.UserName == name { | ||||||
|  | 				return user, nil | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		page += 1 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func resourceRepoRead(d *schema.ResourceData, meta interface{}) (err error) { | func resourceRepoRead(d *schema.ResourceData, meta interface{}) (err error) { | ||||||
| 	client := meta.(*gitea.Client) | 	client := meta.(*gitea.Client) | ||||||
|  |  | ||||||
| @@ -78,6 +107,20 @@ func resourceRepoCreate(d *schema.ResourceData, meta interface{}) (err error) { | |||||||
| 	client := meta.(*gitea.Client) | 	client := meta.(*gitea.Client) | ||||||
|  |  | ||||||
| 	var repo *gitea.Repository | 	var repo *gitea.Repository | ||||||
|  | 	var resp *gitea.Response | ||||||
|  | 	var orgRepo bool | ||||||
|  |  | ||||||
|  | 	_, resp, err = client.GetOrg(d.Get(repoOwner).(string)) | ||||||
|  |  | ||||||
|  | 	if resp.StatusCode == 404 { | ||||||
|  | 		_, err := searchUserByName(client, d.Get(repoOwner).(string)) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return errors.New(fmt.Sprintf("Creation of repository cound not proceed as owner %s is not present in gitea", d.Get(repoOwner).(string))) | ||||||
|  | 		} | ||||||
|  | 		orgRepo = false | ||||||
|  | 	} else { | ||||||
|  | 		orgRepo = true | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (d.Get(repoMirror)).(bool) { | 	if (d.Get(repoMirror)).(bool) { | ||||||
|  |  | ||||||
| @@ -134,7 +177,11 @@ func resourceRepoCreate(d *schema.ResourceData, meta interface{}) (err error) { | |||||||
| 			TrustModel:    "default", | 			TrustModel:    "default", | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		if orgRepo { | ||||||
| 			repo, _, err = client.CreateOrgRepo(d.Get(repoOwner).(string), opts) | 			repo, _, err = client.CreateOrgRepo(d.Get(repoOwner).(string), opts) | ||||||
|  | 		} else { | ||||||
|  | 			repo, _, err = client.AdminCreateRepo(d.Get(repoOwner).(string), opts) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
							
								
								
									
										169
									
								
								gitea/resource_gitea_repository_key.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								gitea/resource_gitea_repository_key.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | |||||||
|  | package gitea | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/sdk/gitea" | ||||||
|  | 	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	deployKeyRepoId   string = "repository" | ||||||
|  | 	deployKeyName     string = "title" | ||||||
|  | 	deployKeyKey      string = "key" | ||||||
|  | 	deployKeyReadOnly string = "read_only" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func resourceRepoKeyIdParts(d *schema.ResourceData) (bool, int64, int64, error) { | ||||||
|  | 	parts := strings.Split(d.Id(), "/") | ||||||
|  | 	if len(parts) != 2 { | ||||||
|  | 		return false, 0, 0, nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	repoId, err := strconv.ParseInt(parts[0], 10, 64) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, 0, 0, err | ||||||
|  | 	} | ||||||
|  | 	keyId, err := strconv.ParseInt(parts[1], 10, 64) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, 0, 0, err | ||||||
|  | 	} | ||||||
|  | 	return true, repoId, keyId, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func resourceRepoKeyRead(d *schema.ResourceData, meta interface{}) (err error) { | ||||||
|  | 	client := meta.(*gitea.Client) | ||||||
|  |  | ||||||
|  | 	hasId, repoId, keyId, err := resourceRepoKeyIdParts(d) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if !hasId { | ||||||
|  | 		d.SetId("") | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	repo, resp, err := client.GetRepoByID(repoId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if resp.StatusCode == 404 { | ||||||
|  | 			d.SetId("") | ||||||
|  | 			return nil | ||||||
|  | 		} else { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	key, resp, err := client.GetDeployKey(repo.Owner.UserName, repo.Name, keyId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if resp.StatusCode == 404 { | ||||||
|  | 			d.SetId("") | ||||||
|  | 			return nil | ||||||
|  | 		} else { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = setRepoKeyResourceData(key, repoId, d) | ||||||
|  |  | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func resourceRepoKeyCreate(d *schema.ResourceData, meta interface{}) (err error) { | ||||||
|  | 	client := meta.(*gitea.Client) | ||||||
|  |  | ||||||
|  | 	repo, _, err := client.GetRepoByID(int64(d.Get(deployKeyRepoId).(int))) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	dk, _, err := client.CreateDeployKey(repo.Owner.UserName, repo.Name, gitea.CreateKeyOption{ | ||||||
|  | 		Title:    d.Get(deployKeyName).(string), | ||||||
|  | 		ReadOnly: d.Get(deployKeyReadOnly).(bool), | ||||||
|  | 		Key:      d.Get(deployKeyKey).(string), | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	setRepoKeyResourceData(dk, repo.ID, d) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func respurceRepoKeyDelete(d *schema.ResourceData, meta interface{}) (err error) { | ||||||
|  | 	client := meta.(*gitea.Client) | ||||||
|  |  | ||||||
|  | 	hasId, repoId, keyId, err := resourceRepoKeyIdParts(d) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if !hasId { | ||||||
|  | 		d.SetId("") | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	repo, resp, err := client.GetRepoByID(repoId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if resp.StatusCode == 404 { | ||||||
|  | 			d.SetId("") | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	client.DeleteDeployKey(repo.Owner.UserName, repo.Name, keyId) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func setRepoKeyResourceData(dk *gitea.DeployKey, repoId int64, d *schema.ResourceData) (err error) { | ||||||
|  | 	d.SetId(fmt.Sprintf("%d/%d", repoId, dk.ID)) | ||||||
|  | 	d.Set(deployKeyRepoId, repoId) | ||||||
|  | 	d.Set(deployKeyReadOnly, dk.ReadOnly) | ||||||
|  | 	d.Set(deployKeyKey, dk.Key) | ||||||
|  | 	d.Set(deployKeyName, dk.Title) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func resourceGiteaRepositoryKey() *schema.Resource { | ||||||
|  | 	return &schema.Resource{ | ||||||
|  | 		Read:   resourceRepoKeyRead, | ||||||
|  | 		Create: resourceRepoKeyCreate, | ||||||
|  | 		Delete: respurceRepoKeyDelete, | ||||||
|  | 		Importer: &schema.ResourceImporter{ | ||||||
|  | 			StateContext: schema.ImportStatePassthroughContext, | ||||||
|  | 		}, | ||||||
|  | 		Schema: map[string]*schema.Schema{ | ||||||
|  | 			deployKeyRepoId: { | ||||||
|  | 				Type:        schema.TypeInt, | ||||||
|  | 				Required:    true, | ||||||
|  | 				ForceNew:    true, | ||||||
|  | 				Description: "The ID of the repository where the deploy key belongs to", | ||||||
|  | 			}, | ||||||
|  | 			deployKeyKey: { | ||||||
|  | 				Type:        schema.TypeString, | ||||||
|  | 				Required:    true, | ||||||
|  | 				ForceNew:    true, | ||||||
|  | 				Description: "Armored SSH key to add", | ||||||
|  | 			}, | ||||||
|  | 			deployKeyReadOnly: { | ||||||
|  | 				Type:        schema.TypeBool, | ||||||
|  | 				Required:    false, | ||||||
|  | 				Optional:    true, | ||||||
|  | 				Default:     true, | ||||||
|  | 				ForceNew:    true, | ||||||
|  | 				Description: "Whether this key has read or read/write access", | ||||||
|  | 			}, | ||||||
|  | 			deployKeyName: { | ||||||
|  | 				Type:        schema.TypeString, | ||||||
|  | 				Required:    true, | ||||||
|  | 				ForceNew:    true, | ||||||
|  | 				Description: "Name of the deploy key", | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		Description: "`gitea_repository_key` manages a deploy key for a single gitea_repository.\n\n" + | ||||||
|  | 			"Every key needs a unique name and unique key, i.e. no key can be added twice to the same repo", | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								go.mod
									
									
									
									
									
								
							| @@ -5,7 +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.13.0 | 	github.com/hashicorp/terraform-plugin-docs v0.13.0 | ||||||
| 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1 | 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.0 | ||||||
| ) | ) | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| @@ -16,7 +16,6 @@ require ( | |||||||
| 	github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect | 	github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect | ||||||
| 	github.com/armon/go-radix v1.0.0 // indirect | 	github.com/armon/go-radix v1.0.0 // indirect | ||||||
| 	github.com/bgentry/speakeasy v0.1.0 // indirect | 	github.com/bgentry/speakeasy v0.1.0 // indirect | ||||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect |  | ||||||
| 	github.com/fatih/color v1.13.0 // indirect | 	github.com/fatih/color v1.13.0 // indirect | ||||||
| 	github.com/golang/protobuf v1.5.2 // indirect | 	github.com/golang/protobuf v1.5.2 // indirect | ||||||
| 	github.com/google/go-cmp v0.5.9 // indirect | 	github.com/google/go-cmp v0.5.9 // indirect | ||||||
| @@ -25,26 +24,26 @@ require ( | |||||||
| 	github.com/hashicorp/go-checkpoint v0.5.0 // indirect | 	github.com/hashicorp/go-checkpoint v0.5.0 // indirect | ||||||
| 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect | 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect | ||||||
| 	github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 // indirect | 	github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 // indirect | ||||||
| 	github.com/hashicorp/go-hclog v1.2.1 // indirect | 	github.com/hashicorp/go-hclog v1.4.0 // indirect | ||||||
| 	github.com/hashicorp/go-multierror v1.1.1 // indirect | 	github.com/hashicorp/go-multierror v1.1.1 // indirect | ||||||
| 	github.com/hashicorp/go-plugin v1.4.6 // indirect | 	github.com/hashicorp/go-plugin v1.4.8 // indirect | ||||||
| 	github.com/hashicorp/go-uuid v1.0.3 // indirect | 	github.com/hashicorp/go-uuid v1.0.3 // indirect | ||||||
| 	github.com/hashicorp/go-version v1.6.0 // indirect | 	github.com/hashicorp/go-version v1.6.0 // indirect | ||||||
| 	github.com/hashicorp/hc-install v0.4.0 // indirect | 	github.com/hashicorp/hc-install v0.5.0 // indirect | ||||||
| 	github.com/hashicorp/hcl/v2 v2.15.0 // indirect | 	github.com/hashicorp/hcl/v2 v2.16.2 // indirect | ||||||
| 	github.com/hashicorp/logutils v1.0.0 // indirect | 	github.com/hashicorp/logutils v1.0.0 // indirect | ||||||
| 	github.com/hashicorp/terraform-exec v0.17.3 // indirect | 	github.com/hashicorp/terraform-exec v0.18.1 // indirect | ||||||
| 	github.com/hashicorp/terraform-json v0.14.0 // indirect | 	github.com/hashicorp/terraform-json v0.16.0 // indirect | ||||||
| 	github.com/hashicorp/terraform-plugin-go v0.14.1 // indirect | 	github.com/hashicorp/terraform-plugin-go v0.14.3 // indirect | ||||||
| 	github.com/hashicorp/terraform-plugin-log v0.7.0 // indirect | 	github.com/hashicorp/terraform-plugin-log v0.8.0 // indirect | ||||||
| 	github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c // 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 | ||||||
| 	github.com/huandu/xstrings v1.3.2 // indirect | 	github.com/huandu/xstrings v1.3.2 // indirect | ||||||
| 	github.com/imdario/mergo v0.3.13 // indirect | 	github.com/imdario/mergo v0.3.13 // indirect | ||||||
| 	github.com/mattn/go-colorable v0.1.12 // indirect | 	github.com/mattn/go-colorable v0.1.12 // indirect | ||||||
| 	github.com/mattn/go-isatty v0.0.14 // indirect | 	github.com/mattn/go-isatty v0.0.14 // indirect | ||||||
| 	github.com/mitchellh/cli v1.1.4 // indirect | 	github.com/mitchellh/cli v1.1.5 // indirect | ||||||
| 	github.com/mitchellh/copystructure v1.2.0 // indirect | 	github.com/mitchellh/copystructure v1.2.0 // indirect | ||||||
| 	github.com/mitchellh/go-testing-interface v1.14.1 // indirect | 	github.com/mitchellh/go-testing-interface v1.14.1 // indirect | ||||||
| 	github.com/mitchellh/go-wordwrap v1.0.0 // indirect | 	github.com/mitchellh/go-wordwrap v1.0.0 // indirect | ||||||
| @@ -58,13 +57,14 @@ require ( | |||||||
| 	github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect | 	github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect | ||||||
| 	github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect | 	github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect | ||||||
| 	github.com/vmihailenco/tagparser v0.1.1 // indirect | 	github.com/vmihailenco/tagparser v0.1.1 // indirect | ||||||
| 	github.com/zclconf/go-cty v1.12.1 // indirect | 	github.com/zclconf/go-cty v1.13.1 // indirect | ||||||
| 	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect | 	golang.org/x/crypto v0.7.0 // indirect | ||||||
| 	golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect | 	golang.org/x/mod v0.8.0 // indirect | ||||||
| 	golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect | 	golang.org/x/net v0.8.0 // indirect | ||||||
| 	golang.org/x/text v0.3.7 // indirect | 	golang.org/x/sys v0.6.0 // indirect | ||||||
|  | 	golang.org/x/text v0.8.0 // indirect | ||||||
| 	google.golang.org/appengine v1.6.6 // indirect | 	google.golang.org/appengine v1.6.6 // indirect | ||||||
| 	google.golang.org/genproto v0.0.0-20200711021454-869866162049 // indirect | 	google.golang.org/genproto v0.0.0-20200711021454-869866162049 // indirect | ||||||
| 	google.golang.org/grpc v1.50.1 // indirect | 	google.golang.org/grpc v1.51.0 // indirect | ||||||
| 	google.golang.org/protobuf v1.28.1 // indirect | 	google.golang.org/protobuf v1.28.1 // indirect | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										99
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								go.sum
									
									
									
									
									
								
							| @@ -4,12 +4,11 @@ code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFj | |||||||
| code.gitea.io/sdk/gitea v0.15.1 h1:WJreC7YYuxbn0UDaPuWIe/mtiNKTvLN8MLkaw71yx/M= | code.gitea.io/sdk/gitea v0.15.1 h1:WJreC7YYuxbn0UDaPuWIe/mtiNKTvLN8MLkaw71yx/M= | ||||||
| code.gitea.io/sdk/gitea v0.15.1/go.mod h1:klY2LVI3s3NChzIk/MzMn7G1FHrfU7qd63iSMVoHRBA= | code.gitea.io/sdk/gitea v0.15.1/go.mod h1:klY2LVI3s3NChzIk/MzMn7G1FHrfU7qd63iSMVoHRBA= | ||||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||||
| github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= |  | ||||||
| github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= | github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= | ||||||
| github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= | github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= | ||||||
| github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= | github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= | ||||||
| github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= | github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= | ||||||
| github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI= | github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= | ||||||
| github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= | github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= | ||||||
| github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= | github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= | ||||||
| github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= | github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= | ||||||
| @@ -22,7 +21,6 @@ github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ | |||||||
| github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE= | github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE= | ||||||
| github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= | github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= | ||||||
| github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | ||||||
| github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I= |  | ||||||
| github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= | github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= | ||||||
| github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= | github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= | ||||||
| github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= | github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= | ||||||
| @@ -79,7 +77,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw | |||||||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||||
| github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
| github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= |  | ||||||
| github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= | github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= | ||||||
| github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| @@ -97,41 +94,40 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n | |||||||
| github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= | ||||||
| github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 h1:1/D3zfFHttUKaCaGKZ/dR2roBXv0vKbSCnssIldfQdI= | github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 h1:1/D3zfFHttUKaCaGKZ/dR2roBXv0vKbSCnssIldfQdI= | ||||||
| github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320/go.mod h1:EiZBMaudVLy8fmjf9Npq1dq9RalhveqZG5w/yz3mHWs= | github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320/go.mod h1:EiZBMaudVLy8fmjf9Npq1dq9RalhveqZG5w/yz3mHWs= | ||||||
| github.com/hashicorp/go-hclog v1.2.1 h1:YQsLlGDJgwhXFpucSPyVbCBviQtjlHv3jLTlp8YmtEw= | github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I= | ||||||
| github.com/hashicorp/go-hclog v1.2.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= | github.com/hashicorp/go-hclog v1.4.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= | ||||||
| github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= | ||||||
| github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= | github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= | ||||||
| github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= | github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= | ||||||
| github.com/hashicorp/go-plugin v1.4.6 h1:MDV3UrKQBM3du3G7MApDGvOsMYy3JQJ4exhSoKBAeVA= | github.com/hashicorp/go-plugin v1.4.8 h1:CHGwpxYDOttQOY7HOWgETU9dyVjOXzniXDqJcYJE1zM= | ||||||
| github.com/hashicorp/go-plugin v1.4.6/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= | github.com/hashicorp/go-plugin v1.4.8/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= | ||||||
| github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | ||||||
| github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= | github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= | ||||||
| github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | ||||||
| github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | ||||||
| github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | ||||||
| github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= |  | ||||||
| github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= | github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= | ||||||
| github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | ||||||
| github.com/hashicorp/hc-install v0.4.0 h1:cZkRFr1WVa0Ty6x5fTvL1TuO1flul231rWkGH92oYYk= | github.com/hashicorp/hc-install v0.5.0 h1:D9bl4KayIYKEeJ4vUDe9L5huqxZXczKaykSRcmQ0xY0= | ||||||
| github.com/hashicorp/hc-install v0.4.0/go.mod h1:5d155H8EC5ewegao9A4PUTMNPZaq+TbOzkJJZ4vrXeI= | github.com/hashicorp/hc-install v0.5.0/go.mod h1:JyzMfbzfSBSjoDCRPna1vi/24BEDxFaCPfdHtM5SCdo= | ||||||
| github.com/hashicorp/hcl/v2 v2.15.0 h1:CPDXO6+uORPjKflkWCCwoWc9uRp+zSIPcCQ+BrxV7m8= | github.com/hashicorp/hcl/v2 v2.16.2 h1:mpkHZh/Tv+xet3sy3F9Ld4FyI2tUpWe9x3XtPx9f1a0= | ||||||
| github.com/hashicorp/hcl/v2 v2.15.0/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng= | github.com/hashicorp/hcl/v2 v2.16.2/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng= | ||||||
| github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= | github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= | ||||||
| github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= | ||||||
| github.com/hashicorp/terraform-exec v0.17.3 h1:MX14Kvnka/oWGmIkyuyvL6POx25ZmKrjlaclkx3eErU= | github.com/hashicorp/terraform-exec v0.18.1 h1:LAbfDvNQU1l0NOQlTuudjczVhHj061fNX5H8XZxHlH4= | ||||||
| github.com/hashicorp/terraform-exec v0.17.3/go.mod h1:+NELG0EqQekJzhvikkeQsOAZpsw0cv/03rbeQJqscAI= | github.com/hashicorp/terraform-exec v0.18.1/go.mod h1:58wg4IeuAJ6LVsLUeD2DWZZoc/bYi6dzhLHzxM41980= | ||||||
| github.com/hashicorp/terraform-json v0.14.0 h1:sh9iZ1Y8IFJLx+xQiKHGud6/TSUCM0N8e17dKDpqV7s= | github.com/hashicorp/terraform-json v0.16.0 h1:UKkeWRWb23do5LNAFlh/K3N0ymn1qTOO8c+85Albo3s= | ||||||
| github.com/hashicorp/terraform-json v0.14.0/go.mod h1:5A9HIWPkk4e5aeeXIBbkcOvaZbIYnAIkEyqP2pNSckM= | github.com/hashicorp/terraform-json v0.16.0/go.mod h1:v0Ufk9jJnk6tcIZvScHvetlKfiNTC+WS21mnXIlc0B0= | ||||||
| github.com/hashicorp/terraform-plugin-docs v0.13.0 h1:6e+VIWsVGb6jYJewfzq2ok2smPzZrt1Wlm9koLeKazY= | github.com/hashicorp/terraform-plugin-docs v0.13.0 h1:6e+VIWsVGb6jYJewfzq2ok2smPzZrt1Wlm9koLeKazY= | ||||||
| github.com/hashicorp/terraform-plugin-docs v0.13.0/go.mod h1:W0oCmHAjIlTHBbvtppWHe8fLfZ2BznQbuv8+UD8OucQ= | github.com/hashicorp/terraform-plugin-docs v0.13.0/go.mod h1:W0oCmHAjIlTHBbvtppWHe8fLfZ2BznQbuv8+UD8OucQ= | ||||||
| github.com/hashicorp/terraform-plugin-go v0.14.1 h1:cwZzPYla82XwAqpLhSzdVsOMU+6H29tczAwrB0z9Zek= | github.com/hashicorp/terraform-plugin-go v0.14.3 h1:nlnJ1GXKdMwsC8g1Nh05tK2wsC3+3BL/DBBxFEki+j0= | ||||||
| github.com/hashicorp/terraform-plugin-go v0.14.1/go.mod h1:Bc/K6K26BQ2FHqIELPbpKtt2CzzbQou+0UQF3/0NsCQ= | github.com/hashicorp/terraform-plugin-go v0.14.3/go.mod h1:7ees7DMZ263q8wQ6E4RdIdR6nHHJtrdt4ogX5lPkX1A= | ||||||
| github.com/hashicorp/terraform-plugin-log v0.7.0 h1:SDxJUyT8TwN4l5b5/VkiTIaQgY6R+Y2BQ0sRZftGKQs= | github.com/hashicorp/terraform-plugin-log v0.8.0 h1:pX2VQ/TGKu+UU1rCay0OlzosNKe4Nz1pepLXj95oyy0= | ||||||
| github.com/hashicorp/terraform-plugin-log v0.7.0/go.mod h1:p4R1jWBXRTvL4odmEkFfDdhUjHf9zcs/BCoNHAc7IK4= | github.com/hashicorp/terraform-plugin-log v0.8.0/go.mod h1:1myFrhVsBLeylQzYYEV17VVjtG8oYPRFdaZs7xdW2xs= | ||||||
| github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1 h1:zHcMbxY0+rFO9gY99elV/XC/UnQVg7FhRCbj1i5b7vM= | github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.0 h1:We3H/dXP7Q0YH4YsBY6DAVj+Ur6PDFC+Yt1btGhTeMs= | ||||||
| github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1/go.mod h1:+tNlb0wkfdsDJ7JEiERLz4HzM19HyiuIoGzTsM7rPpw= | github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.0/go.mod h1:xcOSYlRVdPLmDUoqPhO9fiO/YCN/l6MGYeTzGt5jgkQ= | ||||||
| github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c h1:D8aRO6+mTqHfLsK/BC3j5OAoogv1WLRWzY1AaTo3rBg= | github.com/hashicorp/terraform-registry-address v0.1.0 h1:W6JkV9wbum+m516rCl5/NjKxCyTVaaUBbzYcMzBDO3U= | ||||||
| github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c/go.mod h1:Wn3Na71knbXc1G8Lh+yu/dQWWJeFQEpDeJMtWMtlmNI= | github.com/hashicorp/terraform-registry-address v0.1.0/go.mod h1:EnyO2jYO6j29DTHbJcm00E5nQTFeTtyZH3H5ycydQ5A= | ||||||
| github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 h1:HKLsbzeOsfXmKNpr3GiT18XAblV0BjCbzL8KQAMZGa0= | github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 h1:HKLsbzeOsfXmKNpr3GiT18XAblV0BjCbzL8KQAMZGa0= | ||||||
| github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg= | github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg= | ||||||
| github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= | github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= | ||||||
| @@ -168,8 +164,8 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx | |||||||
| github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||||
| github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= | ||||||
| github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | ||||||
| github.com/mitchellh/cli v1.1.4 h1:qj8czE26AU4PbiaPXK5uVmMSM+V5BYsFBiM9HhGRLUA= | github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= | ||||||
| github.com/mitchellh/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ= | github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= | ||||||
| github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= | github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= | ||||||
| github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= | github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= | ||||||
| github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= | github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= | ||||||
| @@ -185,7 +181,6 @@ github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx | |||||||
| github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= | github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= | ||||||
| github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= | github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= | ||||||
| github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | ||||||
| github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce h1:RPclfga2SEJmgMmz2k+Mg7cowZ8yv4Trqw9UsJby758= |  | ||||||
| github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= | github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= | ||||||
| github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= | github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= | ||||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
| @@ -199,7 +194,6 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: | |||||||
| github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= | github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= | ||||||
| github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= | github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= | ||||||
| github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= | github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= | ||||||
| github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= |  | ||||||
| github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= | github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= | ||||||
| github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= | github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= | ||||||
| github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= | github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= | ||||||
| @@ -212,7 +206,6 @@ github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155 | |||||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= |  | ||||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||||
| @@ -229,12 +222,10 @@ github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgq | |||||||
| github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= | github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= | ||||||
| github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= | github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= | ||||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
|  | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||||
| github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= | github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= | ||||||
| github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= | github.com/zclconf/go-cty v1.13.1 h1:0a6bRwuiSHtAmqCqNOE+c2oHgepv0ctoxU4FUe43kwc= | ||||||
| github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= | github.com/zclconf/go-cty v1.13.1/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= | ||||||
| github.com/zclconf/go-cty v1.12.1 h1:PcupnljUm9EIvbgSHQnHhUr3fO6oFmkOrvs2BAFNXXY= |  | ||||||
| github.com/zclconf/go-cty v1.12.1/go.mod h1:s9IfD1LK5ccNMSWCVFCE2rJfHiZgi7JijgeWIMfhLvA= |  | ||||||
| github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= |  | ||||||
| golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||||
| @@ -242,14 +233,19 @@ golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPh | |||||||
| golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | ||||||
| golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | ||||||
| golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
| golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= | golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= | ||||||
| golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= | ||||||
|  | golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= | ||||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||||
| golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||||
| golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | ||||||
| golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | ||||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
|  | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||||||
|  | golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||||
|  | golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= | ||||||
|  | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| @@ -265,8 +261,10 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL | |||||||
| golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||||||
| golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||||||
| golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= | golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= | ||||||
| golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||||
| golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= | ||||||
|  | golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= | ||||||
|  | golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= | ||||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||||
| golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| @@ -274,6 +272,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ | |||||||
| golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| @@ -291,15 +290,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc | |||||||
| golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8= | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
|  | golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= | ||||||
|  | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||||
|  | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||||
|  | golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= | ||||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |  | ||||||
| golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= |  | ||||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||||
|  | golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | ||||||
|  | golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= | ||||||
|  | golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= | ||||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||||
| @@ -307,6 +312,7 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 | |||||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||||
| golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | ||||||
|  | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| @@ -323,8 +329,8 @@ google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6D | |||||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||||
| google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||||
| google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | ||||||
| google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= | google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= | ||||||
| google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= | google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= | ||||||
| google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | ||||||
| google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | ||||||
| @@ -349,6 +355,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||||||
| gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
|  | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
| gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
| gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								vendor/github.com/davecgh/go-spew/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/davecgh/go-spew/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,15 +0,0 @@ | |||||||
| ISC License |  | ||||||
|  |  | ||||||
| Copyright (c) 2012-2016 Dave Collins <dave@davec.name> |  | ||||||
|  |  | ||||||
| Permission to use, copy, modify, and/or distribute this software for any |  | ||||||
| purpose with or without fee is hereby granted, provided that the above |  | ||||||
| copyright notice and this permission notice appear in all copies. |  | ||||||
|  |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
| WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
| MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
| ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
| OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
							
								
								
									
										145
									
								
								vendor/github.com/davecgh/go-spew/spew/bypass.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										145
									
								
								vendor/github.com/davecgh/go-spew/spew/bypass.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,145 +0,0 @@ | |||||||
| // Copyright (c) 2015-2016 Dave Collins <dave@davec.name> |  | ||||||
| // |  | ||||||
| // Permission to use, copy, modify, and distribute this software for any |  | ||||||
| // purpose with or without fee is hereby granted, provided that the above |  | ||||||
| // copyright notice and this permission notice appear in all copies. |  | ||||||
| // |  | ||||||
| // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
| // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
| // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
| // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
| // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
| // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
| // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  |  | ||||||
| // NOTE: Due to the following build constraints, this file will only be compiled |  | ||||||
| // when the code is not running on Google App Engine, compiled by GopherJS, and |  | ||||||
| // "-tags safe" is not added to the go build command line.  The "disableunsafe" |  | ||||||
| // tag is deprecated and thus should not be used. |  | ||||||
| // Go versions prior to 1.4 are disabled because they use a different layout |  | ||||||
| // for interfaces which make the implementation of unsafeReflectValue more complex. |  | ||||||
| // +build !js,!appengine,!safe,!disableunsafe,go1.4 |  | ||||||
|  |  | ||||||
| package spew |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"reflect" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	// UnsafeDisabled is a build-time constant which specifies whether or |  | ||||||
| 	// not access to the unsafe package is available. |  | ||||||
| 	UnsafeDisabled = false |  | ||||||
|  |  | ||||||
| 	// ptrSize is the size of a pointer on the current arch. |  | ||||||
| 	ptrSize = unsafe.Sizeof((*byte)(nil)) |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type flag uintptr |  | ||||||
|  |  | ||||||
| var ( |  | ||||||
| 	// flagRO indicates whether the value field of a reflect.Value |  | ||||||
| 	// is read-only. |  | ||||||
| 	flagRO flag |  | ||||||
|  |  | ||||||
| 	// flagAddr indicates whether the address of the reflect.Value's |  | ||||||
| 	// value may be taken. |  | ||||||
| 	flagAddr flag |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // flagKindMask holds the bits that make up the kind |  | ||||||
| // part of the flags field. In all the supported versions, |  | ||||||
| // it is in the lower 5 bits. |  | ||||||
| const flagKindMask = flag(0x1f) |  | ||||||
|  |  | ||||||
| // Different versions of Go have used different |  | ||||||
| // bit layouts for the flags type. This table |  | ||||||
| // records the known combinations. |  | ||||||
| var okFlags = []struct { |  | ||||||
| 	ro, addr flag |  | ||||||
| }{{ |  | ||||||
| 	// From Go 1.4 to 1.5 |  | ||||||
| 	ro:   1 << 5, |  | ||||||
| 	addr: 1 << 7, |  | ||||||
| }, { |  | ||||||
| 	// Up to Go tip. |  | ||||||
| 	ro:   1<<5 | 1<<6, |  | ||||||
| 	addr: 1 << 8, |  | ||||||
| }} |  | ||||||
|  |  | ||||||
| var flagValOffset = func() uintptr { |  | ||||||
| 	field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") |  | ||||||
| 	if !ok { |  | ||||||
| 		panic("reflect.Value has no flag field") |  | ||||||
| 	} |  | ||||||
| 	return field.Offset |  | ||||||
| }() |  | ||||||
|  |  | ||||||
| // flagField returns a pointer to the flag field of a reflect.Value. |  | ||||||
| func flagField(v *reflect.Value) *flag { |  | ||||||
| 	return (*flag)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + flagValOffset)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // unsafeReflectValue converts the passed reflect.Value into a one that bypasses |  | ||||||
| // the typical safety restrictions preventing access to unaddressable and |  | ||||||
| // unexported data.  It works by digging the raw pointer to the underlying |  | ||||||
| // value out of the protected value and generating a new unprotected (unsafe) |  | ||||||
| // reflect.Value to it. |  | ||||||
| // |  | ||||||
| // This allows us to check for implementations of the Stringer and error |  | ||||||
| // interfaces to be used for pretty printing ordinarily unaddressable and |  | ||||||
| // inaccessible values such as unexported struct fields. |  | ||||||
| func unsafeReflectValue(v reflect.Value) reflect.Value { |  | ||||||
| 	if !v.IsValid() || (v.CanInterface() && v.CanAddr()) { |  | ||||||
| 		return v |  | ||||||
| 	} |  | ||||||
| 	flagFieldPtr := flagField(&v) |  | ||||||
| 	*flagFieldPtr &^= flagRO |  | ||||||
| 	*flagFieldPtr |= flagAddr |  | ||||||
| 	return v |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sanity checks against future reflect package changes |  | ||||||
| // to the type or semantics of the Value.flag field. |  | ||||||
| func init() { |  | ||||||
| 	field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") |  | ||||||
| 	if !ok { |  | ||||||
| 		panic("reflect.Value has no flag field") |  | ||||||
| 	} |  | ||||||
| 	if field.Type.Kind() != reflect.TypeOf(flag(0)).Kind() { |  | ||||||
| 		panic("reflect.Value flag field has changed kind") |  | ||||||
| 	} |  | ||||||
| 	type t0 int |  | ||||||
| 	var t struct { |  | ||||||
| 		A t0 |  | ||||||
| 		// t0 will have flagEmbedRO set. |  | ||||||
| 		t0 |  | ||||||
| 		// a will have flagStickyRO set |  | ||||||
| 		a t0 |  | ||||||
| 	} |  | ||||||
| 	vA := reflect.ValueOf(t).FieldByName("A") |  | ||||||
| 	va := reflect.ValueOf(t).FieldByName("a") |  | ||||||
| 	vt0 := reflect.ValueOf(t).FieldByName("t0") |  | ||||||
|  |  | ||||||
| 	// Infer flagRO from the difference between the flags |  | ||||||
| 	// for the (otherwise identical) fields in t. |  | ||||||
| 	flagPublic := *flagField(&vA) |  | ||||||
| 	flagWithRO := *flagField(&va) | *flagField(&vt0) |  | ||||||
| 	flagRO = flagPublic ^ flagWithRO |  | ||||||
|  |  | ||||||
| 	// Infer flagAddr from the difference between a value |  | ||||||
| 	// taken from a pointer and not. |  | ||||||
| 	vPtrA := reflect.ValueOf(&t).Elem().FieldByName("A") |  | ||||||
| 	flagNoPtr := *flagField(&vA) |  | ||||||
| 	flagPtr := *flagField(&vPtrA) |  | ||||||
| 	flagAddr = flagNoPtr ^ flagPtr |  | ||||||
|  |  | ||||||
| 	// Check that the inferred flags tally with one of the known versions. |  | ||||||
| 	for _, f := range okFlags { |  | ||||||
| 		if flagRO == f.ro && flagAddr == f.addr { |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	panic("reflect.Value read-only flag has changed semantics") |  | ||||||
| } |  | ||||||
							
								
								
									
										38
									
								
								vendor/github.com/davecgh/go-spew/spew/bypasssafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/davecgh/go-spew/spew/bypasssafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,38 +0,0 @@ | |||||||
| // Copyright (c) 2015-2016 Dave Collins <dave@davec.name> |  | ||||||
| // |  | ||||||
| // Permission to use, copy, modify, and distribute this software for any |  | ||||||
| // purpose with or without fee is hereby granted, provided that the above |  | ||||||
| // copyright notice and this permission notice appear in all copies. |  | ||||||
| // |  | ||||||
| // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
| // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
| // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
| // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
| // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
| // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
| // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  |  | ||||||
| // NOTE: Due to the following build constraints, this file will only be compiled |  | ||||||
| // when the code is running on Google App Engine, compiled by GopherJS, or |  | ||||||
| // "-tags safe" is added to the go build command line.  The "disableunsafe" |  | ||||||
| // tag is deprecated and thus should not be used. |  | ||||||
| // +build js appengine safe disableunsafe !go1.4 |  | ||||||
|  |  | ||||||
| package spew |  | ||||||
|  |  | ||||||
| import "reflect" |  | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	// UnsafeDisabled is a build-time constant which specifies whether or |  | ||||||
| 	// not access to the unsafe package is available. |  | ||||||
| 	UnsafeDisabled = true |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // unsafeReflectValue typically converts the passed reflect.Value into a one |  | ||||||
| // that bypasses the typical safety restrictions preventing access to |  | ||||||
| // unaddressable and unexported data.  However, doing this relies on access to |  | ||||||
| // the unsafe package.  This is a stub version which simply returns the passed |  | ||||||
| // reflect.Value when the unsafe package is not available. |  | ||||||
| func unsafeReflectValue(v reflect.Value) reflect.Value { |  | ||||||
| 	return v |  | ||||||
| } |  | ||||||
							
								
								
									
										341
									
								
								vendor/github.com/davecgh/go-spew/spew/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										341
									
								
								vendor/github.com/davecgh/go-spew/spew/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,341 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Copyright (c) 2013-2016 Dave Collins <dave@davec.name> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| package spew |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"reflect" |  | ||||||
| 	"sort" |  | ||||||
| 	"strconv" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Some constants in the form of bytes to avoid string overhead.  This mirrors |  | ||||||
| // the technique used in the fmt package. |  | ||||||
| var ( |  | ||||||
| 	panicBytes            = []byte("(PANIC=") |  | ||||||
| 	plusBytes             = []byte("+") |  | ||||||
| 	iBytes                = []byte("i") |  | ||||||
| 	trueBytes             = []byte("true") |  | ||||||
| 	falseBytes            = []byte("false") |  | ||||||
| 	interfaceBytes        = []byte("(interface {})") |  | ||||||
| 	commaNewlineBytes     = []byte(",\n") |  | ||||||
| 	newlineBytes          = []byte("\n") |  | ||||||
| 	openBraceBytes        = []byte("{") |  | ||||||
| 	openBraceNewlineBytes = []byte("{\n") |  | ||||||
| 	closeBraceBytes       = []byte("}") |  | ||||||
| 	asteriskBytes         = []byte("*") |  | ||||||
| 	colonBytes            = []byte(":") |  | ||||||
| 	colonSpaceBytes       = []byte(": ") |  | ||||||
| 	openParenBytes        = []byte("(") |  | ||||||
| 	closeParenBytes       = []byte(")") |  | ||||||
| 	spaceBytes            = []byte(" ") |  | ||||||
| 	pointerChainBytes     = []byte("->") |  | ||||||
| 	nilAngleBytes         = []byte("<nil>") |  | ||||||
| 	maxNewlineBytes       = []byte("<max depth reached>\n") |  | ||||||
| 	maxShortBytes         = []byte("<max>") |  | ||||||
| 	circularBytes         = []byte("<already shown>") |  | ||||||
| 	circularShortBytes    = []byte("<shown>") |  | ||||||
| 	invalidAngleBytes     = []byte("<invalid>") |  | ||||||
| 	openBracketBytes      = []byte("[") |  | ||||||
| 	closeBracketBytes     = []byte("]") |  | ||||||
| 	percentBytes          = []byte("%") |  | ||||||
| 	precisionBytes        = []byte(".") |  | ||||||
| 	openAngleBytes        = []byte("<") |  | ||||||
| 	closeAngleBytes       = []byte(">") |  | ||||||
| 	openMapBytes          = []byte("map[") |  | ||||||
| 	closeMapBytes         = []byte("]") |  | ||||||
| 	lenEqualsBytes        = []byte("len=") |  | ||||||
| 	capEqualsBytes        = []byte("cap=") |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // hexDigits is used to map a decimal value to a hex digit. |  | ||||||
| var hexDigits = "0123456789abcdef" |  | ||||||
|  |  | ||||||
| // catchPanic handles any panics that might occur during the handleMethods |  | ||||||
| // calls. |  | ||||||
| func catchPanic(w io.Writer, v reflect.Value) { |  | ||||||
| 	if err := recover(); err != nil { |  | ||||||
| 		w.Write(panicBytes) |  | ||||||
| 		fmt.Fprintf(w, "%v", err) |  | ||||||
| 		w.Write(closeParenBytes) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // handleMethods attempts to call the Error and String methods on the underlying |  | ||||||
| // type the passed reflect.Value represents and outputes the result to Writer w. |  | ||||||
| // |  | ||||||
| // It handles panics in any called methods by catching and displaying the error |  | ||||||
| // as the formatted value. |  | ||||||
| func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) { |  | ||||||
| 	// We need an interface to check if the type implements the error or |  | ||||||
| 	// Stringer interface.  However, the reflect package won't give us an |  | ||||||
| 	// interface on certain things like unexported struct fields in order |  | ||||||
| 	// to enforce visibility rules.  We use unsafe, when it's available, |  | ||||||
| 	// to bypass these restrictions since this package does not mutate the |  | ||||||
| 	// values. |  | ||||||
| 	if !v.CanInterface() { |  | ||||||
| 		if UnsafeDisabled { |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		v = unsafeReflectValue(v) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Choose whether or not to do error and Stringer interface lookups against |  | ||||||
| 	// the base type or a pointer to the base type depending on settings. |  | ||||||
| 	// Technically calling one of these methods with a pointer receiver can |  | ||||||
| 	// mutate the value, however, types which choose to satisify an error or |  | ||||||
| 	// Stringer interface with a pointer receiver should not be mutating their |  | ||||||
| 	// state inside these interface methods. |  | ||||||
| 	if !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() { |  | ||||||
| 		v = unsafeReflectValue(v) |  | ||||||
| 	} |  | ||||||
| 	if v.CanAddr() { |  | ||||||
| 		v = v.Addr() |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Is it an error or Stringer? |  | ||||||
| 	switch iface := v.Interface().(type) { |  | ||||||
| 	case error: |  | ||||||
| 		defer catchPanic(w, v) |  | ||||||
| 		if cs.ContinueOnMethod { |  | ||||||
| 			w.Write(openParenBytes) |  | ||||||
| 			w.Write([]byte(iface.Error())) |  | ||||||
| 			w.Write(closeParenBytes) |  | ||||||
| 			w.Write(spaceBytes) |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		w.Write([]byte(iface.Error())) |  | ||||||
| 		return true |  | ||||||
|  |  | ||||||
| 	case fmt.Stringer: |  | ||||||
| 		defer catchPanic(w, v) |  | ||||||
| 		if cs.ContinueOnMethod { |  | ||||||
| 			w.Write(openParenBytes) |  | ||||||
| 			w.Write([]byte(iface.String())) |  | ||||||
| 			w.Write(closeParenBytes) |  | ||||||
| 			w.Write(spaceBytes) |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
| 		w.Write([]byte(iface.String())) |  | ||||||
| 		return true |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // printBool outputs a boolean value as true or false to Writer w. |  | ||||||
| func printBool(w io.Writer, val bool) { |  | ||||||
| 	if val { |  | ||||||
| 		w.Write(trueBytes) |  | ||||||
| 	} else { |  | ||||||
| 		w.Write(falseBytes) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // printInt outputs a signed integer value to Writer w. |  | ||||||
| func printInt(w io.Writer, val int64, base int) { |  | ||||||
| 	w.Write([]byte(strconv.FormatInt(val, base))) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // printUint outputs an unsigned integer value to Writer w. |  | ||||||
| func printUint(w io.Writer, val uint64, base int) { |  | ||||||
| 	w.Write([]byte(strconv.FormatUint(val, base))) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // printFloat outputs a floating point value using the specified precision, |  | ||||||
| // which is expected to be 32 or 64bit, to Writer w. |  | ||||||
| func printFloat(w io.Writer, val float64, precision int) { |  | ||||||
| 	w.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision))) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // printComplex outputs a complex value using the specified float precision |  | ||||||
| // for the real and imaginary parts to Writer w. |  | ||||||
| func printComplex(w io.Writer, c complex128, floatPrecision int) { |  | ||||||
| 	r := real(c) |  | ||||||
| 	w.Write(openParenBytes) |  | ||||||
| 	w.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision))) |  | ||||||
| 	i := imag(c) |  | ||||||
| 	if i >= 0 { |  | ||||||
| 		w.Write(plusBytes) |  | ||||||
| 	} |  | ||||||
| 	w.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision))) |  | ||||||
| 	w.Write(iBytes) |  | ||||||
| 	w.Write(closeParenBytes) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x' |  | ||||||
| // prefix to Writer w. |  | ||||||
| func printHexPtr(w io.Writer, p uintptr) { |  | ||||||
| 	// Null pointer. |  | ||||||
| 	num := uint64(p) |  | ||||||
| 	if num == 0 { |  | ||||||
| 		w.Write(nilAngleBytes) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix |  | ||||||
| 	buf := make([]byte, 18) |  | ||||||
|  |  | ||||||
| 	// It's simpler to construct the hex string right to left. |  | ||||||
| 	base := uint64(16) |  | ||||||
| 	i := len(buf) - 1 |  | ||||||
| 	for num >= base { |  | ||||||
| 		buf[i] = hexDigits[num%base] |  | ||||||
| 		num /= base |  | ||||||
| 		i-- |  | ||||||
| 	} |  | ||||||
| 	buf[i] = hexDigits[num] |  | ||||||
|  |  | ||||||
| 	// Add '0x' prefix. |  | ||||||
| 	i-- |  | ||||||
| 	buf[i] = 'x' |  | ||||||
| 	i-- |  | ||||||
| 	buf[i] = '0' |  | ||||||
|  |  | ||||||
| 	// Strip unused leading bytes. |  | ||||||
| 	buf = buf[i:] |  | ||||||
| 	w.Write(buf) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // valuesSorter implements sort.Interface to allow a slice of reflect.Value |  | ||||||
| // elements to be sorted. |  | ||||||
| type valuesSorter struct { |  | ||||||
| 	values  []reflect.Value |  | ||||||
| 	strings []string // either nil or same len and values |  | ||||||
| 	cs      *ConfigState |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // newValuesSorter initializes a valuesSorter instance, which holds a set of |  | ||||||
| // surrogate keys on which the data should be sorted.  It uses flags in |  | ||||||
| // ConfigState to decide if and how to populate those surrogate keys. |  | ||||||
| func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface { |  | ||||||
| 	vs := &valuesSorter{values: values, cs: cs} |  | ||||||
| 	if canSortSimply(vs.values[0].Kind()) { |  | ||||||
| 		return vs |  | ||||||
| 	} |  | ||||||
| 	if !cs.DisableMethods { |  | ||||||
| 		vs.strings = make([]string, len(values)) |  | ||||||
| 		for i := range vs.values { |  | ||||||
| 			b := bytes.Buffer{} |  | ||||||
| 			if !handleMethods(cs, &b, vs.values[i]) { |  | ||||||
| 				vs.strings = nil |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 			vs.strings[i] = b.String() |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if vs.strings == nil && cs.SpewKeys { |  | ||||||
| 		vs.strings = make([]string, len(values)) |  | ||||||
| 		for i := range vs.values { |  | ||||||
| 			vs.strings[i] = Sprintf("%#v", vs.values[i].Interface()) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return vs |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // canSortSimply tests whether a reflect.Kind is a primitive that can be sorted |  | ||||||
| // directly, or whether it should be considered for sorting by surrogate keys |  | ||||||
| // (if the ConfigState allows it). |  | ||||||
| func canSortSimply(kind reflect.Kind) bool { |  | ||||||
| 	// This switch parallels valueSortLess, except for the default case. |  | ||||||
| 	switch kind { |  | ||||||
| 	case reflect.Bool: |  | ||||||
| 		return true |  | ||||||
| 	case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: |  | ||||||
| 		return true |  | ||||||
| 	case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: |  | ||||||
| 		return true |  | ||||||
| 	case reflect.Float32, reflect.Float64: |  | ||||||
| 		return true |  | ||||||
| 	case reflect.String: |  | ||||||
| 		return true |  | ||||||
| 	case reflect.Uintptr: |  | ||||||
| 		return true |  | ||||||
| 	case reflect.Array: |  | ||||||
| 		return true |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Len returns the number of values in the slice.  It is part of the |  | ||||||
| // sort.Interface implementation. |  | ||||||
| func (s *valuesSorter) Len() int { |  | ||||||
| 	return len(s.values) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Swap swaps the values at the passed indices.  It is part of the |  | ||||||
| // sort.Interface implementation. |  | ||||||
| func (s *valuesSorter) Swap(i, j int) { |  | ||||||
| 	s.values[i], s.values[j] = s.values[j], s.values[i] |  | ||||||
| 	if s.strings != nil { |  | ||||||
| 		s.strings[i], s.strings[j] = s.strings[j], s.strings[i] |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // valueSortLess returns whether the first value should sort before the second |  | ||||||
| // value.  It is used by valueSorter.Less as part of the sort.Interface |  | ||||||
| // implementation. |  | ||||||
| func valueSortLess(a, b reflect.Value) bool { |  | ||||||
| 	switch a.Kind() { |  | ||||||
| 	case reflect.Bool: |  | ||||||
| 		return !a.Bool() && b.Bool() |  | ||||||
| 	case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: |  | ||||||
| 		return a.Int() < b.Int() |  | ||||||
| 	case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: |  | ||||||
| 		return a.Uint() < b.Uint() |  | ||||||
| 	case reflect.Float32, reflect.Float64: |  | ||||||
| 		return a.Float() < b.Float() |  | ||||||
| 	case reflect.String: |  | ||||||
| 		return a.String() < b.String() |  | ||||||
| 	case reflect.Uintptr: |  | ||||||
| 		return a.Uint() < b.Uint() |  | ||||||
| 	case reflect.Array: |  | ||||||
| 		// Compare the contents of both arrays. |  | ||||||
| 		l := a.Len() |  | ||||||
| 		for i := 0; i < l; i++ { |  | ||||||
| 			av := a.Index(i) |  | ||||||
| 			bv := b.Index(i) |  | ||||||
| 			if av.Interface() == bv.Interface() { |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 			return valueSortLess(av, bv) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return a.String() < b.String() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Less returns whether the value at index i should sort before the |  | ||||||
| // value at index j.  It is part of the sort.Interface implementation. |  | ||||||
| func (s *valuesSorter) Less(i, j int) bool { |  | ||||||
| 	if s.strings == nil { |  | ||||||
| 		return valueSortLess(s.values[i], s.values[j]) |  | ||||||
| 	} |  | ||||||
| 	return s.strings[i] < s.strings[j] |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // sortValues is a sort function that handles both native types and any type that |  | ||||||
| // can be converted to error or Stringer.  Other inputs are sorted according to |  | ||||||
| // their Value.String() value to ensure display stability. |  | ||||||
| func sortValues(values []reflect.Value, cs *ConfigState) { |  | ||||||
| 	if len(values) == 0 { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	sort.Sort(newValuesSorter(values, cs)) |  | ||||||
| } |  | ||||||
							
								
								
									
										306
									
								
								vendor/github.com/davecgh/go-spew/spew/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										306
									
								
								vendor/github.com/davecgh/go-spew/spew/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,306 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Copyright (c) 2013-2016 Dave Collins <dave@davec.name> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| package spew |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"os" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // ConfigState houses the configuration options used by spew to format and |  | ||||||
| // display values.  There is a global instance, Config, that is used to control |  | ||||||
| // all top-level Formatter and Dump functionality.  Each ConfigState instance |  | ||||||
| // provides methods equivalent to the top-level functions. |  | ||||||
| // |  | ||||||
| // The zero value for ConfigState provides no indentation.  You would typically |  | ||||||
| // want to set it to a space or a tab. |  | ||||||
| // |  | ||||||
| // Alternatively, you can use NewDefaultConfig to get a ConfigState instance |  | ||||||
| // with default settings.  See the documentation of NewDefaultConfig for default |  | ||||||
| // values. |  | ||||||
| type ConfigState struct { |  | ||||||
| 	// Indent specifies the string to use for each indentation level.  The |  | ||||||
| 	// global config instance that all top-level functions use set this to a |  | ||||||
| 	// single space by default.  If you would like more indentation, you might |  | ||||||
| 	// set this to a tab with "\t" or perhaps two spaces with "  ". |  | ||||||
| 	Indent string |  | ||||||
|  |  | ||||||
| 	// MaxDepth controls the maximum number of levels to descend into nested |  | ||||||
| 	// data structures.  The default, 0, means there is no limit. |  | ||||||
| 	// |  | ||||||
| 	// NOTE: Circular data structures are properly detected, so it is not |  | ||||||
| 	// necessary to set this value unless you specifically want to limit deeply |  | ||||||
| 	// nested data structures. |  | ||||||
| 	MaxDepth int |  | ||||||
|  |  | ||||||
| 	// DisableMethods specifies whether or not error and Stringer interfaces are |  | ||||||
| 	// invoked for types that implement them. |  | ||||||
| 	DisableMethods bool |  | ||||||
|  |  | ||||||
| 	// DisablePointerMethods specifies whether or not to check for and invoke |  | ||||||
| 	// error and Stringer interfaces on types which only accept a pointer |  | ||||||
| 	// receiver when the current type is not a pointer. |  | ||||||
| 	// |  | ||||||
| 	// NOTE: This might be an unsafe action since calling one of these methods |  | ||||||
| 	// with a pointer receiver could technically mutate the value, however, |  | ||||||
| 	// in practice, types which choose to satisify an error or Stringer |  | ||||||
| 	// interface with a pointer receiver should not be mutating their state |  | ||||||
| 	// inside these interface methods.  As a result, this option relies on |  | ||||||
| 	// access to the unsafe package, so it will not have any effect when |  | ||||||
| 	// running in environments without access to the unsafe package such as |  | ||||||
| 	// Google App Engine or with the "safe" build tag specified. |  | ||||||
| 	DisablePointerMethods bool |  | ||||||
|  |  | ||||||
| 	// DisablePointerAddresses specifies whether to disable the printing of |  | ||||||
| 	// pointer addresses. This is useful when diffing data structures in tests. |  | ||||||
| 	DisablePointerAddresses bool |  | ||||||
|  |  | ||||||
| 	// DisableCapacities specifies whether to disable the printing of capacities |  | ||||||
| 	// for arrays, slices, maps and channels. This is useful when diffing |  | ||||||
| 	// data structures in tests. |  | ||||||
| 	DisableCapacities bool |  | ||||||
|  |  | ||||||
| 	// ContinueOnMethod specifies whether or not recursion should continue once |  | ||||||
| 	// a custom error or Stringer interface is invoked.  The default, false, |  | ||||||
| 	// means it will print the results of invoking the custom error or Stringer |  | ||||||
| 	// interface and return immediately instead of continuing to recurse into |  | ||||||
| 	// the internals of the data type. |  | ||||||
| 	// |  | ||||||
| 	// NOTE: This flag does not have any effect if method invocation is disabled |  | ||||||
| 	// via the DisableMethods or DisablePointerMethods options. |  | ||||||
| 	ContinueOnMethod bool |  | ||||||
|  |  | ||||||
| 	// SortKeys specifies map keys should be sorted before being printed. Use |  | ||||||
| 	// this to have a more deterministic, diffable output.  Note that only |  | ||||||
| 	// native types (bool, int, uint, floats, uintptr and string) and types |  | ||||||
| 	// that support the error or Stringer interfaces (if methods are |  | ||||||
| 	// enabled) are supported, with other types sorted according to the |  | ||||||
| 	// reflect.Value.String() output which guarantees display stability. |  | ||||||
| 	SortKeys bool |  | ||||||
|  |  | ||||||
| 	// SpewKeys specifies that, as a last resort attempt, map keys should |  | ||||||
| 	// be spewed to strings and sorted by those strings.  This is only |  | ||||||
| 	// considered if SortKeys is true. |  | ||||||
| 	SpewKeys bool |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Config is the active configuration of the top-level functions. |  | ||||||
| // The configuration can be changed by modifying the contents of spew.Config. |  | ||||||
| var Config = ConfigState{Indent: " "} |  | ||||||
|  |  | ||||||
| // Errorf is a wrapper for fmt.Errorf that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the formatted string as a value that satisfies error.  See NewFormatter |  | ||||||
| // for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Errorf(format string, a ...interface{}) (err error) { |  | ||||||
| 	return fmt.Errorf(format, c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fprint is a wrapper for fmt.Fprint that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Fprint(w, c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Fprintf(w, format, c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Fprintln(w, c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Print is a wrapper for fmt.Print that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Print(c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Print(a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Print(c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Printf is a wrapper for fmt.Printf that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Printf(format, c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Println is a wrapper for fmt.Println that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Println(c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Println(a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Println(c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sprint is a wrapper for fmt.Sprint that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the resulting string.  See NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Sprint(a ...interface{}) string { |  | ||||||
| 	return fmt.Sprint(c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were |  | ||||||
| // passed with a Formatter interface returned by c.NewFormatter.  It returns |  | ||||||
| // the resulting string.  See NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Sprintf(format string, a ...interface{}) string { |  | ||||||
| 	return fmt.Sprintf(format, c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it |  | ||||||
| // were passed with a Formatter interface returned by c.NewFormatter.  It |  | ||||||
| // returns the resulting string.  See NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b)) |  | ||||||
| func (c *ConfigState) Sprintln(a ...interface{}) string { |  | ||||||
| 	return fmt.Sprintln(c.convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| NewFormatter returns a custom formatter that satisfies the fmt.Formatter |  | ||||||
| interface.  As a result, it integrates cleanly with standard fmt package |  | ||||||
| printing functions.  The formatter is useful for inline printing of smaller data |  | ||||||
| types similar to the standard %v format specifier. |  | ||||||
|  |  | ||||||
| The custom formatter only responds to the %v (most compact), %+v (adds pointer |  | ||||||
| addresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb |  | ||||||
| combinations.  Any other verbs such as %x and %q will be sent to the the |  | ||||||
| standard fmt package for formatting.  In addition, the custom formatter ignores |  | ||||||
| the width and precision arguments (however they will still work on the format |  | ||||||
| specifiers not handled by the custom formatter). |  | ||||||
|  |  | ||||||
| Typically this function shouldn't be called directly.  It is much easier to make |  | ||||||
| use of the custom formatter by calling one of the convenience functions such as |  | ||||||
| c.Printf, c.Println, or c.Printf. |  | ||||||
| */ |  | ||||||
| func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter { |  | ||||||
| 	return newFormatter(c, v) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fdump formats and displays the passed arguments to io.Writer w.  It formats |  | ||||||
| // exactly the same as Dump. |  | ||||||
| func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) { |  | ||||||
| 	fdump(c, w, a...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| Dump displays the passed parameters to standard out with newlines, customizable |  | ||||||
| indentation, and additional debug information such as complete types and all |  | ||||||
| pointer addresses used to indirect to the final value.  It provides the |  | ||||||
| following features over the built-in printing facilities provided by the fmt |  | ||||||
| package: |  | ||||||
|  |  | ||||||
| 	* Pointers are dereferenced and followed |  | ||||||
| 	* Circular data structures are detected and handled properly |  | ||||||
| 	* Custom Stringer/error interfaces are optionally invoked, including |  | ||||||
| 	  on unexported types |  | ||||||
| 	* Custom types which only implement the Stringer/error interfaces via |  | ||||||
| 	  a pointer receiver are optionally invoked when passing non-pointer |  | ||||||
| 	  variables |  | ||||||
| 	* Byte arrays and slices are dumped like the hexdump -C command which |  | ||||||
| 	  includes offsets, byte values in hex, and ASCII output |  | ||||||
|  |  | ||||||
| The configuration options are controlled by modifying the public members |  | ||||||
| of c.  See ConfigState for options documentation. |  | ||||||
|  |  | ||||||
| See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to |  | ||||||
| get the formatted result as a string. |  | ||||||
| */ |  | ||||||
| func (c *ConfigState) Dump(a ...interface{}) { |  | ||||||
| 	fdump(c, os.Stdout, a...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sdump returns a string with the passed arguments formatted exactly the same |  | ||||||
| // as Dump. |  | ||||||
| func (c *ConfigState) Sdump(a ...interface{}) string { |  | ||||||
| 	var buf bytes.Buffer |  | ||||||
| 	fdump(c, &buf, a...) |  | ||||||
| 	return buf.String() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // convertArgs accepts a slice of arguments and returns a slice of the same |  | ||||||
| // length with each argument converted to a spew Formatter interface using |  | ||||||
| // the ConfigState associated with s. |  | ||||||
| func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) { |  | ||||||
| 	formatters = make([]interface{}, len(args)) |  | ||||||
| 	for index, arg := range args { |  | ||||||
| 		formatters[index] = newFormatter(c, arg) |  | ||||||
| 	} |  | ||||||
| 	return formatters |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // NewDefaultConfig returns a ConfigState with the following default settings. |  | ||||||
| // |  | ||||||
| // 	Indent: " " |  | ||||||
| // 	MaxDepth: 0 |  | ||||||
| // 	DisableMethods: false |  | ||||||
| // 	DisablePointerMethods: false |  | ||||||
| // 	ContinueOnMethod: false |  | ||||||
| // 	SortKeys: false |  | ||||||
| func NewDefaultConfig() *ConfigState { |  | ||||||
| 	return &ConfigState{Indent: " "} |  | ||||||
| } |  | ||||||
							
								
								
									
										211
									
								
								vendor/github.com/davecgh/go-spew/spew/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										211
									
								
								vendor/github.com/davecgh/go-spew/spew/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,211 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Copyright (c) 2013-2016 Dave Collins <dave@davec.name> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| Package spew implements a deep pretty printer for Go data structures to aid in |  | ||||||
| debugging. |  | ||||||
|  |  | ||||||
| A quick overview of the additional features spew provides over the built-in |  | ||||||
| printing facilities for Go data types are as follows: |  | ||||||
|  |  | ||||||
| 	* Pointers are dereferenced and followed |  | ||||||
| 	* Circular data structures are detected and handled properly |  | ||||||
| 	* Custom Stringer/error interfaces are optionally invoked, including |  | ||||||
| 	  on unexported types |  | ||||||
| 	* Custom types which only implement the Stringer/error interfaces via |  | ||||||
| 	  a pointer receiver are optionally invoked when passing non-pointer |  | ||||||
| 	  variables |  | ||||||
| 	* Byte arrays and slices are dumped like the hexdump -C command which |  | ||||||
| 	  includes offsets, byte values in hex, and ASCII output (only when using |  | ||||||
| 	  Dump style) |  | ||||||
|  |  | ||||||
| There are two different approaches spew allows for dumping Go data structures: |  | ||||||
|  |  | ||||||
| 	* Dump style which prints with newlines, customizable indentation, |  | ||||||
| 	  and additional debug information such as types and all pointer addresses |  | ||||||
| 	  used to indirect to the final value |  | ||||||
| 	* A custom Formatter interface that integrates cleanly with the standard fmt |  | ||||||
| 	  package and replaces %v, %+v, %#v, and %#+v to provide inline printing |  | ||||||
| 	  similar to the default %v while providing the additional functionality |  | ||||||
| 	  outlined above and passing unsupported format verbs such as %x and %q |  | ||||||
| 	  along to fmt |  | ||||||
|  |  | ||||||
| Quick Start |  | ||||||
|  |  | ||||||
| This section demonstrates how to quickly get started with spew.  See the |  | ||||||
| sections below for further details on formatting and configuration options. |  | ||||||
|  |  | ||||||
| To dump a variable with full newlines, indentation, type, and pointer |  | ||||||
| information use Dump, Fdump, or Sdump: |  | ||||||
| 	spew.Dump(myVar1, myVar2, ...) |  | ||||||
| 	spew.Fdump(someWriter, myVar1, myVar2, ...) |  | ||||||
| 	str := spew.Sdump(myVar1, myVar2, ...) |  | ||||||
|  |  | ||||||
| Alternatively, if you would prefer to use format strings with a compacted inline |  | ||||||
| printing style, use the convenience wrappers Printf, Fprintf, etc with |  | ||||||
| %v (most compact), %+v (adds pointer addresses), %#v (adds types), or |  | ||||||
| %#+v (adds types and pointer addresses): |  | ||||||
| 	spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) |  | ||||||
| 	spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) |  | ||||||
| 	spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) |  | ||||||
| 	spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) |  | ||||||
|  |  | ||||||
| Configuration Options |  | ||||||
|  |  | ||||||
| Configuration of spew is handled by fields in the ConfigState type.  For |  | ||||||
| convenience, all of the top-level functions use a global state available |  | ||||||
| via the spew.Config global. |  | ||||||
|  |  | ||||||
| It is also possible to create a ConfigState instance that provides methods |  | ||||||
| equivalent to the top-level functions.  This allows concurrent configuration |  | ||||||
| options.  See the ConfigState documentation for more details. |  | ||||||
|  |  | ||||||
| The following configuration options are available: |  | ||||||
| 	* Indent |  | ||||||
| 		String to use for each indentation level for Dump functions. |  | ||||||
| 		It is a single space by default.  A popular alternative is "\t". |  | ||||||
|  |  | ||||||
| 	* MaxDepth |  | ||||||
| 		Maximum number of levels to descend into nested data structures. |  | ||||||
| 		There is no limit by default. |  | ||||||
|  |  | ||||||
| 	* DisableMethods |  | ||||||
| 		Disables invocation of error and Stringer interface methods. |  | ||||||
| 		Method invocation is enabled by default. |  | ||||||
|  |  | ||||||
| 	* DisablePointerMethods |  | ||||||
| 		Disables invocation of error and Stringer interface methods on types |  | ||||||
| 		which only accept pointer receivers from non-pointer variables. |  | ||||||
| 		Pointer method invocation is enabled by default. |  | ||||||
|  |  | ||||||
| 	* DisablePointerAddresses |  | ||||||
| 		DisablePointerAddresses specifies whether to disable the printing of |  | ||||||
| 		pointer addresses. This is useful when diffing data structures in tests. |  | ||||||
|  |  | ||||||
| 	* DisableCapacities |  | ||||||
| 		DisableCapacities specifies whether to disable the printing of |  | ||||||
| 		capacities for arrays, slices, maps and channels. This is useful when |  | ||||||
| 		diffing data structures in tests. |  | ||||||
|  |  | ||||||
| 	* ContinueOnMethod |  | ||||||
| 		Enables recursion into types after invoking error and Stringer interface |  | ||||||
| 		methods. Recursion after method invocation is disabled by default. |  | ||||||
|  |  | ||||||
| 	* SortKeys |  | ||||||
| 		Specifies map keys should be sorted before being printed. Use |  | ||||||
| 		this to have a more deterministic, diffable output.  Note that |  | ||||||
| 		only native types (bool, int, uint, floats, uintptr and string) |  | ||||||
| 		and types which implement error or Stringer interfaces are |  | ||||||
| 		supported with other types sorted according to the |  | ||||||
| 		reflect.Value.String() output which guarantees display |  | ||||||
| 		stability.  Natural map order is used by default. |  | ||||||
|  |  | ||||||
| 	* SpewKeys |  | ||||||
| 		Specifies that, as a last resort attempt, map keys should be |  | ||||||
| 		spewed to strings and sorted by those strings.  This is only |  | ||||||
| 		considered if SortKeys is true. |  | ||||||
|  |  | ||||||
| Dump Usage |  | ||||||
|  |  | ||||||
| Simply call spew.Dump with a list of variables you want to dump: |  | ||||||
|  |  | ||||||
| 	spew.Dump(myVar1, myVar2, ...) |  | ||||||
|  |  | ||||||
| You may also call spew.Fdump if you would prefer to output to an arbitrary |  | ||||||
| io.Writer.  For example, to dump to standard error: |  | ||||||
|  |  | ||||||
| 	spew.Fdump(os.Stderr, myVar1, myVar2, ...) |  | ||||||
|  |  | ||||||
| A third option is to call spew.Sdump to get the formatted output as a string: |  | ||||||
|  |  | ||||||
| 	str := spew.Sdump(myVar1, myVar2, ...) |  | ||||||
|  |  | ||||||
| Sample Dump Output |  | ||||||
|  |  | ||||||
| See the Dump example for details on the setup of the types and variables being |  | ||||||
| shown here. |  | ||||||
|  |  | ||||||
| 	(main.Foo) { |  | ||||||
| 	 unexportedField: (*main.Bar)(0xf84002e210)({ |  | ||||||
| 	  flag: (main.Flag) flagTwo, |  | ||||||
| 	  data: (uintptr) <nil> |  | ||||||
| 	 }), |  | ||||||
| 	 ExportedField: (map[interface {}]interface {}) (len=1) { |  | ||||||
| 	  (string) (len=3) "one": (bool) true |  | ||||||
| 	 } |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C |  | ||||||
| command as shown. |  | ||||||
| 	([]uint8) (len=32 cap=32) { |  | ||||||
| 	 00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20  |............... | |  | ||||||
| 	 00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30  |!"#$%&'()*+,-./0| |  | ||||||
| 	 00000020  31 32                                             |12| |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| Custom Formatter |  | ||||||
|  |  | ||||||
| Spew provides a custom formatter that implements the fmt.Formatter interface |  | ||||||
| so that it integrates cleanly with standard fmt package printing functions. The |  | ||||||
| formatter is useful for inline printing of smaller data types similar to the |  | ||||||
| standard %v format specifier. |  | ||||||
|  |  | ||||||
| The custom formatter only responds to the %v (most compact), %+v (adds pointer |  | ||||||
| addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb |  | ||||||
| combinations.  Any other verbs such as %x and %q will be sent to the the |  | ||||||
| standard fmt package for formatting.  In addition, the custom formatter ignores |  | ||||||
| the width and precision arguments (however they will still work on the format |  | ||||||
| specifiers not handled by the custom formatter). |  | ||||||
|  |  | ||||||
| Custom Formatter Usage |  | ||||||
|  |  | ||||||
| The simplest way to make use of the spew custom formatter is to call one of the |  | ||||||
| convenience functions such as spew.Printf, spew.Println, or spew.Printf.  The |  | ||||||
| functions have syntax you are most likely already familiar with: |  | ||||||
|  |  | ||||||
| 	spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) |  | ||||||
| 	spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) |  | ||||||
| 	spew.Println(myVar, myVar2) |  | ||||||
| 	spew.Fprintf(os.Stderr, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) |  | ||||||
| 	spew.Fprintf(os.Stderr, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) |  | ||||||
|  |  | ||||||
| See the Index for the full list convenience functions. |  | ||||||
|  |  | ||||||
| Sample Formatter Output |  | ||||||
|  |  | ||||||
| Double pointer to a uint8: |  | ||||||
| 	  %v: <**>5 |  | ||||||
| 	 %+v: <**>(0xf8400420d0->0xf8400420c8)5 |  | ||||||
| 	 %#v: (**uint8)5 |  | ||||||
| 	%#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 |  | ||||||
|  |  | ||||||
| Pointer to circular struct with a uint8 field and a pointer to itself: |  | ||||||
| 	  %v: <*>{1 <*><shown>} |  | ||||||
| 	 %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)<shown>} |  | ||||||
| 	 %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)<shown>} |  | ||||||
| 	%#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)<shown>} |  | ||||||
|  |  | ||||||
| See the Printf example for details on the setup of variables being shown |  | ||||||
| here. |  | ||||||
|  |  | ||||||
| Errors |  | ||||||
|  |  | ||||||
| Since it is possible for custom Stringer/error interfaces to panic, spew |  | ||||||
| detects them and handles them internally by printing the panic information |  | ||||||
| inline with the output.  Since spew is intended to provide deep pretty printing |  | ||||||
| capabilities on structures, it intentionally does not return any errors. |  | ||||||
| */ |  | ||||||
| package spew |  | ||||||
							
								
								
									
										509
									
								
								vendor/github.com/davecgh/go-spew/spew/dump.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										509
									
								
								vendor/github.com/davecgh/go-spew/spew/dump.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,509 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Copyright (c) 2013-2016 Dave Collins <dave@davec.name> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| package spew |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"encoding/hex" |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"os" |  | ||||||
| 	"reflect" |  | ||||||
| 	"regexp" |  | ||||||
| 	"strconv" |  | ||||||
| 	"strings" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| var ( |  | ||||||
| 	// uint8Type is a reflect.Type representing a uint8.  It is used to |  | ||||||
| 	// convert cgo types to uint8 slices for hexdumping. |  | ||||||
| 	uint8Type = reflect.TypeOf(uint8(0)) |  | ||||||
|  |  | ||||||
| 	// cCharRE is a regular expression that matches a cgo char. |  | ||||||
| 	// It is used to detect character arrays to hexdump them. |  | ||||||
| 	cCharRE = regexp.MustCompile(`^.*\._Ctype_char$`) |  | ||||||
|  |  | ||||||
| 	// cUnsignedCharRE is a regular expression that matches a cgo unsigned |  | ||||||
| 	// char.  It is used to detect unsigned character arrays to hexdump |  | ||||||
| 	// them. |  | ||||||
| 	cUnsignedCharRE = regexp.MustCompile(`^.*\._Ctype_unsignedchar$`) |  | ||||||
|  |  | ||||||
| 	// cUint8tCharRE is a regular expression that matches a cgo uint8_t. |  | ||||||
| 	// It is used to detect uint8_t arrays to hexdump them. |  | ||||||
| 	cUint8tCharRE = regexp.MustCompile(`^.*\._Ctype_uint8_t$`) |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // dumpState contains information about the state of a dump operation. |  | ||||||
| type dumpState struct { |  | ||||||
| 	w                io.Writer |  | ||||||
| 	depth            int |  | ||||||
| 	pointers         map[uintptr]int |  | ||||||
| 	ignoreNextType   bool |  | ||||||
| 	ignoreNextIndent bool |  | ||||||
| 	cs               *ConfigState |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // indent performs indentation according to the depth level and cs.Indent |  | ||||||
| // option. |  | ||||||
| func (d *dumpState) indent() { |  | ||||||
| 	if d.ignoreNextIndent { |  | ||||||
| 		d.ignoreNextIndent = false |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	d.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // unpackValue returns values inside of non-nil interfaces when possible. |  | ||||||
| // This is useful for data types like structs, arrays, slices, and maps which |  | ||||||
| // can contain varying types packed inside an interface. |  | ||||||
| func (d *dumpState) unpackValue(v reflect.Value) reflect.Value { |  | ||||||
| 	if v.Kind() == reflect.Interface && !v.IsNil() { |  | ||||||
| 		v = v.Elem() |  | ||||||
| 	} |  | ||||||
| 	return v |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // dumpPtr handles formatting of pointers by indirecting them as necessary. |  | ||||||
| func (d *dumpState) dumpPtr(v reflect.Value) { |  | ||||||
| 	// Remove pointers at or below the current depth from map used to detect |  | ||||||
| 	// circular refs. |  | ||||||
| 	for k, depth := range d.pointers { |  | ||||||
| 		if depth >= d.depth { |  | ||||||
| 			delete(d.pointers, k) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Keep list of all dereferenced pointers to show later. |  | ||||||
| 	pointerChain := make([]uintptr, 0) |  | ||||||
|  |  | ||||||
| 	// Figure out how many levels of indirection there are by dereferencing |  | ||||||
| 	// pointers and unpacking interfaces down the chain while detecting circular |  | ||||||
| 	// references. |  | ||||||
| 	nilFound := false |  | ||||||
| 	cycleFound := false |  | ||||||
| 	indirects := 0 |  | ||||||
| 	ve := v |  | ||||||
| 	for ve.Kind() == reflect.Ptr { |  | ||||||
| 		if ve.IsNil() { |  | ||||||
| 			nilFound = true |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		indirects++ |  | ||||||
| 		addr := ve.Pointer() |  | ||||||
| 		pointerChain = append(pointerChain, addr) |  | ||||||
| 		if pd, ok := d.pointers[addr]; ok && pd < d.depth { |  | ||||||
| 			cycleFound = true |  | ||||||
| 			indirects-- |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		d.pointers[addr] = d.depth |  | ||||||
|  |  | ||||||
| 		ve = ve.Elem() |  | ||||||
| 		if ve.Kind() == reflect.Interface { |  | ||||||
| 			if ve.IsNil() { |  | ||||||
| 				nilFound = true |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 			ve = ve.Elem() |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Display type information. |  | ||||||
| 	d.w.Write(openParenBytes) |  | ||||||
| 	d.w.Write(bytes.Repeat(asteriskBytes, indirects)) |  | ||||||
| 	d.w.Write([]byte(ve.Type().String())) |  | ||||||
| 	d.w.Write(closeParenBytes) |  | ||||||
|  |  | ||||||
| 	// Display pointer information. |  | ||||||
| 	if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { |  | ||||||
| 		d.w.Write(openParenBytes) |  | ||||||
| 		for i, addr := range pointerChain { |  | ||||||
| 			if i > 0 { |  | ||||||
| 				d.w.Write(pointerChainBytes) |  | ||||||
| 			} |  | ||||||
| 			printHexPtr(d.w, addr) |  | ||||||
| 		} |  | ||||||
| 		d.w.Write(closeParenBytes) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Display dereferenced value. |  | ||||||
| 	d.w.Write(openParenBytes) |  | ||||||
| 	switch { |  | ||||||
| 	case nilFound: |  | ||||||
| 		d.w.Write(nilAngleBytes) |  | ||||||
|  |  | ||||||
| 	case cycleFound: |  | ||||||
| 		d.w.Write(circularBytes) |  | ||||||
|  |  | ||||||
| 	default: |  | ||||||
| 		d.ignoreNextType = true |  | ||||||
| 		d.dump(ve) |  | ||||||
| 	} |  | ||||||
| 	d.w.Write(closeParenBytes) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // dumpSlice handles formatting of arrays and slices.  Byte (uint8 under |  | ||||||
| // reflection) arrays and slices are dumped in hexdump -C fashion. |  | ||||||
| func (d *dumpState) dumpSlice(v reflect.Value) { |  | ||||||
| 	// Determine whether this type should be hex dumped or not.  Also, |  | ||||||
| 	// for types which should be hexdumped, try to use the underlying data |  | ||||||
| 	// first, then fall back to trying to convert them to a uint8 slice. |  | ||||||
| 	var buf []uint8 |  | ||||||
| 	doConvert := false |  | ||||||
| 	doHexDump := false |  | ||||||
| 	numEntries := v.Len() |  | ||||||
| 	if numEntries > 0 { |  | ||||||
| 		vt := v.Index(0).Type() |  | ||||||
| 		vts := vt.String() |  | ||||||
| 		switch { |  | ||||||
| 		// C types that need to be converted. |  | ||||||
| 		case cCharRE.MatchString(vts): |  | ||||||
| 			fallthrough |  | ||||||
| 		case cUnsignedCharRE.MatchString(vts): |  | ||||||
| 			fallthrough |  | ||||||
| 		case cUint8tCharRE.MatchString(vts): |  | ||||||
| 			doConvert = true |  | ||||||
|  |  | ||||||
| 		// Try to use existing uint8 slices and fall back to converting |  | ||||||
| 		// and copying if that fails. |  | ||||||
| 		case vt.Kind() == reflect.Uint8: |  | ||||||
| 			// We need an addressable interface to convert the type |  | ||||||
| 			// to a byte slice.  However, the reflect package won't |  | ||||||
| 			// give us an interface on certain things like |  | ||||||
| 			// unexported struct fields in order to enforce |  | ||||||
| 			// visibility rules.  We use unsafe, when available, to |  | ||||||
| 			// bypass these restrictions since this package does not |  | ||||||
| 			// mutate the values. |  | ||||||
| 			vs := v |  | ||||||
| 			if !vs.CanInterface() || !vs.CanAddr() { |  | ||||||
| 				vs = unsafeReflectValue(vs) |  | ||||||
| 			} |  | ||||||
| 			if !UnsafeDisabled { |  | ||||||
| 				vs = vs.Slice(0, numEntries) |  | ||||||
|  |  | ||||||
| 				// Use the existing uint8 slice if it can be |  | ||||||
| 				// type asserted. |  | ||||||
| 				iface := vs.Interface() |  | ||||||
| 				if slice, ok := iface.([]uint8); ok { |  | ||||||
| 					buf = slice |  | ||||||
| 					doHexDump = true |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// The underlying data needs to be converted if it can't |  | ||||||
| 			// be type asserted to a uint8 slice. |  | ||||||
| 			doConvert = true |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// Copy and convert the underlying type if needed. |  | ||||||
| 		if doConvert && vt.ConvertibleTo(uint8Type) { |  | ||||||
| 			// Convert and copy each element into a uint8 byte |  | ||||||
| 			// slice. |  | ||||||
| 			buf = make([]uint8, numEntries) |  | ||||||
| 			for i := 0; i < numEntries; i++ { |  | ||||||
| 				vv := v.Index(i) |  | ||||||
| 				buf[i] = uint8(vv.Convert(uint8Type).Uint()) |  | ||||||
| 			} |  | ||||||
| 			doHexDump = true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Hexdump the entire slice as needed. |  | ||||||
| 	if doHexDump { |  | ||||||
| 		indent := strings.Repeat(d.cs.Indent, d.depth) |  | ||||||
| 		str := indent + hex.Dump(buf) |  | ||||||
| 		str = strings.Replace(str, "\n", "\n"+indent, -1) |  | ||||||
| 		str = strings.TrimRight(str, d.cs.Indent) |  | ||||||
| 		d.w.Write([]byte(str)) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Recursively call dump for each item. |  | ||||||
| 	for i := 0; i < numEntries; i++ { |  | ||||||
| 		d.dump(d.unpackValue(v.Index(i))) |  | ||||||
| 		if i < (numEntries - 1) { |  | ||||||
| 			d.w.Write(commaNewlineBytes) |  | ||||||
| 		} else { |  | ||||||
| 			d.w.Write(newlineBytes) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // dump is the main workhorse for dumping a value.  It uses the passed reflect |  | ||||||
| // value to figure out what kind of object we are dealing with and formats it |  | ||||||
| // appropriately.  It is a recursive function, however circular data structures |  | ||||||
| // are detected and handled properly. |  | ||||||
| func (d *dumpState) dump(v reflect.Value) { |  | ||||||
| 	// Handle invalid reflect values immediately. |  | ||||||
| 	kind := v.Kind() |  | ||||||
| 	if kind == reflect.Invalid { |  | ||||||
| 		d.w.Write(invalidAngleBytes) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Handle pointers specially. |  | ||||||
| 	if kind == reflect.Ptr { |  | ||||||
| 		d.indent() |  | ||||||
| 		d.dumpPtr(v) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Print type information unless already handled elsewhere. |  | ||||||
| 	if !d.ignoreNextType { |  | ||||||
| 		d.indent() |  | ||||||
| 		d.w.Write(openParenBytes) |  | ||||||
| 		d.w.Write([]byte(v.Type().String())) |  | ||||||
| 		d.w.Write(closeParenBytes) |  | ||||||
| 		d.w.Write(spaceBytes) |  | ||||||
| 	} |  | ||||||
| 	d.ignoreNextType = false |  | ||||||
|  |  | ||||||
| 	// Display length and capacity if the built-in len and cap functions |  | ||||||
| 	// work with the value's kind and the len/cap itself is non-zero. |  | ||||||
| 	valueLen, valueCap := 0, 0 |  | ||||||
| 	switch v.Kind() { |  | ||||||
| 	case reflect.Array, reflect.Slice, reflect.Chan: |  | ||||||
| 		valueLen, valueCap = v.Len(), v.Cap() |  | ||||||
| 	case reflect.Map, reflect.String: |  | ||||||
| 		valueLen = v.Len() |  | ||||||
| 	} |  | ||||||
| 	if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { |  | ||||||
| 		d.w.Write(openParenBytes) |  | ||||||
| 		if valueLen != 0 { |  | ||||||
| 			d.w.Write(lenEqualsBytes) |  | ||||||
| 			printInt(d.w, int64(valueLen), 10) |  | ||||||
| 		} |  | ||||||
| 		if !d.cs.DisableCapacities && valueCap != 0 { |  | ||||||
| 			if valueLen != 0 { |  | ||||||
| 				d.w.Write(spaceBytes) |  | ||||||
| 			} |  | ||||||
| 			d.w.Write(capEqualsBytes) |  | ||||||
| 			printInt(d.w, int64(valueCap), 10) |  | ||||||
| 		} |  | ||||||
| 		d.w.Write(closeParenBytes) |  | ||||||
| 		d.w.Write(spaceBytes) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Call Stringer/error interfaces if they exist and the handle methods flag |  | ||||||
| 	// is enabled |  | ||||||
| 	if !d.cs.DisableMethods { |  | ||||||
| 		if (kind != reflect.Invalid) && (kind != reflect.Interface) { |  | ||||||
| 			if handled := handleMethods(d.cs, d.w, v); handled { |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	switch kind { |  | ||||||
| 	case reflect.Invalid: |  | ||||||
| 		// Do nothing.  We should never get here since invalid has already |  | ||||||
| 		// been handled above. |  | ||||||
|  |  | ||||||
| 	case reflect.Bool: |  | ||||||
| 		printBool(d.w, v.Bool()) |  | ||||||
|  |  | ||||||
| 	case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: |  | ||||||
| 		printInt(d.w, v.Int(), 10) |  | ||||||
|  |  | ||||||
| 	case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: |  | ||||||
| 		printUint(d.w, v.Uint(), 10) |  | ||||||
|  |  | ||||||
| 	case reflect.Float32: |  | ||||||
| 		printFloat(d.w, v.Float(), 32) |  | ||||||
|  |  | ||||||
| 	case reflect.Float64: |  | ||||||
| 		printFloat(d.w, v.Float(), 64) |  | ||||||
|  |  | ||||||
| 	case reflect.Complex64: |  | ||||||
| 		printComplex(d.w, v.Complex(), 32) |  | ||||||
|  |  | ||||||
| 	case reflect.Complex128: |  | ||||||
| 		printComplex(d.w, v.Complex(), 64) |  | ||||||
|  |  | ||||||
| 	case reflect.Slice: |  | ||||||
| 		if v.IsNil() { |  | ||||||
| 			d.w.Write(nilAngleBytes) |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		fallthrough |  | ||||||
|  |  | ||||||
| 	case reflect.Array: |  | ||||||
| 		d.w.Write(openBraceNewlineBytes) |  | ||||||
| 		d.depth++ |  | ||||||
| 		if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { |  | ||||||
| 			d.indent() |  | ||||||
| 			d.w.Write(maxNewlineBytes) |  | ||||||
| 		} else { |  | ||||||
| 			d.dumpSlice(v) |  | ||||||
| 		} |  | ||||||
| 		d.depth-- |  | ||||||
| 		d.indent() |  | ||||||
| 		d.w.Write(closeBraceBytes) |  | ||||||
|  |  | ||||||
| 	case reflect.String: |  | ||||||
| 		d.w.Write([]byte(strconv.Quote(v.String()))) |  | ||||||
|  |  | ||||||
| 	case reflect.Interface: |  | ||||||
| 		// The only time we should get here is for nil interfaces due to |  | ||||||
| 		// unpackValue calls. |  | ||||||
| 		if v.IsNil() { |  | ||||||
| 			d.w.Write(nilAngleBytes) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 	case reflect.Ptr: |  | ||||||
| 		// Do nothing.  We should never get here since pointers have already |  | ||||||
| 		// been handled above. |  | ||||||
|  |  | ||||||
| 	case reflect.Map: |  | ||||||
| 		// nil maps should be indicated as different than empty maps |  | ||||||
| 		if v.IsNil() { |  | ||||||
| 			d.w.Write(nilAngleBytes) |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		d.w.Write(openBraceNewlineBytes) |  | ||||||
| 		d.depth++ |  | ||||||
| 		if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { |  | ||||||
| 			d.indent() |  | ||||||
| 			d.w.Write(maxNewlineBytes) |  | ||||||
| 		} else { |  | ||||||
| 			numEntries := v.Len() |  | ||||||
| 			keys := v.MapKeys() |  | ||||||
| 			if d.cs.SortKeys { |  | ||||||
| 				sortValues(keys, d.cs) |  | ||||||
| 			} |  | ||||||
| 			for i, key := range keys { |  | ||||||
| 				d.dump(d.unpackValue(key)) |  | ||||||
| 				d.w.Write(colonSpaceBytes) |  | ||||||
| 				d.ignoreNextIndent = true |  | ||||||
| 				d.dump(d.unpackValue(v.MapIndex(key))) |  | ||||||
| 				if i < (numEntries - 1) { |  | ||||||
| 					d.w.Write(commaNewlineBytes) |  | ||||||
| 				} else { |  | ||||||
| 					d.w.Write(newlineBytes) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		d.depth-- |  | ||||||
| 		d.indent() |  | ||||||
| 		d.w.Write(closeBraceBytes) |  | ||||||
|  |  | ||||||
| 	case reflect.Struct: |  | ||||||
| 		d.w.Write(openBraceNewlineBytes) |  | ||||||
| 		d.depth++ |  | ||||||
| 		if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { |  | ||||||
| 			d.indent() |  | ||||||
| 			d.w.Write(maxNewlineBytes) |  | ||||||
| 		} else { |  | ||||||
| 			vt := v.Type() |  | ||||||
| 			numFields := v.NumField() |  | ||||||
| 			for i := 0; i < numFields; i++ { |  | ||||||
| 				d.indent() |  | ||||||
| 				vtf := vt.Field(i) |  | ||||||
| 				d.w.Write([]byte(vtf.Name)) |  | ||||||
| 				d.w.Write(colonSpaceBytes) |  | ||||||
| 				d.ignoreNextIndent = true |  | ||||||
| 				d.dump(d.unpackValue(v.Field(i))) |  | ||||||
| 				if i < (numFields - 1) { |  | ||||||
| 					d.w.Write(commaNewlineBytes) |  | ||||||
| 				} else { |  | ||||||
| 					d.w.Write(newlineBytes) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		d.depth-- |  | ||||||
| 		d.indent() |  | ||||||
| 		d.w.Write(closeBraceBytes) |  | ||||||
|  |  | ||||||
| 	case reflect.Uintptr: |  | ||||||
| 		printHexPtr(d.w, uintptr(v.Uint())) |  | ||||||
|  |  | ||||||
| 	case reflect.UnsafePointer, reflect.Chan, reflect.Func: |  | ||||||
| 		printHexPtr(d.w, v.Pointer()) |  | ||||||
|  |  | ||||||
| 	// There were not any other types at the time this code was written, but |  | ||||||
| 	// fall back to letting the default fmt package handle it in case any new |  | ||||||
| 	// types are added. |  | ||||||
| 	default: |  | ||||||
| 		if v.CanInterface() { |  | ||||||
| 			fmt.Fprintf(d.w, "%v", v.Interface()) |  | ||||||
| 		} else { |  | ||||||
| 			fmt.Fprintf(d.w, "%v", v.String()) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // fdump is a helper function to consolidate the logic from the various public |  | ||||||
| // methods which take varying writers and config states. |  | ||||||
| func fdump(cs *ConfigState, w io.Writer, a ...interface{}) { |  | ||||||
| 	for _, arg := range a { |  | ||||||
| 		if arg == nil { |  | ||||||
| 			w.Write(interfaceBytes) |  | ||||||
| 			w.Write(spaceBytes) |  | ||||||
| 			w.Write(nilAngleBytes) |  | ||||||
| 			w.Write(newlineBytes) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		d := dumpState{w: w, cs: cs} |  | ||||||
| 		d.pointers = make(map[uintptr]int) |  | ||||||
| 		d.dump(reflect.ValueOf(arg)) |  | ||||||
| 		d.w.Write(newlineBytes) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fdump formats and displays the passed arguments to io.Writer w.  It formats |  | ||||||
| // exactly the same as Dump. |  | ||||||
| func Fdump(w io.Writer, a ...interface{}) { |  | ||||||
| 	fdump(&Config, w, a...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sdump returns a string with the passed arguments formatted exactly the same |  | ||||||
| // as Dump. |  | ||||||
| func Sdump(a ...interface{}) string { |  | ||||||
| 	var buf bytes.Buffer |  | ||||||
| 	fdump(&Config, &buf, a...) |  | ||||||
| 	return buf.String() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| Dump displays the passed parameters to standard out with newlines, customizable |  | ||||||
| indentation, and additional debug information such as complete types and all |  | ||||||
| pointer addresses used to indirect to the final value.  It provides the |  | ||||||
| following features over the built-in printing facilities provided by the fmt |  | ||||||
| package: |  | ||||||
|  |  | ||||||
| 	* Pointers are dereferenced and followed |  | ||||||
| 	* Circular data structures are detected and handled properly |  | ||||||
| 	* Custom Stringer/error interfaces are optionally invoked, including |  | ||||||
| 	  on unexported types |  | ||||||
| 	* Custom types which only implement the Stringer/error interfaces via |  | ||||||
| 	  a pointer receiver are optionally invoked when passing non-pointer |  | ||||||
| 	  variables |  | ||||||
| 	* Byte arrays and slices are dumped like the hexdump -C command which |  | ||||||
| 	  includes offsets, byte values in hex, and ASCII output |  | ||||||
|  |  | ||||||
| The configuration options are controlled by an exported package global, |  | ||||||
| spew.Config.  See ConfigState for options documentation. |  | ||||||
|  |  | ||||||
| See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to |  | ||||||
| get the formatted result as a string. |  | ||||||
| */ |  | ||||||
| func Dump(a ...interface{}) { |  | ||||||
| 	fdump(&Config, os.Stdout, a...) |  | ||||||
| } |  | ||||||
							
								
								
									
										419
									
								
								vendor/github.com/davecgh/go-spew/spew/format.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										419
									
								
								vendor/github.com/davecgh/go-spew/spew/format.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,419 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Copyright (c) 2013-2016 Dave Collins <dave@davec.name> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| package spew |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"fmt" |  | ||||||
| 	"reflect" |  | ||||||
| 	"strconv" |  | ||||||
| 	"strings" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // supportedFlags is a list of all the character flags supported by fmt package. |  | ||||||
| const supportedFlags = "0-+# " |  | ||||||
|  |  | ||||||
| // formatState implements the fmt.Formatter interface and contains information |  | ||||||
| // about the state of a formatting operation.  The NewFormatter function can |  | ||||||
| // be used to get a new Formatter which can be used directly as arguments |  | ||||||
| // in standard fmt package printing calls. |  | ||||||
| type formatState struct { |  | ||||||
| 	value          interface{} |  | ||||||
| 	fs             fmt.State |  | ||||||
| 	depth          int |  | ||||||
| 	pointers       map[uintptr]int |  | ||||||
| 	ignoreNextType bool |  | ||||||
| 	cs             *ConfigState |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // buildDefaultFormat recreates the original format string without precision |  | ||||||
| // and width information to pass in to fmt.Sprintf in the case of an |  | ||||||
| // unrecognized type.  Unless new types are added to the language, this |  | ||||||
| // function won't ever be called. |  | ||||||
| func (f *formatState) buildDefaultFormat() (format string) { |  | ||||||
| 	buf := bytes.NewBuffer(percentBytes) |  | ||||||
|  |  | ||||||
| 	for _, flag := range supportedFlags { |  | ||||||
| 		if f.fs.Flag(int(flag)) { |  | ||||||
| 			buf.WriteRune(flag) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	buf.WriteRune('v') |  | ||||||
|  |  | ||||||
| 	format = buf.String() |  | ||||||
| 	return format |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // constructOrigFormat recreates the original format string including precision |  | ||||||
| // and width information to pass along to the standard fmt package.  This allows |  | ||||||
| // automatic deferral of all format strings this package doesn't support. |  | ||||||
| func (f *formatState) constructOrigFormat(verb rune) (format string) { |  | ||||||
| 	buf := bytes.NewBuffer(percentBytes) |  | ||||||
|  |  | ||||||
| 	for _, flag := range supportedFlags { |  | ||||||
| 		if f.fs.Flag(int(flag)) { |  | ||||||
| 			buf.WriteRune(flag) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if width, ok := f.fs.Width(); ok { |  | ||||||
| 		buf.WriteString(strconv.Itoa(width)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if precision, ok := f.fs.Precision(); ok { |  | ||||||
| 		buf.Write(precisionBytes) |  | ||||||
| 		buf.WriteString(strconv.Itoa(precision)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	buf.WriteRune(verb) |  | ||||||
|  |  | ||||||
| 	format = buf.String() |  | ||||||
| 	return format |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // unpackValue returns values inside of non-nil interfaces when possible and |  | ||||||
| // ensures that types for values which have been unpacked from an interface |  | ||||||
| // are displayed when the show types flag is also set. |  | ||||||
| // This is useful for data types like structs, arrays, slices, and maps which |  | ||||||
| // can contain varying types packed inside an interface. |  | ||||||
| func (f *formatState) unpackValue(v reflect.Value) reflect.Value { |  | ||||||
| 	if v.Kind() == reflect.Interface { |  | ||||||
| 		f.ignoreNextType = false |  | ||||||
| 		if !v.IsNil() { |  | ||||||
| 			v = v.Elem() |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return v |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // formatPtr handles formatting of pointers by indirecting them as necessary. |  | ||||||
| func (f *formatState) formatPtr(v reflect.Value) { |  | ||||||
| 	// Display nil if top level pointer is nil. |  | ||||||
| 	showTypes := f.fs.Flag('#') |  | ||||||
| 	if v.IsNil() && (!showTypes || f.ignoreNextType) { |  | ||||||
| 		f.fs.Write(nilAngleBytes) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Remove pointers at or below the current depth from map used to detect |  | ||||||
| 	// circular refs. |  | ||||||
| 	for k, depth := range f.pointers { |  | ||||||
| 		if depth >= f.depth { |  | ||||||
| 			delete(f.pointers, k) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Keep list of all dereferenced pointers to possibly show later. |  | ||||||
| 	pointerChain := make([]uintptr, 0) |  | ||||||
|  |  | ||||||
| 	// Figure out how many levels of indirection there are by derferencing |  | ||||||
| 	// pointers and unpacking interfaces down the chain while detecting circular |  | ||||||
| 	// references. |  | ||||||
| 	nilFound := false |  | ||||||
| 	cycleFound := false |  | ||||||
| 	indirects := 0 |  | ||||||
| 	ve := v |  | ||||||
| 	for ve.Kind() == reflect.Ptr { |  | ||||||
| 		if ve.IsNil() { |  | ||||||
| 			nilFound = true |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		indirects++ |  | ||||||
| 		addr := ve.Pointer() |  | ||||||
| 		pointerChain = append(pointerChain, addr) |  | ||||||
| 		if pd, ok := f.pointers[addr]; ok && pd < f.depth { |  | ||||||
| 			cycleFound = true |  | ||||||
| 			indirects-- |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		f.pointers[addr] = f.depth |  | ||||||
|  |  | ||||||
| 		ve = ve.Elem() |  | ||||||
| 		if ve.Kind() == reflect.Interface { |  | ||||||
| 			if ve.IsNil() { |  | ||||||
| 				nilFound = true |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 			ve = ve.Elem() |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Display type or indirection level depending on flags. |  | ||||||
| 	if showTypes && !f.ignoreNextType { |  | ||||||
| 		f.fs.Write(openParenBytes) |  | ||||||
| 		f.fs.Write(bytes.Repeat(asteriskBytes, indirects)) |  | ||||||
| 		f.fs.Write([]byte(ve.Type().String())) |  | ||||||
| 		f.fs.Write(closeParenBytes) |  | ||||||
| 	} else { |  | ||||||
| 		if nilFound || cycleFound { |  | ||||||
| 			indirects += strings.Count(ve.Type().String(), "*") |  | ||||||
| 		} |  | ||||||
| 		f.fs.Write(openAngleBytes) |  | ||||||
| 		f.fs.Write([]byte(strings.Repeat("*", indirects))) |  | ||||||
| 		f.fs.Write(closeAngleBytes) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Display pointer information depending on flags. |  | ||||||
| 	if f.fs.Flag('+') && (len(pointerChain) > 0) { |  | ||||||
| 		f.fs.Write(openParenBytes) |  | ||||||
| 		for i, addr := range pointerChain { |  | ||||||
| 			if i > 0 { |  | ||||||
| 				f.fs.Write(pointerChainBytes) |  | ||||||
| 			} |  | ||||||
| 			printHexPtr(f.fs, addr) |  | ||||||
| 		} |  | ||||||
| 		f.fs.Write(closeParenBytes) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Display dereferenced value. |  | ||||||
| 	switch { |  | ||||||
| 	case nilFound: |  | ||||||
| 		f.fs.Write(nilAngleBytes) |  | ||||||
|  |  | ||||||
| 	case cycleFound: |  | ||||||
| 		f.fs.Write(circularShortBytes) |  | ||||||
|  |  | ||||||
| 	default: |  | ||||||
| 		f.ignoreNextType = true |  | ||||||
| 		f.format(ve) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // format is the main workhorse for providing the Formatter interface.  It |  | ||||||
| // uses the passed reflect value to figure out what kind of object we are |  | ||||||
| // dealing with and formats it appropriately.  It is a recursive function, |  | ||||||
| // however circular data structures are detected and handled properly. |  | ||||||
| func (f *formatState) format(v reflect.Value) { |  | ||||||
| 	// Handle invalid reflect values immediately. |  | ||||||
| 	kind := v.Kind() |  | ||||||
| 	if kind == reflect.Invalid { |  | ||||||
| 		f.fs.Write(invalidAngleBytes) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Handle pointers specially. |  | ||||||
| 	if kind == reflect.Ptr { |  | ||||||
| 		f.formatPtr(v) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Print type information unless already handled elsewhere. |  | ||||||
| 	if !f.ignoreNextType && f.fs.Flag('#') { |  | ||||||
| 		f.fs.Write(openParenBytes) |  | ||||||
| 		f.fs.Write([]byte(v.Type().String())) |  | ||||||
| 		f.fs.Write(closeParenBytes) |  | ||||||
| 	} |  | ||||||
| 	f.ignoreNextType = false |  | ||||||
|  |  | ||||||
| 	// Call Stringer/error interfaces if they exist and the handle methods |  | ||||||
| 	// flag is enabled. |  | ||||||
| 	if !f.cs.DisableMethods { |  | ||||||
| 		if (kind != reflect.Invalid) && (kind != reflect.Interface) { |  | ||||||
| 			if handled := handleMethods(f.cs, f.fs, v); handled { |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	switch kind { |  | ||||||
| 	case reflect.Invalid: |  | ||||||
| 		// Do nothing.  We should never get here since invalid has already |  | ||||||
| 		// been handled above. |  | ||||||
|  |  | ||||||
| 	case reflect.Bool: |  | ||||||
| 		printBool(f.fs, v.Bool()) |  | ||||||
|  |  | ||||||
| 	case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: |  | ||||||
| 		printInt(f.fs, v.Int(), 10) |  | ||||||
|  |  | ||||||
| 	case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: |  | ||||||
| 		printUint(f.fs, v.Uint(), 10) |  | ||||||
|  |  | ||||||
| 	case reflect.Float32: |  | ||||||
| 		printFloat(f.fs, v.Float(), 32) |  | ||||||
|  |  | ||||||
| 	case reflect.Float64: |  | ||||||
| 		printFloat(f.fs, v.Float(), 64) |  | ||||||
|  |  | ||||||
| 	case reflect.Complex64: |  | ||||||
| 		printComplex(f.fs, v.Complex(), 32) |  | ||||||
|  |  | ||||||
| 	case reflect.Complex128: |  | ||||||
| 		printComplex(f.fs, v.Complex(), 64) |  | ||||||
|  |  | ||||||
| 	case reflect.Slice: |  | ||||||
| 		if v.IsNil() { |  | ||||||
| 			f.fs.Write(nilAngleBytes) |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		fallthrough |  | ||||||
|  |  | ||||||
| 	case reflect.Array: |  | ||||||
| 		f.fs.Write(openBracketBytes) |  | ||||||
| 		f.depth++ |  | ||||||
| 		if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { |  | ||||||
| 			f.fs.Write(maxShortBytes) |  | ||||||
| 		} else { |  | ||||||
| 			numEntries := v.Len() |  | ||||||
| 			for i := 0; i < numEntries; i++ { |  | ||||||
| 				if i > 0 { |  | ||||||
| 					f.fs.Write(spaceBytes) |  | ||||||
| 				} |  | ||||||
| 				f.ignoreNextType = true |  | ||||||
| 				f.format(f.unpackValue(v.Index(i))) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		f.depth-- |  | ||||||
| 		f.fs.Write(closeBracketBytes) |  | ||||||
|  |  | ||||||
| 	case reflect.String: |  | ||||||
| 		f.fs.Write([]byte(v.String())) |  | ||||||
|  |  | ||||||
| 	case reflect.Interface: |  | ||||||
| 		// The only time we should get here is for nil interfaces due to |  | ||||||
| 		// unpackValue calls. |  | ||||||
| 		if v.IsNil() { |  | ||||||
| 			f.fs.Write(nilAngleBytes) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 	case reflect.Ptr: |  | ||||||
| 		// Do nothing.  We should never get here since pointers have already |  | ||||||
| 		// been handled above. |  | ||||||
|  |  | ||||||
| 	case reflect.Map: |  | ||||||
| 		// nil maps should be indicated as different than empty maps |  | ||||||
| 		if v.IsNil() { |  | ||||||
| 			f.fs.Write(nilAngleBytes) |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		f.fs.Write(openMapBytes) |  | ||||||
| 		f.depth++ |  | ||||||
| 		if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { |  | ||||||
| 			f.fs.Write(maxShortBytes) |  | ||||||
| 		} else { |  | ||||||
| 			keys := v.MapKeys() |  | ||||||
| 			if f.cs.SortKeys { |  | ||||||
| 				sortValues(keys, f.cs) |  | ||||||
| 			} |  | ||||||
| 			for i, key := range keys { |  | ||||||
| 				if i > 0 { |  | ||||||
| 					f.fs.Write(spaceBytes) |  | ||||||
| 				} |  | ||||||
| 				f.ignoreNextType = true |  | ||||||
| 				f.format(f.unpackValue(key)) |  | ||||||
| 				f.fs.Write(colonBytes) |  | ||||||
| 				f.ignoreNextType = true |  | ||||||
| 				f.format(f.unpackValue(v.MapIndex(key))) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		f.depth-- |  | ||||||
| 		f.fs.Write(closeMapBytes) |  | ||||||
|  |  | ||||||
| 	case reflect.Struct: |  | ||||||
| 		numFields := v.NumField() |  | ||||||
| 		f.fs.Write(openBraceBytes) |  | ||||||
| 		f.depth++ |  | ||||||
| 		if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { |  | ||||||
| 			f.fs.Write(maxShortBytes) |  | ||||||
| 		} else { |  | ||||||
| 			vt := v.Type() |  | ||||||
| 			for i := 0; i < numFields; i++ { |  | ||||||
| 				if i > 0 { |  | ||||||
| 					f.fs.Write(spaceBytes) |  | ||||||
| 				} |  | ||||||
| 				vtf := vt.Field(i) |  | ||||||
| 				if f.fs.Flag('+') || f.fs.Flag('#') { |  | ||||||
| 					f.fs.Write([]byte(vtf.Name)) |  | ||||||
| 					f.fs.Write(colonBytes) |  | ||||||
| 				} |  | ||||||
| 				f.format(f.unpackValue(v.Field(i))) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		f.depth-- |  | ||||||
| 		f.fs.Write(closeBraceBytes) |  | ||||||
|  |  | ||||||
| 	case reflect.Uintptr: |  | ||||||
| 		printHexPtr(f.fs, uintptr(v.Uint())) |  | ||||||
|  |  | ||||||
| 	case reflect.UnsafePointer, reflect.Chan, reflect.Func: |  | ||||||
| 		printHexPtr(f.fs, v.Pointer()) |  | ||||||
|  |  | ||||||
| 	// There were not any other types at the time this code was written, but |  | ||||||
| 	// fall back to letting the default fmt package handle it if any get added. |  | ||||||
| 	default: |  | ||||||
| 		format := f.buildDefaultFormat() |  | ||||||
| 		if v.CanInterface() { |  | ||||||
| 			fmt.Fprintf(f.fs, format, v.Interface()) |  | ||||||
| 		} else { |  | ||||||
| 			fmt.Fprintf(f.fs, format, v.String()) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Format satisfies the fmt.Formatter interface. See NewFormatter for usage |  | ||||||
| // details. |  | ||||||
| func (f *formatState) Format(fs fmt.State, verb rune) { |  | ||||||
| 	f.fs = fs |  | ||||||
|  |  | ||||||
| 	// Use standard formatting for verbs that are not v. |  | ||||||
| 	if verb != 'v' { |  | ||||||
| 		format := f.constructOrigFormat(verb) |  | ||||||
| 		fmt.Fprintf(fs, format, f.value) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if f.value == nil { |  | ||||||
| 		if fs.Flag('#') { |  | ||||||
| 			fs.Write(interfaceBytes) |  | ||||||
| 		} |  | ||||||
| 		fs.Write(nilAngleBytes) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	f.format(reflect.ValueOf(f.value)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // newFormatter is a helper function to consolidate the logic from the various |  | ||||||
| // public methods which take varying config states. |  | ||||||
| func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter { |  | ||||||
| 	fs := &formatState{value: v, cs: cs} |  | ||||||
| 	fs.pointers = make(map[uintptr]int) |  | ||||||
| 	return fs |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| NewFormatter returns a custom formatter that satisfies the fmt.Formatter |  | ||||||
| interface.  As a result, it integrates cleanly with standard fmt package |  | ||||||
| printing functions.  The formatter is useful for inline printing of smaller data |  | ||||||
| types similar to the standard %v format specifier. |  | ||||||
|  |  | ||||||
| The custom formatter only responds to the %v (most compact), %+v (adds pointer |  | ||||||
| addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb |  | ||||||
| combinations.  Any other verbs such as %x and %q will be sent to the the |  | ||||||
| standard fmt package for formatting.  In addition, the custom formatter ignores |  | ||||||
| the width and precision arguments (however they will still work on the format |  | ||||||
| specifiers not handled by the custom formatter). |  | ||||||
|  |  | ||||||
| Typically this function shouldn't be called directly.  It is much easier to make |  | ||||||
| use of the custom formatter by calling one of the convenience functions such as |  | ||||||
| Printf, Println, or Fprintf. |  | ||||||
| */ |  | ||||||
| func NewFormatter(v interface{}) fmt.Formatter { |  | ||||||
| 	return newFormatter(&Config, v) |  | ||||||
| } |  | ||||||
							
								
								
									
										148
									
								
								vendor/github.com/davecgh/go-spew/spew/spew.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										148
									
								
								vendor/github.com/davecgh/go-spew/spew/spew.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,148 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Copyright (c) 2013-2016 Dave Collins <dave@davec.name> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |  | ||||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| package spew |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Errorf is a wrapper for fmt.Errorf that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the formatted string as a value that satisfies error.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Errorf(format string, a ...interface{}) (err error) { |  | ||||||
| 	return fmt.Errorf(format, convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fprint is a wrapper for fmt.Fprint that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Fprint(w io.Writer, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Fprint(w, convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Fprintf(w, format, convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Fprintln(w, convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Print is a wrapper for fmt.Print that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Print(spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Print(a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Print(convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Printf is a wrapper for fmt.Printf that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Printf(format string, a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Printf(format, convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Println is a wrapper for fmt.Println that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the number of bytes written and any write error encountered.  See |  | ||||||
| // NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Println(spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Println(a ...interface{}) (n int, err error) { |  | ||||||
| 	return fmt.Println(convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sprint is a wrapper for fmt.Sprint that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the resulting string.  See NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Sprint(a ...interface{}) string { |  | ||||||
| 	return fmt.Sprint(convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were |  | ||||||
| // passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the resulting string.  See NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Sprintf(format string, a ...interface{}) string { |  | ||||||
| 	return fmt.Sprintf(format, convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it |  | ||||||
| // were passed with a default Formatter interface returned by NewFormatter.  It |  | ||||||
| // returns the resulting string.  See NewFormatter for formatting details. |  | ||||||
| // |  | ||||||
| // This function is shorthand for the following syntax: |  | ||||||
| // |  | ||||||
| //	fmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b)) |  | ||||||
| func Sprintln(a ...interface{}) string { |  | ||||||
| 	return fmt.Sprintln(convertArgs(a)...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // convertArgs accepts a slice of arguments and returns a slice of the same |  | ||||||
| // length with each argument converted to a default spew Formatter interface. |  | ||||||
| func convertArgs(args []interface{}) (formatters []interface{}) { |  | ||||||
| 	formatters = make([]interface{}, len(args)) |  | ||||||
| 	for index, arg := range args { |  | ||||||
| 		formatters[index] = NewFormatter(arg) |  | ||||||
| 	} |  | ||||||
| 	return formatters |  | ||||||
| } |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/go-hclog/colorize_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/go-hclog/colorize_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,7 +8,7 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| // setColorization will mutate the values of this logger | // setColorization will mutate the values of this logger | ||||||
| // to approperately configure colorization options. It provides | // to appropriately configure colorization options. It provides | ||||||
| // a wrapper to the output stream on Windows systems. | // a wrapper to the output stream on Windows systems. | ||||||
| func (l *intLogger) setColorization(opts *LoggerOptions) { | func (l *intLogger) setColorization(opts *LoggerOptions) { | ||||||
| 	switch opts.Color { | 	switch opts.Color { | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/go-hclog/colorize_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/go-hclog/colorize_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -11,7 +11,7 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| // setColorization will mutate the values of this logger | // setColorization will mutate the values of this logger | ||||||
| // to approperately configure colorization options. It provides | // to appropriately configure colorization options. It provides | ||||||
| // a wrapper to the output stream on Windows systems. | // a wrapper to the output stream on Windows systems. | ||||||
| func (l *intLogger) setColorization(opts *LoggerOptions) { | func (l *intLogger) setColorization(opts *LoggerOptions) { | ||||||
| 	switch opts.Color { | 	switch opts.Color { | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								vendor/github.com/hashicorp/go-hclog/global.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/hashicorp/go-hclog/global.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -20,13 +20,13 @@ var ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| // Default returns a globally held logger. This can be a good starting | // Default returns a globally held logger. This can be a good starting | ||||||
| // place, and then you can use .With() and .Name() to create sub-loggers | // place, and then you can use .With() and .Named() to create sub-loggers | ||||||
| // to be used in more specific contexts. | // to be used in more specific contexts. | ||||||
| // The value of the Default logger can be set via SetDefault() or by | // The value of the Default logger can be set via SetDefault() or by | ||||||
| // changing the options in DefaultOptions. | // changing the options in DefaultOptions. | ||||||
| // | // | ||||||
| // This method is goroutine safe, returning a global from memory, but | // This method is goroutine safe, returning a global from memory, but | ||||||
| // cause should be used if SetDefault() is called it random times | // care should be used if SetDefault() is called it random times | ||||||
| // in the program as that may result in race conditions and an unexpected | // in the program as that may result in race conditions and an unexpected | ||||||
| // Logger being returned. | // Logger being returned. | ||||||
| func Default() Logger { | func Default() Logger { | ||||||
|   | |||||||
							
								
								
									
										172
									
								
								vendor/github.com/hashicorp/go-hclog/intlogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										172
									
								
								vendor/github.com/hashicorp/go-hclog/intlogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -17,6 +17,8 @@ import ( | |||||||
| 	"sync" | 	"sync" | ||||||
| 	"sync/atomic" | 	"sync/atomic" | ||||||
| 	"time" | 	"time" | ||||||
|  | 	"unicode" | ||||||
|  | 	"unicode/utf8" | ||||||
|  |  | ||||||
| 	"github.com/fatih/color" | 	"github.com/fatih/color" | ||||||
| ) | ) | ||||||
| @@ -48,6 +50,12 @@ var ( | |||||||
| 		Warn:  color.New(color.FgHiYellow), | 		Warn:  color.New(color.FgHiYellow), | ||||||
| 		Error: color.New(color.FgHiRed), | 		Error: color.New(color.FgHiRed), | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	faintBoldColor                 = color.New(color.Faint, color.Bold) | ||||||
|  | 	faintColor                     = color.New(color.Faint) | ||||||
|  | 	faintMultiLinePrefix           = faintColor.Sprint("  | ") | ||||||
|  | 	faintFieldSeparator            = faintColor.Sprint("=") | ||||||
|  | 	faintFieldSeparatorWithNewLine = faintColor.Sprint("=\n") | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Make sure that intLogger is a Logger | // Make sure that intLogger is a Logger | ||||||
| @@ -70,6 +78,7 @@ type intLogger struct { | |||||||
| 	level  *int32 | 	level  *int32 | ||||||
|  |  | ||||||
| 	headerColor ColorOption | 	headerColor ColorOption | ||||||
|  | 	fieldColor  ColorOption | ||||||
|  |  | ||||||
| 	implied []interface{} | 	implied []interface{} | ||||||
|  |  | ||||||
| @@ -115,14 +124,19 @@ func newLogger(opts *LoggerOptions) *intLogger { | |||||||
| 		mutex = new(sync.Mutex) | 		mutex = new(sync.Mutex) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var primaryColor, headerColor ColorOption | 	var ( | ||||||
|  | 		primaryColor ColorOption = ColorOff | ||||||
| 	if opts.ColorHeaderOnly { | 		headerColor  ColorOption = ColorOff | ||||||
| 		primaryColor = ColorOff | 		fieldColor   ColorOption = ColorOff | ||||||
|  | 	) | ||||||
|  | 	switch { | ||||||
|  | 	case opts.ColorHeaderOnly: | ||||||
| 		headerColor = opts.Color | 		headerColor = opts.Color | ||||||
| 	} else { | 	case opts.ColorHeaderAndFields: | ||||||
|  | 		fieldColor = opts.Color | ||||||
|  | 		headerColor = opts.Color | ||||||
|  | 	default: | ||||||
| 		primaryColor = opts.Color | 		primaryColor = opts.Color | ||||||
| 		headerColor = ColorOff |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	l := &intLogger{ | 	l := &intLogger{ | ||||||
| @@ -137,6 +151,7 @@ func newLogger(opts *LoggerOptions) *intLogger { | |||||||
| 		exclude:           opts.Exclude, | 		exclude:           opts.Exclude, | ||||||
| 		independentLevels: opts.IndependentLevels, | 		independentLevels: opts.IndependentLevels, | ||||||
| 		headerColor:       headerColor, | 		headerColor:       headerColor, | ||||||
|  | 		fieldColor:        fieldColor, | ||||||
| 	} | 	} | ||||||
| 	if opts.IncludeLocation { | 	if opts.IncludeLocation { | ||||||
| 		l.callerOffset = offsetIntLogger + opts.AdditionalLocationOffset | 		l.callerOffset = offsetIntLogger + opts.AdditionalLocationOffset | ||||||
| @@ -235,7 +250,17 @@ func needsQuoting(str string) bool { | |||||||
| 	return false | 	return false | ||||||
| } | } | ||||||
|  |  | ||||||
| // Non-JSON logging format function | // logPlain is the non-JSON logging format function which writes directly | ||||||
|  | // to the underlying writer the logger was initialized with. | ||||||
|  | // | ||||||
|  | // If the logger was initialized with a color function, it also handles | ||||||
|  | // applying the color to the log message. | ||||||
|  | // | ||||||
|  | // Color Options | ||||||
|  | //  1. No color. | ||||||
|  | //  2. Color the whole log line, based on the level. | ||||||
|  | //  3. Color only the header (level) part of the log line. | ||||||
|  | //  4. Color both the header and fields of the log line. | ||||||
| func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, args ...interface{}) { | func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, args ...interface{}) { | ||||||
|  |  | ||||||
| 	if !l.disableTime { | 	if !l.disableTime { | ||||||
| @@ -269,16 +294,19 @@ func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, | |||||||
|  |  | ||||||
| 	if name != "" { | 	if name != "" { | ||||||
| 		l.writer.WriteString(name) | 		l.writer.WriteString(name) | ||||||
|  | 		if msg != "" { | ||||||
| 			l.writer.WriteString(": ") | 			l.writer.WriteString(": ") | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 			l.writer.WriteString(msg) | 			l.writer.WriteString(msg) | ||||||
|  | 		} | ||||||
|  | 	} else if msg != "" { | ||||||
|  | 		l.writer.WriteString(msg) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	args = append(l.implied, args...) | 	args = append(l.implied, args...) | ||||||
|  |  | ||||||
| 	var stacktrace CapturedStacktrace | 	var stacktrace CapturedStacktrace | ||||||
|  |  | ||||||
| 	if args != nil && len(args) > 0 { | 	if len(args) > 0 { | ||||||
| 		if len(args)%2 != 0 { | 		if len(args)%2 != 0 { | ||||||
| 			cs, ok := args[len(args)-1].(CapturedStacktrace) | 			cs, ok := args[len(args)-1].(CapturedStacktrace) | ||||||
| 			if ok { | 			if ok { | ||||||
| @@ -292,13 +320,16 @@ func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, | |||||||
|  |  | ||||||
| 		l.writer.WriteByte(':') | 		l.writer.WriteByte(':') | ||||||
|  |  | ||||||
|  | 		// Handle the field arguments, which come in pairs (key=val). | ||||||
| 	FOR: | 	FOR: | ||||||
| 		for i := 0; i < len(args); i = i + 2 { | 		for i := 0; i < len(args); i = i + 2 { | ||||||
| 			var ( | 			var ( | ||||||
|  | 				key string | ||||||
| 				val string | 				val string | ||||||
| 				raw bool | 				raw bool | ||||||
| 			) | 			) | ||||||
|  |  | ||||||
|  | 			// Convert the field value to a string. | ||||||
| 			switch st := args[i+1].(type) { | 			switch st := args[i+1].(type) { | ||||||
| 			case string: | 			case string: | ||||||
| 				val = st | 				val = st | ||||||
| @@ -350,8 +381,7 @@ func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			var key string | 			// Convert the field key to a string. | ||||||
|  |  | ||||||
| 			switch st := args[i].(type) { | 			switch st := args[i].(type) { | ||||||
| 			case string: | 			case string: | ||||||
| 				key = st | 				key = st | ||||||
| @@ -359,21 +389,49 @@ func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, | |||||||
| 				key = fmt.Sprintf("%s", st) | 				key = fmt.Sprintf("%s", st) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			// Optionally apply the ANSI "faint" and "bold" | ||||||
|  | 			// SGR values to the key. | ||||||
|  | 			if l.fieldColor != ColorOff { | ||||||
|  | 				key = faintBoldColor.Sprint(key) | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// Values may contain multiple lines, and that format | ||||||
|  | 			// is preserved, with each line prefixed with a "  | " | ||||||
|  | 			// to show it's part of a collection of lines. | ||||||
|  | 			// | ||||||
|  | 			// Values may also need quoting, if not all the runes | ||||||
|  | 			// in the value string are "normal", like if they | ||||||
|  | 			// contain ANSI escape sequences. | ||||||
| 			if strings.Contains(val, "\n") { | 			if strings.Contains(val, "\n") { | ||||||
| 				l.writer.WriteString("\n  ") | 				l.writer.WriteString("\n  ") | ||||||
| 				l.writer.WriteString(key) | 				l.writer.WriteString(key) | ||||||
|  | 				if l.fieldColor != ColorOff { | ||||||
|  | 					l.writer.WriteString(faintFieldSeparatorWithNewLine) | ||||||
|  | 					writeIndent(l.writer, val, faintMultiLinePrefix) | ||||||
|  | 				} else { | ||||||
| 					l.writer.WriteString("=\n") | 					l.writer.WriteString("=\n") | ||||||
| 					writeIndent(l.writer, val, "  | ") | 					writeIndent(l.writer, val, "  | ") | ||||||
|  | 				} | ||||||
| 				l.writer.WriteString("  ") | 				l.writer.WriteString("  ") | ||||||
| 			} else if !raw && needsQuoting(val) { | 			} else if !raw && needsQuoting(val) { | ||||||
| 				l.writer.WriteByte(' ') | 				l.writer.WriteByte(' ') | ||||||
| 				l.writer.WriteString(key) | 				l.writer.WriteString(key) | ||||||
|  | 				if l.fieldColor != ColorOff { | ||||||
|  | 					l.writer.WriteString(faintFieldSeparator) | ||||||
|  | 				} else { | ||||||
| 					l.writer.WriteByte('=') | 					l.writer.WriteByte('=') | ||||||
| 				l.writer.WriteString(strconv.Quote(val)) | 				} | ||||||
|  | 				l.writer.WriteByte('"') | ||||||
|  | 				writeEscapedForOutput(l.writer, val, true) | ||||||
|  | 				l.writer.WriteByte('"') | ||||||
| 			} else { | 			} else { | ||||||
| 				l.writer.WriteByte(' ') | 				l.writer.WriteByte(' ') | ||||||
| 				l.writer.WriteString(key) | 				l.writer.WriteString(key) | ||||||
|  | 				if l.fieldColor != ColorOff { | ||||||
|  | 					l.writer.WriteString(faintFieldSeparator) | ||||||
|  | 				} else { | ||||||
| 					l.writer.WriteByte('=') | 					l.writer.WriteByte('=') | ||||||
|  | 				} | ||||||
| 				l.writer.WriteString(val) | 				l.writer.WriteString(val) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @@ -393,19 +451,98 @@ func writeIndent(w *writer, str string, indent string) { | |||||||
| 		if nl == -1 { | 		if nl == -1 { | ||||||
| 			if str != "" { | 			if str != "" { | ||||||
| 				w.WriteString(indent) | 				w.WriteString(indent) | ||||||
| 				w.WriteString(str) | 				writeEscapedForOutput(w, str, false) | ||||||
| 				w.WriteString("\n") | 				w.WriteString("\n") | ||||||
| 			} | 			} | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		w.WriteString(indent) | 		w.WriteString(indent) | ||||||
| 		w.WriteString(str[:nl]) | 		writeEscapedForOutput(w, str[:nl], false) | ||||||
| 		w.WriteString("\n") | 		w.WriteString("\n") | ||||||
| 		str = str[nl+1:] | 		str = str[nl+1:] | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func needsEscaping(str string) bool { | ||||||
|  | 	for _, b := range str { | ||||||
|  | 		if !unicode.IsPrint(b) || b == '"' { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	lowerhex = "0123456789abcdef" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var bufPool = sync.Pool{ | ||||||
|  | 	New: func() interface{} { | ||||||
|  | 		return new(bytes.Buffer) | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func writeEscapedForOutput(w io.Writer, str string, escapeQuotes bool) { | ||||||
|  | 	if !needsEscaping(str) { | ||||||
|  | 		w.Write([]byte(str)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bb := bufPool.Get().(*bytes.Buffer) | ||||||
|  | 	bb.Reset() | ||||||
|  |  | ||||||
|  | 	defer bufPool.Put(bb) | ||||||
|  |  | ||||||
|  | 	for _, r := range str { | ||||||
|  | 		if escapeQuotes && r == '"' { | ||||||
|  | 			bb.WriteString(`\"`) | ||||||
|  | 		} else if unicode.IsPrint(r) { | ||||||
|  | 			bb.WriteRune(r) | ||||||
|  | 		} else { | ||||||
|  | 			switch r { | ||||||
|  | 			case '\a': | ||||||
|  | 				bb.WriteString(`\a`) | ||||||
|  | 			case '\b': | ||||||
|  | 				bb.WriteString(`\b`) | ||||||
|  | 			case '\f': | ||||||
|  | 				bb.WriteString(`\f`) | ||||||
|  | 			case '\n': | ||||||
|  | 				bb.WriteString(`\n`) | ||||||
|  | 			case '\r': | ||||||
|  | 				bb.WriteString(`\r`) | ||||||
|  | 			case '\t': | ||||||
|  | 				bb.WriteString(`\t`) | ||||||
|  | 			case '\v': | ||||||
|  | 				bb.WriteString(`\v`) | ||||||
|  | 			default: | ||||||
|  | 				switch { | ||||||
|  | 				case r < ' ': | ||||||
|  | 					bb.WriteString(`\x`) | ||||||
|  | 					bb.WriteByte(lowerhex[byte(r)>>4]) | ||||||
|  | 					bb.WriteByte(lowerhex[byte(r)&0xF]) | ||||||
|  | 				case !utf8.ValidRune(r): | ||||||
|  | 					r = 0xFFFD | ||||||
|  | 					fallthrough | ||||||
|  | 				case r < 0x10000: | ||||||
|  | 					bb.WriteString(`\u`) | ||||||
|  | 					for s := 12; s >= 0; s -= 4 { | ||||||
|  | 						bb.WriteByte(lowerhex[r>>uint(s)&0xF]) | ||||||
|  | 					} | ||||||
|  | 				default: | ||||||
|  | 					bb.WriteString(`\U`) | ||||||
|  | 					for s := 28; s >= 0; s -= 4 { | ||||||
|  | 						bb.WriteByte(lowerhex[r>>uint(s)&0xF]) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	w.Write(bb.Bytes()) | ||||||
|  | } | ||||||
|  |  | ||||||
| func (l *intLogger) renderSlice(v reflect.Value) string { | func (l *intLogger) renderSlice(v reflect.Value) string { | ||||||
| 	var buf bytes.Buffer | 	var buf bytes.Buffer | ||||||
|  |  | ||||||
| @@ -707,6 +844,11 @@ func (l *intLogger) SetLevel(level Level) { | |||||||
| 	atomic.StoreInt32(l.level, int32(level)) | 	atomic.StoreInt32(l.level, int32(level)) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Returns the current level | ||||||
|  | func (l *intLogger) GetLevel() Level { | ||||||
|  | 	return Level(atomic.LoadInt32(l.level)) | ||||||
|  | } | ||||||
|  |  | ||||||
| // Create a *log.Logger that will send it's data through this Logger. This | // Create a *log.Logger that will send it's data through this Logger. This | ||||||
| // allows packages that expect to be using the standard library log to actually | // allows packages that expect to be using the standard library log to actually | ||||||
| // use this logger. | // use this logger. | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								vendor/github.com/hashicorp/go-hclog/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/hashicorp/go-hclog/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -28,7 +28,7 @@ const ( | |||||||
| 	// of actions in code, such as function enters/exits, etc. | 	// of actions in code, such as function enters/exits, etc. | ||||||
| 	Trace Level = 1 | 	Trace Level = 1 | ||||||
|  |  | ||||||
| 	// Debug information for programmer lowlevel analysis. | 	// Debug information for programmer low-level analysis. | ||||||
| 	Debug Level = 2 | 	Debug Level = 2 | ||||||
|  |  | ||||||
| 	// Info information about steady state operations. | 	// Info information about steady state operations. | ||||||
| @@ -44,13 +44,13 @@ const ( | |||||||
| 	Off Level = 6 | 	Off Level = 6 | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Format is a simple convience type for when formatting is required. When | // Format is a simple convenience type for when formatting is required. When | ||||||
| // processing a value of this type, the logger automatically treats the first | // processing a value of this type, the logger automatically treats the first | ||||||
| // argument as a Printf formatting string and passes the rest as the values | // argument as a Printf formatting string and passes the rest as the values | ||||||
| // to be formatted. For example: L.Info(Fmt{"%d beans/day", beans}). | // to be formatted. For example: L.Info(Fmt{"%d beans/day", beans}). | ||||||
| type Format []interface{} | type Format []interface{} | ||||||
|  |  | ||||||
| // Fmt returns a Format type. This is a convience function for creating a Format | // Fmt returns a Format type. This is a convenience function for creating a Format | ||||||
| // type. | // type. | ||||||
| func Fmt(str string, args ...interface{}) Format { | func Fmt(str string, args ...interface{}) Format { | ||||||
| 	return append(Format{str}, args...) | 	return append(Format{str}, args...) | ||||||
| @@ -134,7 +134,7 @@ func (l Level) String() string { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Logger describes the interface that must be implemeted by all loggers. | // Logger describes the interface that must be implemented by all loggers. | ||||||
| type Logger interface { | type Logger interface { | ||||||
| 	// Args are alternating key, val pairs | 	// Args are alternating key, val pairs | ||||||
| 	// keys must be strings | 	// keys must be strings | ||||||
| @@ -198,6 +198,9 @@ type Logger interface { | |||||||
| 	// implementation cannot update the level on the fly, it should no-op. | 	// implementation cannot update the level on the fly, it should no-op. | ||||||
| 	SetLevel(level Level) | 	SetLevel(level Level) | ||||||
|  |  | ||||||
|  | 	// Returns the current level | ||||||
|  | 	GetLevel() Level | ||||||
|  |  | ||||||
| 	// Return a value that conforms to the stdlib log.Logger interface | 	// Return a value that conforms to the stdlib log.Logger interface | ||||||
| 	StandardLogger(opts *StandardLoggerOptions) *log.Logger | 	StandardLogger(opts *StandardLoggerOptions) *log.Logger | ||||||
|  |  | ||||||
| @@ -236,7 +239,7 @@ type LoggerOptions struct { | |||||||
| 	// Name of the subsystem to prefix logs with | 	// Name of the subsystem to prefix logs with | ||||||
| 	Name string | 	Name string | ||||||
|  |  | ||||||
| 	// The threshold for the logger. Anything less severe is supressed | 	// The threshold for the logger. Anything less severe is suppressed | ||||||
| 	Level Level | 	Level Level | ||||||
|  |  | ||||||
| 	// Where to write the logs to. Defaults to os.Stderr if nil | 	// Where to write the logs to. Defaults to os.Stderr if nil | ||||||
| @@ -267,13 +270,17 @@ type LoggerOptions struct { | |||||||
| 	// because setting TimeFormat to empty assumes the default format. | 	// because setting TimeFormat to empty assumes the default format. | ||||||
| 	DisableTime bool | 	DisableTime bool | ||||||
|  |  | ||||||
| 	// Color the output. On Windows, colored logs are only avaiable for io.Writers that | 	// Color the output. On Windows, colored logs are only available for io.Writers that | ||||||
| 	// are concretely instances of *os.File. | 	// are concretely instances of *os.File. | ||||||
| 	Color ColorOption | 	Color ColorOption | ||||||
|  |  | ||||||
| 	// Only color the header, not the body. This can help with readability of long messages. | 	// Only color the header, not the body. This can help with readability of long messages. | ||||||
| 	ColorHeaderOnly bool | 	ColorHeaderOnly bool | ||||||
|  |  | ||||||
|  | 	// Color the header and message body fields. This can help with readability | ||||||
|  | 	// of long messages with multiple fields. | ||||||
|  | 	ColorHeaderAndFields bool | ||||||
|  |  | ||||||
| 	// A function which is called with the log information and if it returns true the value | 	// A function which is called with the log information and if it returns true the value | ||||||
| 	// should not be logged. | 	// should not be logged. | ||||||
| 	// This is useful when interacting with a system that you wish to suppress the log | 	// This is useful when interacting with a system that you wish to suppress the log | ||||||
| @@ -282,8 +289,8 @@ type LoggerOptions struct { | |||||||
|  |  | ||||||
| 	// IndependentLevels causes subloggers to be created with an independent | 	// IndependentLevels causes subloggers to be created with an independent | ||||||
| 	// copy of this logger's level. This means that using SetLevel on this | 	// copy of this logger's level. This means that using SetLevel on this | ||||||
| 	// logger will not effect any subloggers, and SetLevel on any subloggers | 	// logger will not affect any subloggers, and SetLevel on any subloggers | ||||||
| 	// will not effect the parent or sibling loggers. | 	// will not affect the parent or sibling loggers. | ||||||
| 	IndependentLevels bool | 	IndependentLevels bool | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/go-hclog/nulllogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/go-hclog/nulllogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -49,6 +49,8 @@ func (l *nullLogger) ResetNamed(name string) Logger { return l } | |||||||
|  |  | ||||||
| func (l *nullLogger) SetLevel(level Level) {} | func (l *nullLogger) SetLevel(level Level) {} | ||||||
|  |  | ||||||
|  | func (l *nullLogger) GetLevel() Level { return NoLevel } | ||||||
|  |  | ||||||
| func (l *nullLogger) StandardLogger(opts *StandardLoggerOptions) *log.Logger { | func (l *nullLogger) StandardLogger(opts *StandardLoggerOptions) *log.Logger { | ||||||
| 	return log.New(l.StandardWriter(opts), "", log.LstdFlags) | 	return log.New(l.StandardWriter(opts), "", log.LstdFlags) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								vendor/github.com/hashicorp/go-plugin/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/hashicorp/go-plugin/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,15 @@ | |||||||
|  | ## v1.4.8 | ||||||
|  |  | ||||||
|  | BUG FIXES: | ||||||
|  |  | ||||||
|  | * Fix windows build: [[GH-227](https://github.com/hashicorp/go-plugin/pull/227)] | ||||||
|  |  | ||||||
|  | ## v1.4.7 | ||||||
|  |  | ||||||
|  | ENHANCEMENTS: | ||||||
|  |  | ||||||
|  | * More detailed error message on plugin start failure: [[GH-223](https://github.com/hashicorp/go-plugin/pull/223)] | ||||||
|  |  | ||||||
| ## v1.4.6 | ## v1.4.6 | ||||||
|  |  | ||||||
| BUG FIXES: | BUG FIXES: | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								vendor/github.com/hashicorp/go-plugin/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/hashicorp/go-plugin/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -26,6 +26,14 @@ import ( | |||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | const unrecognizedRemotePluginMessage = `Unrecognized remote plugin message: %s | ||||||
|  | This usually means | ||||||
|  |   the plugin was not compiled for this architecture, | ||||||
|  |   the plugin is missing dynamic-link libraries necessary to run, | ||||||
|  |   the plugin is not executable by this process due to file permissions, or | ||||||
|  |   the plugin failed to negotiate the initial go-plugin protocol handshake | ||||||
|  | %s` | ||||||
|  |  | ||||||
| // If this is 1, then we've called CleanupClients. This can be used | // If this is 1, then we've called CleanupClients. This can be used | ||||||
| // by plugin RPC implementations to change error behavior since you | // by plugin RPC implementations to change error behavior since you | ||||||
| // can expected network connection errors at this point. This should be | // can expected network connection errors at this point. This should be | ||||||
| @@ -473,7 +481,17 @@ func (c *Client) Kill() { | |||||||
| 	c.l.Unlock() | 	c.l.Unlock() | ||||||
| } | } | ||||||
|  |  | ||||||
| // Starts the underlying subprocess, communicating with it to negotiate | // peTypes is a list of Portable Executable (PE) machine types from https://learn.microsoft.com/en-us/windows/win32/debug/pe-format | ||||||
|  | // mapped to GOARCH types. It is not comprehensive, and only includes machine types that Go supports. | ||||||
|  | var peTypes = map[uint16]string{ | ||||||
|  | 	0x14c:  "386", | ||||||
|  | 	0x1c0:  "arm", | ||||||
|  | 	0x6264: "loong64", | ||||||
|  | 	0x8664: "amd64", | ||||||
|  | 	0xaa64: "arm64", | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Start the underlying subprocess, communicating with it to negotiate | ||||||
| // a port for RPC connections, and returning the address to connect via RPC. | // a port for RPC connections, and returning the address to connect via RPC. | ||||||
| // | // | ||||||
| // This method is safe to call multiple times. Subsequent calls have no effect. | // This method is safe to call multiple times. Subsequent calls have no effect. | ||||||
| @@ -697,10 +715,7 @@ func (c *Client) Start() (addr net.Addr, err error) { | |||||||
| 		line = strings.TrimSpace(line) | 		line = strings.TrimSpace(line) | ||||||
| 		parts := strings.SplitN(line, "|", 6) | 		parts := strings.SplitN(line, "|", 6) | ||||||
| 		if len(parts) < 4 { | 		if len(parts) < 4 { | ||||||
| 			err = fmt.Errorf( | 			err = fmt.Errorf(unrecognizedRemotePluginMessage, line, additionalNotesAboutCommand(cmd.Path)) | ||||||
| 				"Unrecognized remote plugin message: %s\n\n"+ |  | ||||||
| 					"This usually means that the plugin is either invalid or simply\n"+ |  | ||||||
| 					"needs to be recompiled to support the latest protocol.", line) |  | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								vendor/github.com/hashicorp/go-plugin/notes_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								vendor/github.com/hashicorp/go-plugin/notes_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | //go:build !windows | ||||||
|  | // +build !windows | ||||||
|  |  | ||||||
|  | package plugin | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"debug/elf" | ||||||
|  | 	"debug/macho" | ||||||
|  | 	"debug/pe" | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"os/user" | ||||||
|  | 	"runtime" | ||||||
|  | 	"strconv" | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // additionalNotesAboutCommand tries to get additional information about a command that might help diagnose | ||||||
|  | // why it won't run correctly. It runs as a best effort only. | ||||||
|  | func additionalNotesAboutCommand(path string) string { | ||||||
|  | 	notes := "" | ||||||
|  | 	stat, err := os.Stat(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return notes | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	notes += "\nAdditional notes about plugin:\n" | ||||||
|  | 	notes += fmt.Sprintf("  Path: %s\n", path) | ||||||
|  | 	notes += fmt.Sprintf("  Mode: %s\n", stat.Mode()) | ||||||
|  | 	statT, ok := stat.Sys().(*syscall.Stat_t) | ||||||
|  | 	if ok { | ||||||
|  | 		currentUsername := "?" | ||||||
|  | 		if u, err := user.LookupId(strconv.FormatUint(uint64(os.Getuid()), 10)); err == nil { | ||||||
|  | 			currentUsername = u.Username | ||||||
|  | 		} | ||||||
|  | 		currentGroup := "?" | ||||||
|  | 		if g, err := user.LookupGroupId(strconv.FormatUint(uint64(os.Getgid()), 10)); err == nil { | ||||||
|  | 			currentGroup = g.Name | ||||||
|  | 		} | ||||||
|  | 		username := "?" | ||||||
|  | 		if u, err := user.LookupId(strconv.FormatUint(uint64(statT.Uid), 10)); err == nil { | ||||||
|  | 			username = u.Username | ||||||
|  | 		} | ||||||
|  | 		group := "?" | ||||||
|  | 		if g, err := user.LookupGroupId(strconv.FormatUint(uint64(statT.Gid), 10)); err == nil { | ||||||
|  | 			group = g.Name | ||||||
|  | 		} | ||||||
|  | 		notes += fmt.Sprintf("  Owner: %d [%s] (current: %d [%s])\n", statT.Uid, username, os.Getuid(), currentUsername) | ||||||
|  | 		notes += fmt.Sprintf("  Group: %d [%s] (current: %d [%s])\n", statT.Gid, group, os.Getgid(), currentGroup) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if elfFile, err := elf.Open(path); err == nil { | ||||||
|  | 		notes += fmt.Sprintf("  ELF architecture: %s (current architecture: %s)\n", elfFile.Machine, runtime.GOARCH) | ||||||
|  | 	} else if machoFile, err := macho.Open(path); err == nil { | ||||||
|  | 		notes += fmt.Sprintf("  MachO architecture: %s (current architecture: %s)\n", machoFile.Cpu, runtime.GOARCH) | ||||||
|  | 	} else if peFile, err := pe.Open(path); err == nil { | ||||||
|  | 		machine, ok := peTypes[peFile.Machine] | ||||||
|  | 		if !ok { | ||||||
|  | 			machine = "unknown" | ||||||
|  | 		} | ||||||
|  | 		notes += fmt.Sprintf("  PE architecture: %s (current architecture: %s)\n", machine, runtime.GOARCH) | ||||||
|  | 	} | ||||||
|  | 	return notes | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								vendor/github.com/hashicorp/go-plugin/notes_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/hashicorp/go-plugin/notes_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | //go:build windows | ||||||
|  | // +build windows | ||||||
|  |  | ||||||
|  | package plugin | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"debug/elf" | ||||||
|  | 	"debug/macho" | ||||||
|  | 	"debug/pe" | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"runtime" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // additionalNotesAboutCommand tries to get additional information about a command that might help diagnose | ||||||
|  | // why it won't run correctly. It runs as a best effort only. | ||||||
|  | func additionalNotesAboutCommand(path string) string { | ||||||
|  | 	notes := "" | ||||||
|  | 	stat, err := os.Stat(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return notes | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	notes += "\nAdditional notes about plugin:\n" | ||||||
|  | 	notes += fmt.Sprintf("  Path: %s\n", path) | ||||||
|  | 	notes += fmt.Sprintf("  Mode: %s\n", stat.Mode()) | ||||||
|  |  | ||||||
|  | 	if elfFile, err := elf.Open(path); err == nil { | ||||||
|  | 		notes += fmt.Sprintf("  ELF architecture: %s (current architecture: %s)\n", elfFile.Machine, runtime.GOARCH) | ||||||
|  | 	} else if machoFile, err := macho.Open(path); err == nil { | ||||||
|  | 		notes += fmt.Sprintf("  MachO architecture: %s (current architecture: %s)\n", machoFile.Cpu, runtime.GOARCH) | ||||||
|  | 	} else if peFile, err := pe.Open(path); err == nil { | ||||||
|  | 		machine, ok := peTypes[peFile.Machine] | ||||||
|  | 		if !ok { | ||||||
|  | 			machine = "unknown" | ||||||
|  | 		} | ||||||
|  | 		notes += fmt.Sprintf("  PE architecture: %s (current architecture: %s)\n", machine, runtime.GOARCH) | ||||||
|  | 	} | ||||||
|  | 	return notes | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/hc-install/.go-version
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/hc-install/.go-version
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1 +1 @@ | |||||||
| 1.17.3 | 1.19.5 | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								vendor/github.com/hashicorp/hc-install/.goreleaser.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/hashicorp/hc-install/.goreleaser.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,29 +0,0 @@ | |||||||
| project_name: tfinstall |  | ||||||
| builds: |  | ||||||
|   - env: |  | ||||||
|       - CGO_ENABLED=0 |  | ||||||
|     main: ./cmd/hcinstall/main.go |  | ||||||
|     mod_timestamp: '{{ .CommitTimestamp }}' |  | ||||||
|     id: "tfinstall" |  | ||||||
|     binary: tfinstall |  | ||||||
|     flags: |  | ||||||
|       - -trimpath |  | ||||||
|     ldflags: |  | ||||||
|     - '-s -w -X main.version={{.Version}} -X main.commit={{.Commit}}' |  | ||||||
|     goos: |  | ||||||
|       - linux |  | ||||||
|       - darwin |  | ||||||
|       - windows |  | ||||||
|     goarch: |  | ||||||
|       - amd64 |  | ||||||
|       - arm |  | ||||||
|       - arm64 |  | ||||||
| archives: |  | ||||||
|   - files: [] |  | ||||||
|     format: zip |  | ||||||
|     name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}' |  | ||||||
| checksum: |  | ||||||
|   name_template: '{{ .ProjectName }}_{{ .Version }}_SHA256SUMS' |  | ||||||
|   algorithm: sha256 |  | ||||||
| changelog: |  | ||||||
|   skip: true |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/hc-install/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/hc-install/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,5 @@ | |||||||
|  | Copyright (c) 2020 HashiCorp, Inc. | ||||||
|  |  | ||||||
| Mozilla Public License Version 2.0 | Mozilla Public License Version 2.0 | ||||||
| ================================== | ================================== | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								vendor/github.com/hashicorp/hc-install/checkpoint/latest_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/hashicorp/hc-install/checkpoint/latest_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -123,7 +123,10 @@ func (lv *LatestVersion) Install(ctx context.Context) (string, error) { | |||||||
| 	if lv.ArmoredPublicKey != "" { | 	if lv.ArmoredPublicKey != "" { | ||||||
| 		d.ArmoredPublicKey = lv.ArmoredPublicKey | 		d.ArmoredPublicKey = lv.ArmoredPublicKey | ||||||
| 	} | 	} | ||||||
| 	err = d.DownloadAndUnpack(ctx, pv, dstDir) | 	zipFilePath, err := d.DownloadAndUnpack(ctx, pv, dstDir) | ||||||
|  | 	if zipFilePath != "" { | ||||||
|  | 		lv.pathsToRemove = append(lv.pathsToRemove, zipFilePath) | ||||||
|  | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								vendor/github.com/hashicorp/hc-install/internal/build/go_build.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										90
									
								
								vendor/github.com/hashicorp/hc-install/internal/build/go_build.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -11,6 +11,7 @@ import ( | |||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  |  | ||||||
| 	"github.com/hashicorp/go-version" | 	"github.com/hashicorp/go-version" | ||||||
|  | 	"golang.org/x/mod/modfile" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var discardLogger = log.New(ioutil.Discard, "", 0) | var discardLogger = log.New(ioutil.Discard, "", 0) | ||||||
| @@ -37,23 +38,47 @@ func (gb *GoBuild) log() *log.Logger { | |||||||
|  |  | ||||||
| // Build runs "go build" within a given repo to produce binaryName in targetDir | // Build runs "go build" within a given repo to produce binaryName in targetDir | ||||||
| func (gb *GoBuild) Build(ctx context.Context, repoDir, targetDir, binaryName string) (string, error) { | func (gb *GoBuild) Build(ctx context.Context, repoDir, targetDir, binaryName string) (string, error) { | ||||||
| 	goCmd, cleanupFunc, err := gb.ensureRequiredGoVersion(ctx, repoDir) | 	reqGo, err := gb.ensureRequiredGoVersion(ctx, repoDir) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	defer cleanupFunc(ctx) | 	defer reqGo.CleanupFunc(ctx) | ||||||
|  |  | ||||||
| 	goArgs := []string{"build", "-o", filepath.Join(targetDir, binaryName)} | 	if reqGo.Version == nil { | ||||||
|  | 		gb.logger.Println("building using default available Go") | ||||||
|  | 	} else { | ||||||
|  | 		gb.logger.Printf("building using Go %s", reqGo.Version) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// `go build` would download dependencies as a side effect, but we attempt | ||||||
|  | 	// to do it early in a separate step, such that we can easily distinguish | ||||||
|  | 	// network failures from build failures. | ||||||
|  | 	// | ||||||
|  | 	// Note, that `go mod download` was introduced in Go 1.11 | ||||||
|  | 	// See https://github.com/golang/go/commit/9f4ea6c2 | ||||||
|  | 	minGoVersion := version.Must(version.NewVersion("1.11")) | ||||||
|  | 	if reqGo.Version.GreaterThanOrEqual(minGoVersion) { | ||||||
|  | 		downloadArgs := []string{"mod", "download"} | ||||||
|  | 		gb.log().Printf("executing %s %q in %q", reqGo.Cmd, downloadArgs, repoDir) | ||||||
|  | 		cmd := exec.CommandContext(ctx, reqGo.Cmd, downloadArgs...) | ||||||
|  | 		cmd.Dir = repoDir | ||||||
|  | 		out, err := cmd.CombinedOutput() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", fmt.Errorf("unable to download dependencies: %w\n%s", err, out) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	buildArgs := []string{"build", "-o", filepath.Join(targetDir, binaryName)} | ||||||
|  |  | ||||||
| 	if gb.DetectVendoring { | 	if gb.DetectVendoring { | ||||||
| 		vendorDir := filepath.Join(repoDir, "vendor") | 		vendorDir := filepath.Join(repoDir, "vendor") | ||||||
| 		if fi, err := os.Stat(vendorDir); err == nil && fi.IsDir() { | 		if fi, err := os.Stat(vendorDir); err == nil && fi.IsDir() { | ||||||
| 			goArgs = append(goArgs, "-mod", "vendor") | 			buildArgs = append(buildArgs, "-mod", "vendor") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	gb.log().Printf("executing %s %q in %q", goCmd, goArgs, repoDir) | 	gb.log().Printf("executing %s %q in %q", reqGo.Cmd, buildArgs, repoDir) | ||||||
| 	cmd := exec.CommandContext(ctx, goCmd, goArgs...) | 	cmd := exec.CommandContext(ctx, reqGo.Cmd, buildArgs...) | ||||||
| 	cmd.Dir = repoDir | 	cmd.Dir = repoDir | ||||||
| 	out, err := cmd.CombinedOutput() | 	out, err := cmd.CombinedOutput() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -71,35 +96,59 @@ func (gb *GoBuild) Remove(ctx context.Context) error { | |||||||
| 	return os.RemoveAll(gb.pathToRemove) | 	return os.RemoveAll(gb.pathToRemove) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (gb *GoBuild) ensureRequiredGoVersion(ctx context.Context, repoDir string) (string, CleanupFunc, error) { | type Go struct { | ||||||
|  | 	Cmd         string | ||||||
|  | 	CleanupFunc CleanupFunc | ||||||
|  | 	Version     *version.Version | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (gb *GoBuild) ensureRequiredGoVersion(ctx context.Context, repoDir string) (Go, error) { | ||||||
| 	cmdName := "go" | 	cmdName := "go" | ||||||
| 	noopCleanupFunc := func(context.Context) {} | 	noopCleanupFunc := func(context.Context) {} | ||||||
|  |  | ||||||
|  | 	var installedVersion *version.Version | ||||||
|  |  | ||||||
| 	if gb.Version != nil { | 	if gb.Version != nil { | ||||||
|  | 		gb.logger.Printf("attempting to satisfy explicit requirement for Go %s", gb.Version) | ||||||
| 		goVersion, err := GetGoVersion(ctx) | 		goVersion, err := GetGoVersion(ctx) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return cmdName, noopCleanupFunc, err | 			return Go{ | ||||||
|  | 				Cmd:         cmdName, | ||||||
|  | 				CleanupFunc: noopCleanupFunc, | ||||||
|  | 			}, err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if !goVersion.GreaterThanOrEqual(gb.Version) { | 		if !goVersion.GreaterThanOrEqual(gb.Version) { | ||||||
| 			// found incompatible version, try downloading the desired one | 			// found incompatible version, try downloading the desired one | ||||||
| 			return gb.installGoVersion(ctx, gb.Version) | 			return gb.installGoVersion(ctx, gb.Version) | ||||||
| 		} | 		} | ||||||
|  | 		installedVersion = goVersion | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if requiredVersion, ok := guessRequiredGoVersion(repoDir); ok { | 	if requiredVersion, ok := guessRequiredGoVersion(repoDir); ok { | ||||||
|  | 		gb.logger.Printf("attempting to satisfy guessed Go requirement %s", requiredVersion) | ||||||
| 		goVersion, err := GetGoVersion(ctx) | 		goVersion, err := GetGoVersion(ctx) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return cmdName, noopCleanupFunc, err | 			return Go{ | ||||||
|  | 				Cmd:         cmdName, | ||||||
|  | 				CleanupFunc: noopCleanupFunc, | ||||||
|  | 			}, err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if !goVersion.GreaterThanOrEqual(requiredVersion) { | 		if !goVersion.GreaterThanOrEqual(requiredVersion) { | ||||||
| 			// found incompatible version, try downloading the desired one | 			// found incompatible version, try downloading the desired one | ||||||
| 			return gb.installGoVersion(ctx, requiredVersion) | 			return gb.installGoVersion(ctx, requiredVersion) | ||||||
| 		} | 		} | ||||||
|  | 		installedVersion = goVersion | ||||||
|  | 	} else { | ||||||
|  | 		gb.logger.Println("unable to guess Go requirement") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return cmdName, noopCleanupFunc, nil | 	return Go{ | ||||||
|  | 		Cmd:         cmdName, | ||||||
|  | 		CleanupFunc: noopCleanupFunc, | ||||||
|  | 		Version:     installedVersion, | ||||||
|  | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // CleanupFunc represents a function to be called once Go is no longer needed | // CleanupFunc represents a function to be called once Go is no longer needed | ||||||
| @@ -119,5 +168,26 @@ func guessRequiredGoVersion(repoDir string) (*version.Version, bool) { | |||||||
| 		} | 		} | ||||||
| 		return requiredVersion, true | 		return requiredVersion, true | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	goModFile := filepath.Join(repoDir, "go.mod") | ||||||
|  | 	if fi, err := os.Stat(goModFile); err == nil && !fi.IsDir() { | ||||||
|  | 		b, err := ioutil.ReadFile(goModFile) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, false | ||||||
|  | 		} | ||||||
|  | 		f, err := modfile.ParseLax(fi.Name(), b, nil) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, false | ||||||
|  | 		} | ||||||
|  | 		if f.Go == nil { | ||||||
|  | 			return nil, false | ||||||
|  | 		} | ||||||
|  | 		requiredVersion, err := version.NewVersion(f.Go.Version) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, false | ||||||
|  | 		} | ||||||
|  | 		return requiredVersion, true | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil, false | 	return nil, false | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								vendor/github.com/hashicorp/hc-install/internal/build/install_go_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/hashicorp/hc-install/internal/build/install_go_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,28 +12,36 @@ import ( | |||||||
|  |  | ||||||
| // installGoVersion installs given version of Go using Go | // installGoVersion installs given version of Go using Go | ||||||
| // according to https://golang.org/doc/manage-install | // according to https://golang.org/doc/manage-install | ||||||
| func (gb *GoBuild) installGoVersion(ctx context.Context, v *version.Version) (string, CleanupFunc, error) { | func (gb *GoBuild) installGoVersion(ctx context.Context, v *version.Version) (Go, error) { | ||||||
| 	// trim 0 patch versions as that's how Go does it :shrug: | 	versionString := v.Core().String() | ||||||
| 	shortVersion := strings.TrimSuffix(v.String(), ".0") |  | ||||||
|  |  | ||||||
|  | 	// trim 0 patch versions as that's how Go does it :shrug: | ||||||
|  | 	shortVersion := strings.TrimSuffix(versionString, ".0") | ||||||
| 	pkgURL := fmt.Sprintf("golang.org/dl/go%s", shortVersion) | 	pkgURL := fmt.Sprintf("golang.org/dl/go%s", shortVersion) | ||||||
|  |  | ||||||
| 	gb.log().Printf("go getting %q", pkgURL) | 	gb.log().Printf("go getting %q", pkgURL) | ||||||
| 	cmd := exec.CommandContext(ctx, "go", "get", pkgURL) | 	cmd := exec.CommandContext(ctx, "go", "get", pkgURL) | ||||||
| 	out, err := cmd.CombinedOutput() | 	out, err := cmd.CombinedOutput() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", nil, fmt.Errorf("unable to install Go %s: %w\n%s", v, err, out) | 		return Go{}, fmt.Errorf("unable to get Go %s: %w\n%s", v, err, out) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	gb.log().Printf("go installing %q", pkgURL) | ||||||
|  | 	cmd = exec.CommandContext(ctx, "go", "install", pkgURL) | ||||||
|  | 	out, err = cmd.CombinedOutput() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return Go{}, fmt.Errorf("unable to install Go %s: %w\n%s", v, err, out) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmdName := fmt.Sprintf("go%s", shortVersion) | 	cmdName := fmt.Sprintf("go%s", shortVersion) | ||||||
|  |  | ||||||
| 	gb.log().Printf("downloading go %q", shortVersion) | 	gb.log().Printf("downloading go %q", v) | ||||||
| 	cmd = exec.CommandContext(ctx, cmdName, "download") | 	cmd = exec.CommandContext(ctx, cmdName, "download") | ||||||
| 	out, err = cmd.CombinedOutput() | 	out, err = cmd.CombinedOutput() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", nil, fmt.Errorf("unable to download Go %s: %w\n%s", v, err, out) | 		return Go{}, fmt.Errorf("unable to download Go %s: %w\n%s", v, err, out) | ||||||
| 	} | 	} | ||||||
| 	gb.log().Printf("download of go %q finished", shortVersion) | 	gb.log().Printf("download of go %q finished", v) | ||||||
|  |  | ||||||
| 	cleanupFunc := func(ctx context.Context) { | 	cleanupFunc := func(ctx context.Context) { | ||||||
| 		cmd = exec.CommandContext(ctx, cmdName, "env", "GOROOT") | 		cmd = exec.CommandContext(ctx, cmdName, "env", "GOROOT") | ||||||
| @@ -49,5 +57,9 @@ func (gb *GoBuild) installGoVersion(ctx context.Context, v *version.Version) (st | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return cmdName, cleanupFunc, nil | 	return Go{ | ||||||
|  | 		Cmd:         cmdName, | ||||||
|  | 		CleanupFunc: cleanupFunc, | ||||||
|  | 		Version:     v, | ||||||
|  | 	}, nil | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								vendor/github.com/hashicorp/hc-install/internal/httpclient/httpclient.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/hashicorp/hc-install/internal/httpclient/httpclient.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -5,7 +5,7 @@ import ( | |||||||
| 	"net/http" | 	"net/http" | ||||||
|  |  | ||||||
| 	"github.com/hashicorp/go-cleanhttp" | 	"github.com/hashicorp/go-cleanhttp" | ||||||
| 	"github.com/hashicorp/hc-install/internal/version" | 	"github.com/hashicorp/hc-install/version" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // NewHTTPClient provides a pre-configured http.Client | // NewHTTPClient provides a pre-configured http.Client | ||||||
| @@ -13,7 +13,7 @@ import ( | |||||||
| func NewHTTPClient() *http.Client { | func NewHTTPClient() *http.Client { | ||||||
| 	client := cleanhttp.DefaultClient() | 	client := cleanhttp.DefaultClient() | ||||||
|  |  | ||||||
| 	userAgent := fmt.Sprintf("hc-install/%s", version.ModuleVersion()) | 	userAgent := fmt.Sprintf("hc-install/%s", version.Version()) | ||||||
|  |  | ||||||
| 	cli := cleanhttp.DefaultPooledClient() | 	cli := cleanhttp.DefaultPooledClient() | ||||||
| 	cli.Transport = &userAgentRoundTripper{ | 	cli.Transport = &userAgentRoundTripper{ | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								vendor/github.com/hashicorp/hc-install/internal/releasesjson/checksum_downloader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/hashicorp/hc-install/internal/releasesjson/checksum_downloader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,11 +2,13 @@ package releasesjson | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
|  | 	"context" | ||||||
| 	"crypto/sha256" | 	"crypto/sha256" | ||||||
| 	"encoding/hex" | 	"encoding/hex" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| @@ -42,7 +44,7 @@ func HashSumFromHexDigest(hexDigest string) (HashSum, error) { | |||||||
| 	return HashSum(sumBytes), nil | 	return HashSum(sumBytes), nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (cd *ChecksumDownloader) DownloadAndVerifyChecksums() (ChecksumFileMap, error) { | func (cd *ChecksumDownloader) DownloadAndVerifyChecksums(ctx context.Context) (ChecksumFileMap, error) { | ||||||
| 	sigFilename, err := cd.findSigFilename(cd.ProductVersion) | 	sigFilename, err := cd.findSigFilename(cd.ProductVersion) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -54,7 +56,12 @@ func (cd *ChecksumDownloader) DownloadAndVerifyChecksums() (ChecksumFileMap, err | |||||||
| 		url.PathEscape(cd.ProductVersion.RawVersion), | 		url.PathEscape(cd.ProductVersion.RawVersion), | ||||||
| 		url.PathEscape(sigFilename)) | 		url.PathEscape(sigFilename)) | ||||||
| 	cd.Logger.Printf("downloading signature from %s", sigURL) | 	cd.Logger.Printf("downloading signature from %s", sigURL) | ||||||
| 	sigResp, err := client.Get(sigURL) |  | ||||||
|  | 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, sigURL, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to create request for %q: %w", sigURL, err) | ||||||
|  | 	} | ||||||
|  | 	sigResp, err := client.Do(req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -70,7 +77,12 @@ func (cd *ChecksumDownloader) DownloadAndVerifyChecksums() (ChecksumFileMap, err | |||||||
| 		url.PathEscape(cd.ProductVersion.RawVersion), | 		url.PathEscape(cd.ProductVersion.RawVersion), | ||||||
| 		url.PathEscape(cd.ProductVersion.SHASUMS)) | 		url.PathEscape(cd.ProductVersion.SHASUMS)) | ||||||
| 	cd.Logger.Printf("downloading checksums from %s", shasumsURL) | 	cd.Logger.Printf("downloading checksums from %s", shasumsURL) | ||||||
| 	sumsResp, err := client.Get(shasumsURL) |  | ||||||
|  | 	req, err = http.NewRequestWithContext(ctx, http.MethodGet, shasumsURL, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to create request for %q: %w", shasumsURL, err) | ||||||
|  | 	} | ||||||
|  | 	sumsResp, err := client.Do(req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										55
									
								
								vendor/github.com/hashicorp/hc-install/internal/releasesjson/downloader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/hashicorp/hc-install/internal/releasesjson/downloader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,10 +8,12 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"runtime" | 	"runtime" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/hashicorp/hc-install/internal/httpclient" | 	"github.com/hashicorp/hc-install/internal/httpclient" | ||||||
| ) | ) | ||||||
| @@ -23,14 +25,14 @@ type Downloader struct { | |||||||
| 	BaseURL          string | 	BaseURL          string | ||||||
| } | } | ||||||
|  |  | ||||||
| func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, dstDir string) error { | func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, dstDir string) (zipFilePath string, err error) { | ||||||
| 	if len(pv.Builds) == 0 { | 	if len(pv.Builds) == 0 { | ||||||
| 		return fmt.Errorf("no builds found for %s %s", pv.Name, pv.Version) | 		return "", fmt.Errorf("no builds found for %s %s", pv.Name, pv.Version) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	pb, ok := pv.Builds.FilterBuild(runtime.GOOS, runtime.GOARCH, "zip") | 	pb, ok := pv.Builds.FilterBuild(runtime.GOOS, runtime.GOARCH, "zip") | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return fmt.Errorf("no ZIP archive found for %s %s %s/%s", | 		return "", fmt.Errorf("no ZIP archive found for %s %s %s/%s", | ||||||
| 			pv.Name, pv.Version, runtime.GOOS, runtime.GOARCH) | 			pv.Name, pv.Version, runtime.GOOS, runtime.GOARCH) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -42,14 +44,14 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | |||||||
| 			Logger:           d.Logger, | 			Logger:           d.Logger, | ||||||
| 			ArmoredPublicKey: d.ArmoredPublicKey, | 			ArmoredPublicKey: d.ArmoredPublicKey, | ||||||
| 		} | 		} | ||||||
| 		verifiedChecksums, err := v.DownloadAndVerifyChecksums() | 		verifiedChecksums, err := v.DownloadAndVerifyChecksums(ctx) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return "", err | ||||||
| 		} | 		} | ||||||
| 		var ok bool | 		var ok bool | ||||||
| 		verifiedChecksum, ok = verifiedChecksums[pb.Filename] | 		verifiedChecksum, ok = verifiedChecksums[pb.Filename] | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			return fmt.Errorf("no checksum found for %q", pb.Filename) | 			return "", fmt.Errorf("no checksum found for %q", pb.Filename) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -61,12 +63,12 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | |||||||
| 		// are still pointing to the mock server if one is set | 		// are still pointing to the mock server if one is set | ||||||
| 		baseURL, err := url.Parse(d.BaseURL) | 		baseURL, err := url.Parse(d.BaseURL) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return "", err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		u, err := url.Parse(archiveURL) | 		u, err := url.Parse(archiveURL) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return "", err | ||||||
| 		} | 		} | ||||||
| 		u.Scheme = baseURL.Scheme | 		u.Scheme = baseURL.Scheme | ||||||
| 		u.Host = baseURL.Host | 		u.Host = baseURL.Host | ||||||
| @@ -74,13 +76,18 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	d.Logger.Printf("downloading archive from %s", archiveURL) | 	d.Logger.Printf("downloading archive from %s", archiveURL) | ||||||
| 	resp, err := client.Get(archiveURL) |  | ||||||
|  | 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, archiveURL, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return "", fmt.Errorf("failed to create request for %q: %w", archiveURL, err) | ||||||
|  | 	} | ||||||
|  | 	resp, err := client.Do(req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if resp.StatusCode != 200 { | 	if resp.StatusCode != 200 { | ||||||
| 		return fmt.Errorf("failed to download ZIP archive from %q: %s", archiveURL, resp.Status) | 		return "", fmt.Errorf("failed to download ZIP archive from %q: %s", archiveURL, resp.Status) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	defer resp.Body.Close() | 	defer resp.Body.Close() | ||||||
| @@ -90,7 +97,7 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | |||||||
|  |  | ||||||
| 	contentType := resp.Header.Get("content-type") | 	contentType := resp.Header.Get("content-type") | ||||||
| 	if !contentTypeIsZip(contentType) { | 	if !contentTypeIsZip(contentType) { | ||||||
| 		return fmt.Errorf("unexpected content-type: %s (expected any of %q)", | 		return "", fmt.Errorf("unexpected content-type: %s (expected any of %q)", | ||||||
| 			contentType, zipMimeTypes) | 			contentType, zipMimeTypes) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -105,15 +112,16 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | |||||||
|  |  | ||||||
| 		err := compareChecksum(d.Logger, r, verifiedChecksum, pb.Filename, expectedSize) | 		err := compareChecksum(d.Logger, r, verifiedChecksum, pb.Filename, expectedSize) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return "", err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	pkgFile, err := ioutil.TempFile("", pb.Filename) | 	pkgFile, err := ioutil.TempFile("", pb.Filename) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	defer pkgFile.Close() | 	defer pkgFile.Close() | ||||||
|  | 	pkgFilePath, err := filepath.Abs(pkgFile.Name()) | ||||||
|  |  | ||||||
| 	d.Logger.Printf("copying %q (%d bytes) to %s", pb.Filename, expectedSize, pkgFile.Name()) | 	d.Logger.Printf("copying %q (%d bytes) to %s", pb.Filename, expectedSize, pkgFile.Name()) | ||||||
| 	// Unless the bytes were already downloaded above for checksum verification | 	// Unless the bytes were already downloaded above for checksum verification | ||||||
| @@ -122,43 +130,48 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | |||||||
| 	// on demand over the network. | 	// on demand over the network. | ||||||
| 	bytesCopied, err := io.Copy(pkgFile, pkgReader) | 	bytesCopied, err := io.Copy(pkgFile, pkgReader) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return pkgFilePath, err | ||||||
| 	} | 	} | ||||||
| 	d.Logger.Printf("copied %d bytes to %s", bytesCopied, pkgFile.Name()) | 	d.Logger.Printf("copied %d bytes to %s", bytesCopied, pkgFile.Name()) | ||||||
|  |  | ||||||
| 	if expectedSize != 0 && bytesCopied != int64(expectedSize) { | 	if expectedSize != 0 && bytesCopied != int64(expectedSize) { | ||||||
| 		return fmt.Errorf("unexpected size (downloaded: %d, expected: %d)", | 		return pkgFilePath, fmt.Errorf("unexpected size (downloaded: %d, expected: %d)", | ||||||
| 			bytesCopied, expectedSize) | 			bytesCopied, expectedSize) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	r, err := zip.OpenReader(pkgFile.Name()) | 	r, err := zip.OpenReader(pkgFile.Name()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return pkgFilePath, err | ||||||
| 	} | 	} | ||||||
| 	defer r.Close() | 	defer r.Close() | ||||||
|  |  | ||||||
| 	for _, f := range r.File { | 	for _, f := range r.File { | ||||||
|  | 		if strings.Contains(f.Name, "..") { | ||||||
|  | 			// While we generally trust the source ZIP file | ||||||
|  | 			// we still reject path traversal attempts as a precaution. | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
| 		srcFile, err := f.Open() | 		srcFile, err := f.Open() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return pkgFilePath, err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		d.Logger.Printf("unpacking %s to %s", f.Name, dstDir) | 		d.Logger.Printf("unpacking %s to %s", f.Name, dstDir) | ||||||
| 		dstPath := filepath.Join(dstDir, f.Name) | 		dstPath := filepath.Join(dstDir, f.Name) | ||||||
| 		dstFile, err := os.Create(dstPath) | 		dstFile, err := os.Create(dstPath) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return pkgFilePath, err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		_, err = io.Copy(dstFile, srcFile) | 		_, err = io.Copy(dstFile, srcFile) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return pkgFilePath, err | ||||||
| 		} | 		} | ||||||
| 		srcFile.Close() | 		srcFile.Close() | ||||||
| 		dstFile.Close() | 		dstFile.Close() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return pkgFilePath, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // The production release site uses consistent single mime type | // The production release site uses consistent single mime type | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								vendor/github.com/hashicorp/hc-install/internal/releasesjson/releases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/hashicorp/hc-install/internal/releasesjson/releases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -6,6 +6,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| @@ -68,7 +69,11 @@ func (r *Releases) ListProductVersions(ctx context.Context, productName string) | |||||||
| 		url.PathEscape(productName)) | 		url.PathEscape(productName)) | ||||||
| 	r.logger.Printf("requesting versions from %s", productIndexURL) | 	r.logger.Printf("requesting versions from %s", productIndexURL) | ||||||
|  |  | ||||||
| 	resp, err := client.Get(productIndexURL) | 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, productIndexURL, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to create request for %q: %w", productIndexURL, err) | ||||||
|  | 	} | ||||||
|  | 	resp, err := client.Do(req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -133,7 +138,11 @@ func (r *Releases) GetProductVersion(ctx context.Context, product string, versio | |||||||
| 		url.PathEscape(version.String())) | 		url.PathEscape(version.String())) | ||||||
| 	r.logger.Printf("requesting version from %s", indexURL) | 	r.logger.Printf("requesting version from %s", indexURL) | ||||||
|  |  | ||||||
| 	resp, err := client.Get(indexURL) | 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, indexURL, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to create request for %q: %w", indexURL, err) | ||||||
|  | 	} | ||||||
|  | 	resp, err := client.Do(req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								vendor/github.com/hashicorp/hc-install/internal/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/hashicorp/hc-install/internal/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,9 +0,0 @@ | |||||||
| package version |  | ||||||
|  |  | ||||||
| const version = "0.1.0" |  | ||||||
|  |  | ||||||
| // ModuleVersion returns the current version of the github.com/hashicorp/hc-install Go module. |  | ||||||
| // This is a function to allow for future possible enhancement using debug.BuildInfo. |  | ||||||
| func ModuleVersion() string { |  | ||||||
| 	return version |  | ||||||
| } |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/hc-install/product/consul.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/hc-install/product/consul.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -50,6 +50,6 @@ var Consul = Product{ | |||||||
| 	BuildInstructions: &BuildInstructions{ | 	BuildInstructions: &BuildInstructions{ | ||||||
| 		GitRepoURL:    "https://github.com/hashicorp/consul.git", | 		GitRepoURL:    "https://github.com/hashicorp/consul.git", | ||||||
| 		PreCloneCheck: &build.GoIsInstalled{}, | 		PreCloneCheck: &build.GoIsInstalled{}, | ||||||
| 		Build:         &build.GoBuild{Version: v1_18}, | 		Build:         &build.GoBuild{}, | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hc-install/product/vault.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hc-install/product/vault.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,7 +14,6 @@ import ( | |||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	vaultVersionOutputRe = regexp.MustCompile(`Vault ` + simpleVersionRe) | 	vaultVersionOutputRe = regexp.MustCompile(`Vault ` + simpleVersionRe) | ||||||
| 	v1_17                = version.Must(version.NewVersion("1.17")) |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var Vault = Product{ | var Vault = Product{ | ||||||
| @@ -49,6 +48,6 @@ var Vault = Product{ | |||||||
| 	BuildInstructions: &BuildInstructions{ | 	BuildInstructions: &BuildInstructions{ | ||||||
| 		GitRepoURL:    "https://github.com/hashicorp/vault.git", | 		GitRepoURL:    "https://github.com/hashicorp/vault.git", | ||||||
| 		PreCloneCheck: &build.GoIsInstalled{}, | 		PreCloneCheck: &build.GoIsInstalled{}, | ||||||
| 		Build:         &build.GoBuild{Version: v1_17}, | 		Build:         &build.GoBuild{}, | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								vendor/github.com/hashicorp/hc-install/releases/exact_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/hashicorp/hc-install/releases/exact_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -115,7 +115,10 @@ func (ev *ExactVersion) Install(ctx context.Context) (string, error) { | |||||||
| 		d.BaseURL = ev.apiBaseURL | 		d.BaseURL = ev.apiBaseURL | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = d.DownloadAndUnpack(ctx, pv, dstDir) | 	zipFilePath, err := d.DownloadAndUnpack(ctx, pv, dstDir) | ||||||
|  | 	if zipFilePath != "" { | ||||||
|  | 		ev.pathsToRemove = append(ev.pathsToRemove, zipFilePath) | ||||||
|  | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								vendor/github.com/hashicorp/hc-install/releases/latest_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/hashicorp/hc-install/releases/latest_version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -119,7 +119,10 @@ func (lv *LatestVersion) Install(ctx context.Context) (string, error) { | |||||||
| 	if lv.apiBaseURL != "" { | 	if lv.apiBaseURL != "" { | ||||||
| 		d.BaseURL = lv.apiBaseURL | 		d.BaseURL = lv.apiBaseURL | ||||||
| 	} | 	} | ||||||
| 	err = d.DownloadAndUnpack(ctx, versionToInstall, dstDir) | 	zipFilePath, err := d.DownloadAndUnpack(ctx, versionToInstall, dstDir) | ||||||
|  | 	if zipFilePath != "" { | ||||||
|  | 		lv.pathsToRemove = append(lv.pathsToRemove, zipFilePath) | ||||||
|  | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								vendor/github.com/hashicorp/hc-install/version/VERSION
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/hashicorp/hc-install/version/VERSION
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | 0.5.0 | ||||||
							
								
								
									
										20
									
								
								vendor/github.com/hashicorp/hc-install/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/hashicorp/hc-install/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | package version | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	_ "embed" | ||||||
|  |  | ||||||
|  | 	"github.com/hashicorp/go-version" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | //go:embed VERSION | ||||||
|  | var rawVersion string | ||||||
|  |  | ||||||
|  | // Version returns the version of the library | ||||||
|  | // | ||||||
|  | // Note: This is only exposed as public function/package | ||||||
|  | // due to hard-coded constraints in the release tooling. | ||||||
|  | // In general downstream should not implement version-specific | ||||||
|  | // logic and rely on this function to be present in future releases. | ||||||
|  | func Version() *version.Version { | ||||||
|  | 	return version.Must(version.NewVersion(rawVersion)) | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								vendor/github.com/hashicorp/hcl/v2/.copywrite.hcl
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/hashicorp/hcl/v2/.copywrite.hcl
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | schema_version = 1 | ||||||
|  |  | ||||||
|  | project { | ||||||
|  |   license        = "MPL-2.0" | ||||||
|  |   copyright_year = 2014 | ||||||
|  |  | ||||||
|  |   # (OPTIONAL) A list of globs that should not have copyright/license headers. | ||||||
|  |   # Supports doublestar glob patterns for more flexibility in defining which | ||||||
|  |   # files or folders should be ignored | ||||||
|  |   header_ignore = [ | ||||||
|  |     "hclsyntax/fuzz/testdata/**", | ||||||
|  |     "hclwrite/fuzz/testdata/**", | ||||||
|  |     "json/fuzz/testdata/**", | ||||||
|  |     "specsuite/tests/**", | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								vendor/github.com/hashicorp/hcl/v2/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/hashicorp/hcl/v2/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,5 +1,31 @@ | |||||||
| # HCL Changelog | # HCL Changelog | ||||||
|  |  | ||||||
|  | ## v2.16.2 (March 9, 2023) | ||||||
|  |  | ||||||
|  | ### Bugs Fixed | ||||||
|  |  | ||||||
|  | * ext/typeexpr: Verify type assumptions when applying default values, and ignore input values that do not match type assumptions. ([#594](https://github.com/hashicorp/hcl/pull/594)) | ||||||
|  |  | ||||||
|  | ## v2.16.1 (February 13, 2023) | ||||||
|  |  | ||||||
|  | ### Bugs Fixed | ||||||
|  |  | ||||||
|  | * hclsyntax: Report correct `Range.End` for `FunctionCall` with incomplete argument ([#588](https://github.com/hashicorp/hcl/pull/588)) | ||||||
|  |  | ||||||
|  | ## v2.16.0 (January 30, 2023) | ||||||
|  |  | ||||||
|  | ### Enhancements | ||||||
|  |  | ||||||
|  | * ext/typeexpr: Modify the `Defaults` functionality to implement additional flexibility. HCL will now upcast lists and sets into tuples, and maps into objects, when applying default values if the applied defaults cause the elements within a target collection to have differing types. Previously, this would have resulted in a panic, now HCL will return a modified overall type. ([#574](https://github.com/hashicorp/hcl/pull/574)) | ||||||
|  |  | ||||||
|  |     Users should return to the advice provided by v2.14.0, and apply the go-cty convert functionality *after* setting defaults on a given `cty.Value`, rather than before. | ||||||
|  | * hclfmt: Avoid rewriting unchanged files. ([#576](https://github.com/hashicorp/hcl/pull/576)) | ||||||
|  | * hclsyntax: Simplify the AST for certain string expressions. ([#584](https://github.com/hashicorp/hcl/pull/584)) | ||||||
|  |  | ||||||
|  | ### Bugs Fixed | ||||||
|  |  | ||||||
|  | * hclwrite: Fix data race in `formatSpaces`. ([#511](https://github.com/hashicorp/hcl/pull/511)) | ||||||
|  |  | ||||||
| ## v2.15.0 (November 10, 2022) | ## v2.15.0 (November 10, 2022) | ||||||
|  |  | ||||||
| ### Bugs Fixed | ### Bugs Fixed | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/hcl/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/hcl/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,5 @@ | |||||||
|  | Copyright (c) 2014 HashiCorp, Inc. | ||||||
|  |  | ||||||
| Mozilla Public License, version 2.0 | Mozilla Public License, version 2.0 | ||||||
|  |  | ||||||
| 1. Definitions | 1. Definitions | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/diagnostic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/diagnostic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/diagnostic_text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/diagnostic_text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/diagnostic_typeparams.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/diagnostic_typeparams.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| //go:build go1.18 | //go:build go1.18 | ||||||
| // +build go1.18 | // +build go1.18 | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/didyoumean.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/didyoumean.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| // Package hcl contains the main modelling types and general utility functions | // Package hcl contains the main modelling types and general utility functions | ||||||
| // for HCL. | // for HCL. | ||||||
| // | // | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/eval_context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/eval_context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_call.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_call.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| // ExprCall tests if the given expression is a function call and, | // ExprCall tests if the given expression is a function call and, | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_list.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_list.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| // ExprList tests if the given expression is a static list construct and, | // ExprList tests if the given expression is a static list construct and, | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_map.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_map.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| // ExprMap tests if the given expression is a static map construct and, | // ExprMap tests if the given expression is a static map construct and, | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_unwrap.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/expr_unwrap.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| type unwrapExpression interface { | type unwrapExpression interface { | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/ext/customdecode/customdecode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/ext/customdecode/customdecode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| // Package customdecode contains a HCL extension that allows, in certain | // Package customdecode contains a HCL extension that allows, in certain | ||||||
| // contexts, expression evaluation to be overridden by custom static analysis. | // contexts, expression evaluation to be overridden by custom static analysis. | ||||||
| // | // | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/ext/customdecode/expression_type.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/ext/customdecode/expression_type.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package customdecode | package customdecode | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/diagnostics.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/diagnostics.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/didyoumean.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/didyoumean.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| // Package hclsyntax contains the parser, AST, etc for HCL's native language, | // Package hclsyntax contains the parser, AST, etc for HCL's native language, | ||||||
| // as opposed to the JSON variant. | // as opposed to the JSON variant. | ||||||
| // | // | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression_ops.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression_ops.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression_template.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression_template.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression_vars.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/expression_vars.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| // Generated by expression_vars_get.go. DO NOT EDIT. | // Generated by expression_vars_get.go. DO NOT EDIT. | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/generate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/generate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| //go:generate go run expression_vars_gen.go | //go:generate go run expression_vars_gen.go | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/keywords.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/keywords.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/navigation.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/navigation.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/node.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/node.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| @@ -1174,7 +1177,12 @@ Token: | |||||||
| 			// if there was a parse error in the argument then we've | 			// if there was a parse error in the argument then we've | ||||||
| 			// probably been left in a weird place in the token stream, | 			// probably been left in a weird place in the token stream, | ||||||
| 			// so we'll bail out with a partial argument list. | 			// so we'll bail out with a partial argument list. | ||||||
| 			p.recover(TokenCParen) | 			recoveredTok := p.recover(TokenCParen) | ||||||
|  |  | ||||||
|  | 			// record the recovered token, if one was found | ||||||
|  | 			if recoveredTok.Type == TokenCParen { | ||||||
|  | 				closeTok = recoveredTok | ||||||
|  | 			} | ||||||
| 			break Token | 			break Token | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/parser_template.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/parser_template.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| @@ -38,6 +41,7 @@ func (p *parser) parseTemplateInner(end TokenType, flushHeredoc bool) ([]Express | |||||||
| 	if flushHeredoc { | 	if flushHeredoc { | ||||||
| 		flushHeredocTemplateParts(parts) // Trim off leading spaces on lines per the flush heredoc spec | 		flushHeredocTemplateParts(parts) // Trim off leading spaces on lines per the flush heredoc spec | ||||||
| 	} | 	} | ||||||
|  | 	meldConsecutiveStringLiterals(parts) | ||||||
| 	tp := templateParser{ | 	tp := templateParser{ | ||||||
| 		Tokens:   parts.Tokens, | 		Tokens:   parts.Tokens, | ||||||
| 		SrcRange: parts.SrcRange, | 		SrcRange: parts.SrcRange, | ||||||
| @@ -751,6 +755,37 @@ func flushHeredocTemplateParts(parts *templateParts) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // meldConsecutiveStringLiterals simplifies the AST output by combining a | ||||||
|  | // sequence of string literal tokens into a single string literal. This must be | ||||||
|  | // performed after any whitespace trimming operations. | ||||||
|  | func meldConsecutiveStringLiterals(parts *templateParts) { | ||||||
|  | 	if len(parts.Tokens) == 0 { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Loop over all tokens starting at the second element, as we want to join | ||||||
|  | 	// pairs of consecutive string literals. | ||||||
|  | 	i := 1 | ||||||
|  | 	for i < len(parts.Tokens) { | ||||||
|  | 		if prevLiteral, ok := parts.Tokens[i-1].(*templateLiteralToken); ok { | ||||||
|  | 			if literal, ok := parts.Tokens[i].(*templateLiteralToken); ok { | ||||||
|  | 				// The current and previous tokens are both literals: combine | ||||||
|  | 				prevLiteral.Val = prevLiteral.Val + literal.Val | ||||||
|  | 				prevLiteral.SrcRange.End = literal.SrcRange.End | ||||||
|  |  | ||||||
|  | 				// Remove the current token from the slice | ||||||
|  | 				parts.Tokens = append(parts.Tokens[:i], parts.Tokens[i+1:]...) | ||||||
|  |  | ||||||
|  | 				// Continue without moving forward in the slice | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Try the next pair of tokens | ||||||
|  | 		i++ | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| type templateParts struct { | type templateParts struct { | ||||||
| 	Tokens   []templateToken | 	Tokens   []templateToken | ||||||
| 	SrcRange hcl.Range | 	SrcRange hcl.Range | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/parser_traversal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/parser_traversal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/peeker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/peeker.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/public.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/public.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/scan_string_lit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/scan_string_lit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| //line scan_string_lit.rl:1 | //line scan_string_lit.rl:1 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/scan_tokens.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/scan_tokens.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| //line scan_tokens.rl:1 | //line scan_tokens.rl:1 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/spec.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/spec.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -82,7 +82,7 @@ Comments serve as program documentation and come in two forms: | |||||||
|  |  | ||||||
| - _Inline comments_ start with the `/*` sequence and end with the `*/` | - _Inline comments_ start with the `/*` sequence and end with the `*/` | ||||||
|   sequence, and may have any characters within except the ending sequence. |   sequence, and may have any characters within except the ending sequence. | ||||||
|   An inline comments is considered equivalent to a whitespace sequence. |   An inline comment is considered equivalent to a whitespace sequence. | ||||||
|  |  | ||||||
| Comments and whitespace cannot begin within other comments, or within | Comments and whitespace cannot begin within other comments, or within | ||||||
| template literals except inside an interpolation sequence or template directive. | template literals except inside an interpolation sequence or template directive. | ||||||
| @@ -268,10 +268,10 @@ collection value. | |||||||
| ```ebnf | ```ebnf | ||||||
| CollectionValue = tuple | object; | CollectionValue = tuple | object; | ||||||
| tuple = "[" ( | tuple = "[" ( | ||||||
|     (Expression ("," Expression)* ","?)? |     (Expression (("," | Newline) Expression)* ","?)? | ||||||
| ) "]"; | ) "]"; | ||||||
| object = "{" ( | object = "{" ( | ||||||
|     (objectelem ("," objectelem)* ","?)? |     (objectelem (( "," | Newline) objectelem)* ","?)? | ||||||
| ) "}"; | ) "}"; | ||||||
| objectelem = (Identifier | Expression) ("=" | ":") Expression; | objectelem = (Identifier | Expression) ("=" | ":") Expression; | ||||||
| ``` | ``` | ||||||
| @@ -635,7 +635,7 @@ binaryOp = ExprTerm binaryOperator ExprTerm; | |||||||
| binaryOperator = compareOperator | arithmeticOperator | logicOperator; | binaryOperator = compareOperator | arithmeticOperator | logicOperator; | ||||||
| compareOperator = "==" | "!=" | "<" | ">" | "<=" | ">="; | compareOperator = "==" | "!=" | "<" | ">" | "<=" | ">="; | ||||||
| arithmeticOperator = "+" | "-" | "*" | "/" | "%"; | arithmeticOperator = "+" | "-" | "*" | "/" | "%"; | ||||||
| logicOperator = "&&" | "||" | "!"; | logicOperator = "&&" | "||"; | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| The unary operators have the highest precedence. | The unary operators have the highest precedence. | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/structure.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/structure.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/structure_at_pos.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/structure_at_pos.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/token.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/token.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/unicode2ragel.rb
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/unicode2ragel.rb
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,4 +1,7 @@ | |||||||
| #!/usr/bin/env ruby | #!/usr/bin/env ruby | ||||||
|  | # Copyright (c) HashiCorp, Inc. | ||||||
|  | # SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| # | # | ||||||
| # This scripted has been updated to accept more command-line arguments: | # This scripted has been updated to accept more command-line arguments: | ||||||
| # | # | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/variables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/variables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/walk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/hclsyntax/walk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hclsyntax | package hclsyntax | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/merged.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/merged.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/ops.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/ops.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/pos.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/pos.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import "fmt" | import "fmt" | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/pos_scanner.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/pos_scanner.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/schema.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hashicorp/hcl/v2/schema.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | // Copyright (c) HashiCorp, Inc. | ||||||
|  | // SPDX-License-Identifier: MPL-2.0 | ||||||
|  |  | ||||||
| package hcl | package hcl | ||||||
|  |  | ||||||
| // BlockHeaderSchema represents the shape of a block header, and is | // BlockHeaderSchema represents the shape of a block header, and is | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user