From 3648373333efa52e3180a308b80fa1d8c8fa648b Mon Sep 17 00:00:00 2001 From: mathias Date: Sat, 16 May 2026 21:17:40 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20merge=20repo=5Fupdate=20=E2=80=94=20add?= =?UTF-8?q?=20archived+template,=20keep=20default=5Fbranch+confirm=20from?= =?UTF-8?q?=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/tools/repo_update.go | 54 +++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/internal/tools/repo_update.go b/internal/tools/repo_update.go index 959d164..5201070 100644 --- a/internal/tools/repo_update.go +++ b/internal/tools/repo_update.go @@ -22,7 +22,7 @@ func NewRepoUpdate(c *gitea.Client, a *allowlist.Allowlist) *RepoUpdate { func (t *RepoUpdate) Descriptor() registry.ToolDescriptor { return registry.ToolDescriptor{ Name: "repo_update", - Description: "Update repository metadata via PATCH (archived, description, private, website, template). " + + Description: "Update repository metadata (description, visibility, default branch, website, archived, template). " + "Only fields explicitly set in the call are patched. " + "WARNING: private=false exposes the repo publicly — verify intent before calling.", InputSchema: json.RawMessage(`{ @@ -30,11 +30,13 @@ func (t *RepoUpdate) Descriptor() registry.ToolDescriptor { "properties":{ "owner":{"type":"string"}, "name":{"type":"string"}, - "archived":{"type":"boolean","description":"Mark repo as archived (read-only). Reversible."}, "description":{"type":"string"}, "private":{"type":"boolean","description":"Toggle visibility. false makes the repo public."}, "website":{"type":"string","description":"Homepage URL"}, - "template":{"type":"boolean","description":"Toggle template-repo flag"} + "default_branch":{"type":"string","description":"Rename the default branch"}, + "archived":{"type":"boolean","description":"Mark repo as archived (read-only)."}, + "template":{"type":"boolean","description":"Toggle template-repo flag"}, + "confirm":{"type":"string","description":"Required when setting private=false. Must equal the repo name."} }, "required":["owner","name"] }`), @@ -42,13 +44,15 @@ func (t *RepoUpdate) Descriptor() registry.ToolDescriptor { } type repoUpdateArgs struct { - Owner string `json:"owner"` - Name string `json:"name"` - Archived *bool `json:"archived,omitempty"` - Description *string `json:"description,omitempty"` - Private *bool `json:"private,omitempty"` - Website *string `json:"website,omitempty"` - Template *bool `json:"template,omitempty"` + Owner string `json:"owner"` + Name string `json:"name"` + Description *string `json:"description,omitempty"` + Private *bool `json:"private,omitempty"` + Website *string `json:"website,omitempty"` + DefaultBranch *string `json:"default_branch,omitempty"` + Archived *bool `json:"archived,omitempty"` + Template *bool `json:"template,omitempty"` + Confirm string `json:"confirm"` } func (t *RepoUpdate) Call(ctx context.Context, raw json.RawMessage) (json.RawMessage, error) { @@ -59,23 +63,29 @@ func (t *RepoUpdate) Call(ctx context.Context, raw json.RawMessage) (json.RawMes if err := t.a.Check(args.Owner); err != nil { return nil, err } - if args.Name == "" { - return nil, fmt.Errorf("name required: %w", gitea.ErrValidation) + + // Making a repo public is a significant action — require explicit confirmation. + if args.Private != nil && !*args.Private { + if args.Confirm != args.Name { + return nil, fmt.Errorf("setting private=false makes the repo public: set confirm=%q to proceed", args.Name) + } } - if args.Archived == nil && args.Description == nil && args.Private == nil && - args.Website == nil && args.Template == nil { + + if args.Description == nil && args.Private == nil && args.Website == nil && + args.DefaultBranch == nil && args.Archived == nil && args.Template == nil { return nil, fmt.Errorf("at least one updatable field must be set: %w", gitea.ErrValidation) } - updated, err := t.c.EditRepo(ctx, args.Owner, args.Name, gitea.EditRepoArgs{ - Archived: args.Archived, - Description: args.Description, - Private: args.Private, - Website: args.Website, - Template: args.Template, + r, err := t.c.UpdateRepo(ctx, args.Owner, args.Name, gitea.UpdateRepoArgs{ + Description: args.Description, + Private: args.Private, + Website: args.Website, + DefaultBranch: args.DefaultBranch, + Archived: args.Archived, + Template: args.Template, }) if err != nil { - return nil, fmt.Errorf("edit repo: %w", err) + return nil, err } - return textOK(updated) + return textOK(r) }