git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2] branch -d: refuse deleting a branch which is currently checked out

From
Kazuki Yamaguchi <k@rhe.jp>
Date
Mar 29, 2016, 09:28 UTC
Message-ID
<20160329092802.GA17915@chikuwa.rhe.jp>
In-Reply-To
<CAPig+cSzTwup6ojboVkP8nMR91-ZUU9FCbAK5NcrcohfFh2taQ@mail.gmail.com>
On Mon, Mar 28, 2016 at 12:51:21PM -0400, Eric Sunshine wrote:
Show 11 quoted lines
> On Mon, Mar 28, 2016 at 3:22 AM, Kazuki Yamaguchi <k@rhe.jp> wrote:
> > When a branch is checked out by current working tree, deleting the
> > branch is forbidden. However when the branch is checked out only by
> > other working trees, deleting is allowed.
> 
> It's not quite clear from this description that it is bad for deletion
> to succeed in the second case. Perhaps:
> 
>     s/deleting is allowed/deletion incorrectly succeeds/
> 
> would make it more clear.
Thanks.
Show 22 quoted lines
> 
> > Use find_shared_symref() to check if the branch is in use, not just
> > comparing with the current working tree's HEAD.
> 
> This version of the patch is nicer. Thanks. See a couple minor
> comments below which may or may not be worth a re-roll (you decide).
> 
> > Signed-off-by: Kazuki Yamaguchi <k@rhe.jp>
> > ---
> >
> >   % git worktree list
> >   /path/to      2c3c5f2 [master]
> >   /path/to/wt   2c3c5f2 [branch-a]
> >   % git branch -d branch-a
> >   error: Cannot delete the branch 'branch-a' which is currently checked out at '/path/to/wt'
> 
> Thanks for an example of the new behavior. It's also helpful to
> reviewers if you use this space to explain what changed since the
> previous version, and to provide a link to the previous attempt, like
> this[1].
> 
> [1]: http://thread.gmane.org/gmane.comp.version-control.git/289413/focus=289932
I'll do from next time.
Show 26 quoted lines
> 
> > diff --git a/builtin/branch.c b/builtin/branch.c
> > @@ -215,16 +216,21 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
> >                 int flags = 0;
> >
> >                 strbuf_branchname(&bname, argv[i]);
> > -               if (kinds == FILTER_REFS_BRANCHES && !strcmp(head, bname.buf)) {
> > -                       error(_("Cannot delete the branch '%s' "
> > -                             "which you are currently on."), bname.buf);
> > -                       ret = 1;
> > -                       continue;
> > -               }
> > -
> >                 free(name);
> > -
> >                 name = mkpathdup(fmt, bname.buf);
> > +
> > +               if (kinds == FILTER_REFS_BRANCHES) {
> > +                       char *worktree = find_shared_symref("HEAD", name);
> > +                       if (worktree) {
> > +                               error(_("Cannot delete the branch '%s' "
> > +                                       "which is currently checked out at '%s'"),
> 
> This could be stated more concisely as:
> 
>     "Cannot delete branch '%s' checked out at '%s'"
I'll use it. Thanks.
Show 7 quoted lines
> 
> > +                                     bname.buf, worktree);
> > +                               free(worktree);
> 
> Would it make sense to show all worktrees at which this branch is
> checked out, rather than only one, or is that not worth the effort and
> extra code ugliness?

I thought one is enough. I think the worktrees usually won't be more than one, considering "git worktree add" requires additional option to check out an already checked out branch. Also, since the branch is not actually deleted at that time, the user can safely retry after checking "git worktree list".

Thanks,
Show 9 quoted lines
> 
> > +                               ret = 1;
> > +                               continue;
> > +                       }
> > +               }
> > +
> >                 target = resolve_ref_unsafe(name,
> >                                             RESOLVE_REF_READING
> >                                             | RESOLVE_REF_NO_RECURSE
Previous: Eric SunshineNext: Eric Sunshine
Message 12 of 17 in “branch: fix branch operations with multiple working trees”
  1. 0/5 branch: fix branch operations with multiple working treesKazuki Yamaguchi, Mar 25, 2016
  2. 1/5 refs: add new flag RESOLVE_REF_COMMON_DIR to resolve_ref_unsafeKazuki Yamaguchi, Mar 25, 2016
  3. 2/5 refs: add REF_COMMON_DIR flagKazuki Yamaguchi, Mar 25, 2016
  4. 3/5 refs: add create_symref_common_dir as a variation of create_symrefKazuki Yamaguchi, Mar 25, 2016
  5. 4/5 branch -m: update all per-worktree HEADsKazuki Yamaguchi, Mar 25, 2016
  6. 5/5 branch -d: refuse deleting a branch which is currently checked outKazuki Yamaguchi, Mar 25, 2016
  7. Junio C HamanoMar 25, 2016
  8. Eric SunshineMar 27, 2016
  9. Kazuki YamaguchiMar 28, 2016
  10. branch -d: refuse deleting a branch which is currently checked outKazuki Yamaguchi, Mar 28, 2016
  11. Eric SunshineMar 28, 2016
  12. Kazuki YamaguchiMar 29, 2016
  13. Eric SunshineMar 29, 2016
  14. branch -d: refuse deleting a branch which is currently checked outKazuki Yamaguchi, Mar 29, 2016
  15. Eric SunshineMar 29, 2016
  16. Junio C HamanoMar 25, 2016
  17. Kazuki YamaguchiMar 27, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.