Download raw body.
make 'got branch -d' consistent with 'got branch -l"
Since got 0.49 'got branch -l' lists copies of remote branches which exist under "refs/remotes/". This was done to make it easier for users to identify valid arguments for 'got update -b'. But 'got branch -d' still operates on "refs/heads" only. My original idea was to rely on 'got ref -d' to delete copies of remote branches. Attempting to delete a remote branch via 'got branch -d' gives a 'reference not found' error which is now inconsistent with 'got branch -l' since this command displays the remote branch. So I'd like to allow deletion of remote branches via 'got branch -d'. ok? diff bc62ede807f0ad3a920fa1e8b05dd90cc8f5f289 /home/stsp/src/got blob - 22cc9a1eba46d729c6f6890233b894a7d846f716 file + got/got.1 --- got/got.1 +++ got/got.1 @@ -983,7 +983,7 @@ Local branches are managed via references which live i reference namespace. The .Cm got branch -command creates or deletes references in this namespace only. +command will create references in this namespace only. .Pp If invoked in a work tree without any arguments, print the name of the work tree's current branch. @@ -1042,7 +1042,14 @@ with one the following annotations: .It \(a~ Ta work tree's base commit is out-of-date .El .It Fl d Ar name -Delete the branch with the specified name from the repository. +Delete the branch with the specified +.Ar name +from the repository. +If this branch does not exist in the +.Dq refs/heads/ +reference namespace, attempt to delete it from the +.Dq refs/remotes/ +reference namespace instead. Only the branch reference is deleted. Any commit, tree, and blob objects belonging to the branch remain in the repository and may be removed separately with blob - 9bcd279e5446ef8a890025dd5e3e16b3206fc66a file + got/got.c --- got/got.c +++ got/got.c @@ -5642,8 +5642,23 @@ delete_branch(struct got_repository *repo, struct got_ return got_error_from_errno("asprintf"); err = got_ref_open(&ref, repo, refname, 0); - if (err) - goto done; + if (err) { + if (err->code != GOT_ERR_NOT_REF) + goto done; + free(refname); + refname = NULL; + if (asprintf(&refname, "refs/remotes/%s", branch_name) == -1) + return got_error_from_errno("asprintf"); + err = got_ref_open(&ref, repo, refname, 0); + if (err) { + if (err->code == GOT_ERR_NOT_REF) { + err = got_error_fmt(GOT_ERR_NOT_REF, + "refs/heads/%s or refs/remotes/%s", + branch_name, branch_name); + } + goto done; + } + } if (worktree && strcmp(got_worktree_get_head_ref_name(worktree), blob - a766241048c3ca1094a34b2c4977c80ec15d69e5 file + regress/cmdline/branch.sh --- regress/cmdline/branch.sh +++ regress/cmdline/branch.sh @@ -289,8 +289,11 @@ test_branch_delete() { return 1 fi - echo "got: reference refs/heads/bogus_branch_name not found" \ - > $testroot/stderr.expected + echo -n "got: refs/heads/bogus_branch_name " \ + >> $testroot/stderr.expected + echo -n "or refs/remotes/bogus_branch_name: " \ + >> $testroot/stderr.expected + echo "no such reference found" >> $testroot/stderr.expected cmp -s $testroot/stderr $testroot/stderr.expected ret="$?" if [ "$ret" != "0" ]; then @@ -382,8 +385,11 @@ test_branch_delete_packed() { return 1 fi - echo "got: reference refs/heads/bogus_branch_name not found" \ - > $testroot/stderr.expected + echo -n "got: refs/heads/bogus_branch_name " \ + >> $testroot/stderr.expected + echo -n "or refs/remotes/bogus_branch_name: " \ + >> $testroot/stderr.expected + echo "no such reference found" >> $testroot/stderr.expected cmp -s $testroot/stderr $testroot/stderr.expected ret="$?" if [ "$ret" != "0" ]; then
make 'got branch -d' consistent with 'got branch -l"