From 138d16d067b5ed8796999ccbda95d8100315edcc Mon Sep 17 00:00:00 2001 From: AdeshDeshmukh Date: Fri, 15 May 2026 09:20:44 +0530 Subject: [PATCH 1/3] fix: handle GetRobot error in robot create and update output path to prevent nil panic Signed-off-by: AdeshDeshmukh Signed-off-by: Adesh Deshmukh --- cmd/harbor/root/project/robot/create.go | 6 +++++- cmd/harbor/root/robot/create.go | 6 +++++- cmd/harbor/root/robot/update.go | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cmd/harbor/root/project/robot/create.go b/cmd/harbor/root/project/robot/create.go index 00ba2369d..a552b8d1e 100644 --- a/cmd/harbor/root/project/robot/create.go +++ b/cmd/harbor/root/project/robot/create.go @@ -202,7 +202,11 @@ Examples: FormatFlag := viper.GetString("output-format") if FormatFlag != "" { name := response.Payload.Name - res, _ := api.GetRobot(response.Payload.ID) + res, err := api.GetRobot(response.Payload.ID) + if err != nil { + return fmt.Errorf("failed to get robot details: %v", + utils.ParseHarborErrorMsg(err)) + } utils.SavePayloadJSON(name, res.Payload) return nil } diff --git a/cmd/harbor/root/robot/create.go b/cmd/harbor/root/robot/create.go index 633d43df1..f02987c41 100644 --- a/cmd/harbor/root/robot/create.go +++ b/cmd/harbor/root/robot/create.go @@ -331,7 +331,11 @@ func createRobotAndHandleResponse(opts *create.CreateView, exportToFile bool) er // Handle output format if formatFlag := viper.GetString("output-format"); formatFlag != "" { - res, _ := api.GetRobot(response.Payload.ID) + res, err := api.GetRobot(response.Payload.ID) + if err != nil { + return fmt.Errorf("failed to get robot details: %v", + utils.ParseHarborErrorMsg(err)) + } utils.SavePayloadJSON(response.Payload.Name, res.Payload) return nil } diff --git a/cmd/harbor/root/robot/update.go b/cmd/harbor/root/robot/update.go index 1d2716118..1ee072c80 100644 --- a/cmd/harbor/root/robot/update.go +++ b/cmd/harbor/root/robot/update.go @@ -587,7 +587,11 @@ func updateRobotAndHandleResponse(opts *update.UpdateView) error { // Handle output format if formatFlag := viper.GetString("output-format"); formatFlag != "" { - res, _ := api.GetRobot(opts.ID) + res, err := api.GetRobot(opts.ID) + if err != nil { + return fmt.Errorf("failed to get robot details: %v", + utils.ParseHarborErrorMsg(err)) + } utils.SavePayloadJSON(opts.Name, res.Payload) } From cdfd3116d434ffaabaf65c76d4e7b7d707b7ede0 Mon Sep 17 00:00:00 2001 From: Adesh Deshmukh Date: Mon, 15 Jun 2026 19:21:59 +0530 Subject: [PATCH 2/3] fix: collapse fmt.Errorf to single line per codebase convention Signed-off-by: Adesh Deshmukh --- cmd/harbor/root/project/robot/create.go | 3 +-- cmd/harbor/root/robot/create.go | 3 +-- cmd/harbor/root/robot/update.go | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/cmd/harbor/root/project/robot/create.go b/cmd/harbor/root/project/robot/create.go index a552b8d1e..1fb0d186b 100644 --- a/cmd/harbor/root/project/robot/create.go +++ b/cmd/harbor/root/project/robot/create.go @@ -204,8 +204,7 @@ Examples: name := response.Payload.Name res, err := api.GetRobot(response.Payload.ID) if err != nil { - return fmt.Errorf("failed to get robot details: %v", - utils.ParseHarborErrorMsg(err)) + return fmt.Errorf("failed to get robot details: %v", utils.ParseHarborErrorMsg(err)) } utils.SavePayloadJSON(name, res.Payload) return nil diff --git a/cmd/harbor/root/robot/create.go b/cmd/harbor/root/robot/create.go index f02987c41..59de6442b 100644 --- a/cmd/harbor/root/robot/create.go +++ b/cmd/harbor/root/robot/create.go @@ -333,8 +333,7 @@ func createRobotAndHandleResponse(opts *create.CreateView, exportToFile bool) er if formatFlag := viper.GetString("output-format"); formatFlag != "" { res, err := api.GetRobot(response.Payload.ID) if err != nil { - return fmt.Errorf("failed to get robot details: %v", - utils.ParseHarborErrorMsg(err)) + return fmt.Errorf("failed to get robot details: %v", utils.ParseHarborErrorMsg(err)) } utils.SavePayloadJSON(response.Payload.Name, res.Payload) return nil diff --git a/cmd/harbor/root/robot/update.go b/cmd/harbor/root/robot/update.go index 1ee072c80..9acf07a06 100644 --- a/cmd/harbor/root/robot/update.go +++ b/cmd/harbor/root/robot/update.go @@ -589,8 +589,7 @@ func updateRobotAndHandleResponse(opts *update.UpdateView) error { if formatFlag := viper.GetString("output-format"); formatFlag != "" { res, err := api.GetRobot(opts.ID) if err != nil { - return fmt.Errorf("failed to get robot details: %v", - utils.ParseHarborErrorMsg(err)) + return fmt.Errorf("failed to get robot details: %v", utils.ParseHarborErrorMsg(err)) } utils.SavePayloadJSON(opts.Name, res.Payload) } From 450784e8498a2283570f1bea9b166686fca0cddf Mon Sep 17 00:00:00 2001 From: Adesh Deshmukh Date: Mon, 15 Jun 2026 20:10:08 +0530 Subject: [PATCH 3/3] fix: normalize webhook endpoint URL in interactive forms Apply FormatUrl before ValidateURL in the webhook interactive form validation callbacks, matching the pattern already used by registry and scanner commands for interactive input. The CLI flag path (create.go, edit.go) was already fixed upstream; this completes the fix for the interactive prompt path. Closes #828 Signed-off-by: Adesh Deshmukh --- pkg/views/webhook/create/view.go | 7 ++++++- pkg/views/webhook/edit/view.go | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/views/webhook/create/view.go b/pkg/views/webhook/create/view.go index 0142f47a1..c33a1784d 100644 --- a/pkg/views/webhook/create/view.go +++ b/pkg/views/webhook/create/view.go @@ -83,7 +83,12 @@ func WebhookCreateView(createView *CreateView) error { Title("Endpoint URL"). Value(&createView.EndpointURL). Validate(func(str string) error { - return utils.ValidateURL(str) + formattedUrl := utils.FormatUrl(str) + if err := utils.ValidateURL(formattedUrl); err != nil { + return err + } + createView.EndpointURL = formattedUrl + return nil }), huh.NewInput(). Title("Auth Header"). diff --git a/pkg/views/webhook/edit/view.go b/pkg/views/webhook/edit/view.go index 6c2b5e3d9..31ebeacd8 100644 --- a/pkg/views/webhook/edit/view.go +++ b/pkg/views/webhook/edit/view.go @@ -109,9 +109,11 @@ func WebhookEditView(editView *EditView) { if strings.TrimSpace(str) == "" { return errors.New("endpoint URL cannot be empty") } - if err := utils.ValidateURL(str); err != nil { + formattedUrl := utils.FormatUrl(str) + if err := utils.ValidateURL(formattedUrl); err != nil { return err } + editView.EndpointURL = formattedUrl return nil }),