From dfd6d3a8972fba28b2a6f258967351a020f7e0eb Mon Sep 17 00:00:00 2001 From: AMAN-sharma07 Date: Tue, 17 Mar 2026 17:59:04 +0000 Subject: [PATCH 1/3] feat(project): add confirmation prompt before deleting projects Signed-off-by: AMAN-sharma07 --- cmd/harbor/root/project/delete.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cmd/harbor/root/project/delete.go b/cmd/harbor/root/project/delete.go index 4f787fc58..b8af431b5 100644 --- a/cmd/harbor/root/project/delete.go +++ b/cmd/harbor/root/project/delete.go @@ -52,6 +52,23 @@ func DeleteProjectCommand() *cobra.Command { } } + if !forceDelete { + var confirm string + if projectID != "" { + fmt.Printf("Are you sure you want to delete project ID: %s ? (y/n): ", projectID) + } else if len(args) > 0 { + fmt.Printf("Are you sure you want to delete project(s): %v ? (y/n): ", args) + } else { + fmt.Print("Are you sure you want to delete the selected project? (y/n): ") + } + fmt.Scanln(&confirm) + + if confirm != "y" && confirm != "Y" { + fmt.Println("Aborted.") + return nil + } + } + if projectID != "" { log.Debugf("Deleting project with ID: %s", projectID) wg.Add(1) From c717636c69947a6956fc3d994a14f3cee1db6c6c Mon Sep 17 00:00:00 2001 From: AMAN-sharma07 Date: Thu, 26 Mar 2026 20:22:06 +0000 Subject: [PATCH 2/3] refactor(project): use huh for confirmation and move prompt logic to prompt package Signed-off-by: AMAN-sharma07 --- cmd/harbor/root/project/delete.go | 19 ++++++++++++------- go.mod | 2 +- go.sum | 2 ++ pkg/prompt/prompt.go | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/cmd/harbor/root/project/delete.go b/cmd/harbor/root/project/delete.go index b8af431b5..3740e59e2 100644 --- a/cmd/harbor/root/project/delete.go +++ b/cmd/harbor/root/project/delete.go @@ -53,17 +53,22 @@ func DeleteProjectCommand() *cobra.Command { } if !forceDelete { - var confirm string + msg := "" + if projectID != "" { - fmt.Printf("Are you sure you want to delete project ID: %s ? (y/n): ", projectID) + msg = fmt.Sprintf("Delete project ID: %s?", projectID) } else if len(args) > 0 { - fmt.Printf("Are you sure you want to delete project(s): %v ? (y/n): ", args) + msg = fmt.Sprintf("Delete project(s): %v?", args) } else { - fmt.Print("Are you sure you want to delete the selected project? (y/n): ") - } - fmt.Scanln(&confirm) + msg = "Delete selected project?" + } + + confirm, err := prompt.ConfirmProjectDeletion(msg) + if err != nil { + return err + } - if confirm != "y" && confirm != "Y" { + if !confirm { fmt.Println("Aborted.") return nil } diff --git a/go.mod b/go.mod index e35e3449c..725c4973d 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/charmbracelet/bubbles v1.0.0 github.com/charmbracelet/bubbletea v1.3.10 - github.com/charmbracelet/huh v0.8.0 + github.com/charmbracelet/huh v1.0.0 github.com/charmbracelet/lipgloss v1.1.0 github.com/sahilm/fuzzy v0.1.1 github.com/sirupsen/logrus v1.9.4 diff --git a/go.sum b/go.sum index 1865cb2cc..73d4cb9fc 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,8 @@ github.com/charmbracelet/colorprofile v0.4.1 h1:a1lO03qTrSIRaK8c3JRxJDZOvhvIeSco github.com/charmbracelet/colorprofile v0.4.1/go.mod h1:U1d9Dljmdf9DLegaJ0nGZNJvoXAhayhmidOdcBwAvKk= github.com/charmbracelet/huh v0.8.0 h1:Xz/Pm2h64cXQZn/Jvele4J3r7DDiqFCNIVteYukxDvY= github.com/charmbracelet/huh v0.8.0/go.mod h1:5YVc+SlZ1IhQALxRPpkGwwEKftN/+OlJlnJYlDRFqN4= +github.com/charmbracelet/huh v1.0.0 h1:wOnedH8G4qzJbmhftTqrpppyqHakl/zbbNdXIWJyIxw= +github.com/charmbracelet/huh v1.0.0/go.mod h1:5YVc+SlZ1IhQALxRPpkGwwEKftN/+OlJlnJYlDRFqN4= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8= diff --git a/pkg/prompt/prompt.go b/pkg/prompt/prompt.go index 9d73e75e6..7d1b66ea5 100644 --- a/pkg/prompt/prompt.go +++ b/pkg/prompt/prompt.go @@ -24,6 +24,7 @@ import ( "github.com/goharbor/go-client/pkg/sdk/v2.0/models" "github.com/goharbor/harbor-cli/pkg/api" "github.com/goharbor/harbor-cli/pkg/constants" + "github.com/charmbracelet/huh" aview "github.com/goharbor/harbor-cli/pkg/views/artifact/select" tview "github.com/goharbor/harbor-cli/pkg/views/artifact/tags/select" immview "github.com/goharbor/harbor-cli/pkg/views/immutable/select" @@ -442,3 +443,18 @@ func GetRoleIDFromUser() int64 { return <-roleID } + +func ConfirmProjectDeletion(message string) (bool, error) { + var confirm bool + + form := huh.NewForm( + huh.NewGroup( + huh.NewConfirm(). + Title(message). + Value(&confirm), + ), + ) + + err := form.Run() + return confirm, err +} \ No newline at end of file From 936bd54a7ca1b9386a6b0dff229ff8fa90debd82 Mon Sep 17 00:00:00 2001 From: AMAN-sharma07 Date: Fri, 27 Mar 2026 12:17:45 +0000 Subject: [PATCH 3/3] refactor(project): move confirmation logic fully into prompt package Signed-off-by: AMAN-sharma07 --- cmd/harbor/root/project/delete.go | 12 +----------- pkg/prompt/prompt.go | 12 +++++++++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cmd/harbor/root/project/delete.go b/cmd/harbor/root/project/delete.go index 3740e59e2..f859716c0 100644 --- a/cmd/harbor/root/project/delete.go +++ b/cmd/harbor/root/project/delete.go @@ -53,17 +53,7 @@ func DeleteProjectCommand() *cobra.Command { } if !forceDelete { - msg := "" - - if projectID != "" { - msg = fmt.Sprintf("Delete project ID: %s?", projectID) - } else if len(args) > 0 { - msg = fmt.Sprintf("Delete project(s): %v?", args) - } else { - msg = "Delete selected project?" - } - - confirm, err := prompt.ConfirmProjectDeletion(msg) + confirm, err := prompt.ConfirmProjectDeletion(projectID, args) if err != nil { return err } diff --git a/pkg/prompt/prompt.go b/pkg/prompt/prompt.go index 7d1b66ea5..4b1d3b8d8 100644 --- a/pkg/prompt/prompt.go +++ b/pkg/prompt/prompt.go @@ -444,9 +444,19 @@ func GetRoleIDFromUser() int64 { return <-roleID } -func ConfirmProjectDeletion(message string) (bool, error) { +func ConfirmProjectDeletion(projectID string, args []string) (bool, error) { var confirm bool + message := "" + + if projectID != "" { + message = fmt.Sprintf("Delete project ID: %s?", projectID) + } else if len(args) > 0 { + message = fmt.Sprintf("Delete project(s): %v?", args) + } else { + message = "Delete selected project?" + } + form := huh.NewForm( huh.NewGroup( huh.NewConfirm().