Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions internal/pkg/cli/command/apiKey/create.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package apiKey

import (
"fmt"

"github.com/pinecone-io/cli/internal/pkg/utils/configuration/secrets"
"github.com/pinecone-io/cli/internal/pkg/utils/configuration/state"
"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/log"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/style"
Expand Down Expand Up @@ -96,7 +97,7 @@ func NewCreateApiKeyCmd() *cobra.Command {

if options.json {
json := text.IndentJSON(keyWithSecret)
pcio.PrintJSON(json)
fmt.Println(json)
} else {
msg.SuccessMsg("API key %s created successfully.\n", style.Emphasis(keyWithSecret.Key.Name))
presenters.PrintDescribeAPIKeyWithSecretTable(keyWithSecret)
Expand Down
3 changes: 1 addition & 2 deletions internal/pkg/cli/command/apiKey/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/style"
"github.com/pinecone-io/cli/internal/pkg/utils/text"
Expand Down Expand Up @@ -104,7 +103,7 @@ func confirmDeleteApiKey(apiKeyName string) {
msg.WarnMsg("This action cannot be undone.")

// Prompt the user
pcio.Print("Do you want to continue? (y/N): ")
fmt.Print("Do you want to continue? (y/N): ")

// Read the user's input
reader := bufio.NewReader(os.Stdin)
Expand Down
6 changes: 4 additions & 2 deletions internal/pkg/cli/command/apiKey/describe.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package apiKey

import (
"fmt"
"os"

"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/style"
Expand Down Expand Up @@ -39,7 +41,7 @@ func NewDescribeAPIKeyCmd() *cobra.Command {

if options.json {
json := text.IndentJSON(apiKey)
pcio.PrintJSON(json)
fmt.Fprint(os.Stdout, json)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JSON output missing trailing newline in two commands

Medium Severity

The old pcio.PrintJSON used fmt.Fprintln which appends a newline. These two call sites replace it with fmt.Fprint(os.Stdout, json) which does not append a newline, while every other replacement in the PR correctly uses fmt.Println(json). Since text.IndentJSON doesn't include a trailing newline, api-key describe --json and api-key update --json will output JSON without a final newline, breaking piping to tools like jq and causing the shell prompt to render on the same line as the output.

Additional Locations (1)
Fix in Cursor Fix in Web

} else {
presenters.PrintDescribeAPIKeyTable(apiKey)
}
Expand Down
18 changes: 9 additions & 9 deletions internal/pkg/cli/command/apiKey/list.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package apiKey

import (
"fmt"
"sort"
"strings"

"github.com/pinecone-io/cli/internal/pkg/utils/configuration/state"
"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/style"
Expand Down Expand Up @@ -65,7 +65,7 @@ func NewListKeysCmd() *cobra.Command {

if options.json {
json := text.IndentJSON(sortedKeys)
pcio.PrintJSON(json)
fmt.Println(json)
} else {
printTable(sortedKeys)
}
Expand All @@ -78,17 +78,17 @@ func NewListKeysCmd() *cobra.Command {
}

func printTable(keys []*pinecone.APIKey) {
pcio.Printf("Organization: %s (ID: %s)\n", style.Emphasis(state.TargetOrg.Get().Name), style.Emphasis(state.TargetOrg.Get().Id))
pcio.Printf("Project: %s (ID: %s)\n", style.Emphasis(state.TargetProj.Get().Name), style.Emphasis(state.TargetProj.Get().Id))
pcio.Println()
pcio.Println(style.Heading("API Keys"))
pcio.Println()
fmt.Printf("Organization: %s (ID: %s)\n", style.Emphasis(state.TargetOrg.Get().Name), style.Emphasis(state.TargetOrg.Get().Id))
fmt.Printf("Project: %s (ID: %s)\n", style.Emphasis(state.TargetProj.Get().Name), style.Emphasis(state.TargetProj.Get().Id))
fmt.Println()
fmt.Println(style.Heading("API Keys"))
fmt.Println()

writer := presenters.NewTabWriter()

columns := []string{"NAME", "ID", "PROJECT ID", "ROLES"}
header := strings.Join(columns, "\t") + "\n"
pcio.Fprint(writer, header)
fmt.Fprint(writer, header)

for _, key := range keys {
values := []string{
Expand All @@ -97,7 +97,7 @@ func printTable(keys []*pinecone.APIKey) {
key.ProjectId,
strings.Join(key.Roles, ", "),
}
pcio.Fprintf(writer, strings.Join(values, "\t")+"\n")
fmt.Fprintf(writer, strings.Join(values, "\t")+"\n")
}

writer.Flush()
Expand Down
6 changes: 4 additions & 2 deletions internal/pkg/cli/command/apiKey/update.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package apiKey

import (
"fmt"
"os"

"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/text"
Expand Down Expand Up @@ -50,7 +52,7 @@ func NewUpdateAPIKeyCmd() *cobra.Command {

if options.json {
json := text.IndentJSON(apiKey)
pcio.PrintJSON(json)
fmt.Fprint(os.Stdout, json)
return
}

Expand Down
16 changes: 8 additions & 8 deletions internal/pkg/cli/command/auth/configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package auth

import (
"context"
"fmt"
"io"
"os"
"strings"
Expand All @@ -15,7 +16,6 @@ import (
"github.com/pinecone-io/cli/internal/pkg/utils/log"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/oauth"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/prompt"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
Expand Down Expand Up @@ -112,7 +112,7 @@ func Run(ctx context.Context, io IO, opts configureCmdOptions) {
}
clientSecret = string(secretBytes)
} else if opts.promptIfMissing && isTerminal(os.Stdin) {
pcio.Fprint(io.Out, "Client Secret: ")
fmt.Fprint(io.Out, "Client Secret: ")
secretBytes, err := term.ReadPassword(int(os.Stdin.Fd()))
if err != nil {
msg.FailMsg("Error reading client secret from terminal: %+v", err)
Expand Down Expand Up @@ -175,7 +175,7 @@ func Run(ctx context.Context, io IO, opts configureCmdOptions) {
// If the user has no projects, they can create one by running the project create command
if len(projects) == 0 {
log.Info().Msg("No projects found for service account")
exit.SuccessMsg(pcio.Sprintf("No projects found for service account, you can create a project by running %s", style.Code("pc project create")))
exit.SuccessMsg(fmt.Sprintf("No projects found for service account, you can create a project by running %s", style.Code("pc project create")))
}

// If the user has one project, set it as the target project
Expand Down Expand Up @@ -240,11 +240,11 @@ func Run(ctx context.Context, io IO, opts configureCmdOptions) {
defaultAPIKey := secrets.DefaultAPIKey.Get()
targetContext.DefaultAPIKey = presenters.MaskHeadTail(defaultAPIKey, 4, 4)
json := text.IndentJSON(targetContext)
pcio.PrintJSON(json)
fmt.Println(json)
return
}

pcio.Println()
fmt.Println()
presenters.PrintTargetContext(state.GetTargetContext())
}

Expand Down Expand Up @@ -288,15 +288,15 @@ func uiProjectSelector(projects []*pinecone.Project) *pinecone.Project {
}

m2 := prompt.NewList(projectItems, len(projectItems)+6, "Choose a project to target", func() {
pcio.Println("Exiting without targeting a project.")
pcio.Printf("You can always run %s to set or change a project context later.\n", style.Code("pc target"))
fmt.Println("Exiting without targeting a project.")
fmt.Printf("You can always run %s to set or change a project context later.\n", style.Code("pc target"))
exit.Success()
}, func(choice string) string {
targetProjectName = choice
return "Target project: " + choice
})
if _, err := tea.NewProgram(m2).Run(); err != nil {
pcio.Println("Error running program:", err)
fmt.Println("Error running program:", err)
os.Exit(1)
}

Expand Down
8 changes: 4 additions & 4 deletions internal/pkg/cli/command/auth/local_keys_list.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package auth

import (
"fmt"
"strings"

"github.com/pinecone-io/cli/internal/pkg/utils/configuration/secrets"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/text"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -42,7 +42,7 @@ func NewListLocalKeysCmd() *cobra.Command {
if options.json {
maskedMap := maskForJSON(managedKeys, options.reveal)
json := text.IndentJSON(maskedMap)
pcio.PrintJSON(json)
fmt.Println(json)
} else {
printTable(managedKeys, options.reveal)
}
Expand All @@ -60,15 +60,15 @@ func printTable(managedKeys map[string]secrets.ManagedKey, reveal bool) {

columns := []string{"PROJECT ID", "API KEY NAME", "API KEY ID", "API KEY VALUE", "ORIGIN", "ORGANIZATION ID"}
header := strings.Join(columns, "\t") + "\n"
pcio.Fprint(writer, header)
fmt.Fprint(writer, header)

for projectId, managedKey := range managedKeys {
keyValue := managedKey.Value
if !reveal {
keyValue = presenters.MaskHeadTail(keyValue, 4, 4)
}
values := []string{projectId, managedKey.Name, managedKey.Id, keyValue, string(managedKey.Origin), managedKey.OrganizationId}
pcio.Fprintf(writer, strings.Join(values, "\t")+"\n")
fmt.Fprintf(writer, strings.Join(values, "\t")+"\n")
}

writer.Flush()
Expand Down
5 changes: 2 additions & 3 deletions internal/pkg/cli/command/auth/local_keys_prune.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/log"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/style"
"github.com/pinecone-io/cli/internal/pkg/utils/text"
Expand Down Expand Up @@ -191,7 +190,7 @@ func confirmPruneKeys(plan []planItem, options pruneLocalKeysCmdOptions) (bool,
msg.WarnMsg("This action cannot be undone.")

// Prompt the user
pcio.Print("Do you want to continue? (y/N): ")
fmt.Print("Do you want to continue? (y/N): ")

// Read the user's input
reader := bufio.NewReader(os.Stdin)
Expand All @@ -215,7 +214,7 @@ func confirmPruneKeys(plan []planItem, options pruneLocalKeysCmdOptions) (bool,
func printDryRunPlan(plan []planItem, options pruneLocalKeysCmdOptions) {
if options.json {
json := text.IndentJSON(plan)
pcio.PrintJSON(json)
fmt.Println(json)
} else {
for _, key := range plan {
if key.onServer {
Expand Down
4 changes: 2 additions & 2 deletions internal/pkg/cli/command/auth/status.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package auth

import (
"fmt"
"time"

"github.com/pinecone-io/cli/internal/pkg/utils/configuration/config"
Expand All @@ -10,7 +11,6 @@ import (
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/oauth"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/text"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -99,7 +99,7 @@ func runAuthStatus(cmd *cobra.Command, options authStatusCmdOptions) error {

if options.json {
json := text.IndentJSON(authStatus)
pcio.PrintJSON(json)
fmt.Println(json)
return nil
}

Expand Down
10 changes: 0 additions & 10 deletions internal/pkg/cli/command/backup/backup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package backup

import (
"context"
"os"
"testing"

"github.com/pinecone-io/cli/internal/pkg/cli/testutils"
"github.com/pinecone-io/go-pinecone/v5/pinecone"
)

Expand Down Expand Up @@ -52,10 +49,3 @@ func (m *mockBackupService) CreateIndexFromBackup(ctx context.Context, in *pinec
m.lastCreateIndexFromBackupReq = in
return m.createIndexFromBackupResp, m.createIndexFromBackupErr
}

func TestMain(m *testing.M) {
reset := testutils.SilenceOutput()
code := m.Run()
reset()
os.Exit(code)
}
3 changes: 1 addition & 2 deletions internal/pkg/cli/command/backup/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/style"
Expand Down Expand Up @@ -71,7 +70,7 @@ func NewCreateBackupCmd() *cobra.Command {

func runCreateBackupCmd(ctx context.Context, svc BackupService, options createBackupCmdOptions) error {
if strings.TrimSpace(options.indexName) == "" {
return pcio.Errorf("--index-name is required")
return fmt.Errorf("--index-name is required")
}

var descPtr *string
Expand Down
3 changes: 1 addition & 2 deletions internal/pkg/cli/command/backup/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"github.com/pinecone-io/cli/internal/pkg/utils/pcio"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/text"
Expand Down Expand Up @@ -50,7 +49,7 @@ func NewDescribeBackupCmd() *cobra.Command {

func runDescribeBackupCmd(ctx context.Context, svc BackupService, options describeBackupCmdOptions) error {
if strings.TrimSpace(options.backupId) == "" {
return pcio.Errorf("--id is required")
return fmt.Errorf("--id is required")
}

resp, err := svc.DescribeBackup(ctx, options.backupId)
Expand Down
3 changes: 2 additions & 1 deletion internal/pkg/cli/command/backup/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ package backup
import (
"context"

"fmt"

"github.com/pinecone-io/cli/internal/pkg/utils/exit"
"github.com/pinecone-io/cli/internal/pkg/utils/help"
"github.com/pinecone-io/cli/internal/pkg/utils/msg"
"fmt"
"github.com/pinecone-io/cli/internal/pkg/utils/presenters"
"github.com/pinecone-io/cli/internal/pkg/utils/sdk"
"github.com/pinecone-io/cli/internal/pkg/utils/text"
Expand Down
Loading
Loading