rugged 0.26.0b3 → 0.26.0b4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/ext/rugged/extconf.rb +10 -7
  4. data/ext/rugged/rugged.c +4 -6
  5. data/ext/rugged/rugged_repo.c +1 -1
  6. data/ext/rugged/rugged_revwalk.c +4 -4
  7. data/ext/rugged/rugged_tree.c +2 -2
  8. data/lib/rugged/version.rb +1 -1
  9. data/vendor/libgit2/CMakeLists.txt +13 -6
  10. data/vendor/libgit2/COPYING +33 -0
  11. data/vendor/libgit2/include/git2/branch.h +12 -0
  12. data/vendor/libgit2/include/git2/commit.h +6 -3
  13. data/vendor/libgit2/include/git2/common.h +11 -0
  14. data/vendor/libgit2/include/git2/errors.h +2 -0
  15. data/vendor/libgit2/include/git2/index.h +7 -6
  16. data/vendor/libgit2/include/git2/repository.h +91 -0
  17. data/vendor/libgit2/include/git2/stash.h +2 -2
  18. data/vendor/libgit2/include/git2/types.h +3 -0
  19. data/vendor/libgit2/include/git2/worktree.h +161 -0
  20. data/vendor/libgit2/src/attr.c +24 -16
  21. data/vendor/libgit2/src/attr_file.h +1 -1
  22. data/vendor/libgit2/src/attrcache.c +11 -10
  23. data/vendor/libgit2/src/attrcache.h +1 -4
  24. data/vendor/libgit2/src/blob.c +2 -2
  25. data/vendor/libgit2/src/branch.c +63 -0
  26. data/vendor/libgit2/src/buffer.h +2 -1
  27. data/vendor/libgit2/src/cache.c +21 -25
  28. data/vendor/libgit2/src/cache.h +1 -1
  29. data/vendor/libgit2/src/checkout.c +0 -2
  30. data/vendor/libgit2/src/cherrypick.c +2 -2
  31. data/vendor/libgit2/src/clone.c +2 -3
  32. data/vendor/libgit2/src/commit.c +8 -4
  33. data/vendor/libgit2/src/config_file.c +1 -3
  34. data/vendor/libgit2/src/describe.c +1 -3
  35. data/vendor/libgit2/src/diff_driver.c +2 -4
  36. data/vendor/libgit2/src/fetchhead.c +2 -2
  37. data/vendor/libgit2/src/fileops.c +1 -3
  38. data/vendor/libgit2/src/hash.h +5 -3
  39. data/vendor/libgit2/src/hash/hash_collisiondetect.h +57 -0
  40. data/vendor/libgit2/src/hash/sha1dc/sha1.c +1149 -0
  41. data/vendor/libgit2/src/hash/sha1dc/sha1.h +94 -0
  42. data/vendor/libgit2/src/hash/sha1dc/ubc_check.c +361 -0
  43. data/vendor/libgit2/src/hash/sha1dc/ubc_check.h +35 -0
  44. data/vendor/libgit2/src/idxmap.c +133 -0
  45. data/vendor/libgit2/src/idxmap.h +22 -60
  46. data/vendor/libgit2/src/ignore.c +7 -1
  47. data/vendor/libgit2/src/ignore.h +1 -1
  48. data/vendor/libgit2/src/index.c +11 -14
  49. data/vendor/libgit2/src/indexer.c +8 -11
  50. data/vendor/libgit2/src/merge.c +5 -5
  51. data/vendor/libgit2/src/mwindow.c +1 -3
  52. data/vendor/libgit2/src/odb.c +3 -3
  53. data/vendor/libgit2/src/odb.h +3 -0
  54. data/vendor/libgit2/src/odb_mempack.c +11 -18
  55. data/vendor/libgit2/src/offmap.c +83 -0
  56. data/vendor/libgit2/src/offmap.h +14 -34
  57. data/vendor/libgit2/src/oidmap.c +105 -0
  58. data/vendor/libgit2/src/oidmap.h +19 -22
  59. data/vendor/libgit2/src/pack-objects.c +10 -13
  60. data/vendor/libgit2/src/pack.c +17 -26
  61. data/vendor/libgit2/src/path.c +45 -24
  62. data/vendor/libgit2/src/rebase.c +3 -3
  63. data/vendor/libgit2/src/refdb_fs.c +81 -46
  64. data/vendor/libgit2/src/refs.c +13 -3
  65. data/vendor/libgit2/src/remote.c +6 -2
  66. data/vendor/libgit2/src/repository.c +318 -46
  67. data/vendor/libgit2/src/repository.h +5 -2
  68. data/vendor/libgit2/src/revert.c +2 -2
  69. data/vendor/libgit2/src/revwalk.c +6 -8
  70. data/vendor/libgit2/src/settings.c +5 -0
  71. data/vendor/libgit2/src/sortedcache.c +3 -5
  72. data/vendor/libgit2/src/strmap.c +95 -0
  73. data/vendor/libgit2/src/strmap.h +17 -37
  74. data/vendor/libgit2/src/submodule.c +12 -8
  75. data/vendor/libgit2/src/thread-utils.h +6 -0
  76. data/vendor/libgit2/src/transaction.c +5 -17
  77. data/vendor/libgit2/src/transports/local.c +2 -1
  78. data/vendor/libgit2/src/transports/smart.h +2 -0
  79. data/vendor/libgit2/src/transports/smart_protocol.c +3 -1
  80. data/vendor/libgit2/src/tree.c +2 -4
  81. data/vendor/libgit2/src/unix/posix.h +1 -1
  82. data/vendor/libgit2/src/worktree.c +432 -0
  83. data/vendor/libgit2/src/worktree.h +35 -0
  84. metadata +13 -2
@@ -16,9 +16,6 @@
16
16
 
17
17
  #include <zlib.h>
18
18
 
19
- GIT__USE_OFFMAP
20
- GIT__USE_OIDMAP
21
-
22
19
  static int packfile_open(struct git_pack_file *p);
23
20
  static git_off_t nth_packed_object_offset(const struct git_pack_file *p, uint32_t n);
24
21
  static int packfile_unpack_compressed(
@@ -78,13 +75,12 @@ static void free_cache_object(void *o)
78
75
 
79
76
  static void cache_free(git_pack_cache *cache)
80
77
  {
81
- khiter_t k;
78
+ git_pack_cache_entry *entry;
82
79
 
83
80
  if (cache->entries) {
84
- for (k = kh_begin(cache->entries); k != kh_end(cache->entries); k++) {
85
- if (kh_exist(cache->entries, k))
86
- free_cache_object(kh_value(cache->entries, k));
87
- }
81
+ git_offmap_foreach_value(cache->entries, entry, {
82
+ free_cache_object(entry);
83
+ });
88
84
 
89
85
  git_offmap_free(cache->entries);
90
86
  cache->entries = NULL;
@@ -118,9 +114,9 @@ static git_pack_cache_entry *cache_get(git_pack_cache *cache, git_off_t offset)
118
114
  if (git_mutex_lock(&cache->lock) < 0)
119
115
  return NULL;
120
116
 
121
- k = kh_get(off, cache->entries, offset);
122
- if (k != kh_end(cache->entries)) { /* found it */
123
- entry = kh_value(cache->entries, k);
117
+ k = git_offmap_lookup_index(cache->entries, offset);
118
+ if (git_offmap_valid_index(cache->entries, k)) { /* found it */
119
+ entry = git_offmap_value_at(cache->entries, k);
124
120
  git_atomic_inc(&entry->refcount);
125
121
  entry->last_usage = cache->use_ctr++;
126
122
  }
@@ -132,21 +128,16 @@ static git_pack_cache_entry *cache_get(git_pack_cache *cache, git_off_t offset)
132
128
  /* Run with the cache lock held */
133
129
  static void free_lowest_entry(git_pack_cache *cache)
134
130
  {
131
+ git_off_t offset;
135
132
  git_pack_cache_entry *entry;
136
- khiter_t k;
137
-
138
- for (k = kh_begin(cache->entries); k != kh_end(cache->entries); k++) {
139
- if (!kh_exist(cache->entries, k))
140
- continue;
141
-
142
- entry = kh_value(cache->entries, k);
143
133
 
134
+ git_offmap_foreach(cache->entries, offset, entry, {
144
135
  if (entry && entry->refcount.val == 0) {
145
136
  cache->memory_used -= entry->raw.len;
146
- kh_del(off, cache->entries, k);
137
+ git_offmap_delete(cache->entries, offset);
147
138
  free_cache_object(entry);
148
139
  }
149
- }
140
+ });
150
141
  }
151
142
 
152
143
  static int cache_add(
@@ -170,14 +161,14 @@ static int cache_add(
170
161
  return -1;
171
162
  }
172
163
  /* Add it to the cache if nobody else has */
173
- exists = kh_get(off, cache->entries, offset) != kh_end(cache->entries);
164
+ exists = git_offmap_exists(cache->entries, offset);
174
165
  if (!exists) {
175
166
  while (cache->memory_used + base->len > cache->memory_limit)
176
167
  free_lowest_entry(cache);
177
168
 
178
- k = kh_put(off, cache->entries, offset, &error);
169
+ k = git_offmap_put(cache->entries, offset, &error);
179
170
  assert(error != 0);
180
- kh_value(cache->entries, k) = entry;
171
+ git_offmap_set_value_at(cache->entries, k, entry);
181
172
  cache->memory_used += entry->raw.len;
182
173
 
183
174
  *cached_out = entry;
@@ -962,10 +953,10 @@ git_off_t get_delta_base(
962
953
  git_oid oid;
963
954
 
964
955
  git_oid_fromraw(&oid, base_info);
965
- k = kh_get(oid, p->idx_cache, &oid);
966
- if (k != kh_end(p->idx_cache)) {
956
+ k = git_oidmap_lookup_index(p->idx_cache, &oid);
957
+ if (git_oidmap_valid_index(p->idx_cache, k)) {
967
958
  *curpos += 20;
968
- return ((struct git_pack_entry *)kh_value(p->idx_cache, k))->offset;
959
+ return ((struct git_pack_entry *)git_oidmap_value_at(p->idx_cache, k))->offset;
969
960
  } else {
970
961
  /* If we're building an index, don't try to find the pack
971
962
  * entry; we just haven't seen it yet. We'll make
@@ -110,6 +110,34 @@ Exit:
110
110
  return result;
111
111
  }
112
112
 
113
+ /*
114
+ * Determine if the path is a Windows prefix and, if so, returns
115
+ * its actual lentgh. If it is not a prefix, returns -1.
116
+ */
117
+ static int win32_prefix_length(const char *path, int len)
118
+ {
119
+ #ifndef GIT_WIN32
120
+ GIT_UNUSED(path);
121
+ GIT_UNUSED(len);
122
+ #else
123
+ /*
124
+ * Mimic unix behavior where '/.git' returns '/': 'C:/.git' will return
125
+ * 'C:/' here
126
+ */
127
+ if (len == 2 && LOOKS_LIKE_DRIVE_PREFIX(path))
128
+ return 2;
129
+
130
+ /*
131
+ * Similarly checks if we're dealing with a network computer name
132
+ * '//computername/.git' will return '//computername/'
133
+ */
134
+ if (looks_like_network_computer_name(path, len))
135
+ return len;
136
+ #endif
137
+
138
+ return -1;
139
+ }
140
+
113
141
  /*
114
142
  * Based on the Android implementation, BSD licensed.
115
143
  * Check http://android.git.kernel.org/
@@ -117,7 +145,7 @@ Exit:
117
145
  int git_path_dirname_r(git_buf *buffer, const char *path)
118
146
  {
119
147
  const char *endp;
120
- int result, len;
148
+ int is_prefix = 0, len;
121
149
 
122
150
  /* Empty or NULL string gets treated as "." */
123
151
  if (path == NULL || *path == '\0') {
@@ -131,6 +159,11 @@ int git_path_dirname_r(git_buf *buffer, const char *path)
131
159
  while (endp > path && *endp == '/')
132
160
  endp--;
133
161
 
162
+ if ((len = win32_prefix_length(path, endp - path + 1)) > 0) {
163
+ is_prefix = 1;
164
+ goto Exit;
165
+ }
166
+
134
167
  /* Find the start of the dir */
135
168
  while (endp > path && *endp != '/')
136
169
  endp--;
@@ -146,35 +179,23 @@ int git_path_dirname_r(git_buf *buffer, const char *path)
146
179
  endp--;
147
180
  } while (endp > path && *endp == '/');
148
181
 
149
- /* Cast is safe because max path < max int */
150
- len = (int)(endp - path + 1);
151
-
152
- #ifdef GIT_WIN32
153
- /* Mimic unix behavior where '/.git' returns '/': 'C:/.git' will return
154
- 'C:/' here */
155
-
156
- if (len == 2 && LOOKS_LIKE_DRIVE_PREFIX(path)) {
157
- len = 3;
182
+ if ((len = win32_prefix_length(path, endp - path + 1)) > 0) {
183
+ is_prefix = 1;
158
184
  goto Exit;
159
185
  }
160
186
 
161
- /* Similarly checks if we're dealing with a network computer name
162
- '//computername/.git' will return '//computername/' */
163
-
164
- if (looks_like_network_computer_name(path, len)) {
165
- len++;
166
- goto Exit;
167
- }
168
-
169
- #endif
187
+ /* Cast is safe because max path < max int */
188
+ len = (int)(endp - path + 1);
170
189
 
171
190
  Exit:
172
- result = len;
173
-
174
- if (buffer != NULL && git_buf_set(buffer, path, len) < 0)
175
- return -1;
191
+ if (buffer) {
192
+ if (git_buf_set(buffer, path, len) < 0)
193
+ return -1;
194
+ if (is_prefix && git_buf_putc(buffer, '/') < 0)
195
+ return -1;
196
+ }
176
197
 
177
- return result;
198
+ return len;
178
199
  }
179
200
 
180
201
 
@@ -92,7 +92,7 @@ static int rebase_state_type(
92
92
  git_buf path = GIT_BUF_INIT;
93
93
  git_rebase_type_t type = GIT_REBASE_TYPE_NONE;
94
94
 
95
- if (git_buf_joinpath(&path, repo->path_repository, REBASE_APPLY_DIR) < 0)
95
+ if (git_buf_joinpath(&path, repo->gitdir, REBASE_APPLY_DIR) < 0)
96
96
  return -1;
97
97
 
98
98
  if (git_path_isdir(git_buf_cstr(&path))) {
@@ -101,7 +101,7 @@ static int rebase_state_type(
101
101
  }
102
102
 
103
103
  git_buf_clear(&path);
104
- if (git_buf_joinpath(&path, repo->path_repository, REBASE_MERGE_DIR) < 0)
104
+ if (git_buf_joinpath(&path, repo->gitdir, REBASE_MERGE_DIR) < 0)
105
105
  return -1;
106
106
 
107
107
  if (git_path_isdir(git_buf_cstr(&path))) {
@@ -624,7 +624,7 @@ static int rebase_init_merge(
624
624
 
625
625
  GIT_UNUSED(upstream);
626
626
 
627
- if ((error = git_buf_joinpath(&state_path, repo->path_repository, REBASE_MERGE_DIR)) < 0)
627
+ if ((error = git_buf_joinpath(&state_path, repo->gitdir, REBASE_MERGE_DIR)) < 0)
628
628
  goto done;
629
629
 
630
630
  rebase->state_path = git_buf_detach(&state_path);
@@ -26,8 +26,6 @@
26
26
  #include <git2/sys/refs.h>
27
27
  #include <git2/sys/reflog.h>
28
28
 
29
- GIT__USE_STRMAP
30
-
31
29
  #define DEFAULT_NESTING_LEVEL 5
32
30
  #define MAX_NESTING_LEVEL 10
33
31
 
@@ -55,7 +53,10 @@ typedef struct refdb_fs_backend {
55
53
  git_refdb_backend parent;
56
54
 
57
55
  git_repository *repo;
58
- char *path;
56
+ /* path to git directory */
57
+ char *gitpath;
58
+ /* path to common objects' directory */
59
+ char *commonpath;
59
60
 
60
61
  git_sortedcache *refcache;
61
62
  int peeling_mode;
@@ -77,7 +78,7 @@ static int packed_reload(refdb_fs_backend *backend)
77
78
  git_buf packedrefs = GIT_BUF_INIT;
78
79
  char *scan, *eof, *eol;
79
80
 
80
- if (!backend->path)
81
+ if (!backend->gitpath)
81
82
  return 0;
82
83
 
83
84
  error = git_sortedcache_lockandload(backend->refcache, &packedrefs);
@@ -238,7 +239,7 @@ static int loose_lookup_to_packfile(refdb_fs_backend *backend, const char *name)
238
239
  /* if we fail to load the loose reference, assume someone changed
239
240
  * the filesystem under us and skip it...
240
241
  */
241
- if (loose_readbuffer(&ref_file, backend->path, name) < 0) {
242
+ if (loose_readbuffer(&ref_file, backend->gitpath, name) < 0) {
242
243
  giterr_clear();
243
244
  goto done;
244
245
  }
@@ -287,7 +288,7 @@ static int _dirent_loose_load(void *payload, git_buf *full_path)
287
288
  return error;
288
289
  }
289
290
 
290
- file_path = full_path->ptr + strlen(backend->path);
291
+ file_path = full_path->ptr + strlen(backend->gitpath);
291
292
 
292
293
  return loose_lookup_to_packfile(backend, file_path);
293
294
  }
@@ -303,7 +304,7 @@ static int packed_loadloose(refdb_fs_backend *backend)
303
304
  int error;
304
305
  git_buf refs_path = GIT_BUF_INIT;
305
306
 
306
- if (git_buf_joinpath(&refs_path, backend->path, GIT_REFS_DIR) < 0)
307
+ if (git_buf_joinpath(&refs_path, backend->gitpath, GIT_REFS_DIR) < 0)
307
308
  return -1;
308
309
 
309
310
  /*
@@ -331,7 +332,7 @@ static int refdb_fs_backend__exists(
331
332
  assert(backend);
332
333
 
333
334
  if ((error = packed_reload(backend)) < 0 ||
334
- (error = git_buf_joinpath(&ref_path, backend->path, ref_name)) < 0)
335
+ (error = git_buf_joinpath(&ref_path, backend->gitpath, ref_name)) < 0)
335
336
  return error;
336
337
 
337
338
  *exists = git_path_isfile(ref_path.ptr) ||
@@ -362,6 +363,19 @@ static const char *loose_parse_symbolic(git_buf *file_content)
362
363
  return refname_start;
363
364
  }
364
365
 
366
+ /*
367
+ * Returns whether a reference is stored per worktree or not.
368
+ * Per-worktree references are:
369
+ *
370
+ * - all pseudorefs, e.g. HEAD and MERGE_HEAD
371
+ * - all references stored inside of "refs/bisect/"
372
+ */
373
+ static bool is_per_worktree_ref(const char *ref_name)
374
+ {
375
+ return git__prefixcmp(ref_name, "refs/") != 0 ||
376
+ git__prefixcmp(ref_name, "refs/bisect/") == 0;
377
+ }
378
+
365
379
  static int loose_lookup(
366
380
  git_reference **out,
367
381
  refdb_fs_backend *backend,
@@ -369,11 +383,17 @@ static int loose_lookup(
369
383
  {
370
384
  git_buf ref_file = GIT_BUF_INIT;
371
385
  int error = 0;
386
+ const char *ref_dir;
372
387
 
373
388
  if (out)
374
389
  *out = NULL;
375
390
 
376
- if ((error = loose_readbuffer(&ref_file, backend->path, ref_name)) < 0)
391
+ if (is_per_worktree_ref(ref_name))
392
+ ref_dir = backend->gitpath;
393
+ else
394
+ ref_dir = backend->commonpath;
395
+
396
+ if ((error = loose_readbuffer(&ref_file, ref_dir, ref_name)) < 0)
377
397
  /* cannot read loose ref file - gah */;
378
398
  else if (git__prefixcmp(git_buf_cstr(&ref_file), GIT_SYMREF) == 0) {
379
399
  const char *target;
@@ -484,12 +504,12 @@ static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
484
504
  git_iterator_options fsit_opts = GIT_ITERATOR_OPTIONS_INIT;
485
505
  const git_index_entry *entry = NULL;
486
506
 
487
- if (!backend->path) /* do nothing if no path for loose refs */
507
+ if (!backend->commonpath) /* do nothing if no commonpath for loose refs */
488
508
  return 0;
489
509
 
490
510
  fsit_opts.flags = backend->iterator_flags;
491
511
 
492
- if ((error = git_buf_printf(&path, "%s/refs", backend->path)) < 0 ||
512
+ if ((error = git_buf_printf(&path, "%s/refs", backend->commonpath)) < 0 ||
493
513
  (error = git_iterator_for_filesystem(&fsit, path.ptr, &fsit_opts)) < 0) {
494
514
  git_buf_free(&path);
495
515
  return error;
@@ -729,10 +749,10 @@ static int loose_lock(git_filebuf *file, refdb_fs_backend *backend, const char *
729
749
  /* Remove a possibly existing empty directory hierarchy
730
750
  * which name would collide with the reference name
731
751
  */
732
- if ((error = git_futils_rmdir_r(name, backend->path, GIT_RMDIR_SKIP_NONEMPTY)) < 0)
752
+ if ((error = git_futils_rmdir_r(name, backend->gitpath, GIT_RMDIR_SKIP_NONEMPTY)) < 0)
733
753
  return error;
734
754
 
735
- if (git_buf_joinpath(&ref_path, backend->path, name) < 0)
755
+ if (git_buf_joinpath(&ref_path, backend->gitpath, name) < 0)
736
756
  return -1;
737
757
 
738
758
  error = git_filebuf_open(file, ref_path.ptr, GIT_FILEBUF_FORCE, GIT_REFS_FILE_MODE);
@@ -1283,7 +1303,7 @@ static int refdb_fs_backend__delete_tail(
1283
1303
  }
1284
1304
 
1285
1305
  /* If a loose reference exists, remove it from the filesystem */
1286
- if (git_buf_joinpath(&loose_path, backend->path, ref_name) < 0)
1306
+ if (git_buf_joinpath(&loose_path, backend->gitpath, ref_name) < 0)
1287
1307
  return -1;
1288
1308
 
1289
1309
 
@@ -1408,28 +1428,30 @@ static void refdb_fs_backend__free(git_refdb_backend *_backend)
1408
1428
  assert(backend);
1409
1429
 
1410
1430
  git_sortedcache_free(backend->refcache);
1411
- git__free(backend->path);
1431
+ git__free(backend->gitpath);
1432
+ git__free(backend->commonpath);
1412
1433
  git__free(backend);
1413
1434
  }
1414
1435
 
1415
- static int setup_namespace(git_buf *path, git_repository *repo)
1436
+ static char *setup_namespace(git_repository *repo, const char *in)
1416
1437
  {
1417
- char *parts, *start, *end;
1438
+ git_buf path = GIT_BUF_INIT;
1439
+ char *parts, *start, *end, *out = NULL;
1418
1440
 
1419
- /* Not all repositories have a path */
1420
- if (repo->path_repository == NULL)
1421
- return 0;
1441
+ if (!in)
1442
+ goto done;
1422
1443
 
1423
- /* Load the path to the repo first */
1424
- git_buf_puts(path, repo->path_repository);
1444
+ git_buf_puts(&path, in);
1425
1445
 
1426
1446
  /* if the repo is not namespaced, nothing else to do */
1427
- if (repo->namespace == NULL)
1428
- return 0;
1447
+ if (repo->namespace == NULL) {
1448
+ out = git_buf_detach(&path);
1449
+ goto done;
1450
+ }
1429
1451
 
1430
1452
  parts = end = git__strdup(repo->namespace);
1431
1453
  if (parts == NULL)
1432
- return -1;
1454
+ goto done;
1433
1455
 
1434
1456
  /*
1435
1457
  * From `man gitnamespaces`:
@@ -1437,21 +1459,24 @@ static int setup_namespace(git_buf *path, git_repository *repo)
1437
1459
  * of namespaces; for example, GIT_NAMESPACE=foo/bar will store
1438
1460
  * refs under refs/namespaces/foo/refs/namespaces/bar/
1439
1461
  */
1440
- while ((start = git__strsep(&end, "/")) != NULL) {
1441
- git_buf_printf(path, "refs/namespaces/%s/", start);
1442
- }
1462
+ while ((start = git__strsep(&end, "/")) != NULL)
1463
+ git_buf_printf(&path, "refs/namespaces/%s/", start);
1443
1464
 
1444
- git_buf_printf(path, "refs/namespaces/%s/refs", end);
1465
+ git_buf_printf(&path, "refs/namespaces/%s/refs", end);
1445
1466
  git__free(parts);
1446
1467
 
1447
1468
  /* Make sure that the folder with the namespace exists */
1448
- if (git_futils_mkdir_relative(git_buf_cstr(path), repo->path_repository,
1449
- 0777, GIT_MKDIR_PATH, NULL) < 0)
1450
- return -1;
1469
+ if (git_futils_mkdir_relative(git_buf_cstr(&path), in, 0777,
1470
+ GIT_MKDIR_PATH, NULL) < 0)
1471
+ goto done;
1451
1472
 
1452
- /* Return root of the namespaced path, i.e. without the trailing '/refs' */
1453
- git_buf_rtruncate_at_char(path, '/');
1454
- return 0;
1473
+ /* Return root of the namespaced gitpath, i.e. without the trailing '/refs' */
1474
+ git_buf_rtruncate_at_char(&path, '/');
1475
+ out = git_buf_detach(&path);
1476
+
1477
+ done:
1478
+ git_buf_free(&path);
1479
+ return out;
1455
1480
  }
1456
1481
 
1457
1482
  static int reflog_alloc(git_reflog **reflog, const char *name)
@@ -1562,7 +1587,7 @@ static int create_new_reflog_file(const char *filepath)
1562
1587
 
1563
1588
  GIT_INLINE(int) retrieve_reflog_path(git_buf *path, git_repository *repo, const char *name)
1564
1589
  {
1565
- return git_buf_join3(path, '/', repo->path_repository, GIT_REFLOG_DIR, name);
1590
+ return git_buf_join3(path, '/', repo->commondir, GIT_REFLOG_DIR, name);
1566
1591
  }
1567
1592
 
1568
1593
  static int refdb_reflog_fs__ensure_log(git_refdb_backend *_backend, const char *name)
@@ -1857,7 +1882,7 @@ static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_
1857
1882
  &normalized, new_name, GIT_REF_FORMAT_ALLOW_ONELEVEL)) < 0)
1858
1883
  return error;
1859
1884
 
1860
- if (git_buf_joinpath(&temp_path, repo->path_repository, GIT_REFLOG_DIR) < 0)
1885
+ if (git_buf_joinpath(&temp_path, repo->gitdir, GIT_REFLOG_DIR) < 0)
1861
1886
  return -1;
1862
1887
 
1863
1888
  if (git_buf_joinpath(&old_path, git_buf_cstr(&temp_path), old_name) < 0)
@@ -1948,7 +1973,7 @@ int git_refdb_backend_fs(
1948
1973
  git_repository *repository)
1949
1974
  {
1950
1975
  int t = 0;
1951
- git_buf path = GIT_BUF_INIT;
1976
+ git_buf gitpath = GIT_BUF_INIT;
1952
1977
  refdb_fs_backend *backend;
1953
1978
 
1954
1979
  backend = git__calloc(1, sizeof(refdb_fs_backend));
@@ -1956,18 +1981,27 @@ int git_refdb_backend_fs(
1956
1981
 
1957
1982
  backend->repo = repository;
1958
1983
 
1959
- if (setup_namespace(&path, repository) < 0)
1960
- goto fail;
1984
+ if (repository->gitdir) {
1985
+ backend->gitpath = setup_namespace(repository, repository->gitdir);
1961
1986
 
1962
- backend->path = git_buf_detach(&path);
1987
+ if (backend->gitpath == NULL)
1988
+ goto fail;
1989
+ }
1990
+
1991
+ if (repository->commondir) {
1992
+ backend->commonpath = setup_namespace(repository, repository->commondir);
1993
+
1994
+ if (backend->commonpath == NULL)
1995
+ goto fail;
1996
+ }
1963
1997
 
1964
- if (git_buf_joinpath(&path, backend->path, GIT_PACKEDREFS_FILE) < 0 ||
1998
+ if (git_buf_joinpath(&gitpath, backend->commonpath, GIT_PACKEDREFS_FILE) < 0 ||
1965
1999
  git_sortedcache_new(
1966
2000
  &backend->refcache, offsetof(struct packref, name),
1967
- NULL, NULL, packref_cmp, git_buf_cstr(&path)) < 0)
2001
+ NULL, NULL, packref_cmp, git_buf_cstr(&gitpath)) < 0)
1968
2002
  goto fail;
1969
2003
 
1970
- git_buf_free(&path);
2004
+ git_buf_free(&gitpath);
1971
2005
 
1972
2006
  if (!git_repository__cvar(&t, backend->repo, GIT_CVAR_IGNORECASE) && t) {
1973
2007
  backend->iterator_flags |= GIT_ITERATOR_IGNORE_CASE;
@@ -1999,8 +2033,9 @@ int git_refdb_backend_fs(
1999
2033
  return 0;
2000
2034
 
2001
2035
  fail:
2002
- git_buf_free(&path);
2003
- git__free(backend->path);
2036
+ git_buf_free(&gitpath);
2037
+ git__free(backend->gitpath);
2038
+ git__free(backend->commonpath);
2004
2039
  git__free(backend);
2005
2040
  return -1;
2006
2041
  }