]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/worktree.c
Merge branch 'bw/rebase-autostash-keep-current-branch'
[thirdparty/git.git] / builtin / worktree.c
index d2a7e2f3f18ba411d065a52ac868db612de5beaa..7f094f8170ae7d55d453a2b0ab5db933ddf395ba 100644 (file)
@@ -275,6 +275,7 @@ static int add_worktree(const char *path, const char *refname,
        struct strbuf symref = STRBUF_INIT;
        struct commit *commit = NULL;
        int is_branch = 0;
+       struct strbuf sb_name = STRBUF_INIT;
 
        validate_worktree_add(path, opts);
 
@@ -290,7 +291,13 @@ static int add_worktree(const char *path, const char *refname,
                die(_("invalid reference: %s"), refname);
 
        name = worktree_basename(path, &len);
-       git_path_buf(&sb_repo, "worktrees/%.*s", (int)(path + len - name), name);
+       strbuf_add(&sb, name, path + len - name);
+       sanitize_refname_component(sb.buf, &sb_name);
+       if (!sb_name.len)
+               BUG("How come '%s' becomes empty after sanitization?", sb.buf);
+       strbuf_reset(&sb);
+       name = sb_name.buf;
+       git_path_buf(&sb_repo, "worktrees/%s", name);
        len = sb_repo.len;
        if (safe_create_leading_directories_const(sb_repo.buf))
                die_errno(_("could not create leading directories of '%s'"),
@@ -418,6 +425,7 @@ done:
        strbuf_release(&symref);
        strbuf_release(&sb_repo);
        strbuf_release(&sb_git);
+       strbuf_release(&sb_name);
        return ret;
 }
 
@@ -872,7 +880,7 @@ static void check_clean_worktree(struct worktree *wt,
                          original_path);
        ret = xread(cp.out, buf, sizeof(buf));
        if (ret)
-               die(_("'%s' is dirty, use --force to delete it"),
+               die(_("'%s' contains modified or untracked files, use --force to delete it"),
                    original_path);
        close(cp.out);
        ret = finish_command(&cp);