rugged 0.26.0b3 → 0.26.0b4

Sign up to get free protection for your applications and to get access to all the features.
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
  }