refs: kill set_worktree_head_symref()
70999e9cec(branch -m: update all per-worktree HEADs - 2016-03-27) added this function in order to update HEADs of all relevant worktrees, when a branch is renamed. It, as a public ref api, kind of breaks abstraction when it uses internal functions of files backend. With the introduction of refs_create_symref(), we can move back pretty close to the code before70999e9cec, where create_symref() was used for updating HEAD. 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
fa099d2322
commit
d026a25657
10
branch.c
10
branch.c
@@ -353,19 +353,19 @@ int replace_each_worktree_head_symref(const char *oldref, const char *newref,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; worktrees[i]; i++) {
|
for (i = 0; worktrees[i]; i++) {
|
||||||
|
struct ref_store *refs;
|
||||||
|
|
||||||
if (worktrees[i]->is_detached)
|
if (worktrees[i]->is_detached)
|
||||||
continue;
|
continue;
|
||||||
if (worktrees[i]->head_ref &&
|
if (worktrees[i]->head_ref &&
|
||||||
strcmp(oldref, worktrees[i]->head_ref))
|
strcmp(oldref, worktrees[i]->head_ref))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (set_worktree_head_symref(get_worktree_git_dir(worktrees[i]),
|
refs = get_worktree_ref_store(worktrees[i]);
|
||||||
newref, logmsg)) {
|
if (refs_create_symref(refs, "HEAD", newref, logmsg))
|
||||||
ret = -1;
|
ret = error(_("HEAD of working tree %s is not updated"),
|
||||||
error(_("HEAD of working tree %s is not updated"),
|
|
||||||
worktrees[i]->path);
|
worktrees[i]->path);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
free_worktrees(worktrees);
|
free_worktrees(worktrees);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
10
refs.h
10
refs.h
@@ -402,16 +402,6 @@ int refs_create_symref(struct ref_store *refs, const char *refname,
|
|||||||
const char *target, const char *logmsg);
|
const char *target, const char *logmsg);
|
||||||
int create_symref(const char *refname, const char *target, const char *logmsg);
|
int create_symref(const char *refname, const char *target, const char *logmsg);
|
||||||
|
|
||||||
/*
|
|
||||||
* Update HEAD of the specified gitdir.
|
|
||||||
* Similar to create_symref("relative-git-dir/HEAD", target, NULL), but
|
|
||||||
* this can update the main working tree's HEAD regardless of where
|
|
||||||
* $GIT_DIR points to.
|
|
||||||
* Return 0 if successful, non-zero otherwise.
|
|
||||||
* */
|
|
||||||
int set_worktree_head_symref(const char *gitdir, const char *target,
|
|
||||||
const char *logmsg);
|
|
||||||
|
|
||||||
enum action_on_err {
|
enum action_on_err {
|
||||||
UPDATE_REFS_MSG_ON_ERR,
|
UPDATE_REFS_MSG_ON_ERR,
|
||||||
UPDATE_REFS_DIE_ON_ERR,
|
UPDATE_REFS_DIE_ON_ERR,
|
||||||
|
|||||||
@@ -3160,50 +3160,6 @@ static int files_create_symref(struct ref_store *ref_store,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_worktree_head_symref(const char *gitdir, const char *target, const char *logmsg)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* FIXME: this obviously will not work well for future refs
|
|
||||||
* backends. This function needs to die.
|
|
||||||
*/
|
|
||||||
struct files_ref_store *refs =
|
|
||||||
files_downcast(get_main_ref_store(),
|
|
||||||
REF_STORE_WRITE,
|
|
||||||
"set_head_symref");
|
|
||||||
|
|
||||||
static struct lock_file head_lock;
|
|
||||||
struct ref_lock *lock;
|
|
||||||
struct strbuf head_path = STRBUF_INIT;
|
|
||||||
const char *head_rel;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
strbuf_addf(&head_path, "%s/HEAD", absolute_path(gitdir));
|
|
||||||
if (hold_lock_file_for_update(&head_lock, head_path.buf,
|
|
||||||
LOCK_NO_DEREF) < 0) {
|
|
||||||
struct strbuf err = STRBUF_INIT;
|
|
||||||
unable_to_lock_message(head_path.buf, errno, &err);
|
|
||||||
error("%s", err.buf);
|
|
||||||
strbuf_release(&err);
|
|
||||||
strbuf_release(&head_path);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* head_rel will be "HEAD" for the main tree, "worktrees/wt/HEAD" for
|
|
||||||
linked trees */
|
|
||||||
head_rel = remove_leading_path(head_path.buf,
|
|
||||||
absolute_path(get_git_common_dir()));
|
|
||||||
/* to make use of create_symref_locked(), initialize ref_lock */
|
|
||||||
lock = xcalloc(1, sizeof(struct ref_lock));
|
|
||||||
lock->lk = &head_lock;
|
|
||||||
lock->ref_name = xstrdup(head_rel);
|
|
||||||
|
|
||||||
ret = create_symref_locked(refs, lock, head_rel, target, logmsg);
|
|
||||||
|
|
||||||
unlock_ref(lock); /* will free lock */
|
|
||||||
strbuf_release(&head_path);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int files_reflog_exists(struct ref_store *ref_store,
|
static int files_reflog_exists(struct ref_store *ref_store,
|
||||||
const char *refname)
|
const char *refname)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -37,4 +37,16 @@ test_expect_success 'resolve_ref(<per-worktree-ref>)' '
|
|||||||
test_cmp expected actual
|
test_cmp expected actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'create_symref(FOO, refs/heads/master)' '
|
||||||
|
$RWT create-symref FOO refs/heads/master nothing &&
|
||||||
|
echo refs/heads/master >expected &&
|
||||||
|
git -C wt symbolic-ref FOO >actual &&
|
||||||
|
test_cmp expected actual &&
|
||||||
|
|
||||||
|
$RMAIN create-symref FOO refs/heads/wt-master nothing &&
|
||||||
|
echo refs/heads/wt-master >expected &&
|
||||||
|
git symbolic-ref FOO >actual &&
|
||||||
|
test_cmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|||||||
Reference in New Issue
Block a user