From 32ee6616e5e7cdf4553ece2163532c135d332192 Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Wed, 3 Sep 2025 01:00:02 +0000 Subject: [PATCH] fix(cli/templatepush): only implicitly read from stdin if the directory flag is unset --- cli/templatepush.go | 5 +++-- cli/templatepush_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/cli/templatepush.go b/cli/templatepush.go index 312c8a466ec50..d008df52b30a7 100644 --- a/cli/templatepush.go +++ b/cli/templatepush.go @@ -309,8 +309,9 @@ func (pf *templateUploadFlags) stdin(inv *serpent.Invocation) (out bool) { inv.Logger.Info(inv.Context(), "uploading tar read from stdin") } }() - // We let the directory override our isTTY check - return pf.directory == "-" || (!isTTYIn(inv) && pf.directory == ".") + // We read a tar from stdin if the directory is "-" or if we're not in a + // TTY and the directory flag is unset. + return pf.directory == "-" || (!isTTYIn(inv) && !inv.ParsedFlags().Lookup("directory").Changed) } func (pf *templateUploadFlags) upload(inv *serpent.Invocation, client *codersdk.Client) (*codersdk.UploadResponse, error) { diff --git a/cli/templatepush_test.go b/cli/templatepush_test.go index 732fdd5ee50b0..7c8007c96a210 100644 --- a/cli/templatepush_test.go +++ b/cli/templatepush_test.go @@ -339,6 +339,7 @@ func TestTemplatePush(t *testing.T) { inv, root := clitest.New(t, "templates", "push", "--test.provisioner", string(database.ProvisionerTypeEcho), "--test.workdir", source, + "--force-tty", ) clitest.SetupConfig(t, templateAdmin, root) pty := ptytest.New(t).Attach(inv) @@ -1075,6 +1076,45 @@ func TestTemplatePush(t *testing.T) { require.Equal(t, templateName, template.Name) require.NotEqual(t, uuid.Nil, template.ActiveVersionID) }) + + t.Run("NoStdinWithCurrentDirectory", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) + _ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + source := clitest.CreateTemplateVersionSource(t, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: echo.ApplyComplete, + }) + + inv, root := clitest.New(t, "templates", "push", template.Name, + "--directory", ".", + "--test.provisioner", string(database.ProvisionerTypeEcho), + "--test.workdir", source, + "--name", "example", + "--yes") + clitest.SetupConfig(t, templateAdmin, root) + + inv.Stdin = strings.NewReader("invalid tar content that would cause failure") + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium) + defer cancel() + + err := inv.WithContext(ctx).Run() + require.NoError(t, err, "Should succeed without reading from stdin") + + templateVersions, err := client.TemplateVersionsByTemplate(ctx, codersdk.TemplateVersionsByTemplateRequest{ + TemplateID: template.ID, + }) + require.NoError(t, err) + require.Len(t, templateVersions, 2) + require.Equal(t, "example", templateVersions[1].Name) + }) }) }