Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package terragrunt for openSUSE:Factory checked in at 2023-08-01 15:38:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/terragrunt (Old) and /work/SRC/openSUSE:Factory/.terragrunt.new.32662 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "terragrunt" Tue Aug 1 15:38:39 2023 rev:58 rq:1101685 version:0.48.5 Changes: -------- --- /work/SRC/openSUSE:Factory/terragrunt/terragrunt.changes 2023-07-25 11:49:52.373020243 +0200 +++ /work/SRC/openSUSE:Factory/.terragrunt.new.32662/terragrunt.changes 2023-08-01 15:38:43.905895319 +0200 @@ -1,0 +2,9 @@ +Tue Aug 01 10:03:34 UTC 2023 - ka...@b1-systems.de + +- Update to version 0.48.5: + * Add a "output-module-groups" command (#2130) + * Updated CLI flag wording (#2647) + * Bump tzinfo from 1.2.7 to 1.2.10 in /docs (#2207) + * Bump nokogiri from 1.13.6 to 1.14.3 in /docs (#2526) + +------------------------------------------------------------------- Old: ---- terragrunt-0.48.4.obscpio New: ---- terragrunt-0.48.5.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ terragrunt.spec ++++++ --- /var/tmp/diff_new_pack.AztpQs/_old 2023-08-01 15:38:45.449904880 +0200 +++ /var/tmp/diff_new_pack.AztpQs/_new 2023-08-01 15:38:45.453904904 +0200 @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: terragrunt -Version: 0.48.4 +Version: 0.48.5 Release: 0 Summary: Thin wrapper for Terraform for working with multiple Terraform modules License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.AztpQs/_old 2023-08-01 15:38:45.485905103 +0200 +++ /var/tmp/diff_new_pack.AztpQs/_new 2023-08-01 15:38:45.489905128 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/gruntwork-io/terragrunt</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.48.4</param> + <param name="revision">v0.48.5</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.AztpQs/_old 2023-08-01 15:38:45.537905425 +0200 +++ /var/tmp/diff_new_pack.AztpQs/_new 2023-08-01 15:38:45.545905474 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/gruntwork-io/terragrunt</param> - <param name="changesrevision">2dc7f9157abfe9890931625b64315bf22fa425c0</param></service></servicedata> + <param name="changesrevision">2cab9f99efd3a7faa0b431165fd9f697b06b7048</param></service></servicedata> (No newline at EOF) ++++++ terragrunt-0.48.4.obscpio -> terragrunt-0.48.5.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/cli/cli_app.go new/terragrunt-0.48.5/cli/cli_app.go --- old/terragrunt-0.48.4/cli/cli_app.go 2023-07-19 16:35:23.000000000 +0200 +++ new/terragrunt-0.48.5/cli/cli_app.go 2023-07-28 20:17:16.000000000 +0200 @@ -125,6 +125,7 @@ CMD_HCLFMT = "hclfmt" CMD_AWS_PROVIDER_PATCH = "aws-provider-patch" CMD_RENDER_JSON = "render-json" + CMD_OUTPUT_MODULE_GROUPS = "output-module-groups" ) // START: Constants useful for multimodule command handling @@ -245,6 +246,7 @@ hclfmt Recursively find hcl files and rewrite them into a canonical format. aws-provider-patch Overwrite settings on nested AWS providers to work around a Terraform bug (issue #13018) render-json Render the final terragrunt config, with all variables, includes, and functions resolved, as json. This is useful for enforcing policies using static analysis tools like Open Policy Agent, or for debugging your terragrunt config. + output-module-groups Output groups of modules ordered for apply as a list of list in JSON (useful for CI use cases). * Terragrunt forwards all other commands directly to Terraform GLOBAL OPTIONS: @@ -423,6 +425,18 @@ return runRenderJSON(terragruntOptions, terragruntConfig) } + if shouldPrintModuleGroups(terragruntOptions) { + js, err := runGraphDependenciesGroups(terragruntOptions) + if err != nil { + return err + } + _, err = fmt.Fprintf(terragruntOptions.Writer, "%s\n", js) + if err != nil { + return err + } + return nil + } + terragruntOptionsClone := terragruntOptions.Clone(terragruntOptions.TerragruntConfigPath) terragruntOptionsClone.TerraformCommand = CMD_TERRAGRUNT_READ_CONFIG @@ -624,6 +638,20 @@ return nil } +// Run graph dependencies returns the dependency graph +func runGraphDependenciesGroups(terragruntOptions *options.TerragruntOptions) (string, error) { + stack, err := configstack.FindStackInSubfolders(terragruntOptions, nil) + if err != nil { + return "", err + } + + js, err := stack.JsonModuleDeployOrder(terragruntOptions.TerraformCommand) + if err != nil { + return "", err + } + return js, nil +} + func shouldPrintTerraformHelp(terragruntOptions *options.TerragruntOptions) bool { for _, tfHelpFlag := range TERRAFORM_HELP_FLAGS { if util.ListContainsElement(terragruntOptions.TerraformCliArgs, tfHelpFlag) { @@ -668,6 +696,10 @@ return util.ListContainsElement(terragruntOptions.TerraformCliArgs, CMD_RENDER_JSON) } +func shouldPrintModuleGroups(terragruntOptions *options.TerragruntOptions) bool { + return util.ListContainsElement(terragruntOptions.TerraformCliArgs, CMD_OUTPUT_MODULE_GROUPS) +} + func shouldApplyAwsProviderPatch(terragruntOptions *options.TerragruntOptions) bool { return util.ListContainsElement(terragruntOptions.TerraformCliArgs, CMD_AWS_PROVIDER_PATCH) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/configstack/module.go new/terragrunt-0.48.5/configstack/module.go --- old/terragrunt-0.48.4/configstack/module.go 2023-07-19 16:35:23.000000000 +0200 +++ new/terragrunt-0.48.5/configstack/module.go 2023-07-28 20:17:16.000000000 +0200 @@ -1,6 +1,7 @@ package configstack import ( + "encoding/json" "fmt" "path/filepath" "sort" @@ -41,6 +42,10 @@ ) } +func (module TerraformModule) MarshalJSON() ([]byte, error) { + return json.Marshal(module.Path) +} + // Go through each of the given Terragrunt configuration files and resolve the module that configuration file represents // into a TerraformModule struct. Return the list of these TerraformModule structs. func ResolveTerraformModules(terragruntConfigPaths []string, terragruntOptions *options.TerragruntOptions, childTerragruntConfig *config.TerragruntConfig, howThesePathsWereFound string) ([]*TerraformModule, error) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/configstack/stack.go new/terragrunt-0.48.5/configstack/stack.go --- old/terragrunt-0.48.4/configstack/stack.go 2023-07-19 16:35:23.000000000 +0200 +++ new/terragrunt-0.48.5/configstack/stack.go 2023-07-28 20:17:16.000000000 +0200 @@ -2,6 +2,7 @@ import ( "bytes" + "encoding/json" "fmt" "io" "sort" @@ -51,6 +52,30 @@ return nil } +// JsonModuleDeployOrder will return the modules that will be deployed by a plan/apply operation, in the order +// that the operations happen. +func (stack *Stack) JsonModuleDeployOrder(terraformCommand string) (string, error) { + runGraph, err := stack.getModuleRunGraph(terraformCommand) + if err != nil { + return "", err + } + // Convert the module paths to a string array for JSON marshalling + // The index should be the group number, and the value should be an array of module paths + jsonGraph := make(map[string][]string) + for i, group := range runGraph { + groupNum := "Group " + fmt.Sprintf("%d", i+1) + jsonGraph[groupNum] = make([]string, len(group)) + for j, module := range group { + jsonGraph[groupNum][j] = module.Path + } + } + j, _ := json.MarshalIndent(jsonGraph, "", " ") + if err != nil { + return "", err + } + return string(j), nil +} + // Graph creates a graphviz representation of the modules func (stack *Stack) Graph(terragruntOptions *options.TerragruntOptions) { WriteDot(terragruntOptions.Writer, terragruntOptions, stack.Modules) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/docs/Gemfile.lock new/terragrunt-0.48.5/docs/Gemfile.lock --- old/terragrunt-0.48.4/docs/Gemfile.lock 2023-07-19 16:35:23.000000000 +0200 +++ new/terragrunt-0.48.5/docs/Gemfile.lock 2023-07-28 20:17:16.000000000 +0200 @@ -210,14 +210,14 @@ rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - mini_portile2 (2.8.0) + mini_portile2 (2.8.1) minima (2.5.1) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) minitest (5.14.2) multipart-post (2.1.1) - nokogiri (1.13.6) + nokogiri (1.14.3) mini_portile2 (~> 2.8.0) racc (~> 1.4) octokit (4.19.0) @@ -226,7 +226,7 @@ pathutil (0.16.2) forwardable-extended (~> 2.6) public_suffix (3.1.1) - racc (1.6.0) + racc (1.6.2) rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) @@ -256,7 +256,7 @@ thread_safe (0.3.6) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.7) + tzinfo (1.2.10) thread_safe (~> 0.1) unf (0.1.4) unf_ext diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/docs/_docs/04_reference/cli-options.md new/terragrunt-0.48.5/docs/_docs/04_reference/cli-options.md --- old/terragrunt-0.48.4/docs/_docs/04_reference/cli-options.md 2023-07-19 16:35:23.000000000 +0200 +++ new/terragrunt-0.48.5/docs/_docs/04_reference/cli-options.md 2023-07-28 20:17:16.000000000 +0200 @@ -36,6 +36,7 @@ - [hclfmt](#hclfmt) - [aws-provider-patch](#aws-provider-patch) - [render-json](#render-json) + - [output-module-groups](#output-module-groups) ### All Terraform built-in commands @@ -464,6 +465,46 @@ } ``` +### output-module-groups + +Output groups of modules ordered for apply as a list of list in JSON (useful for CI use cases). + +Example: + +```bash +terragrunt output-module-groups +``` + +This will recursively search the current working directory for any folders that contain Terragrunt modules and build +the dependency graph based on [`dependency`](/docs/reference/config-blocks-and-attributes/#dependency) and +[`dependencies`](/docs/reference/config-blocks-and-attributes/#dependencies) blocks. This may produce output such as: + +``` +{ + "Group 1": [ + "stage/frontend-app" + ], + "Group 2": [ + "stage/backend-app" + ], + "Group 3": [ + "mgmt/bastion-host", + "stage/search-app" + ], + "Group 4": [ + "mgmt/kms-master-key", + "stage/mysql", + "stage/redis" + ], + "Group 5": [ + "stage/vpc" + ], + "Group 6": [ + "mgmt/vpc" + ] +} +``` + ## CLI options Terragrunt forwards all options to Terraform. The only exceptions are `--version` and arguments that start with the @@ -938,7 +979,7 @@ **CLI Arg**: `--terragrunt-fail-on-state-bucket-creation` **Environment Variable**: `TERRAGRUNT_FAIL_ON_STATE_BUCKET_CREATION` (set to `true`) -When this flag is set, Terragrunt will wait for execution if it is required to create the remote state bucket. +When this flag is set, Terragrunt will fail and exit if it is necessary to create the remote state bucket. ### terragrunt-disable-bucket-update diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/backend-app/main.tf new/terragrunt-0.48.5/test/fixture-output-module-groups/root/backend-app/main.tf --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/backend-app/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/backend-app/main.tf 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,3 @@ +terraform { + backend "s3" {} +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/backend-app/terragrunt.hcl new/terragrunt-0.48.5/test/fixture-output-module-groups/root/backend-app/terragrunt.hcl --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/backend-app/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/backend-app/terragrunt.hcl 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,8 @@ +include { + path = find_in_parent_folders() +} + +dependencies { + paths = ["../mysql", "../redis", "../vpc"] +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/frontend-app/main.tf new/terragrunt-0.48.5/test/fixture-output-module-groups/root/frontend-app/main.tf --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/frontend-app/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/frontend-app/main.tf 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,3 @@ +terraform { + backend "s3" {} +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/frontend-app/terragrunt.hcl new/terragrunt-0.48.5/test/fixture-output-module-groups/root/frontend-app/terragrunt.hcl --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/frontend-app/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/frontend-app/terragrunt.hcl 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,7 @@ +include { + path = find_in_parent_folders() +} + +dependencies { + paths = ["../backend-app", "../vpc"] +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/mysql/main.tf new/terragrunt-0.48.5/test/fixture-output-module-groups/root/mysql/main.tf --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/mysql/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/mysql/main.tf 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,3 @@ +terraform { + backend "s3" {} +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/mysql/terragrunt.hcl new/terragrunt-0.48.5/test/fixture-output-module-groups/root/mysql/terragrunt.hcl --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/mysql/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/mysql/terragrunt.hcl 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,8 @@ +include { + path = find_in_parent_folders() +} + +dependencies { + paths = ["../vpc"] +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/redis/main.tf new/terragrunt-0.48.5/test/fixture-output-module-groups/root/redis/main.tf --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/redis/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/redis/main.tf 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,3 @@ +terraform { + backend "s3" {} +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/redis/terragrunt.hcl new/terragrunt-0.48.5/test/fixture-output-module-groups/root/redis/terragrunt.hcl --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/redis/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/redis/terragrunt.hcl 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,8 @@ +include { + path = find_in_parent_folders() +} + +dependencies { + paths = ["../vpc"] +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/vpc/main.tf new/terragrunt-0.48.5/test/fixture-output-module-groups/root/vpc/main.tf --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/vpc/main.tf 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/vpc/main.tf 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,3 @@ +terraform { + backend "s3" {} +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/root/vpc/terragrunt.hcl new/terragrunt-0.48.5/test/fixture-output-module-groups/root/vpc/terragrunt.hcl --- old/terragrunt-0.48.4/test/fixture-output-module-groups/root/vpc/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/root/vpc/terragrunt.hcl 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,5 @@ +include { + path = find_in_parent_folders() +} + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/fixture-output-module-groups/terragrunt.hcl new/terragrunt-0.48.5/test/fixture-output-module-groups/terragrunt.hcl --- old/terragrunt-0.48.4/test/fixture-output-module-groups/terragrunt.hcl 1970-01-01 01:00:00.000000000 +0100 +++ new/terragrunt-0.48.5/test/fixture-output-module-groups/terragrunt.hcl 2023-07-28 20:17:16.000000000 +0200 @@ -0,0 +1,14 @@ +# Configure Terragrunt to automatically store tfstate files in an S3 bucket +remote_state { + backend = "s3" + config = { + encrypt = true + bucket = "__FILL_IN_BUCKET_NAME__" + key = "${path_relative_to_include()}/terraform.tfstate" + region = "us-west-2" + } +} + +inputs = { + terraform_remote_state_s3_bucket = "__FILL_IN_BUCKET_NAME__" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/terragrunt-0.48.4/test/integration_test.go new/terragrunt-0.48.5/test/integration_test.go --- old/terragrunt-0.48.4/test/integration_test.go 2023-07-19 16:35:23.000000000 +0200 +++ new/terragrunt-0.48.5/test/integration_test.go 2023-07-28 20:17:16.000000000 +0200 @@ -135,6 +135,7 @@ TEST_FIXTURE_RENDER_JSON_METADATA = "fixture-render-json-metadata" TEST_FIXTURE_RENDER_JSON_MOCK_OUTPUTS = "fixture-render-json-mock-outputs" TEST_FIXTURE_RENDER_JSON_INPUTS = "fixture-render-json-inputs" + TEST_FIXTURE_OUTPUT_MODULE_GROUPS = "fixture-output-module-groups" TEST_FIXTURE_STARTSWITH = "fixture-startswith" TEST_FIXTURE_TIMECMP = "fixture-timecmp" TEST_FIXTURE_TIMECMP_INVALID_TIMESTAMP = "fixture-timecmp-errors/invalid-timestamp" @@ -4882,6 +4883,37 @@ assert.True(t, reflect.DeepEqual(expectedTerraformVersionConstraint, terraformVersionConstraint)) } +func TestOutputModuleGroups(t *testing.T) { + t.Parallel() + + tmpEnvPath := copyEnvironment(t, TEST_FIXTURE_OUTPUT_MODULE_GROUPS) + cleanupTerraformFolder(t, tmpEnvPath) + environmentPath := fmt.Sprintf("%s/%s", tmpEnvPath, TEST_FIXTURE_OUTPUT_MODULE_GROUPS) + var ( + stdout bytes.Buffer + stderr bytes.Buffer + ) + runTerragruntRedirectOutput(t, fmt.Sprintf("terragrunt output-module-groups --terragrunt-working-dir %s", environmentPath), &stdout, &stderr) + output := stdout.String() + expectedOutput := fmt.Sprintf(` +{ + "Group 1": [ + "%[1]s/root/vpc" + ], + "Group 2": [ + "%[1]s/root/mysql", + "%[1]s/root/redis" + ], + "Group 3": [ + "%[1]s/root/backend-app" + ], + "Group 4": [ + "%[1]s/root/frontend-app" + ] +}`, environmentPath) + assert.True(t, strings.Contains(output, strings.TrimSpace(expectedOutput))) +} + func TestRenderJsonMetadataDependencies(t *testing.T) { t.Parallel() ++++++ terragrunt.obsinfo ++++++ --- /var/tmp/diff_new_pack.AztpQs/_old 2023-08-01 15:38:46.337910378 +0200 +++ /var/tmp/diff_new_pack.AztpQs/_new 2023-08-01 15:38:46.341910403 +0200 @@ -1,5 +1,5 @@ name: terragrunt -version: 0.48.4 -mtime: 1689777323 -commit: 2dc7f9157abfe9890931625b64315bf22fa425c0 +version: 0.48.5 +mtime: 1690568236 +commit: 2cab9f99efd3a7faa0b431165fd9f697b06b7048 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/terragrunt/vendor.tar.gz /work/SRC/openSUSE:Factory/.terragrunt.new.32662/vendor.tar.gz differ: char 5, line 1