Compare commits
	
		
			29 Commits
		
	
	
		
			v0.11.2
			...
			b2403e2569
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b2403e2569 | ||
|  | 98867f2830 | ||
|  | 948b20a6d2 | ||
|  | bc28fe186f | ||
|  | 19062e27f0 | ||
|  | 322ad2d3c4 | ||
|  | 9e34636c29 | ||
|  | b4b13dc3ca | ||
|  | e5a6132b9d | ||
|  | d71cbbd0b6 | ||
|  | 0a85957c50 | ||
|  | f87515a453 | ||
|  | 0e8aa2bf9b | ||
|  | 1162650a73 | ||
|  | abc332958b | ||
|  | 6ce5f8bf9f | ||
|  | 1c80699599 | ||
|  | 84c9110a24 | ||
|  | ad2692136f | ||
| 4f33464489 | |||
| 2c787bd532 | |||
| feacbf5a3f | |||
| d6160c596b | |||
| 9799416352 | |||
| 8095c2a513 | |||
|  | 14c1a11417 | ||
|  | 8a805faa72 | ||
|  | 32ad02fa73 | ||
| edd03aca2f | 
| @@ -30,6 +30,7 @@ steps: | ||||
|   - name: build | ||||
|     image: goreleaser/goreleaser | ||||
|     commands: | ||||
|       - curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin v0.64.0 | ||||
|       - goreleaser build --snapshot | ||||
|     when: | ||||
|       event: | ||||
| @@ -59,6 +60,7 @@ steps: | ||||
|       GPG_PRIVATE_KEY_BASE64: | ||||
|         from_secret: GPG_PRIVATE_KEY_BASE64 | ||||
|     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 | ||||
|       - gpg-agent --daemon --default-cache-ttl 7200 | ||||
|       - echo $GPG_PRIVATE_KEY_BASE64 | base64 -d | gpg --import --batch --no-tty | ||||
|   | ||||
							
								
								
									
										25
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -18,27 +18,26 @@ jobs: | ||||
|   goreleaser: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Unshallow | ||||
|       - name: Unshallow | ||||
|         run: git fetch --prune --unshallow | ||||
|       - | ||||
|         name: Set up Go | ||||
|         uses: actions/setup-go@v3 | ||||
|       - name: Set up Go | ||||
|         uses: actions/setup-go@v4 | ||||
|         with: | ||||
|           go-version: 1.18 | ||||
|       - | ||||
|         name: Import GPG key | ||||
|       - name: Import GPG key | ||||
|         id: import_gpg | ||||
|         uses: crazy-max/ghaction-import-gpg@v5.2.0 | ||||
|         uses: crazy-max/ghaction-import-gpg@v5.3.0 | ||||
|         with: | ||||
|           gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} | ||||
|           passphrase: ${{ secrets.PASSPHRASE }} | ||||
|       - | ||||
|         name: Run GoReleaser | ||||
|         uses: goreleaser/goreleaser-action@v4.1.0 | ||||
|       - name: setup-syft | ||||
|         run: | | ||||
|           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: | ||||
|           version: latest | ||||
|           args: release --rm-dist | ||||
|   | ||||
| @@ -41,6 +41,8 @@ checksum: | ||||
|       name_template: '{{ .ProjectName }}_{{ .Version }}_manifest.json' | ||||
|   name_template: '{{ .ProjectName }}_{{ .Version }}_SHA256SUMS' | ||||
|   algorithm: sha256 | ||||
| sboms: | ||||
|   - artifacts: archive | ||||
| signs: | ||||
|   - artifacts: checksum | ||||
|     args: | ||||
|   | ||||
							
								
								
									
										10
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,9 +1,11 @@ | ||||
| TEST?=./gitea | ||||
| GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor) | ||||
| ARCH?=$$(uname -m) | ||||
| KERNEL?=$$(uname -s | tr '[:upper:]' '[:lower:]') | ||||
|  | ||||
| GOFMT ?= gofmt -s | ||||
|  | ||||
| VERSION = 0.11.2 | ||||
| VERSION = 0.14.0 | ||||
|  | ||||
| test: fmt-check | ||||
| 	go test -i $(TEST) || exit 1 | ||||
| @@ -34,8 +36,8 @@ build: | ||||
| 	go build -ldflags="-X 'main.Version=${VERSION}'" -o terraform-provider-gitea_${VERSION} | ||||
| install: build  | ||||
| 	@echo installing to  | ||||
| 	@echo ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/linux_amd64/terraform-provider-gitea_${VERSION} | ||||
| 	@mkdir -p ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/linux_amd64 | ||||
| 	@mv terraform-provider-gitea_${VERSION} ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/linux_amd64/terraform-provider-gitea_${VERSION} | ||||
| 	@echo ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/${KERNEL}_${ARCH}/terraform-provider-gitea_${VERSION} | ||||
| 	@mkdir -p ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/${KERNEL}_${ARCH} | ||||
| 	@mv terraform-provider-gitea_${VERSION} ~/.terraform.d/plugins/terraform.local/lerentis/gitea/${VERSION}/${KERNEL}_${ARCH}/terraform-provider-gitea_${VERSION} | ||||
| doc: | ||||
| 	tfplugindocs | ||||
|   | ||||
| @@ -17,7 +17,7 @@ terraform { | ||||
|   required_providers { | ||||
|     gitea = { | ||||
|       source = "Lerentis/gitea" | ||||
|       version = "0.11.2" | ||||
|       version = "0.14.0" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -17,7 +17,7 @@ terraform { | ||||
|   required_providers { | ||||
|     gitea = { | ||||
|       source = "Lerentis/gitea" | ||||
|       version = "0.11.1" | ||||
|       version = "0.14.0" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,7 @@ description: |- | ||||
|   Per default this repository will be initializiled with the provided configuration (gitignore, License etc.). | ||||
|   If the username property is set to a organisation name, the provider will try to look if this organisation exists and create the repository under the organisation scope. | ||||
|   Repository migrations have some properties that are not available to regular repositories. These are all prefixed with migration_. | ||||
|   Codeberg.org does currently not allow mirrors to be created. See FAQ Section of CodeBerg for more information: https://docs.codeberg.org/getting-started/faq/#why-am-i-not-allowed-to-set-up-an-automatic-mirror | ||||
| --- | ||||
|  | ||||
| # gitea_repository (Resource) | ||||
| @@ -17,6 +18,7 @@ Per default this repository will be initializiled with the provided configuratio | ||||
| If the `username` property is set to a organisation name, the provider will try to look if this organisation exists and create the repository under the organisation scope. | ||||
|  | ||||
| Repository migrations have some properties that are not available to regular repositories. These are all prefixed with `migration_`. | ||||
| Codeberg.org does currently not allow mirrors to be created. See FAQ Section of CodeBerg for more information: https://docs.codeberg.org/getting-started/faq/#why-am-i-not-allowed-to-set-up-an-automatic-mirror | ||||
|  | ||||
| ## Example Usage | ||||
|  | ||||
| @@ -39,6 +41,16 @@ resource "gitea_repository" "mirror" { | ||||
|   migration_service            = "gitea" | ||||
|   migration_service_auth_token = var.gitea_mirror_token | ||||
| } | ||||
|  | ||||
| resource "gitea_repository" "clone" { | ||||
|   username                     = "lerentis" | ||||
|   name                         = "terraform-provider-gitea-clone" | ||||
|   description                  = "Clone of Terraform Provider" | ||||
|   mirror                       = false | ||||
|   migration_clone_address      = "https://git.uploadfilter24.eu/lerentis/terraform-provider-gitea.git" | ||||
|   migration_service            = "gitea" | ||||
|   migration_service_auth_token = var.gitea_clone_token | ||||
| } | ||||
| ``` | ||||
|  | ||||
| <!-- schema generated by tfplugindocs --> | ||||
|   | ||||
							
								
								
									
										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. | ||||
|  | ||||
|  | ||||
| @@ -34,6 +34,26 @@ resource "gitea_team" "test_team" { | ||||
|   permission   = "write" | ||||
|   members      = [gitea_user.test.username] | ||||
| } | ||||
|  | ||||
|  | ||||
| resource "gitea_repository" "test" { | ||||
|   username     = gitea_org.test_org.name | ||||
|   name         = "test" | ||||
|   private      = true | ||||
|   issue_labels = "Default" | ||||
|   license      = "MIT" | ||||
|   gitignores   = "Go" | ||||
| } | ||||
|  | ||||
| resource "gitea_team" "test_team_restricted" { | ||||
|   name                     = "Restricted Devs" | ||||
|   organisation             = gitea_org.test_org.name | ||||
|   description              = "Restricted Devs of Test Org" | ||||
|   permission               = "write" | ||||
|   members                  = [gitea_user.test.username] | ||||
|   include_all_repositories = false | ||||
|   repositories             = [gitea_repository.test.name] | ||||
| } | ||||
| ``` | ||||
|  | ||||
| <!-- schema generated by tfplugindocs --> | ||||
| @@ -52,6 +72,7 @@ resource "gitea_team" "test_team" { | ||||
| - `members` (List of String) List of Users that should be part of this team | ||||
| - `permission` (String) Permissions associated with this Team | ||||
| Can be `none`, `read`, `write`, `admin` or `owner` | ||||
| - `repositories` (List of String) List of Repositories that should be part of this team | ||||
| - `units` (String) List of types of Repositories that should be allowed to be created from Team members. | ||||
| Can be `repo.code`, `repo.issues`, `repo.ext_issues`, `repo.wiki`, `repo.pulls`, `repo.releases`, `repo.projects` and/or `repo.ext_wiki` | ||||
|  | ||||
|   | ||||
| @@ -101,6 +101,24 @@ resource "gitea_token" "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" { | ||||
|   value = resource.gitea_token.test_token.token | ||||
|   sensitive = true | ||||
|   | ||||
| @@ -2,7 +2,7 @@ terraform { | ||||
|   required_providers { | ||||
|     gitea = { | ||||
|       source = "terraform.local/lerentis/gitea" | ||||
|       version = "0.11.2" | ||||
|       version = "0.14.0" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -2,7 +2,7 @@ terraform { | ||||
|   required_providers { | ||||
|     gitea = { | ||||
|       source = "Lerentis/gitea" | ||||
|       version = "0.11.1" | ||||
|       version = "0.14.0" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -16,3 +16,13 @@ resource "gitea_repository" "mirror" { | ||||
|   migration_service            = "gitea" | ||||
|   migration_service_auth_token = var.gitea_mirror_token | ||||
| } | ||||
|  | ||||
| resource "gitea_repository" "clone" { | ||||
|   username                     = "lerentis" | ||||
|   name                         = "terraform-provider-gitea-clone" | ||||
|   description                  = "Clone of Terraform Provider" | ||||
|   mirror                       = false | ||||
|   migration_clone_address      = "https://git.uploadfilter24.eu/lerentis/terraform-provider-gitea.git" | ||||
|   migration_service            = "gitea" | ||||
|   migration_service_auth_token = var.gitea_clone_token | ||||
| } | ||||
|   | ||||
							
								
								
									
										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 | ||||
| } | ||||
| @@ -19,3 +19,23 @@ resource "gitea_team" "test_team" { | ||||
|   permission   = "write" | ||||
|   members      = [gitea_user.test.username] | ||||
| } | ||||
|  | ||||
|  | ||||
| resource "gitea_repository" "test" { | ||||
|   username     = gitea_org.test_org.name | ||||
|   name         = "test" | ||||
|   private      = true | ||||
|   issue_labels = "Default" | ||||
|   license      = "MIT" | ||||
|   gitignores   = "Go" | ||||
| } | ||||
|  | ||||
| resource "gitea_team" "test_team_restricted" { | ||||
|   name                     = "Restricted Devs" | ||||
|   organisation             = gitea_org.test_org.name | ||||
|   description              = "Restricted Devs of Test Org" | ||||
|   permission               = "write" | ||||
|   members                  = [gitea_user.test.username] | ||||
|   include_all_repositories = false | ||||
|   repositories             = [gitea_repository.test.name] | ||||
| } | ||||
|   | ||||
| @@ -116,7 +116,7 @@ func dataSourceGiteaRepoRead(d *schema.ResourceData, meta interface{}) error { | ||||
| 	} | ||||
| 	username := strings.ToLower(usernameData.(string)) | ||||
|  | ||||
| 	nameData, nameOk := d.GetOk("username") | ||||
| 	nameData, nameOk := d.GetOk("name") | ||||
| 	if !nameOk { | ||||
| 		return fmt.Errorf("name of repo must be passed") | ||||
| 	} | ||||
|   | ||||
| @@ -75,14 +75,15 @@ func Provider() *schema.Provider { | ||||
| 			"gitea_org": resourceGiteaOrg(), | ||||
| 			// "gitea_team":       resourceGiteaTeam(), | ||||
| 			// "gitea_repo":       resourceGiteaRepo(), | ||||
| 			"gitea_user":       resourceGiteaUser(), | ||||
| 			"gitea_oauth2_app": resourceGiteaOauthApp(), | ||||
| 			"gitea_repository": resourceGiteaRepository(), | ||||
| 			"gitea_fork":       resourceGiteaFork(), | ||||
| 			"gitea_public_key": resourceGiteaPublicKey(), | ||||
| 			"gitea_team":       resourceGiteaTeam(), | ||||
| 			"gitea_git_hook":   resourceGiteaGitHook(), | ||||
| 			"gitea_token":      resourceGiteaToken(), | ||||
| 			"gitea_user":           resourceGiteaUser(), | ||||
| 			"gitea_oauth2_app":     resourceGiteaOauthApp(), | ||||
| 			"gitea_repository":     resourceGiteaRepository(), | ||||
| 			"gitea_fork":           resourceGiteaFork(), | ||||
| 			"gitea_public_key":     resourceGiteaPublicKey(), | ||||
| 			"gitea_team":           resourceGiteaTeam(), | ||||
| 			"gitea_git_hook":       resourceGiteaGitHook(), | ||||
| 			"gitea_token":          resourceGiteaToken(), | ||||
| 			"gitea_repository_key": resourceGiteaRepositoryKey(), | ||||
| 		}, | ||||
|  | ||||
| 		ConfigureFunc: providerConfigure, | ||||
|   | ||||
| @@ -58,7 +58,8 @@ func resourceOrgRead(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 	org, err = searchOrgByClientId(client, id) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 		d.SetId("") | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	err = setOrgResourceData(org, d) | ||||
|   | ||||
| @@ -1,10 +1,14 @@ | ||||
| package gitea | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/sdk/gitea" | ||||
| 	"github.com/hashicorp/terraform-plugin-log/tflog" | ||||
| 	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||||
| ) | ||||
|  | ||||
| @@ -48,6 +52,34 @@ const ( | ||||
| 	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) { | ||||
| 	client := meta.(*gitea.Client) | ||||
|  | ||||
| @@ -78,15 +110,35 @@ func resourceRepoCreate(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 	client := meta.(*gitea.Client) | ||||
|  | ||||
| 	var repo *gitea.Repository | ||||
| 	var resp *gitea.Response | ||||
| 	var orgRepo, hasAdmin bool | ||||
|  | ||||
| 	if (d.Get(repoMirror)).(bool) { | ||||
| 	_, resp, err = client.GetOrg(d.Get(repoOwner).(string)) | ||||
|  | ||||
| 		var cloneAddr string | ||||
| 		if d.Get(migrationCloneAddresse).(string) != "" { | ||||
| 			cloneAddr = d.Get(migrationCloneAddresse).(string) | ||||
| 	if resp.StatusCode == 404 { | ||||
| 		_, err := searchUserByName(client, d.Get(repoOwner).(string)) | ||||
| 		if err != nil { | ||||
| 			if strings.Contains(err.Error(), "could not be found") { | ||||
| 				return errors.New(fmt.Sprintf("Creation of repository cound not proceed as owner %s is not present in gitea", d.Get(repoOwner).(string))) | ||||
| 			} | ||||
| 			tflog.Warn(context.Background(), "Error query for users. Assuming missing permissions and proceding with user permissions") | ||||
| 			hasAdmin = false | ||||
| 		} else { | ||||
| 			cloneAddr = d.Get(migrationCloneAddress).(string) | ||||
| 			hasAdmin = true | ||||
| 		} | ||||
| 		orgRepo = false | ||||
| 	} else { | ||||
| 		orgRepo = true | ||||
| 	} | ||||
|  | ||||
| 	var cloneAddr string | ||||
| 	if d.Get(migrationCloneAddresse).(string) != "" { | ||||
| 		cloneAddr = d.Get(migrationCloneAddresse).(string) | ||||
| 	} else { | ||||
| 		cloneAddr = d.Get(migrationCloneAddress).(string) | ||||
| 	} | ||||
|  | ||||
| 	if cloneAddr != "" { | ||||
|  | ||||
| 		opts := gitea.MigrateRepoOption{ | ||||
| 			RepoName:       d.Get(repoName).(string), | ||||
| @@ -134,7 +186,15 @@ func resourceRepoCreate(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 			TrustModel:    "default", | ||||
| 		} | ||||
|  | ||||
| 		repo, _, err = client.CreateOrgRepo(d.Get(repoOwner).(string), opts) | ||||
| 		if orgRepo { | ||||
| 			repo, _, err = client.CreateOrgRepo(d.Get(repoOwner).(string), opts) | ||||
| 		} else { | ||||
| 			if hasAdmin { | ||||
| 				repo, _, err = client.AdminCreateRepo(d.Get(repoOwner).(string), opts) | ||||
| 			} else { | ||||
| 				repo, _, err = client.CreateRepo(opts) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if err != nil { | ||||
| @@ -533,6 +593,8 @@ func resourceGiteaRepository() *schema.Resource { | ||||
| 			"Per default this repository will be initializiled with the provided configuration (gitignore, License etc.).\n" + | ||||
| 			"If the `username` property is set to a organisation name, the provider will try to look if this organisation exists " + | ||||
| 			"and create the repository under the organisation scope.\n\n" + | ||||
| 			"Repository migrations have some properties that are not available to regular repositories. These are all prefixed with `migration_`.", | ||||
| 			"Repository migrations have some properties that are not available to regular repositories. These are all prefixed with `migration_`.\n" + | ||||
| 			"Codeberg.org does currently not allow mirrors to be created. See FAQ Section of CodeBerg for more information: " + | ||||
| 			"https://docs.codeberg.org/getting-started/faq/#why-am-i-not-allowed-to-set-up-an-automatic-mirror", | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										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", | ||||
| 	} | ||||
| } | ||||
| @@ -1,6 +1,7 @@ | ||||
| package gitea | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| @@ -18,6 +19,7 @@ const ( | ||||
| 	TeamIncludeAllReposFlag string = "include_all_repositories" | ||||
| 	TeamUnits               string = "units" | ||||
| 	TeamMembers             string = "members" | ||||
| 	TeamRepositories        string = "repositories" | ||||
| ) | ||||
|  | ||||
| func resourceTeamRead(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| @@ -75,12 +77,14 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 		units = append(units, gitea.RepoUnitProjects) | ||||
| 	} | ||||
|  | ||||
| 	includeAllRepos := d.Get(TeamIncludeAllReposFlag).(bool) | ||||
|  | ||||
| 	opts := gitea.CreateTeamOption{ | ||||
| 		Name:                    d.Get(TeamName).(string), | ||||
| 		Description:             d.Get(TeamDescription).(string), | ||||
| 		Permission:              gitea.AccessMode(d.Get(TeamPermissions).(string)), | ||||
| 		CanCreateOrgRepo:        d.Get(TeamCreateRepoFlag).(bool), | ||||
| 		IncludesAllRepositories: d.Get(TeamIncludeAllReposFlag).(bool), | ||||
| 		IncludesAllRepositories: includeAllRepos, | ||||
| 		Units:                   units, | ||||
| 	} | ||||
|  | ||||
| @@ -101,6 +105,13 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if !includeAllRepos { | ||||
| 		err = setTeamRepositories(team, d, meta, false) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	err = setTeamResourceData(team, d) | ||||
|  | ||||
| 	return | ||||
| @@ -181,6 +192,13 @@ func resourceTeamUpdate(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if !includeAllRepos { | ||||
| 		err = setTeamRepositories(team, d, meta, true) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	team, _, _ = client.GetTeam(id) | ||||
|  | ||||
| 	err = setTeamResourceData(team, d) | ||||
| @@ -218,6 +236,7 @@ func setTeamResourceData(team *gitea.Team, d *schema.ResourceData) (err error) { | ||||
| 	d.Set(TeamUnits, d.Get(TeamUnits).(string)) | ||||
| 	d.Set(TeamOrg, d.Get(TeamOrg).(string)) | ||||
| 	d.Set(TeamMembers, d.Get(TeamMembers)) | ||||
| 	d.Set(TeamRepositories, d.Get(TeamRepositories)) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| @@ -290,7 +309,75 @@ func resourceGiteaTeam() *schema.Resource { | ||||
| 				Computed:    true, | ||||
| 				Description: "List of Users that should be part of this team", | ||||
| 			}, | ||||
| 			"repositories": { | ||||
| 				Type: schema.TypeList, | ||||
| 				Elem: &schema.Schema{ | ||||
| 					Type: schema.TypeString, | ||||
| 				}, | ||||
| 				Optional:    true, | ||||
| 				Required:    false, | ||||
| 				Computed:    true, | ||||
| 				Description: "List of Repositories that should be part of this team", | ||||
| 			}, | ||||
| 		}, | ||||
| 		Description: "`gitea_team` manages Team that are part of an organisation.", | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func setTeamRepositories(team *gitea.Team, d *schema.ResourceData, meta interface{}, update bool) (err error) { | ||||
| 	client := meta.(*gitea.Client) | ||||
|  | ||||
| 	org := d.Get(TeamOrg).(string) | ||||
|  | ||||
| 	repositories := make(map[string]bool) | ||||
| 	for _, repo := range d.Get(TeamRepositories).([]interface{}) { | ||||
| 		if repo != "" { | ||||
| 			repositories[repo.(string)] = true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if update { | ||||
| 		page := 1 | ||||
|  | ||||
| 		for { | ||||
| 			var existingRepositories []*gitea.Repository | ||||
| 			existingRepositories, _, err = client.ListTeamRepositories(team.ID, gitea.ListTeamRepositoriesOptions{ | ||||
| 				ListOptions: gitea.ListOptions{ | ||||
| 					Page:     page, | ||||
| 					PageSize: 50, | ||||
| 				}, | ||||
| 			}) | ||||
| 			if err != nil { | ||||
| 				return errors.New(fmt.Sprintf("[ERROR] Error listeng team repositories: %s", err)) | ||||
| 			} | ||||
| 			if len(existingRepositories) == 0 { | ||||
| 				break | ||||
| 			} | ||||
|  | ||||
| 			for _, exr := range existingRepositories { | ||||
| 				_, exists := repositories[exr.Name] | ||||
| 				if exists { | ||||
| 					repositories[exr.Name] = false | ||||
| 				} else { | ||||
| 					_, err = client.RemoveTeamRepository(team.ID, org, exr.Name) | ||||
| 					if err != nil { | ||||
| 						return errors.New(fmt.Sprintf("[ERROR] Error removing team repository %q: %s", exr.Name, err)) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			page += 1 | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for repo, flag := range repositories { | ||||
| 		if flag { | ||||
| 			_, err = client.AddTeamRepository(team.ID, org, repo) | ||||
| 			if err != nil { | ||||
| 				return errors.New(fmt.Sprintf("[ERROR] Error adding team repository %q: %s", repo, err)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|   | ||||
							
								
								
									
										42
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								go.mod
									
									
									
									
									
								
							| @@ -4,8 +4,9 @@ go 1.18 | ||||
|  | ||||
| require ( | ||||
| 	code.gitea.io/sdk/gitea v0.15.1 | ||||
| 	github.com/hashicorp/terraform-plugin-docs v0.13.0 | ||||
| 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1 | ||||
| 	github.com/hashicorp/terraform-plugin-docs v0.14.1 | ||||
| 	github.com/hashicorp/terraform-plugin-log v0.8.0 | ||||
| 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| @@ -16,7 +17,6 @@ require ( | ||||
| 	github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect | ||||
| 	github.com/armon/go-radix v1.0.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/golang/protobuf v1.5.2 // indirect | ||||
| 	github.com/google/go-cmp v0.5.9 // indirect | ||||
| @@ -25,26 +25,25 @@ require ( | ||||
| 	github.com/hashicorp/go-checkpoint v0.5.0 // 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-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-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-version v1.6.0 // indirect | ||||
| 	github.com/hashicorp/hc-install v0.4.0 // indirect | ||||
| 	github.com/hashicorp/hcl/v2 v2.15.0 // indirect | ||||
| 	github.com/hashicorp/hc-install v0.5.0 // indirect | ||||
| 	github.com/hashicorp/hcl/v2 v2.16.2 // indirect | ||||
| 	github.com/hashicorp/logutils v1.0.0 // indirect | ||||
| 	github.com/hashicorp/terraform-exec v0.17.3 // indirect | ||||
| 	github.com/hashicorp/terraform-json v0.14.0 // indirect | ||||
| 	github.com/hashicorp/terraform-plugin-go v0.14.1 // indirect | ||||
| 	github.com/hashicorp/terraform-plugin-log v0.7.0 // indirect | ||||
| 	github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c // indirect | ||||
| 	github.com/hashicorp/terraform-exec v0.18.1 // indirect | ||||
| 	github.com/hashicorp/terraform-json v0.16.0 // indirect | ||||
| 	github.com/hashicorp/terraform-plugin-go v0.14.3 // 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/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect | ||||
| 	github.com/huandu/xstrings v1.3.2 // indirect | ||||
| 	github.com/imdario/mergo v0.3.13 // indirect | ||||
| 	github.com/mattn/go-colorable v0.1.12 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.14 // indirect | ||||
| 	github.com/mitchellh/cli v1.1.4 // indirect | ||||
| 	github.com/mattn/go-colorable v0.1.13 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.16 // indirect | ||||
| 	github.com/mitchellh/cli v1.1.5 // indirect | ||||
| 	github.com/mitchellh/copystructure v1.2.0 // indirect | ||||
| 	github.com/mitchellh/go-testing-interface v1.14.1 // 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 v4.3.12 // indirect | ||||
| 	github.com/vmihailenco/tagparser v0.1.1 // indirect | ||||
| 	github.com/zclconf/go-cty v1.12.1 // indirect | ||||
| 	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect | ||||
| 	golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect | ||||
| 	golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect | ||||
| 	golang.org/x/text v0.3.7 // indirect | ||||
| 	github.com/zclconf/go-cty v1.13.1 // indirect | ||||
| 	golang.org/x/crypto v0.7.0 // indirect | ||||
| 	golang.org/x/mod v0.8.0 // indirect | ||||
| 	golang.org/x/net v0.8.0 // 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/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 | ||||
| ) | ||||
|   | ||||
							
								
								
									
										110
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								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/go.mod h1:klY2LVI3s3NChzIk/MzMn7G1FHrfU7qd63iSMVoHRBA= | ||||
| 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/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= | ||||
| 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/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/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= | ||||
| 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/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= | ||||
| 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/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= | ||||
| 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.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.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| 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/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-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-hclog v1.2.1 h1:YQsLlGDJgwhXFpucSPyVbCBviQtjlHv3jLTlp8YmtEw= | ||||
| github.com/hashicorp/go-hclog v1.2.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= | ||||
| github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I= | ||||
| 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.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= | ||||
| 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.6/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= | ||||
| github.com/hashicorp/go-plugin v1.4.8 h1:CHGwpxYDOttQOY7HOWgETU9dyVjOXzniXDqJcYJE1zM= | ||||
| 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.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= | ||||
| 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.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/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | ||||
| github.com/hashicorp/hc-install v0.4.0 h1:cZkRFr1WVa0Ty6x5fTvL1TuO1flul231rWkGH92oYYk= | ||||
| github.com/hashicorp/hc-install v0.4.0/go.mod h1:5d155H8EC5ewegao9A4PUTMNPZaq+TbOzkJJZ4vrXeI= | ||||
| github.com/hashicorp/hcl/v2 v2.15.0 h1:CPDXO6+uORPjKflkWCCwoWc9uRp+zSIPcCQ+BrxV7m8= | ||||
| github.com/hashicorp/hcl/v2 v2.15.0/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng= | ||||
| github.com/hashicorp/hc-install v0.5.0 h1:D9bl4KayIYKEeJ4vUDe9L5huqxZXczKaykSRcmQ0xY0= | ||||
| github.com/hashicorp/hc-install v0.5.0/go.mod h1:JyzMfbzfSBSjoDCRPna1vi/24BEDxFaCPfdHtM5SCdo= | ||||
| github.com/hashicorp/hcl/v2 v2.16.2 h1:mpkHZh/Tv+xet3sy3F9Ld4FyI2tUpWe9x3XtPx9f1a0= | ||||
| 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/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= | ||||
| github.com/hashicorp/terraform-exec v0.17.3 h1:MX14Kvnka/oWGmIkyuyvL6POx25ZmKrjlaclkx3eErU= | ||||
| github.com/hashicorp/terraform-exec v0.17.3/go.mod h1:+NELG0EqQekJzhvikkeQsOAZpsw0cv/03rbeQJqscAI= | ||||
| github.com/hashicorp/terraform-json v0.14.0 h1:sh9iZ1Y8IFJLx+xQiKHGud6/TSUCM0N8e17dKDpqV7s= | ||||
| github.com/hashicorp/terraform-json v0.14.0/go.mod h1:5A9HIWPkk4e5aeeXIBbkcOvaZbIYnAIkEyqP2pNSckM= | ||||
| 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-go v0.14.1 h1:cwZzPYla82XwAqpLhSzdVsOMU+6H29tczAwrB0z9Zek= | ||||
| github.com/hashicorp/terraform-plugin-go v0.14.1/go.mod h1:Bc/K6K26BQ2FHqIELPbpKtt2CzzbQou+0UQF3/0NsCQ= | ||||
| github.com/hashicorp/terraform-plugin-log v0.7.0 h1:SDxJUyT8TwN4l5b5/VkiTIaQgY6R+Y2BQ0sRZftGKQs= | ||||
| github.com/hashicorp/terraform-plugin-log v0.7.0/go.mod h1:p4R1jWBXRTvL4odmEkFfDdhUjHf9zcs/BCoNHAc7IK4= | ||||
| github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1 h1:zHcMbxY0+rFO9gY99elV/XC/UnQVg7FhRCbj1i5b7vM= | ||||
| github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1/go.mod h1:+tNlb0wkfdsDJ7JEiERLz4HzM19HyiuIoGzTsM7rPpw= | ||||
| github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c h1:D8aRO6+mTqHfLsK/BC3j5OAoogv1WLRWzY1AaTo3rBg= | ||||
| github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c/go.mod h1:Wn3Na71knbXc1G8Lh+yu/dQWWJeFQEpDeJMtWMtlmNI= | ||||
| github.com/hashicorp/terraform-exec v0.18.1 h1:LAbfDvNQU1l0NOQlTuudjczVhHj061fNX5H8XZxHlH4= | ||||
| github.com/hashicorp/terraform-exec v0.18.1/go.mod h1:58wg4IeuAJ6LVsLUeD2DWZZoc/bYi6dzhLHzxM41980= | ||||
| github.com/hashicorp/terraform-json v0.16.0 h1:UKkeWRWb23do5LNAFlh/K3N0ymn1qTOO8c+85Albo3s= | ||||
| github.com/hashicorp/terraform-json v0.16.0/go.mod h1:v0Ufk9jJnk6tcIZvScHvetlKfiNTC+WS21mnXIlc0B0= | ||||
| github.com/hashicorp/terraform-plugin-docs v0.14.1 h1:MikFi59KxrP/ewrZoaowrB9he5Vu4FtvhamZFustiA4= | ||||
| github.com/hashicorp/terraform-plugin-docs v0.14.1/go.mod h1:k2NW8+t113jAus6bb5tQYQgEAX/KueE/u8X2Z45V1GM= | ||||
| github.com/hashicorp/terraform-plugin-go v0.14.3 h1:nlnJ1GXKdMwsC8g1Nh05tK2wsC3+3BL/DBBxFEki+j0= | ||||
| github.com/hashicorp/terraform-plugin-go v0.14.3/go.mod h1:7ees7DMZ263q8wQ6E4RdIdR6nHHJtrdt4ogX5lPkX1A= | ||||
| github.com/hashicorp/terraform-plugin-log v0.8.0 h1:pX2VQ/TGKu+UU1rCay0OlzosNKe4Nz1pepLXj95oyy0= | ||||
| github.com/hashicorp/terraform-plugin-log v0.8.0/go.mod h1:1myFrhVsBLeylQzYYEV17VVjtG8oYPRFdaZs7xdW2xs= | ||||
| github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1 h1:G9WAfb8LHeCxu7Ae8nc1agZlQOSCUWsb610iAogBhCs= | ||||
| github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1/go.mod h1:xcOSYlRVdPLmDUoqPhO9fiO/YCN/l6MGYeTzGt5jgkQ= | ||||
| github.com/hashicorp/terraform-registry-address v0.1.0 h1:W6JkV9wbum+m516rCl5/NjKxCyTVaaUBbzYcMzBDO3U= | ||||
| 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/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg= | ||||
| github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= | ||||
| @@ -162,14 +158,16 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 | ||||
| github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= | ||||
| github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | ||||
| github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | ||||
| github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= | ||||
| github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= | ||||
| github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= | ||||
| github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= | ||||
| github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | ||||
| 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/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | ||||
| github.com/mitchellh/cli v1.1.4 h1:qj8czE26AU4PbiaPXK5uVmMSM+V5BYsFBiM9HhGRLUA= | ||||
| github.com/mitchellh/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ= | ||||
| github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= | ||||
| github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= | ||||
| github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= | ||||
| 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.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= | ||||
| github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= | ||||
| @@ -185,7 +183,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/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= | ||||
| 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/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| @@ -199,7 +196,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/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= | ||||
| 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.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= | ||||
| github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= | ||||
| @@ -212,7 +208,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.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| 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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| @@ -229,12 +224,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/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= | ||||
| 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.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= | ||||
| github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= | ||||
| 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= | ||||
| github.com/zclconf/go-cty v1.13.1 h1:0a6bRwuiSHtAmqCqNOE+c2oHgepv0ctoxU4FUe43kwc= | ||||
| github.com/zclconf/go-cty v1.13.1/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= | ||||
| 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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| @@ -242,14 +235,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-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-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= | ||||
| golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= | ||||
| 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/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-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.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-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| @@ -265,8 +263,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-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-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= | ||||
| golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| 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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| @@ -274,6 +274,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-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-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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| @@ -291,15 +292,22 @@ 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-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-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8= | ||||
| golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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-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.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.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.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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||
| @@ -307,6 +315,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-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.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-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| @@ -323,8 +332,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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| 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.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= | ||||
| google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= | ||||
| 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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | ||||
| @@ -349,6 +358,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.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-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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||
| 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 | ||||
| // to approperately configure colorization options. It provides | ||||
| // to appropriately configure colorization options. It provides | ||||
| // a wrapper to the output stream on Windows systems. | ||||
| func (l *intLogger) setColorization(opts *LoggerOptions) { | ||||
| 	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 | ||||
| // to approperately configure colorization options. It provides | ||||
| // to appropriately configure colorization options. It provides | ||||
| // a wrapper to the output stream on Windows systems. | ||||
| func (l *intLogger) setColorization(opts *LoggerOptions) { | ||||
| 	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 | ||||
| // 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. | ||||
| // The value of the Default logger can be set via SetDefault() or by | ||||
| // changing the options in DefaultOptions. | ||||
| // | ||||
| // 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 | ||||
| // Logger being returned. | ||||
| func Default() Logger { | ||||
|   | ||||
							
								
								
									
										184
									
								
								vendor/github.com/hashicorp/go-hclog/intlogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										184
									
								
								vendor/github.com/hashicorp/go-hclog/intlogger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -17,6 +17,8 @@ import ( | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"github.com/fatih/color" | ||||
| ) | ||||
| @@ -48,6 +50,12 @@ var ( | ||||
| 		Warn:  color.New(color.FgHiYellow), | ||||
| 		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 | ||||
| @@ -70,6 +78,7 @@ type intLogger struct { | ||||
| 	level  *int32 | ||||
|  | ||||
| 	headerColor ColorOption | ||||
| 	fieldColor  ColorOption | ||||
|  | ||||
| 	implied []interface{} | ||||
|  | ||||
| @@ -115,14 +124,19 @@ func newLogger(opts *LoggerOptions) *intLogger { | ||||
| 		mutex = new(sync.Mutex) | ||||
| 	} | ||||
|  | ||||
| 	var primaryColor, headerColor ColorOption | ||||
|  | ||||
| 	if opts.ColorHeaderOnly { | ||||
| 		primaryColor = ColorOff | ||||
| 	var ( | ||||
| 		primaryColor ColorOption = ColorOff | ||||
| 		headerColor  ColorOption = ColorOff | ||||
| 		fieldColor   ColorOption = ColorOff | ||||
| 	) | ||||
| 	switch { | ||||
| 	case opts.ColorHeaderOnly: | ||||
| 		headerColor = opts.Color | ||||
| 	} else { | ||||
| 	case opts.ColorHeaderAndFields: | ||||
| 		fieldColor = opts.Color | ||||
| 		headerColor = opts.Color | ||||
| 	default: | ||||
| 		primaryColor = opts.Color | ||||
| 		headerColor = ColorOff | ||||
| 	} | ||||
|  | ||||
| 	l := &intLogger{ | ||||
| @@ -137,6 +151,7 @@ func newLogger(opts *LoggerOptions) *intLogger { | ||||
| 		exclude:           opts.Exclude, | ||||
| 		independentLevels: opts.IndependentLevels, | ||||
| 		headerColor:       headerColor, | ||||
| 		fieldColor:        fieldColor, | ||||
| 	} | ||||
| 	if opts.IncludeLocation { | ||||
| 		l.callerOffset = offsetIntLogger + opts.AdditionalLocationOffset | ||||
| @@ -160,7 +175,7 @@ func newLogger(opts *LoggerOptions) *intLogger { | ||||
| } | ||||
|  | ||||
| // offsetIntLogger is the stack frame offset in the call stack for the caller to | ||||
| // one of the Warn,Info,Log,etc methods. | ||||
| // one of the Warn, Info, Log, etc methods. | ||||
| const offsetIntLogger = 3 | ||||
|  | ||||
| // Log a message and a set of key/value pairs if the given level is at | ||||
| @@ -235,7 +250,17 @@ func needsQuoting(str string) bool { | ||||
| 	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{}) { | ||||
|  | ||||
| 	if !l.disableTime { | ||||
| @@ -269,16 +294,19 @@ func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, | ||||
|  | ||||
| 	if name != "" { | ||||
| 		l.writer.WriteString(name) | ||||
| 		l.writer.WriteString(": ") | ||||
| 		if msg != "" { | ||||
| 			l.writer.WriteString(": ") | ||||
| 			l.writer.WriteString(msg) | ||||
| 		} | ||||
| 	} else if msg != "" { | ||||
| 		l.writer.WriteString(msg) | ||||
| 	} | ||||
|  | ||||
| 	l.writer.WriteString(msg) | ||||
|  | ||||
| 	args = append(l.implied, args...) | ||||
|  | ||||
| 	var stacktrace CapturedStacktrace | ||||
|  | ||||
| 	if args != nil && len(args) > 0 { | ||||
| 	if len(args) > 0 { | ||||
| 		if len(args)%2 != 0 { | ||||
| 			cs, ok := args[len(args)-1].(CapturedStacktrace) | ||||
| 			if ok { | ||||
| @@ -292,13 +320,16 @@ func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, | ||||
|  | ||||
| 		l.writer.WriteByte(':') | ||||
|  | ||||
| 		// Handle the field arguments, which come in pairs (key=val). | ||||
| 	FOR: | ||||
| 		for i := 0; i < len(args); i = i + 2 { | ||||
| 			var ( | ||||
| 				key string | ||||
| 				val string | ||||
| 				raw bool | ||||
| 			) | ||||
|  | ||||
| 			// Convert the field value to a string. | ||||
| 			switch st := args[i+1].(type) { | ||||
| 			case string: | ||||
| 				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) { | ||||
| 			case string: | ||||
| 				key = st | ||||
| @@ -359,21 +389,49 @@ func (l *intLogger) logPlain(t time.Time, name string, level Level, msg string, | ||||
| 				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") { | ||||
| 				l.writer.WriteString("\n  ") | ||||
| 				l.writer.WriteString(key) | ||||
| 				l.writer.WriteString("=\n") | ||||
| 				writeIndent(l.writer, val, "  | ") | ||||
| 				if l.fieldColor != ColorOff { | ||||
| 					l.writer.WriteString(faintFieldSeparatorWithNewLine) | ||||
| 					writeIndent(l.writer, val, faintMultiLinePrefix) | ||||
| 				} else { | ||||
| 					l.writer.WriteString("=\n") | ||||
| 					writeIndent(l.writer, val, "  | ") | ||||
| 				} | ||||
| 				l.writer.WriteString("  ") | ||||
| 			} else if !raw && needsQuoting(val) { | ||||
| 				l.writer.WriteByte(' ') | ||||
| 				l.writer.WriteString(key) | ||||
| 				l.writer.WriteByte('=') | ||||
| 				l.writer.WriteString(strconv.Quote(val)) | ||||
| 				if l.fieldColor != ColorOff { | ||||
| 					l.writer.WriteString(faintFieldSeparator) | ||||
| 				} else { | ||||
| 					l.writer.WriteByte('=') | ||||
| 				} | ||||
| 				l.writer.WriteByte('"') | ||||
| 				writeEscapedForOutput(l.writer, val, true) | ||||
| 				l.writer.WriteByte('"') | ||||
| 			} else { | ||||
| 				l.writer.WriteByte(' ') | ||||
| 				l.writer.WriteString(key) | ||||
| 				l.writer.WriteByte('=') | ||||
| 				if l.fieldColor != ColorOff { | ||||
| 					l.writer.WriteString(faintFieldSeparator) | ||||
| 				} else { | ||||
| 					l.writer.WriteByte('=') | ||||
| 				} | ||||
| 				l.writer.WriteString(val) | ||||
| 			} | ||||
| 		} | ||||
| @@ -393,19 +451,98 @@ func writeIndent(w *writer, str string, indent string) { | ||||
| 		if nl == -1 { | ||||
| 			if str != "" { | ||||
| 				w.WriteString(indent) | ||||
| 				w.WriteString(str) | ||||
| 				writeEscapedForOutput(w, str, false) | ||||
| 				w.WriteString("\n") | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		w.WriteString(indent) | ||||
| 		w.WriteString(str[:nl]) | ||||
| 		writeEscapedForOutput(w, str[:nl], false) | ||||
| 		w.WriteString("\n") | ||||
| 		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 { | ||||
| 	var buf bytes.Buffer | ||||
|  | ||||
| @@ -707,6 +844,11 @@ func (l *intLogger) SetLevel(level 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 | ||||
| // allows packages that expect to be using the standard library log to actually | ||||
| // use this logger. | ||||
|   | ||||
							
								
								
									
										25
									
								
								vendor/github.com/hashicorp/go-hclog/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/hashicorp/go-hclog/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -9,7 +9,7 @@ import ( | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	//DefaultOutput is used as the default log output. | ||||
| 	// DefaultOutput is used as the default log output. | ||||
| 	DefaultOutput io.Writer = os.Stderr | ||||
|  | ||||
| 	// DefaultLevel is used as the default log level. | ||||
| @@ -28,7 +28,7 @@ const ( | ||||
| 	// of actions in code, such as function enters/exits, etc. | ||||
| 	Trace Level = 1 | ||||
|  | ||||
| 	// Debug information for programmer lowlevel analysis. | ||||
| 	// Debug information for programmer low-level analysis. | ||||
| 	Debug Level = 2 | ||||
|  | ||||
| 	// Info information about steady state operations. | ||||
| @@ -44,13 +44,13 @@ const ( | ||||
| 	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 | ||||
| // 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}). | ||||
| 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. | ||||
| func Fmt(str string, args ...interface{}) Format { | ||||
| 	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 { | ||||
| 	// Args are alternating key, val pairs | ||||
| 	// keys must be strings | ||||
| @@ -198,6 +198,9 @@ type Logger interface { | ||||
| 	// implementation cannot update the level on the fly, it should no-op. | ||||
| 	SetLevel(level Level) | ||||
|  | ||||
| 	// Returns the current level | ||||
| 	GetLevel() Level | ||||
|  | ||||
| 	// Return a value that conforms to the stdlib log.Logger interface | ||||
| 	StandardLogger(opts *StandardLoggerOptions) *log.Logger | ||||
|  | ||||
| @@ -236,7 +239,7 @@ type LoggerOptions struct { | ||||
| 	// Name of the subsystem to prefix logs with | ||||
| 	Name string | ||||
|  | ||||
| 	// The threshold for the logger. Anything less severe is supressed | ||||
| 	// The threshold for the logger. Anything less severe is suppressed | ||||
| 	Level Level | ||||
|  | ||||
| 	// 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. | ||||
| 	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. | ||||
| 	Color ColorOption | ||||
|  | ||||
| 	// Only color the header, not the body. This can help with readability of long messages. | ||||
| 	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 | ||||
| 	// should not be logged. | ||||
| 	// 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 | ||||
| 	// copy of this logger's level. This means that using SetLevel on this | ||||
| 	// logger will not effect any subloggers, and SetLevel on any subloggers | ||||
| 	// will not effect the parent or sibling loggers. | ||||
| 	// logger will not affect any subloggers, and SetLevel on any subloggers | ||||
| 	// will not affect the parent or sibling loggers. | ||||
| 	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) GetLevel() Level { return NoLevel } | ||||
|  | ||||
| func (l *nullLogger) StandardLogger(opts *StandardLoggerOptions) *log.Logger { | ||||
| 	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 | ||||
|  | ||||
| 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" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| // by plugin RPC implementations to change error behavior since you | ||||
| // can expected network connection errors at this point. This should be | ||||
| @@ -473,7 +481,17 @@ func (c *Client) Kill() { | ||||
| 	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. | ||||
| // | ||||
| // 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) | ||||
| 		parts := strings.SplitN(line, "|", 6) | ||||
| 		if len(parts) < 4 { | ||||
| 			err = fmt.Errorf( | ||||
| 				"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) | ||||
| 			err = fmt.Errorf(unrecognizedRemotePluginMessage, line, additionalNotesAboutCommand(cmd.Path)) | ||||
| 			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 | ||||
| ================================== | ||||
|  | ||||
|   | ||||
							
								
								
									
										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 != "" { | ||||
| 		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 { | ||||
| 		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" | ||||
|  | ||||
| 	"github.com/hashicorp/go-version" | ||||
| 	"golang.org/x/mod/modfile" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| 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 { | ||||
| 		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 { | ||||
| 		vendorDir := filepath.Join(repoDir, "vendor") | ||||
| 		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) | ||||
| 	cmd := exec.CommandContext(ctx, goCmd, goArgs...) | ||||
| 	gb.log().Printf("executing %s %q in %q", reqGo.Cmd, buildArgs, repoDir) | ||||
| 	cmd := exec.CommandContext(ctx, reqGo.Cmd, buildArgs...) | ||||
| 	cmd.Dir = repoDir | ||||
| 	out, err := cmd.CombinedOutput() | ||||
| 	if err != nil { | ||||
| @@ -71,35 +96,59 @@ func (gb *GoBuild) Remove(ctx context.Context) error { | ||||
| 	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" | ||||
| 	noopCleanupFunc := func(context.Context) {} | ||||
|  | ||||
| 	var installedVersion *version.Version | ||||
|  | ||||
| 	if gb.Version != nil { | ||||
| 		gb.logger.Printf("attempting to satisfy explicit requirement for Go %s", gb.Version) | ||||
| 		goVersion, err := GetGoVersion(ctx) | ||||
| 		if err != nil { | ||||
| 			return cmdName, noopCleanupFunc, err | ||||
| 			return Go{ | ||||
| 				Cmd:         cmdName, | ||||
| 				CleanupFunc: noopCleanupFunc, | ||||
| 			}, err | ||||
| 		} | ||||
|  | ||||
| 		if !goVersion.GreaterThanOrEqual(gb.Version) { | ||||
| 			// found incompatible version, try downloading the desired one | ||||
| 			return gb.installGoVersion(ctx, gb.Version) | ||||
| 		} | ||||
| 		installedVersion = goVersion | ||||
| 	} | ||||
|  | ||||
| 	if requiredVersion, ok := guessRequiredGoVersion(repoDir); ok { | ||||
| 		gb.logger.Printf("attempting to satisfy guessed Go requirement %s", requiredVersion) | ||||
| 		goVersion, err := GetGoVersion(ctx) | ||||
| 		if err != nil { | ||||
| 			return cmdName, noopCleanupFunc, err | ||||
| 			return Go{ | ||||
| 				Cmd:         cmdName, | ||||
| 				CleanupFunc: noopCleanupFunc, | ||||
| 			}, err | ||||
| 		} | ||||
|  | ||||
| 		if !goVersion.GreaterThanOrEqual(requiredVersion) { | ||||
| 			// found incompatible version, try downloading the desired one | ||||
| 			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 | ||||
| @@ -119,5 +168,26 @@ func guessRequiredGoVersion(repoDir string) (*version.Version, bool) { | ||||
| 		} | ||||
| 		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 | ||||
| } | ||||
|   | ||||
							
								
								
									
										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 | ||||
| // according to https://golang.org/doc/manage-install | ||||
| func (gb *GoBuild) installGoVersion(ctx context.Context, v *version.Version) (string, CleanupFunc, error) { | ||||
| 	// trim 0 patch versions as that's how Go does it :shrug: | ||||
| 	shortVersion := strings.TrimSuffix(v.String(), ".0") | ||||
| func (gb *GoBuild) installGoVersion(ctx context.Context, v *version.Version) (Go, error) { | ||||
| 	versionString := v.Core().String() | ||||
|  | ||||
| 	// 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) | ||||
|  | ||||
| 	gb.log().Printf("go getting %q", pkgURL) | ||||
| 	cmd := exec.CommandContext(ctx, "go", "get", pkgURL) | ||||
| 	out, err := cmd.CombinedOutput() | ||||
| 	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) | ||||
|  | ||||
| 	gb.log().Printf("downloading go %q", shortVersion) | ||||
| 	gb.log().Printf("downloading go %q", v) | ||||
| 	cmd = exec.CommandContext(ctx, cmdName, "download") | ||||
| 	out, err = cmd.CombinedOutput() | ||||
| 	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) { | ||||
| 		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" | ||||
|  | ||||
| 	"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 | ||||
| @@ -13,7 +13,7 @@ import ( | ||||
| func NewHTTPClient() *http.Client { | ||||
| 	client := cleanhttp.DefaultClient() | ||||
|  | ||||
| 	userAgent := fmt.Sprintf("hc-install/%s", version.ModuleVersion()) | ||||
| 	userAgent := fmt.Sprintf("hc-install/%s", version.Version()) | ||||
|  | ||||
| 	cli := cleanhttp.DefaultPooledClient() | ||||
| 	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 ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"crypto/sha256" | ||||
| 	"encoding/hex" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
|  | ||||
| @@ -42,7 +44,7 @@ func HashSumFromHexDigest(hexDigest string) (HashSum, error) { | ||||
| 	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) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -54,7 +56,12 @@ func (cd *ChecksumDownloader) DownloadAndVerifyChecksums() (ChecksumFileMap, err | ||||
| 		url.PathEscape(cd.ProductVersion.RawVersion), | ||||
| 		url.PathEscape(sigFilename)) | ||||
| 	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 { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -70,7 +77,12 @@ func (cd *ChecksumDownloader) DownloadAndVerifyChecksums() (ChecksumFileMap, err | ||||
| 		url.PathEscape(cd.ProductVersion.RawVersion), | ||||
| 		url.PathEscape(cd.ProductVersion.SHASUMS)) | ||||
| 	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 { | ||||
| 		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/ioutil" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"runtime" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/hashicorp/hc-install/internal/httpclient" | ||||
| ) | ||||
| @@ -23,14 +25,14 @@ type Downloader struct { | ||||
| 	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 { | ||||
| 		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") | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| @@ -42,14 +44,14 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | ||||
| 			Logger:           d.Logger, | ||||
| 			ArmoredPublicKey: d.ArmoredPublicKey, | ||||
| 		} | ||||
| 		verifiedChecksums, err := v.DownloadAndVerifyChecksums() | ||||
| 		verifiedChecksums, err := v.DownloadAndVerifyChecksums(ctx) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return "", err | ||||
| 		} | ||||
| 		var ok bool | ||||
| 		verifiedChecksum, ok = verifiedChecksums[pb.Filename] | ||||
| 		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 | ||||
| 		baseURL, err := url.Parse(d.BaseURL) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return "", err | ||||
| 		} | ||||
|  | ||||
| 		u, err := url.Parse(archiveURL) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return "", err | ||||
| 		} | ||||
| 		u.Scheme = baseURL.Scheme | ||||
| 		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) | ||||
| 	resp, err := client.Get(archiveURL) | ||||
|  | ||||
| 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, archiveURL, 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 { | ||||
| 		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() | ||||
| @@ -90,7 +97,7 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | ||||
|  | ||||
| 	contentType := resp.Header.Get("content-type") | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| @@ -105,15 +112,16 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | ||||
|  | ||||
| 		err := compareChecksum(d.Logger, r, verifiedChecksum, pb.Filename, expectedSize) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return "", err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	pkgFile, err := ioutil.TempFile("", pb.Filename) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 		return "", err | ||||
| 	} | ||||
| 	defer pkgFile.Close() | ||||
| 	pkgFilePath, err := filepath.Abs(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 | ||||
| @@ -122,43 +130,48 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, | ||||
| 	// on demand over the network. | ||||
| 	bytesCopied, err := io.Copy(pkgFile, pkgReader) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 		return pkgFilePath, err | ||||
| 	} | ||||
| 	d.Logger.Printf("copied %d bytes to %s", bytesCopied, pkgFile.Name()) | ||||
|  | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| 	r, err := zip.OpenReader(pkgFile.Name()) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 		return pkgFilePath, err | ||||
| 	} | ||||
| 	defer r.Close() | ||||
|  | ||||
| 	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() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return pkgFilePath, err | ||||
| 		} | ||||
|  | ||||
| 		d.Logger.Printf("unpacking %s to %s", f.Name, dstDir) | ||||
| 		dstPath := filepath.Join(dstDir, f.Name) | ||||
| 		dstFile, err := os.Create(dstPath) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return pkgFilePath, err | ||||
| 		} | ||||
|  | ||||
| 		_, err = io.Copy(dstFile, srcFile) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return pkgFilePath, err | ||||
| 		} | ||||
| 		srcFile.Close() | ||||
| 		dstFile.Close() | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| 	return pkgFilePath, nil | ||||
| } | ||||
|  | ||||
| // 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" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
|  | ||||
| @@ -68,7 +69,11 @@ func (r *Releases) ListProductVersions(ctx context.Context, productName string) | ||||
| 		url.PathEscape(productName)) | ||||
| 	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 { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -133,7 +138,11 @@ func (r *Releases) GetProductVersion(ctx context.Context, product string, versio | ||||
| 		url.PathEscape(version.String())) | ||||
| 	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 { | ||||
| 		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{ | ||||
| 		GitRepoURL:    "https://github.com/hashicorp/consul.git", | ||||
| 		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 ( | ||||
| 	vaultVersionOutputRe = regexp.MustCompile(`Vault ` + simpleVersionRe) | ||||
| 	v1_17                = version.Must(version.NewVersion("1.17")) | ||||
| ) | ||||
|  | ||||
| var Vault = Product{ | ||||
| @@ -49,6 +48,6 @@ var Vault = Product{ | ||||
| 	BuildInstructions: &BuildInstructions{ | ||||
| 		GitRepoURL:    "https://github.com/hashicorp/vault.git", | ||||
| 		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 | ||||
| 	} | ||||
|  | ||||
| 	err = d.DownloadAndUnpack(ctx, pv, dstDir) | ||||
| 	zipFilePath, err := d.DownloadAndUnpack(ctx, pv, dstDir) | ||||
| 	if zipFilePath != "" { | ||||
| 		ev.pathsToRemove = append(ev.pathsToRemove, zipFilePath) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		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 != "" { | ||||
| 		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 { | ||||
| 		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 | ||||
|  | ||||
| ## 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) | ||||
|  | ||||
| ### 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
| // +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 | ||||
|  | ||||
| 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 | ||||
| // 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| // 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 | ||||
|  | ||||
| // 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 | ||||
|  | ||||
| // 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 | ||||
|  | ||||
| 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 | ||||
| // 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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, | ||||
| // 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| // 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| //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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| import ( | ||||
| @@ -1174,7 +1177,12 @@ Token: | ||||
| 			// if there was a parse error in the argument then we've | ||||
| 			// probably been left in a weird place in the token stream, | ||||
| 			// 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 | ||||
| 		} | ||||
|  | ||||
|   | ||||
							
								
								
									
										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 | ||||
|  | ||||
| import ( | ||||
| @@ -38,6 +41,7 @@ func (p *parser) parseTemplateInner(end TokenType, flushHeredoc bool) ([]Express | ||||
| 	if flushHeredoc { | ||||
| 		flushHeredocTemplateParts(parts) // Trim off leading spaces on lines per the flush heredoc spec | ||||
| 	} | ||||
| 	meldConsecutiveStringLiterals(parts) | ||||
| 	tp := templateParser{ | ||||
| 		Tokens:   parts.Tokens, | ||||
| 		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 { | ||||
| 	Tokens   []templateToken | ||||
| 	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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 `*/` | ||||
|   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 | ||||
| template literals except inside an interpolation sequence or template directive. | ||||
| @@ -268,10 +268,10 @@ collection value. | ||||
| ```ebnf | ||||
| CollectionValue = tuple | object; | ||||
| tuple = "[" ( | ||||
|     (Expression ("," Expression)* ","?)? | ||||
|     (Expression (("," | Newline) Expression)* ","?)? | ||||
| ) "]"; | ||||
| object = "{" ( | ||||
|     (objectelem ("," objectelem)* ","?)? | ||||
|     (objectelem (( "," | Newline) objectelem)* ","?)? | ||||
| ) "}"; | ||||
| objectelem = (Identifier | Expression) ("=" | ":") Expression; | ||||
| ``` | ||||
| @@ -635,7 +635,7 @@ binaryOp = ExprTerm binaryOperator ExprTerm; | ||||
| binaryOperator = compareOperator | arithmeticOperator | logicOperator; | ||||
| compareOperator = "==" | "!=" | "<" | ">" | "<=" | ">="; | ||||
| arithmeticOperator = "+" | "-" | "*" | "/" | "%"; | ||||
| logicOperator = "&&" | "||" | "!"; | ||||
| logicOperator = "&&" | "||"; | ||||
| ``` | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
| # Copyright (c) HashiCorp, Inc. | ||||
| # SPDX-License-Identifier: MPL-2.0 | ||||
|  | ||||
| # | ||||
| # 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| import ( | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user