git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 2/5] refs: add REF_COMMON_DIR flag

From
Kazuki Yamaguchi <k@rhe.jp>
Date
Mar 25, 2016, 18:28 UTC
Message-ID
<baa0ab35c01c536fc25dbc83402c116f8515d3e7.1458927521.git.k@rhe.jp>
In-Reply-To
<cover.1458927521.git.k@rhe.jp>

Add a flag to force using $GIT_COMMON_DIR, instead of selecting $GIT_DIR or $GIT_COMMON_DIR by refname.

This allows updating worktree-specific refs of the main working tree from a linked working tree. We will use this later.

Signed-off-by: Kazuki Yamaguchi <k@rhe.jp>
---
 refs.h               |  4 ++++
 refs/files-backend.c | 12 ++++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/refs.h b/refs.h
index 5d9ab5c1c5dd..dc4782241e49 100644
--- a/refs.h
+++ b/refs.h
@@ -238,10 +238,14 @@ int pack_refs(unsigned int flags);
  * REF_NODEREF: act on the ref directly, instead of dereferencing
  *              symbolic references.
  *
+ * REF_COMMON_DIR: use $GIT_COMMON_DIR always. If not specified, $GIT_DIR or
+ *                 $GIT_COMMON_DIR is used depending on refname.
+ *
  * Other flags are reserved for internal use.
  */
 #define REF_NODEREF	0x01
 #define REF_FORCE_CREATE_REFLOG 0x40
+#define REF_COMMON_DIR 0x80
 
 /*
  * Setup reflog before using. Fill in err and return -1 on failure.
diff --git a/refs/files-backend.c b/refs/files-backend.c
index a534f1a1e078..2a808d520213 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -1918,6 +1918,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 		resolve_flags |= RESOLVE_REF_NO_RECURSE;
 		lflags |= LOCK_NO_DEREF;
 	}
+	if (flags & REF_COMMON_DIR)
+		resolve_flags |= RESOLVE_REF_COMMON_DIR;
 
 	refname = resolve_ref_unsafe(refname, resolve_flags,
 				     lock->old_oid.hash, &type);
@@ -1928,7 +1930,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 		 * it is normal for the empty directory 'foo'
 		 * to remain.
 		 */
-		strbuf_git_path(&orig_ref_file, "%s", orig_refname);
+		if (flags & REF_COMMON_DIR)
+			strbuf_addf(&orig_ref_file, "%s/%s", get_git_common_dir(), orig_refname);
+		else
+			strbuf_git_path(&orig_ref_file, "%s", orig_refname);
 		if (remove_empty_directories(&orig_ref_file)) {
 			last_errno = errno;
 			if (!verify_refname_available_dir(orig_refname, extras, skip,
@@ -1973,7 +1978,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 
 	lock->ref_name = xstrdup(refname);
 	lock->orig_ref_name = xstrdup(orig_refname);
-	strbuf_git_path(&ref_file, "%s", refname);
+	if (flags & REF_COMMON_DIR)
+		strbuf_addf(&ref_file, "%s/%s", get_git_common_dir(), refname);
+	else
+		strbuf_git_path(&ref_file, "%s", refname);
 
  retry:
 	switch (safe_create_leading_directories_const(ref_file.buf)) {
-- 
2.8.0.rc4.21.g05df949
Previous: Kazuki YamaguchiNext: Kazuki Yamaguchi
Message 3 of 17 in “branch: fix branch operations with multiple working trees”
  1. 0/5 branch: fix branch operations with multiple working treesKazuki Yamaguchi, Mar 25, 2016
  2. 1/5 refs: add new flag RESOLVE_REF_COMMON_DIR to resolve_ref_unsafeKazuki Yamaguchi, Mar 25, 2016
  3. 2/5 refs: add REF_COMMON_DIR flagKazuki Yamaguchi, Mar 25, 2016
  4. 3/5 refs: add create_symref_common_dir as a variation of create_symrefKazuki Yamaguchi, Mar 25, 2016
  5. 4/5 branch -m: update all per-worktree HEADsKazuki Yamaguchi, Mar 25, 2016
  6. 5/5 branch -d: refuse deleting a branch which is currently checked outKazuki Yamaguchi, Mar 25, 2016
  7. Junio C HamanoMar 25, 2016
  8. Eric SunshineMar 27, 2016
  9. Kazuki YamaguchiMar 28, 2016
  10. branch -d: refuse deleting a branch which is currently checked outKazuki Yamaguchi, Mar 28, 2016
  11. Eric SunshineMar 28, 2016
  12. Kazuki YamaguchiMar 29, 2016
  13. Eric SunshineMar 29, 2016
  14. branch -d: refuse deleting a branch which is currently checked outKazuki Yamaguchi, Mar 29, 2016
  15. Eric SunshineMar 29, 2016
  16. Junio C HamanoMar 25, 2016
  17. Kazuki YamaguchiMar 27, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.