Previous rounds are at <20180121120208.12760-1-t.gummerer@xxxxxxxxx>, <20180204221305.28300-1-t.gummerer@xxxxxxxxx>, <20180317220830.30963-1-t.gummerer@xxxxxxxxx>, <20180317222219.4940-1-t.gummerer@xxxxxxxxx>, <20180325134947.25828-1-t.gummerer@xxxxxxxxx>, <20180331151804.30380-1-t.gummerer@xxxxxxxxx>, <20180415202917.4360-1-t.gummerer@xxxxxxxxx> and <20180423193848.5159-1-t.gummerer@xxxxxxxxx>. Thanks Eric for the review and the suggestions on the previous round. Changes since the previous round: - UNLEAK new_branch after it was xstrndup'd - update the commit message of 2/4 according to Eric's suggestions - make force_new_branch a boolean flag in print_preparing_worktree_line, instead of using it as the branch name. Instead use new_branch as the new branch name everywhere in that function. - get rid of the ckeckout_existing_branch flag Interdiff below: diff --git a/builtin/worktree.c b/builtin/worktree.c index d52495f312..d3aeb4877d 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -356,18 +356,15 @@ static int add_worktree(const char *path, const char *refname, static void print_preparing_worktree_line(int detach, const char *branch, const char *new_branch, - const char *new_branch_force, - int checkout_existing_branch) + int force_new_branch) { - if (checkout_existing_branch) { - printf_ln(_("Preparing worktree (checking out '%s')"), branch); - } else if (new_branch_force) { - struct commit *commit = lookup_commit_reference_by_name(new_branch_force); + if (force_new_branch) { + struct commit *commit = lookup_commit_reference_by_name(new_branch); if (!commit) - printf_ln(_("Preparing worktree (new branch '%s')"), new_branch_force); + printf_ln(_("Preparing worktree (new branch '%s')"), new_branch); else printf_ln(_("Preparing worktree (resetting branch '%s'; was at %s)"), - new_branch_force, + new_branch, find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV)); } else if (new_branch) { @@ -390,19 +387,17 @@ static void print_preparing_worktree_line(int detach, } } -static const char *dwim_branch(const char *path, const char **new_branch, - int *checkout_existing_branch) +static const char *dwim_branch(const char *path, const char **new_branch) { int n; const char *s = worktree_basename(path, &n); const char *branchname = xstrndup(s, n); struct strbuf ref = STRBUF_INIT; + UNLEAK(branchname); if (!strbuf_check_branch_ref(&ref, branchname) && ref_exists(ref.buf)) { - *checkout_existing_branch = 1; strbuf_release(&ref); - UNLEAK(branchname); return branchname; } @@ -421,7 +416,6 @@ static int add(int ac, const char **av, const char *prefix) struct add_opts opts; const char *new_branch_force = NULL; char *path; - int checkout_existing_branch = 0; const char *branch; const char *new_branch = NULL; const char *opt_track = NULL; @@ -469,8 +463,7 @@ static int add(int ac, const char **av, const char *prefix) } if (ac < 2 && !new_branch && !opts.detach) { - const char *s = dwim_branch(path, &new_branch, - &checkout_existing_branch); + const char *s = dwim_branch(path, &new_branch); if (s) branch = s; } @@ -490,8 +483,7 @@ static int add(int ac, const char **av, const char *prefix) } } - print_preparing_worktree_line(opts.detach, branch, new_branch, new_branch_force, - checkout_existing_branch); + print_preparing_worktree_line(opts.detach, branch, new_branch, !!new_branch_force); if (new_branch) { struct child_process cp = CHILD_PROCESS_INIT; Thomas Gummerer (4): worktree: remove extra members from struct add_opts worktree: improve message when creating a new worktree worktree: factor out dwim_branch function worktree: teach "add" to check out existing branches Documentation/git-worktree.txt | 9 +++- builtin/worktree.c | 103 ++++++++++++++++++++++++++++++----------- t/t2025-worktree-add.sh | 26 ++++++++--- 3 files changed, 102 insertions(+), 36 deletions(-) -- 2.16.1.74.g7afd1c25cc.dirty