summaryrefslogtreecommitdiff
path: root/refs
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2016-03-27 14:37:13 (GMT)
committerJunio C Hamano <gitster@pobox.com>2016-04-04 19:57:21 (GMT)
commit2233066e778e32dfab0471ea2ad8d1c7a94b7e39 (patch)
tree49a3691576048fde90f5f39d2a7e3cc91081b835 /refs
parent56331f8727b0c2e7dc713b728eaf1e5843422cb7 (diff)
downloadgit-2233066e778e32dfab0471ea2ad8d1c7a94b7e39.zip
git-2233066e778e32dfab0471ea2ad8d1c7a94b7e39.tar.gz
git-2233066e778e32dfab0471ea2ad8d1c7a94b7e39.tar.bz2
refs: add a new function set_worktree_head_symref
Add a new function set_worktree_head_symref, to update HEAD symref for the specified worktree. To update HEAD of a linked working tree, create_symref("worktrees/$work_tree/HEAD", "refs/heads/$branch", msg) could be used. However when it comes to updating HEAD of the main working tree, it is unusable because it uses $GIT_DIR for worktree-specific symrefs (HEAD). The new function takes git_dir (real directory) as an argument, and updates HEAD of the working tree. This function will be used when renaming a branch. Signed-off-by: Kazuki Yamaguchi <k@rhe.jp> Acked-by: David Turner <dturner@twopensource.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs')
-rw-r--r--refs/files-backend.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 81f68f8..ec237ef 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2894,6 +2894,41 @@ int create_symref(const char *refname, const char *target, const char *logmsg)
return ret;
}
+int set_worktree_head_symref(const char *gitdir, const char *target)
+{
+ static struct lock_file head_lock;
+ struct ref_lock *lock;
+ struct strbuf err = STRBUF_INIT;
+ 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) {
+ 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);
+ lock->orig_ref_name = xstrdup(head_rel);
+
+ ret = create_symref_locked(lock, head_rel, target, NULL);
+
+ unlock_ref(lock); /* will free lock */
+ strbuf_release(&head_path);
+ return ret;
+}
+
int reflog_exists(const char *refname)
{
struct stat st;