worktree add: sanitize worktree names
Worktree names are based on $(basename $GIT_WORK_TREE). They aren't
significant until 3a3b9d8cde
(refs: new ref types to make per-worktree
refs visible to all worktrees - 2018-10-21), where worktree name could
be part of a refname and must follow refname rules.
Update 'worktree add' code to remove special characters to follow
these rules. In the future the user will be able to specify the
worktree name by themselves if they're not happy with this dumb
character substitution.
Reported-by: Konstantin Kharlamov <hi-angel@yandex.ru>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
7d0c1f4556
commit
1de16aecf5
@ -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'"),
|
||||
@ -415,6 +422,7 @@ done:
|
||||
strbuf_release(&symref);
|
||||
strbuf_release(&sb_repo);
|
||||
strbuf_release(&sb_git);
|
||||
strbuf_release(&sb_name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user