diff --git a/internal/command/show.go b/internal/command/show.go index 0b16ee735285..123b86536eab 100644 --- a/internal/command/show.go +++ b/internal/command/show.go @@ -151,7 +151,7 @@ func (c *ShowCommand) showFromLatestStateSnapshot() (*statefile.File, tfdiags.Di // Get the latest state snapshot from the backend for the current workspace stateFile, stateErr := getStateFromBackend(b, workspace) if stateErr != nil { - diags = diags.Append(stateErr.Error()) + diags = diags.Append(stateErr) return nil, diags } diff --git a/internal/command/show_test.go b/internal/command/show_test.go index e2cc2a879cba..6e0103e26149 100644 --- a/internal/command/show_test.go +++ b/internal/command/show_test.go @@ -905,6 +905,34 @@ func TestShow_planWithNonDefaultStateLineage(t *testing.T) { } } +func TestShow_corruptStatefile(t *testing.T) { + td := t.TempDir() + inputDir := "testdata/show-corrupt-statefile" + testCopyDir(t, inputDir, td) + defer testChdir(t, td)() + + view, done := testView(t) + c := &ShowCommand{ + Meta: Meta{ + testingOverrides: metaOverridesForProvider(testProvider()), + View: view, + }, + } + + code := c.Run([]string{}) + output := done(t) + + if code != 1 { + t.Fatalf("unexpected exit status %d; want 1\ngot: %s", code, output.Stdout()) + } + + got := output.Stderr() + want := `Unsupported state file format` + if !strings.Contains(got, want) { + t.Errorf("unexpected output\ngot: %s\nwant:\n%s", got, want) + } +} + // showFixtureSchema returns a schema suitable for processing the configuration // in testdata/show. This schema should be assigned to a mock provider // named "test". diff --git a/internal/command/testdata/show-corrupt-statefile/terraform.tfstate b/internal/command/testdata/show-corrupt-statefile/terraform.tfstate new file mode 100644 index 000000000000..9977a2836c1a --- /dev/null +++ b/internal/command/testdata/show-corrupt-statefile/terraform.tfstate @@ -0,0 +1 @@ +invalid