Merge branch 'ms/worktree-add-atomic-mkdir'
[gitweb.git] / refs / files-backend.c
index 06ba49f47ab1b465555f9128a91b9d0a51a55ef3..5848f32ef8f206f489416cd3cfe52d12cc54ad36 100644 (file)
@@ -180,7 +180,8 @@ static void files_reflog_path(struct files_ref_store *refs,
                break;
        case REF_TYPE_OTHER_PSEUDOREF:
        case REF_TYPE_MAIN_PSEUDOREF:
-               return files_reflog_path_other_worktrees(refs, sb, refname);
+               files_reflog_path_other_worktrees(refs, sb, refname);
+               break;
        case REF_TYPE_NORMAL:
                strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, refname);
                break;
@@ -214,28 +215,28 @@ static void files_ref_path(struct files_ref_store *refs,
 }
 
 /*
- * Manually add refs/bisect and refs/worktree, which, being
+ * Manually add refs/bisect, refs/rewritten and refs/worktree, which, being
  * per-worktree, might not appear in the directory listing for
  * refs/ in the main repo.
  */
 static void add_per_worktree_entries_to_dir(struct ref_dir *dir, const char *dirname)
 {
-       int pos;
+       const char *prefixes[] = { "refs/bisect/", "refs/worktree/", "refs/rewritten/" };
+       int ip;
 
        if (strcmp(dirname, "refs/"))
                return;
 
-       pos = search_ref_dir(dir, "refs/bisect/", 12);
-       if (pos < 0) {
-               struct ref_entry *child_entry =
-                       create_dir_entry(dir->cache, "refs/bisect/", 12, 1);
-               add_entry_to_dir(dir, child_entry);
-       }
+       for (ip = 0; ip < ARRAY_SIZE(prefixes); ip++) {
+               const char *prefix = prefixes[ip];
+               int prefix_len = strlen(prefix);
+               struct ref_entry *child_entry;
+               int pos;
 
-       pos = search_ref_dir(dir, "refs/worktree/", 11);
-       if (pos < 0) {
-               struct ref_entry *child_entry =
-                       create_dir_entry(dir->cache, "refs/worktree/", 11, 1);
+               pos = search_ref_dir(dir, prefix, prefix_len);
+               if (pos >= 0)
+                       continue;
+               child_entry = create_dir_entry(dir->cache, prefix, prefix_len, 1);
                add_entry_to_dir(dir, child_entry);
        }
 }
@@ -2259,8 +2260,7 @@ static int split_head_update(struct ref_update *update,
  * Note that the new update will itself be subject to splitting when
  * the iteration gets to it.
  */
-static int split_symref_update(struct files_ref_store *refs,
-                              struct ref_update *update,
+static int split_symref_update(struct ref_update *update,
                               const char *referent,
                               struct ref_transaction *transaction,
                               struct string_list *affected_refnames,
@@ -2454,7 +2454,7 @@ static int lock_ref_for_update(struct files_ref_store *refs,
                         * of processing the split-off update, so we
                         * don't have to do it here.
                         */
-                       ret = split_symref_update(refs, update,
+                       ret = split_symref_update(update,
                                                  referent.buf, transaction,
                                                  affected_refnames, err);
                        if (ret)