]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
is_ntfs_dotgit(): only verify the leading segment
[thirdparty/git.git] / refs.c
CommitLineData
7bd9bcf3
MH
1/*
2 * The backend-independent part of the reference module.
3 */
4
95fc7512 5#include "cache.h"
b2141fc1 6#include "config.h"
7d4558c4 7#include "hashmap.h"
697cc8ef 8#include "lockfile.h"
b05855b5 9#include "iterator.h"
85023577 10#include "refs.h"
4cb77009 11#include "refs/refs-internal.h"
cf0adba7
JH
12#include "object.h"
13#include "tag.h"
5d0bc90e 14#include "submodule.h"
17eff96b 15#include "worktree.h"
3581d793 16
3dce444f
RS
17/*
18 * List of all available backends
19 */
20static struct ref_storage_be *refs_backends = &refs_be_files;
21
22static struct ref_storage_be *find_ref_storage_backend(const char *name)
23{
24 struct ref_storage_be *be;
25 for (be = refs_backends; be; be = be->next)
26 if (!strcmp(be->name, name))
27 return be;
28 return NULL;
29}
30
31int ref_storage_backend_exists(const char *name)
32{
33 return find_ref_storage_backend(name) != NULL;
34}
35
bc5fd6d3 36/*
dde8a902
DT
37 * How to handle various characters in refnames:
38 * 0: An acceptable character for refs
5e650228
JH
39 * 1: End-of-component
40 * 2: ., look for a preceding . to reject .. in refs
41 * 3: {, look for a preceding @ to reject @{ in refs
53a8555e 42 * 4: A bad character: ASCII control characters, and
cd377f45
JK
43 * ":", "?", "[", "\", "^", "~", SP, or TAB
44 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
dde8a902
DT
45 */
46static unsigned char refname_disposition[256] = {
5e650228
JH
47 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
48 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
cd377f45 49 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
5e650228 50 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
dde8a902 51 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5e650228
JH
52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
dde8a902
DT
55};
56
57/*
58 * Try to read one refname component from the front of refname.
59 * Return the length of the component found, or -1 if the component is
60 * not legal. It is legal if it is something reasonable to have under
61 * ".git/refs/"; We do not like it if:
bc5fd6d3
MH
62 *
63 * - any path component of it begins with ".", or
64 * - it has double dots "..", or
53a8555e 65 * - it has ASCII control characters, or
cd377f45
JK
66 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
67 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
53a8555e
JK
68 * - it ends with a "/", or
69 * - it ends with ".lock", or
70 * - it contains a "@{" portion
bc5fd6d3 71 */
cd377f45 72static int check_refname_component(const char *refname, int *flags)
bc5fd6d3
MH
73{
74 const char *cp;
75 char last = '\0';
76
77 for (cp = refname; ; cp++) {
dde8a902
DT
78 int ch = *cp & 255;
79 unsigned char disp = refname_disposition[ch];
80 switch (disp) {
5e650228 81 case 1:
dde8a902 82 goto out;
5e650228 83 case 2:
dde8a902
DT
84 if (last == '.')
85 return -1; /* Refname contains "..". */
86 break;
5e650228 87 case 3:
dde8a902
DT
88 if (last == '@')
89 return -1; /* Refname contains "@{". */
bc5fd6d3 90 break;
5e650228 91 case 4:
dde8a902 92 return -1;
cd377f45
JK
93 case 5:
94 if (!(*flags & REFNAME_REFSPEC_PATTERN))
95 return -1; /* refspec can't be a pattern */
96
97 /*
98 * Unset the pattern flag so that we only accept
99 * a single asterisk for one side of refspec.
100 */
101 *flags &= ~ REFNAME_REFSPEC_PATTERN;
102 break;
dde8a902 103 }
bc5fd6d3
MH
104 last = ch;
105 }
dde8a902 106out:
bc5fd6d3 107 if (cp == refname)
dac529e4 108 return 0; /* Component has zero length. */
f3cc52d8
JN
109 if (refname[0] == '.')
110 return -1; /* Component starts with '.'. */
7108ad23
MH
111 if (cp - refname >= LOCK_SUFFIX_LEN &&
112 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
bc5fd6d3
MH
113 return -1; /* Refname ends with ".lock". */
114 return cp - refname;
115}
116
5e650228 117int check_refname_format(const char *refname, int flags)
bc5fd6d3
MH
118{
119 int component_len, component_count = 0;
120
9ba89f48
FC
121 if (!strcmp(refname, "@"))
122 /* Refname is a single character '@'. */
123 return -1;
124
bc5fd6d3
MH
125 while (1) {
126 /* We are at the start of a path component. */
cd377f45
JK
127 component_len = check_refname_component(refname, &flags);
128 if (component_len <= 0)
129 return -1;
130
bc5fd6d3
MH
131 component_count++;
132 if (refname[component_len] == '\0')
133 break;
134 /* Skip to next component. */
135 refname += component_len + 1;
136 }
137
138 if (refname[component_len - 1] == '.')
139 return -1; /* Refname ends with '.'. */
140 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
141 return -1; /* Refname has only one component. */
142 return 0;
143}
144
4cb77009 145int refname_is_safe(const char *refname)
d0f810f0 146{
39950fef
MH
147 const char *rest;
148
149 if (skip_prefix(refname, "refs/", &rest)) {
d0f810f0
RS
150 char *buf;
151 int result;
e40f3557
MH
152 size_t restlen = strlen(rest);
153
154 /* rest must not be empty, or start or end with "/" */
155 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
156 return 0;
d0f810f0 157
d0f810f0
RS
158 /*
159 * Does the refname try to escape refs/?
160 * For example: refs/foo/../bar is safe but refs/foo/../../bar
161 * is not.
162 */
e40f3557
MH
163 buf = xmallocz(restlen);
164 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
d0f810f0
RS
165 free(buf);
166 return result;
167 }
35db25c6
MH
168
169 do {
d0f810f0
RS
170 if (!isupper(*refname) && *refname != '_')
171 return 0;
172 refname++;
35db25c6 173 } while (*refname);
d0f810f0
RS
174 return 1;
175}
176
7d2df051
NTND
177char *refs_resolve_refdup(struct ref_store *refs,
178 const char *refname, int resolve_flags,
179 unsigned char *sha1, int *flags)
180{
181 const char *result;
182
183 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
184 sha1, flags);
185 return xstrdup_or_null(result);
186}
187
7bd9bcf3
MH
188char *resolve_refdup(const char *refname, int resolve_flags,
189 unsigned char *sha1, int *flags)
e1e22e37 190{
7d2df051
NTND
191 return refs_resolve_refdup(get_main_ref_store(),
192 refname, resolve_flags,
193 sha1, flags);
cddc4258
MH
194}
195
7bd9bcf3
MH
196/* The argument to filter_refs */
197struct ref_filter {
198 const char *pattern;
199 each_ref_fn *fn;
200 void *cb_data;
201};
432ad41e 202
7d2df051
NTND
203int refs_read_ref_full(struct ref_store *refs, const char *refname,
204 int resolve_flags, unsigned char *sha1, int *flags)
732134ed 205{
7d2df051 206 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags))
7bd9bcf3
MH
207 return 0;
208 return -1;
732134ed
MH
209}
210
7d2df051
NTND
211int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
212{
213 return refs_read_ref_full(get_main_ref_store(), refname,
214 resolve_flags, sha1, flags);
215}
216
7bd9bcf3 217int read_ref(const char *refname, unsigned char *sha1)
cddc4258 218{
7bd9bcf3 219 return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
c774aab9
JP
220}
221
7bd9bcf3 222int ref_exists(const char *refname)
bc5fd6d3 223{
7bd9bcf3
MH
224 unsigned char sha1[20];
225 return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
bc5fd6d3
MH
226}
227
7bd9bcf3
MH
228static int filter_refs(const char *refname, const struct object_id *oid,
229 int flags, void *data)
432ad41e 230{
7bd9bcf3
MH
231 struct ref_filter *filter = (struct ref_filter *)data;
232
55d34269 233 if (wildmatch(filter->pattern, refname, 0))
7bd9bcf3
MH
234 return 0;
235 return filter->fn(refname, oid, flags, filter->cb_data);
432ad41e
MH
236}
237
7bd9bcf3 238enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
c774aab9 239{
7bd9bcf3 240 struct object *o = lookup_unknown_object(name);
c774aab9 241
7bd9bcf3
MH
242 if (o->type == OBJ_NONE) {
243 int type = sha1_object_info(name, NULL);
244 if (type < 0 || !object_as_type(o, type, 0))
245 return PEEL_INVALID;
246 }
bc5fd6d3 247
7bd9bcf3
MH
248 if (o->type != OBJ_TAG)
249 return PEEL_NON_TAG;
e1980c9d 250
7bd9bcf3
MH
251 o = deref_tag_noverify(o);
252 if (!o)
253 return PEEL_INVALID;
254
844a9ce4 255 hashcpy(sha1, o->oid.hash);
7bd9bcf3 256 return PEEL_PEELED;
e1980c9d
JH
257}
258
7bd9bcf3
MH
259struct warn_if_dangling_data {
260 FILE *fp;
261 const char *refname;
262 const struct string_list *refnames;
263 const char *msg_fmt;
264};
bc5fd6d3 265
7bd9bcf3
MH
266static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
267 int flags, void *cb_data)
268{
269 struct warn_if_dangling_data *d = cb_data;
270 const char *resolves_to;
271 struct object_id junk;
bc5fd6d3 272
7bd9bcf3
MH
273 if (!(flags & REF_ISSYMREF))
274 return 0;
bc5fd6d3 275
7bd9bcf3
MH
276 resolves_to = resolve_ref_unsafe(refname, 0, junk.hash, NULL);
277 if (!resolves_to
278 || (d->refname
279 ? strcmp(resolves_to, d->refname)
280 : !string_list_has_string(d->refnames, resolves_to))) {
281 return 0;
282 }
bc5fd6d3 283
7bd9bcf3
MH
284 fprintf(d->fp, d->msg_fmt, refname);
285 fputc('\n', d->fp);
286 return 0;
bc5fd6d3
MH
287}
288
7bd9bcf3 289void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
f348ac92 290{
7bd9bcf3
MH
291 struct warn_if_dangling_data data;
292
293 data.fp = fp;
294 data.refname = refname;
295 data.refnames = NULL;
296 data.msg_fmt = msg_fmt;
297 for_each_rawref(warn_if_dangling_symref, &data);
f348ac92
MH
298}
299
7bd9bcf3 300void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
432ad41e 301{
7bd9bcf3 302 struct warn_if_dangling_data data;
432ad41e 303
7bd9bcf3
MH
304 data.fp = fp;
305 data.refname = NULL;
306 data.refnames = refnames;
307 data.msg_fmt = msg_fmt;
308 for_each_rawref(warn_if_dangling_symref, &data);
432ad41e
MH
309}
310
7d2df051
NTND
311int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
312{
313 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
314}
315
7bd9bcf3 316int for_each_tag_ref(each_ref_fn fn, void *cb_data)
432ad41e 317{
7d2df051 318 return refs_for_each_tag_ref(get_main_ref_store(), fn, cb_data);
432ad41e
MH
319}
320
7bd9bcf3 321int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
506a760d 322{
7d2df051
NTND
323 return refs_for_each_tag_ref(get_submodule_ref_store(submodule),
324 fn, cb_data);
325}
326
327int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
328{
329 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
432ad41e
MH
330}
331
7bd9bcf3 332int for_each_branch_ref(each_ref_fn fn, void *cb_data)
432ad41e 333{
7d2df051 334 return refs_for_each_branch_ref(get_main_ref_store(), fn, cb_data);
432ad41e
MH
335}
336
7bd9bcf3 337int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
202a56a9 338{
7d2df051
NTND
339 return refs_for_each_branch_ref(get_submodule_ref_store(submodule),
340 fn, cb_data);
341}
342
343int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
344{
345 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
202a56a9 346}
432ad41e 347
7bd9bcf3 348int for_each_remote_ref(each_ref_fn fn, void *cb_data)
e9c4c111 349{
7d2df051 350 return refs_for_each_remote_ref(get_main_ref_store(), fn, cb_data);
202a56a9
MH
351}
352
7bd9bcf3 353int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
e9c4c111 354{
7d2df051
NTND
355 return refs_for_each_remote_ref(get_submodule_ref_store(submodule),
356 fn, cb_data);
662428f4 357}
c774aab9 358
7bd9bcf3
MH
359int head_ref_namespaced(each_ref_fn fn, void *cb_data)
360{
361 struct strbuf buf = STRBUF_INIT;
362 int ret = 0;
363 struct object_id oid;
364 int flag;
c774aab9 365
7bd9bcf3
MH
366 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
367 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, oid.hash, &flag))
368 ret = fn(buf.buf, &oid, flag, cb_data);
369 strbuf_release(&buf);
c774aab9 370
7bd9bcf3 371 return ret;
e9c4c111 372}
c774aab9 373
7bd9bcf3
MH
374int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
375 const char *prefix, void *cb_data)
662428f4 376{
7bd9bcf3
MH
377 struct strbuf real_pattern = STRBUF_INIT;
378 struct ref_filter filter;
379 int ret;
d08bae7e 380
59556548 381 if (!prefix && !starts_with(pattern, "refs/"))
d08bae7e 382 strbuf_addstr(&real_pattern, "refs/");
b09fe971
IL
383 else if (prefix)
384 strbuf_addstr(&real_pattern, prefix);
d08bae7e
IL
385 strbuf_addstr(&real_pattern, pattern);
386
894a9d33 387 if (!has_glob_specials(pattern)) {
9517e6b8 388 /* Append implied '/' '*' if not present. */
00b6c178 389 strbuf_complete(&real_pattern, '/');
d08bae7e
IL
390 /* No need to check for '*', there is none. */
391 strbuf_addch(&real_pattern, '*');
392 }
393
394 filter.pattern = real_pattern.buf;
395 filter.fn = fn;
396 filter.cb_data = cb_data;
397 ret = for_each_ref(filter_refs, &filter);
398
399 strbuf_release(&real_pattern);
400 return ret;
401}
402
b09fe971
IL
403int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
404{
405 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
406}
407
4577e483 408const char *prettify_refname(const char *name)
a9c37a72 409{
3e5b36c6
SG
410 if (skip_prefix(name, "refs/heads/", &name) ||
411 skip_prefix(name, "refs/tags/", &name) ||
412 skip_prefix(name, "refs/remotes/", &name))
413 ; /* nothing */
414 return name;
a9c37a72
DB
415}
416
54457fe5 417static const char *ref_rev_parse_rules[] = {
79803322
SP
418 "%.*s",
419 "refs/%.*s",
420 "refs/tags/%.*s",
421 "refs/heads/%.*s",
422 "refs/remotes/%.*s",
423 "refs/remotes/%.*s/HEAD",
424 NULL
425};
426
54457fe5 427int refname_match(const char *abbrev_name, const char *full_name)
79803322
SP
428{
429 const char **p;
430 const int abbrev_name_len = strlen(abbrev_name);
431
54457fe5 432 for (p = ref_rev_parse_rules; *p; p++) {
79803322
SP
433 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
434 return 1;
435 }
436 }
437
438 return 0;
439}
440
ff74f7f1
JH
441/*
442 * *string and *len will only be substituted, and *string returned (for
443 * later free()ing) if the string passed in is a magic short-hand form
444 * to name a branch.
445 */
446static char *substitute_branch_name(const char **string, int *len)
447{
448 struct strbuf buf = STRBUF_INIT;
0e9f62da 449 int ret = interpret_branch_name(*string, *len, &buf, 0);
ff74f7f1
JH
450
451 if (ret == *len) {
452 size_t size;
453 *string = strbuf_detach(&buf, &size);
454 *len = size;
455 return (char *)*string;
456 }
457
458 return NULL;
459}
460
461int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
462{
463 char *last_branch = substitute_branch_name(&str, &len);
41da7111
NTND
464 int refs_found = expand_ref(str, len, sha1, ref);
465 free(last_branch);
466 return refs_found;
467}
468
469int expand_ref(const char *str, int len, unsigned char *sha1, char **ref)
470{
ff74f7f1
JH
471 const char **p, *r;
472 int refs_found = 0;
6cd4a898 473 struct strbuf fullref = STRBUF_INIT;
ff74f7f1
JH
474
475 *ref = NULL;
476 for (p = ref_rev_parse_rules; *p; p++) {
ff74f7f1
JH
477 unsigned char sha1_from_ref[20];
478 unsigned char *this_result;
479 int flag;
480
481 this_result = refs_found ? sha1_from_ref : sha1;
6cd4a898
JK
482 strbuf_reset(&fullref);
483 strbuf_addf(&fullref, *p, len, str);
484 r = resolve_ref_unsafe(fullref.buf, RESOLVE_REF_READING,
7695d118 485 this_result, &flag);
ff74f7f1
JH
486 if (r) {
487 if (!refs_found++)
488 *ref = xstrdup(r);
489 if (!warn_ambiguous_refs)
490 break;
6cd4a898
JK
491 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
492 warning("ignoring dangling symref %s.", fullref.buf);
493 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
494 warning("ignoring broken ref %s.", fullref.buf);
55956350 495 }
ff74f7f1 496 }
6cd4a898 497 strbuf_release(&fullref);
ff74f7f1
JH
498 return refs_found;
499}
500
501int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
502{
503 char *last_branch = substitute_branch_name(&str, &len);
504 const char **p;
505 int logs_found = 0;
6cd4a898 506 struct strbuf path = STRBUF_INIT;
ff74f7f1
JH
507
508 *log = NULL;
509 for (p = ref_rev_parse_rules; *p; p++) {
ff74f7f1 510 unsigned char hash[20];
ff74f7f1
JH
511 const char *ref, *it;
512
6cd4a898
JK
513 strbuf_reset(&path);
514 strbuf_addf(&path, *p, len, str);
515 ref = resolve_ref_unsafe(path.buf, RESOLVE_REF_READING,
7695d118 516 hash, NULL);
ff74f7f1
JH
517 if (!ref)
518 continue;
6cd4a898
JK
519 if (reflog_exists(path.buf))
520 it = path.buf;
521 else if (strcmp(ref, path.buf) && reflog_exists(ref))
ff74f7f1
JH
522 it = ref;
523 else
524 continue;
525 if (!logs_found++) {
526 *log = xstrdup(it);
527 hashcpy(sha1, hash);
528 }
7bd9bcf3
MH
529 if (!warn_ambiguous_refs)
530 break;
c0277d15 531 }
6cd4a898 532 strbuf_release(&path);
7bd9bcf3
MH
533 free(last_branch);
534 return logs_found;
2ddb5d17
BK
535}
536
266b1827
DT
537static int is_per_worktree_ref(const char *refname)
538{
ce414b33
DT
539 return !strcmp(refname, "HEAD") ||
540 starts_with(refname, "refs/bisect/");
266b1827
DT
541}
542
543static int is_pseudoref_syntax(const char *refname)
544{
545 const char *c;
546
547 for (c = refname; *c; c++) {
548 if (!isupper(*c) && *c != '-' && *c != '_')
549 return 0;
550 }
551
552 return 1;
553}
554
555enum ref_type ref_type(const char *refname)
556{
557 if (is_per_worktree_ref(refname))
558 return REF_TYPE_PER_WORKTREE;
559 if (is_pseudoref_syntax(refname))
560 return REF_TYPE_PSEUDOREF;
561 return REF_TYPE_NORMAL;
562}
563
74ec19d4
DT
564static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
565 const unsigned char *old_sha1, struct strbuf *err)
566{
567 const char *filename;
568 int fd;
569 static struct lock_file lock;
570 struct strbuf buf = STRBUF_INIT;
571 int ret = -1;
572
573 strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
574
575 filename = git_path("%s", pseudoref);
576 fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
577 if (fd < 0) {
0568c8e9 578 strbuf_addf(err, "could not open '%s' for writing: %s",
74ec19d4
DT
579 filename, strerror(errno));
580 return -1;
581 }
582
583 if (old_sha1) {
584 unsigned char actual_old_sha1[20];
2c3aed13
DT
585
586 if (read_ref(pseudoref, actual_old_sha1))
587 die("could not read ref '%s'", pseudoref);
74ec19d4 588 if (hashcmp(actual_old_sha1, old_sha1)) {
0568c8e9 589 strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
74ec19d4
DT
590 rollback_lock_file(&lock);
591 goto done;
592 }
593 }
594
06f46f23 595 if (write_in_full(fd, buf.buf, buf.len) < 0) {
0568c8e9 596 strbuf_addf(err, "could not write to '%s'", filename);
74ec19d4
DT
597 rollback_lock_file(&lock);
598 goto done;
599 }
600
601 commit_lock_file(&lock);
602 ret = 0;
603done:
604 strbuf_release(&buf);
605 return ret;
606}
607
608static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1)
609{
610 static struct lock_file lock;
611 const char *filename;
612
613 filename = git_path("%s", pseudoref);
614
615 if (old_sha1 && !is_null_sha1(old_sha1)) {
616 int fd;
617 unsigned char actual_old_sha1[20];
618
619 fd = hold_lock_file_for_update(&lock, filename,
620 LOCK_DIE_ON_ERROR);
621 if (fd < 0)
622 die_errno(_("Could not open '%s' for writing"), filename);
2c3aed13
DT
623 if (read_ref(pseudoref, actual_old_sha1))
624 die("could not read ref '%s'", pseudoref);
74ec19d4
DT
625 if (hashcmp(actual_old_sha1, old_sha1)) {
626 warning("Unexpected sha1 when deleting %s", pseudoref);
627 rollback_lock_file(&lock);
628 return -1;
a4c653df 629 }
74ec19d4
DT
630
631 unlink(filename);
632 rollback_lock_file(&lock);
633 } else {
634 unlink(filename);
4bd18c43 635 }
a4c653df 636
4bd18c43 637 return 0;
95fc7512 638}
d556fae2 639
c0fe4e8b
NTND
640int refs_delete_ref(struct ref_store *refs, const char *msg,
641 const char *refname,
642 const unsigned char *old_sha1,
643 unsigned int flags)
41b625b0 644{
7521cc46 645 struct ref_transaction *transaction;
a4c653df 646 struct strbuf err = STRBUF_INIT;
8b5157e4 647
c0fe4e8b
NTND
648 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
649 assert(refs == get_main_ref_store());
080cc646 650 return delete_pseudoref(refname, old_sha1);
c0fe4e8b 651 }
d48744d1 652
c0fe4e8b 653 transaction = ref_store_transaction_begin(refs, &err);
7521cc46 654 if (!transaction ||
fc67a082 655 ref_transaction_delete(transaction, refname, old_sha1,
755b49ae 656 flags, msg, &err) ||
db7516ab 657 ref_transaction_commit(transaction, &err)) {
7521cc46
RS
658 error("%s", err.buf);
659 ref_transaction_free(transaction);
660 strbuf_release(&err);
c0277d15 661 return 1;
41b625b0 662 }
7bd9bcf3
MH
663 ref_transaction_free(transaction);
664 strbuf_release(&err);
b531394d
BC
665 return 0;
666}
41b625b0 667
c0fe4e8b
NTND
668int delete_ref(const char *msg, const char *refname,
669 const unsigned char *old_sha1, unsigned int flags)
670{
671 return refs_delete_ref(get_main_ref_store(), msg, refname,
672 old_sha1, flags);
673}
674
4cb77009 675int copy_reflog_msg(char *buf, const char *msg)
0ec29a47
JH
676{
677 char *cp = buf;
678 char c;
679 int wasspace = 1;
8b5157e4 680
0ec29a47
JH
681 *cp++ = '\t';
682 while ((c = *msg++)) {
683 if (wasspace && isspace(c))
684 continue;
685 wasspace = isspace(c);
686 if (wasspace)
687 c = ' ';
688 *cp++ = c;
a4c653df 689 }
0ec29a47
JH
690 while (buf < cp && isspace(cp[-1]))
691 cp--;
692 *cp++ = '\n';
693 return cp - buf;
694}
8b5157e4 695
4cb77009 696int should_autocreate_reflog(const char *refname)
4e2bef57 697{
341fb286
CW
698 switch (log_all_ref_updates) {
699 case LOG_REFS_ALWAYS:
700 return 1;
701 case LOG_REFS_NORMAL:
702 return starts_with(refname, "refs/heads/") ||
703 starts_with(refname, "refs/remotes/") ||
704 starts_with(refname, "refs/notes/") ||
705 !strcmp(refname, "HEAD");
706 default:
4e2bef57 707 return 0;
341fb286 708 }
4e2bef57
DT
709}
710
e7e0f26e 711int is_branch(const char *refname)
c3b0dec5 712{
59556548 713 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
714}
715
4207ed28
RS
716struct read_ref_at_cb {
717 const char *refname;
dddbad72 718 timestamp_t at_time;
4207ed28
RS
719 int cnt;
720 int reccnt;
721 unsigned char *sha1;
722 int found_it;
723
724 unsigned char osha1[20];
725 unsigned char nsha1[20];
726 int tz;
dddbad72 727 timestamp_t date;
4207ed28 728 char **msg;
dddbad72 729 timestamp_t *cutoff_time;
4207ed28
RS
730 int *cutoff_tz;
731 int *cutoff_cnt;
732};
733
9461d272 734static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
dddbad72 735 const char *email, timestamp_t timestamp, int tz,
4207ed28
RS
736 const char *message, void *cb_data)
737{
738 struct read_ref_at_cb *cb = cb_data;
739
740 cb->reccnt++;
741 cb->tz = tz;
742 cb->date = timestamp;
743
744 if (timestamp <= cb->at_time || cb->cnt == 0) {
745 if (cb->msg)
746 *cb->msg = xstrdup(message);
747 if (cb->cutoff_time)
748 *cb->cutoff_time = timestamp;
749 if (cb->cutoff_tz)
750 *cb->cutoff_tz = tz;
751 if (cb->cutoff_cnt)
752 *cb->cutoff_cnt = cb->reccnt - 1;
753 /*
754 * we have not yet updated cb->[n|o]sha1 so they still
755 * hold the values for the previous record.
756 */
757 if (!is_null_sha1(cb->osha1)) {
9461d272 758 hashcpy(cb->sha1, noid->hash);
759 if (hashcmp(cb->osha1, noid->hash))
4207ed28 760 warning("Log for ref %s has gap after %s.",
a5481a6c 761 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
4207ed28
RS
762 }
763 else if (cb->date == cb->at_time)
9461d272 764 hashcpy(cb->sha1, noid->hash);
765 else if (hashcmp(noid->hash, cb->sha1))
4207ed28
RS
766 warning("Log for ref %s unexpectedly ended on %s.",
767 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 768 DATE_MODE(RFC2822)));
9461d272 769 hashcpy(cb->osha1, ooid->hash);
770 hashcpy(cb->nsha1, noid->hash);
4207ed28
RS
771 cb->found_it = 1;
772 return 1;
773 }
9461d272 774 hashcpy(cb->osha1, ooid->hash);
775 hashcpy(cb->nsha1, noid->hash);
4207ed28
RS
776 if (cb->cnt > 0)
777 cb->cnt--;
778 return 0;
779}
780
9461d272 781static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
dddbad72 782 const char *email, timestamp_t timestamp,
4207ed28
RS
783 int tz, const char *message, void *cb_data)
784{
785 struct read_ref_at_cb *cb = cb_data;
786
787 if (cb->msg)
788 *cb->msg = xstrdup(message);
789 if (cb->cutoff_time)
790 *cb->cutoff_time = timestamp;
791 if (cb->cutoff_tz)
792 *cb->cutoff_tz = tz;
793 if (cb->cutoff_cnt)
794 *cb->cutoff_cnt = cb->reccnt;
9461d272 795 hashcpy(cb->sha1, ooid->hash);
4207ed28 796 if (is_null_sha1(cb->sha1))
9461d272 797 hashcpy(cb->sha1, noid->hash);
4207ed28
RS
798 /* We just want the first entry */
799 return 1;
16d7cc90
JH
800}
801
dddbad72 802int read_ref_at(const char *refname, unsigned int flags, timestamp_t at_time, int cnt,
dfefa935 803 unsigned char *sha1, char **msg,
dddbad72 804 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 805{
4207ed28 806 struct read_ref_at_cb cb;
d556fae2 807
4207ed28
RS
808 memset(&cb, 0, sizeof(cb));
809 cb.refname = refname;
810 cb.at_time = at_time;
811 cb.cnt = cnt;
812 cb.msg = msg;
813 cb.cutoff_time = cutoff_time;
814 cb.cutoff_tz = cutoff_tz;
815 cb.cutoff_cnt = cutoff_cnt;
816 cb.sha1 = sha1;
817
818 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
819
c41a87dd
DA
820 if (!cb.reccnt) {
821 if (flags & GET_SHA1_QUIETLY)
822 exit(128);
823 else
824 die("Log for %s is empty.", refname);
825 }
4207ed28
RS
826 if (cb.found_it)
827 return 0;
828
829 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
d556fae2 830
16d7cc90 831 return 1;
d556fae2 832}
2ff81662 833
c0fe4e8b
NTND
834struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
835 struct strbuf *err)
caa4046c 836{
c0fe4e8b 837 struct ref_transaction *tr;
5a603b04
JN
838 assert(err);
839
c0fe4e8b
NTND
840 tr = xcalloc(1, sizeof(struct ref_transaction));
841 tr->ref_store = refs;
842 return tr;
843}
844
845struct ref_transaction *ref_transaction_begin(struct strbuf *err)
846{
847 return ref_store_transaction_begin(get_main_ref_store(), err);
caa4046c
MH
848}
849
026bd1d3 850void ref_transaction_free(struct ref_transaction *transaction)
caa4046c 851{
43a2dfde 852 size_t i;
caa4046c 853
1b07255c
RS
854 if (!transaction)
855 return;
856
30173b88
MH
857 switch (transaction->state) {
858 case REF_TRANSACTION_OPEN:
859 case REF_TRANSACTION_CLOSED:
860 /* OK */
861 break;
862 case REF_TRANSACTION_PREPARED:
863 die("BUG: free called on a prepared reference transaction");
864 break;
865 default:
866 die("BUG: unexpected reference transaction state");
867 break;
868 }
869
db7516ab
RS
870 for (i = 0; i < transaction->nr; i++) {
871 free(transaction->updates[i]->msg);
88615910 872 free(transaction->updates[i]);
db7516ab 873 }
caa4046c
MH
874 free(transaction->updates);
875 free(transaction);
876}
877
71564516
MH
878struct ref_update *ref_transaction_add_update(
879 struct ref_transaction *transaction,
880 const char *refname, unsigned int flags,
881 const unsigned char *new_sha1,
882 const unsigned char *old_sha1,
883 const char *msg)
caa4046c 884{
96ffc06f 885 struct ref_update *update;
71564516
MH
886
887 if (transaction->state != REF_TRANSACTION_OPEN)
888 die("BUG: update called for transaction that is not open");
889
890 if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
891 die("BUG: REF_ISPRUNING set without REF_NODEREF");
892
96ffc06f 893 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
894 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
895 transaction->updates[transaction->nr++] = update;
71564516
MH
896
897 update->flags = flags;
898
899 if (flags & REF_HAVE_NEW)
98491298 900 hashcpy(update->new_oid.hash, new_sha1);
71564516 901 if (flags & REF_HAVE_OLD)
98491298 902 hashcpy(update->old_oid.hash, old_sha1);
13092a91 903 update->msg = xstrdup_or_null(msg);
caa4046c
MH
904 return update;
905}
906
8e34800e
RS
907int ref_transaction_update(struct ref_transaction *transaction,
908 const char *refname,
909 const unsigned char *new_sha1,
910 const unsigned char *old_sha1,
1d147bdf 911 unsigned int flags, const char *msg,
8e34800e 912 struct strbuf *err)
caa4046c 913{
5a603b04
JN
914 assert(err);
915
8a679de6
MH
916 if ((new_sha1 && !is_null_sha1(new_sha1)) ?
917 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
918 !refname_is_safe(refname)) {
0568c8e9 919 strbuf_addf(err, "refusing to update ref with bad name '%s'",
d0f810f0
RS
920 refname);
921 return -1;
922 }
923
c788c54c
TG
924 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
925
71564516
MH
926 flags |= (new_sha1 ? REF_HAVE_NEW : 0) | (old_sha1 ? REF_HAVE_OLD : 0);
927
928 ref_transaction_add_update(transaction, refname, flags,
929 new_sha1, old_sha1, msg);
8e34800e 930 return 0;
caa4046c
MH
931}
932
b416af5b
RS
933int ref_transaction_create(struct ref_transaction *transaction,
934 const char *refname,
935 const unsigned char *new_sha1,
fec14ec3 936 unsigned int flags, const char *msg,
b416af5b 937 struct strbuf *err)
caa4046c 938{
f04c5b55
MH
939 if (!new_sha1 || is_null_sha1(new_sha1))
940 die("BUG: create called without valid new_sha1");
bc9f2925 941 return ref_transaction_update(transaction, refname, new_sha1,
1d147bdf 942 null_sha1, flags, msg, err);
caa4046c
MH
943}
944
8c8bdc0d
RS
945int ref_transaction_delete(struct ref_transaction *transaction,
946 const char *refname,
947 const unsigned char *old_sha1,
fb5a6bb6 948 unsigned int flags, const char *msg,
8c8bdc0d 949 struct strbuf *err)
caa4046c 950{
60294596
MH
951 if (old_sha1 && is_null_sha1(old_sha1))
952 die("BUG: delete called with old_sha1 set to zeros");
1d147bdf 953 return ref_transaction_update(transaction, refname,
fb5a6bb6 954 null_sha1, old_sha1,
1d147bdf 955 flags, msg, err);
caa4046c
MH
956}
957
16180334
MH
958int ref_transaction_verify(struct ref_transaction *transaction,
959 const char *refname,
960 const unsigned char *old_sha1,
961 unsigned int flags,
962 struct strbuf *err)
963{
964 if (!old_sha1)
965 die("BUG: verify called with old_sha1 set to NULL");
966 return ref_transaction_update(transaction, refname,
967 NULL, old_sha1,
968 flags, NULL, err);
969}
970
8f6dc7e3 971int update_ref_oid(const char *msg, const char *refname,
972 const struct object_id *new_oid, const struct object_id *old_oid,
973 unsigned int flags, enum action_on_err onerr)
974{
975 return update_ref(msg, refname, new_oid ? new_oid->hash : NULL,
976 old_oid ? old_oid->hash : NULL, flags, onerr);
977}
978
c0fe4e8b
NTND
979int refs_update_ref(struct ref_store *refs, const char *msg,
980 const char *refname, const unsigned char *new_sha1,
981 const unsigned char *old_sha1, unsigned int flags,
982 enum action_on_err onerr)
4738a333 983{
74ec19d4 984 struct ref_transaction *t = NULL;
b4d75ac1 985 struct strbuf err = STRBUF_INIT;
74ec19d4 986 int ret = 0;
b4d75ac1 987
74ec19d4 988 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
c0fe4e8b 989 assert(refs == get_main_ref_store());
74ec19d4
DT
990 ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
991 } else {
c0fe4e8b 992 t = ref_store_transaction_begin(refs, &err);
74ec19d4
DT
993 if (!t ||
994 ref_transaction_update(t, refname, new_sha1, old_sha1,
995 flags, msg, &err) ||
996 ref_transaction_commit(t, &err)) {
997 ret = 1;
998 ref_transaction_free(t);
999 }
1000 }
1001 if (ret) {
b4d75ac1
RS
1002 const char *str = "update_ref failed for ref '%s': %s";
1003
b4d75ac1
RS
1004 switch (onerr) {
1005 case UPDATE_REFS_MSG_ON_ERR:
1006 error(str, refname, err.buf);
1007 break;
1008 case UPDATE_REFS_DIE_ON_ERR:
1009 die(str, refname, err.buf);
1010 break;
1011 case UPDATE_REFS_QUIET_ON_ERR:
1012 break;
1013 }
1014 strbuf_release(&err);
4738a333 1015 return 1;
b4d75ac1
RS
1016 }
1017 strbuf_release(&err);
74ec19d4
DT
1018 if (t)
1019 ref_transaction_free(t);
b4d75ac1 1020 return 0;
4738a333
BK
1021}
1022
c0fe4e8b
NTND
1023int update_ref(const char *msg, const char *refname,
1024 const unsigned char *new_sha1,
1025 const unsigned char *old_sha1,
1026 unsigned int flags, enum action_on_err onerr)
1027{
1028 return refs_update_ref(get_main_ref_store(), msg, refname, new_sha1,
1029 old_sha1, flags, onerr);
1030}
1031
dfefa935 1032char *shorten_unambiguous_ref(const char *refname, int strict)
7c2b3029
JK
1033{
1034 int i;
1035 static char **scanf_fmts;
1036 static int nr_rules;
1037 char *short_name;
6cd4a898 1038 struct strbuf resolved_buf = STRBUF_INIT;
7c2b3029 1039
7c2b3029 1040 if (!nr_rules) {
4346663a
MH
1041 /*
1042 * Pre-generate scanf formats from ref_rev_parse_rules[].
1043 * Generate a format suitable for scanf from a
1044 * ref_rev_parse_rules rule by interpolating "%s" at the
1045 * location of the "%.*s".
1046 */
7c2b3029 1047 size_t total_len = 0;
84d5633f 1048 size_t offset = 0;
7c2b3029
JK
1049
1050 /* the rule list is NULL terminated, count them first */
a4165851 1051 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
1052 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1053 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 1054
50492f7b 1055 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 1056
84d5633f 1057 offset = 0;
7c2b3029 1058 for (i = 0; i < nr_rules; i++) {
4346663a 1059 assert(offset < total_len);
84d5633f 1060 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
4346663a
MH
1061 offset += snprintf(scanf_fmts[i], total_len - offset,
1062 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
1063 }
1064 }
1065
1066 /* bail out if there are no rules */
1067 if (!nr_rules)
dfefa935 1068 return xstrdup(refname);
7c2b3029 1069
dfefa935
MH
1070 /* buffer for scanf result, at most refname must fit */
1071 short_name = xstrdup(refname);
7c2b3029
JK
1072
1073 /* skip first rule, it will always match */
1074 for (i = nr_rules - 1; i > 0 ; --i) {
1075 int j;
6e7b3309 1076 int rules_to_fail = i;
7c2b3029
JK
1077 int short_name_len;
1078
dfefa935 1079 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
1080 continue;
1081
1082 short_name_len = strlen(short_name);
1083
6e7b3309
BW
1084 /*
1085 * in strict mode, all (except the matched one) rules
1086 * must fail to resolve to a valid non-ambiguous ref
1087 */
1088 if (strict)
1089 rules_to_fail = nr_rules;
1090
7c2b3029
JK
1091 /*
1092 * check if the short name resolves to a valid ref,
1093 * but use only rules prior to the matched one
1094 */
6e7b3309 1095 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 1096 const char *rule = ref_rev_parse_rules[j];
7c2b3029 1097
6e7b3309
BW
1098 /* skip matched rule */
1099 if (i == j)
1100 continue;
1101
7c2b3029
JK
1102 /*
1103 * the short name is ambiguous, if it resolves
1104 * (with this previous rule) to a valid ref
1105 * read_ref() returns 0 on success
1106 */
6cd4a898
JK
1107 strbuf_reset(&resolved_buf);
1108 strbuf_addf(&resolved_buf, rule,
1109 short_name_len, short_name);
1110 if (ref_exists(resolved_buf.buf))
7c2b3029
JK
1111 break;
1112 }
1113
1114 /*
1115 * short name is non-ambiguous if all previous rules
1116 * haven't resolved to a valid ref
1117 */
6cd4a898
JK
1118 if (j == rules_to_fail) {
1119 strbuf_release(&resolved_buf);
7c2b3029 1120 return short_name;
6cd4a898 1121 }
7c2b3029
JK
1122 }
1123
6cd4a898 1124 strbuf_release(&resolved_buf);
7c2b3029 1125 free(short_name);
dfefa935 1126 return xstrdup(refname);
7c2b3029 1127}
daebaa78
JH
1128
1129static struct string_list *hide_refs;
1130
1131int parse_hide_refs_config(const char *var, const char *value, const char *section)
1132{
ad8c7cda 1133 const char *key;
daebaa78 1134 if (!strcmp("transfer.hiderefs", var) ||
ad8c7cda
JK
1135 (!parse_config_key(var, section, NULL, NULL, &key) &&
1136 !strcmp(key, "hiderefs"))) {
daebaa78
JH
1137 char *ref;
1138 int len;
1139
1140 if (!value)
1141 return config_error_nonbool(var);
1142 ref = xstrdup(value);
1143 len = strlen(ref);
1144 while (len && ref[len - 1] == '/')
1145 ref[--len] = '\0';
1146 if (!hide_refs) {
1147 hide_refs = xcalloc(1, sizeof(*hide_refs));
1148 hide_refs->strdup_strings = 1;
1149 }
1150 string_list_append(hide_refs, ref);
1151 }
1152 return 0;
1153}
1154
78a766ab 1155int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1156{
2bc31d16 1157 int i;
daebaa78
JH
1158
1159 if (!hide_refs)
1160 return 0;
2bc31d16
JK
1161 for (i = hide_refs->nr - 1; i >= 0; i--) {
1162 const char *match = hide_refs->items[i].string;
78a766ab 1163 const char *subject;
2bc31d16 1164 int neg = 0;
7a40a95e 1165 const char *p;
2bc31d16
JK
1166
1167 if (*match == '!') {
1168 neg = 1;
1169 match++;
1170 }
1171
78a766ab
LF
1172 if (*match == '^') {
1173 subject = refname_full;
1174 match++;
1175 } else {
1176 subject = refname;
1177 }
1178
1179 /* refname can be NULL when namespaces are used. */
7a40a95e
CC
1180 if (subject &&
1181 skip_prefix(subject, match, &p) &&
1182 (!*p || *p == '/'))
2bc31d16 1183 return !neg;
daebaa78
JH
1184 }
1185 return 0;
1186}
fa5b1830 1187
0845122c
DT
1188const char *find_descendant_ref(const char *dirname,
1189 const struct string_list *extras,
1190 const struct string_list *skip)
fa5b1830 1191{
0845122c 1192 int pos;
fa5b1830 1193
0845122c
DT
1194 if (!extras)
1195 return NULL;
fa5b1830
MH
1196
1197 /*
0845122c
DT
1198 * Look at the place where dirname would be inserted into
1199 * extras. If there is an entry at that position that starts
1200 * with dirname (remember, dirname includes the trailing
1201 * slash) and is not in skip, then we have a conflict.
fa5b1830 1202 */
0845122c
DT
1203 for (pos = string_list_find_insert_index(extras, dirname, 0);
1204 pos < extras->nr; pos++) {
1205 const char *extra_refname = extras->items[pos].string;
fa5b1830 1206
0845122c
DT
1207 if (!starts_with(extra_refname, dirname))
1208 break;
1209
1210 if (!skip || !string_list_has_string(skip, extra_refname))
1211 return extra_refname;
fa5b1830 1212 }
0845122c
DT
1213 return NULL;
1214}
fa5b1830 1215
7d2df051
NTND
1216int refs_rename_ref_available(struct ref_store *refs,
1217 const char *old_refname,
1218 const char *new_refname)
0845122c
DT
1219{
1220 struct string_list skip = STRING_LIST_INIT_NODUP;
1221 struct strbuf err = STRBUF_INIT;
ff3a299c 1222 int ok;
fa5b1830 1223
ff3a299c 1224 string_list_insert(&skip, old_refname);
7d2df051
NTND
1225 ok = !refs_verify_refname_available(refs, new_refname,
1226 NULL, &skip, &err);
ff3a299c 1227 if (!ok)
0845122c
DT
1228 error("%s", err.buf);
1229
1230 string_list_clear(&skip, 0);
1231 strbuf_release(&err);
ff3a299c 1232 return ok;
fa5b1830 1233}
2bf68ed5
DT
1234
1235int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1236{
1237 struct object_id oid;
1238 int flag;
1239
1240 if (submodule) {
1241 if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
1242 return fn("HEAD", &oid, 0, cb_data);
1243
1244 return 0;
1245 }
1246
1247 if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
1248 return fn("HEAD", &oid, flag, cb_data);
1249
1250 return 0;
1251}
1252
1253int head_ref(each_ref_fn fn, void *cb_data)
1254{
1255 return head_ref_submodule(NULL, fn, cb_data);
1256}
93770590 1257
e121b9cb
MH
1258struct ref_iterator *refs_ref_iterator_begin(
1259 struct ref_store *refs,
1260 const char *prefix, int trim, int flags)
1261{
1262 struct ref_iterator *iter;
1263
0a0865b8
MH
1264 if (ref_paranoia < 0)
1265 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
1266 if (ref_paranoia)
1267 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1268
e121b9cb 1269 iter = refs->be->iterator_begin(refs, prefix, flags);
c7599718
MH
1270
1271 /*
1272 * `iterator_begin()` already takes care of prefix, but we
1273 * might need to do some trimming:
1274 */
1275 if (trim)
1276 iter = prefix_ref_iterator_begin(iter, "", trim);
e121b9cb
MH
1277
1278 return iter;
1279}
1280
4c4de895
MH
1281/*
1282 * Call fn for each reference in the specified submodule for which the
1283 * refname begins with prefix. If trim is non-zero, then trim that
1284 * many characters off the beginning of each refname before passing
1285 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1286 * include broken references in the iteration. If fn ever returns a
1287 * non-zero value, stop the iteration and return that value;
1288 * otherwise, return 0.
1289 */
7d2df051 1290static int do_for_each_ref(struct ref_store *refs, const char *prefix,
4c4de895
MH
1291 each_ref_fn fn, int trim, int flags, void *cb_data)
1292{
1293 struct ref_iterator *iter;
1294
00eebe35
MH
1295 if (!refs)
1296 return 0;
1297
e121b9cb 1298 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
4c4de895
MH
1299
1300 return do_for_each_ref_iterator(iter, fn, cb_data);
1301}
1302
7d2df051
NTND
1303int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1304{
1305 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1306}
1307
93770590
DT
1308int for_each_ref(each_ref_fn fn, void *cb_data)
1309{
7d2df051 1310 return refs_for_each_ref(get_main_ref_store(), fn, cb_data);
93770590
DT
1311}
1312
1313int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1314{
7d2df051
NTND
1315 return refs_for_each_ref(get_submodule_ref_store(submodule), fn, cb_data);
1316}
1317
1318int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1319 each_ref_fn fn, void *cb_data)
1320{
1321 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
93770590
DT
1322}
1323
1324int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1325{
7d2df051 1326 return refs_for_each_ref_in(get_main_ref_store(), prefix, fn, cb_data);
93770590
DT
1327}
1328
1329int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1330{
1331 unsigned int flag = 0;
1332
1333 if (broken)
1334 flag = DO_FOR_EACH_INCLUDE_BROKEN;
7d2df051
NTND
1335 return do_for_each_ref(get_main_ref_store(),
1336 prefix, fn, 0, flag, cb_data);
93770590
DT
1337}
1338
1339int for_each_ref_in_submodule(const char *submodule, const char *prefix,
7d2df051 1340 each_ref_fn fn, void *cb_data)
93770590 1341{
7d2df051
NTND
1342 return refs_for_each_ref_in(get_submodule_ref_store(submodule),
1343 prefix, fn, cb_data);
93770590
DT
1344}
1345
03df567f
MH
1346int for_each_fullref_in_submodule(const char *submodule, const char *prefix,
1347 each_ref_fn fn, void *cb_data,
1348 unsigned int broken)
1349{
1350 unsigned int flag = 0;
1351
1352 if (broken)
1353 flag = DO_FOR_EACH_INCLUDE_BROKEN;
1354 return do_for_each_ref(get_submodule_ref_store(submodule),
1355 prefix, fn, 0, flag, cb_data);
1356}
1357
93770590
DT
1358int for_each_replace_ref(each_ref_fn fn, void *cb_data)
1359{
7d2df051
NTND
1360 return do_for_each_ref(get_main_ref_store(),
1361 git_replace_ref_base, fn,
1362 strlen(git_replace_ref_base),
1363 0, cb_data);
93770590
DT
1364}
1365
1366int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1367{
1368 struct strbuf buf = STRBUF_INIT;
1369 int ret;
1370 strbuf_addf(&buf, "%srefs/", get_git_namespace());
7d2df051
NTND
1371 ret = do_for_each_ref(get_main_ref_store(),
1372 buf.buf, fn, 0, 0, cb_data);
93770590
DT
1373 strbuf_release(&buf);
1374 return ret;
1375}
1376
7d2df051 1377int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
93770590 1378{
7d2df051 1379 return do_for_each_ref(refs, "", fn, 0,
93770590
DT
1380 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1381}
2d0663b2 1382
7d2df051
NTND
1383int for_each_rawref(each_ref_fn fn, void *cb_data)
1384{
1385 return refs_for_each_rawref(get_main_ref_store(), fn, cb_data);
1386}
1387
470be518
MH
1388int refs_read_raw_ref(struct ref_store *ref_store,
1389 const char *refname, unsigned char *sha1,
1390 struct strbuf *referent, unsigned int *type)
1391{
1392 return ref_store->be->read_raw_ref(ref_store, refname, sha1, referent, type);
1393}
1394
2d0663b2 1395/* This function needs to return a meaningful errno on failure */
7d2df051 1396const char *refs_resolve_ref_unsafe(struct ref_store *refs,
3c0cb0cb
MH
1397 const char *refname,
1398 int resolve_flags,
1399 unsigned char *sha1, int *flags)
2d0663b2
DT
1400{
1401 static struct strbuf sb_refname = STRBUF_INIT;
1402 int unused_flags;
1403 int symref_count;
1404
1405 if (!flags)
1406 flags = &unused_flags;
1407
1408 *flags = 0;
1409
1410 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1411 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1412 !refname_is_safe(refname)) {
1413 errno = EINVAL;
1414 return NULL;
1415 }
1416
1417 /*
1418 * dwim_ref() uses REF_ISBROKEN to distinguish between
1419 * missing refs and refs that were present but invalid,
1420 * to complain about the latter to stderr.
1421 *
1422 * We don't know whether the ref exists, so don't set
1423 * REF_ISBROKEN yet.
1424 */
1425 *flags |= REF_BAD_NAME;
1426 }
1427
1428 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1429 unsigned int read_flags = 0;
1430
470be518
MH
1431 if (refs_read_raw_ref(refs, refname,
1432 sha1, &sb_refname, &read_flags)) {
2d0663b2
DT
1433 *flags |= read_flags;
1434 if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
1435 return NULL;
1436 hashclr(sha1);
1437 if (*flags & REF_BAD_NAME)
1438 *flags |= REF_ISBROKEN;
1439 return refname;
1440 }
1441
1442 *flags |= read_flags;
1443
1444 if (!(read_flags & REF_ISSYMREF)) {
1445 if (*flags & REF_BAD_NAME) {
1446 hashclr(sha1);
1447 *flags |= REF_ISBROKEN;
1448 }
1449 return refname;
1450 }
1451
1452 refname = sb_refname.buf;
1453 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1454 hashclr(sha1);
1455 return refname;
1456 }
1457 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1458 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1459 !refname_is_safe(refname)) {
1460 errno = EINVAL;
1461 return NULL;
1462 }
1463
1464 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1465 }
1466 }
1467
1468 errno = ELOOP;
1469 return NULL;
1470}
00eebe35 1471
6fb5acfd
DT
1472/* backend functions */
1473int refs_init_db(struct strbuf *err)
1474{
077be78d 1475 struct ref_store *refs = get_main_ref_store();
6fb5acfd
DT
1476
1477 return refs->be->init_db(refs, err);
1478}
1479
bd40dcda
MH
1480const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1481 unsigned char *sha1, int *flags)
1482{
7d2df051 1483 return refs_resolve_ref_unsafe(get_main_ref_store(), refname,
bd40dcda
MH
1484 resolve_flags, sha1, flags);
1485}
1486
a8355bb7
MH
1487int resolve_gitlink_ref(const char *submodule, const char *refname,
1488 unsigned char *sha1)
424dcc76 1489{
a8355bb7 1490 size_t len = strlen(submodule);
424dcc76
MH
1491 struct ref_store *refs;
1492 int flags;
1493
a8355bb7 1494 while (len && submodule[len - 1] == '/')
424dcc76 1495 len--;
48a8475f 1496
424dcc76
MH
1497 if (!len)
1498 return -1;
1499
a8355bb7 1500 if (submodule[len]) {
48a8475f 1501 /* We need to strip off one or more trailing slashes */
a8355bb7 1502 char *stripped = xmemdupz(submodule, len);
48a8475f 1503
18d0002d 1504 refs = get_submodule_ref_store(stripped);
48a8475f
MH
1505 free(stripped);
1506 } else {
18d0002d 1507 refs = get_submodule_ref_store(submodule);
48a8475f
MH
1508 }
1509
424dcc76
MH
1510 if (!refs)
1511 return -1;
1512
7d2df051 1513 if (!refs_resolve_ref_unsafe(refs, refname, 0, sha1, &flags) ||
424dcc76
MH
1514 is_null_sha1(sha1))
1515 return -1;
1516 return 0;
1517}
1518
0c064d90 1519struct ref_store_hash_entry
7d4558c4
MH
1520{
1521 struct hashmap_entry ent; /* must be the first member! */
1522
1523 struct ref_store *refs;
1524
0c064d90
NTND
1525 /* NUL-terminated identifier of the ref store: */
1526 char name[FLEX_ARRAY];
7d4558c4
MH
1527};
1528
7663cdc8
SB
1529static int ref_store_hash_cmp(const void *unused_cmp_data,
1530 const void *entry, const void *entry_or_key,
7d4558c4
MH
1531 const void *keydata)
1532{
0c064d90
NTND
1533 const struct ref_store_hash_entry *e1 = entry, *e2 = entry_or_key;
1534 const char *name = keydata ? keydata : e2->name;
7d4558c4 1535
0c064d90 1536 return strcmp(e1->name, name);
7d4558c4
MH
1537}
1538
0c064d90
NTND
1539static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1540 const char *name, struct ref_store *refs)
7d4558c4 1541{
0c064d90 1542 struct ref_store_hash_entry *entry;
7d4558c4 1543
0c064d90
NTND
1544 FLEX_ALLOC_STR(entry, name, name);
1545 hashmap_entry_init(entry, strhash(name));
7d4558c4
MH
1546 entry->refs = refs;
1547 return entry;
1548}
1549
00eebe35
MH
1550/* A pointer to the ref_store for the main repository: */
1551static struct ref_store *main_ref_store;
1552
7d4558c4
MH
1553/* A hashmap of ref_stores, stored by submodule name: */
1554static struct hashmap submodule_ref_stores;
00eebe35 1555
17eff96b
NTND
1556/* A hashmap of ref_stores, stored by worktree id: */
1557static struct hashmap worktree_ref_stores;
1558
c468da4e 1559/*
0c064d90
NTND
1560 * Look up a ref store by name. If that ref_store hasn't been
1561 * registered yet, return NULL.
c468da4e 1562 */
0c064d90
NTND
1563static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1564 const char *name)
00eebe35 1565{
0c064d90 1566 struct ref_store_hash_entry *entry;
00eebe35 1567
0c064d90 1568 if (!map->tablesize)
7d4558c4
MH
1569 /* It's initialized on demand in register_ref_store(). */
1570 return NULL;
620a66b9 1571
0c064d90 1572 entry = hashmap_get_from_hash(map, strhash(name), name);
7d4558c4 1573 return entry ? entry->refs : NULL;
00eebe35
MH
1574}
1575
c468da4e
MH
1576/*
1577 * Create, record, and return a ref_store instance for the specified
5d0bc90e 1578 * gitdir.
c468da4e 1579 */
9e7ec634
NTND
1580static struct ref_store *ref_store_init(const char *gitdir,
1581 unsigned int flags)
00eebe35
MH
1582{
1583 const char *be_name = "files";
1584 struct ref_storage_be *be = find_ref_storage_backend(be_name);
ba88add5 1585 struct ref_store *refs;
00eebe35
MH
1586
1587 if (!be)
1588 die("BUG: reference backend %s is unknown", be_name);
1589
9e7ec634 1590 refs = be->init(gitdir, flags);
ba88add5 1591 return refs;
00eebe35
MH
1592}
1593
077be78d 1594struct ref_store *get_main_ref_store(void)
24c8407e
NTND
1595{
1596 if (main_ref_store)
1597 return main_ref_store;
1598
0d8a814d 1599 main_ref_store = ref_store_init(get_git_dir(), REF_STORE_ALL_CAPS);
378dc910
NTND
1600 return main_ref_store;
1601}
1602
1603/*
0c064d90
NTND
1604 * Associate a ref store with a name. It is a fatal error to call this
1605 * function twice for the same name.
378dc910 1606 */
0c064d90
NTND
1607static void register_ref_store_map(struct hashmap *map,
1608 const char *type,
1609 struct ref_store *refs,
1610 const char *name)
378dc910 1611{
0c064d90 1612 if (!map->tablesize)
7663cdc8 1613 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
378dc910 1614
0c064d90
NTND
1615 if (hashmap_put(map, alloc_ref_store_hash_entry(name, refs)))
1616 die("BUG: %s ref_store '%s' initialized twice", type, name);
24c8407e
NTND
1617}
1618
18d0002d 1619struct ref_store *get_submodule_ref_store(const char *submodule)
00eebe35 1620{
126c9e05 1621 struct strbuf submodule_sb = STRBUF_INIT;
00eebe35 1622 struct ref_store *refs;
126c9e05 1623 int ret;
00eebe35
MH
1624
1625 if (!submodule || !*submodule) {
18d0002d
NTND
1626 /*
1627 * FIXME: This case is ideally not allowed. But that
1628 * can't happen until we clean up all the callers.
1629 */
24c8407e 1630 return get_main_ref_store();
126c9e05 1631 }
00eebe35 1632
0c064d90 1633 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
126c9e05
NTND
1634 if (refs)
1635 return refs;
00eebe35 1636
126c9e05
NTND
1637 strbuf_addstr(&submodule_sb, submodule);
1638 ret = is_nonbare_repository_dir(&submodule_sb);
1639 strbuf_release(&submodule_sb);
1640 if (!ret)
1641 return NULL;
00eebe35 1642
5d0bc90e
NTND
1643 ret = submodule_to_gitdir(&submodule_sb, submodule);
1644 if (ret) {
1645 strbuf_release(&submodule_sb);
1646 return NULL;
00eebe35
MH
1647 }
1648
9e7ec634
NTND
1649 /* assume that add_submodule_odb() has been called */
1650 refs = ref_store_init(submodule_sb.buf,
1651 REF_STORE_READ | REF_STORE_ODB);
0c064d90
NTND
1652 register_ref_store_map(&submodule_ref_stores, "submodule",
1653 refs, submodule);
5d0bc90e
NTND
1654
1655 strbuf_release(&submodule_sb);
00eebe35
MH
1656 return refs;
1657}
1658
17eff96b
NTND
1659struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1660{
1661 struct ref_store *refs;
1662 const char *id;
1663
1664 if (wt->is_current)
1665 return get_main_ref_store();
1666
1667 id = wt->id ? wt->id : "/";
1668 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1669 if (refs)
1670 return refs;
1671
1672 if (wt->id)
1673 refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
1674 REF_STORE_ALL_CAPS);
1675 else
1676 refs = ref_store_init(get_git_common_dir(),
1677 REF_STORE_ALL_CAPS);
1678
1679 if (refs)
1680 register_ref_store_map(&worktree_ref_stores, "worktree",
1681 refs, id);
1682 return refs;
1683}
1684
620a66b9 1685void base_ref_store_init(struct ref_store *refs,
fbfd0a29 1686 const struct ref_storage_be *be)
00eebe35 1687{
620a66b9 1688 refs->be = be;
00eebe35 1689}
127b42a1
RS
1690
1691/* backend functions */
7d2df051 1692int refs_pack_refs(struct ref_store *refs, unsigned int flags)
8231527e 1693{
8231527e
MH
1694 return refs->be->pack_refs(refs, flags);
1695}
1696
7d2df051
NTND
1697int refs_peel_ref(struct ref_store *refs, const char *refname,
1698 unsigned char *sha1)
1699{
1700 return refs->be->peel_ref(refs, refname, sha1);
8231527e
MH
1701}
1702
bd427cf2
MH
1703int peel_ref(const char *refname, unsigned char *sha1)
1704{
7d2df051
NTND
1705 return refs_peel_ref(get_main_ref_store(), refname, sha1);
1706}
bd427cf2 1707
7d2df051
NTND
1708int refs_create_symref(struct ref_store *refs,
1709 const char *ref_target,
1710 const char *refs_heads_master,
1711 const char *logmsg)
1712{
1713 return refs->be->create_symref(refs, ref_target,
1714 refs_heads_master,
1715 logmsg);
bd427cf2
MH
1716}
1717
284689ba
MH
1718int create_symref(const char *ref_target, const char *refs_heads_master,
1719 const char *logmsg)
1720{
7d2df051
NTND
1721 return refs_create_symref(get_main_ref_store(), ref_target,
1722 refs_heads_master, logmsg);
284689ba
MH
1723}
1724
2ced105c
MH
1725int ref_update_reject_duplicates(struct string_list *refnames,
1726 struct strbuf *err)
1727{
a552e50e 1728 size_t i, n = refnames->nr;
2ced105c
MH
1729
1730 assert(err);
1731
8556f8d6
MH
1732 for (i = 1; i < n; i++) {
1733 int cmp = strcmp(refnames->items[i - 1].string,
1734 refnames->items[i].string);
1735
1736 if (!cmp) {
2ced105c
MH
1737 strbuf_addf(err,
1738 "multiple updates for ref '%s' not allowed.",
1739 refnames->items[i].string);
1740 return 1;
8556f8d6
MH
1741 } else if (cmp > 0) {
1742 die("BUG: ref_update_reject_duplicates() received unsorted list");
2ced105c 1743 }
8556f8d6 1744 }
2ced105c
MH
1745 return 0;
1746}
1747
30173b88
MH
1748int ref_transaction_prepare(struct ref_transaction *transaction,
1749 struct strbuf *err)
127b42a1 1750{
c0fe4e8b 1751 struct ref_store *refs = transaction->ref_store;
127b42a1 1752
8d4240d3
MH
1753 switch (transaction->state) {
1754 case REF_TRANSACTION_OPEN:
1755 /* Good. */
1756 break;
30173b88
MH
1757 case REF_TRANSACTION_PREPARED:
1758 die("BUG: prepare called twice on reference transaction");
1759 break;
8d4240d3
MH
1760 case REF_TRANSACTION_CLOSED:
1761 die("BUG: prepare called on a closed reference transaction");
1762 break;
1763 default:
1764 die("BUG: unexpected reference transaction state");
1765 break;
1766 }
1767
d8f4481c
JK
1768 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
1769 strbuf_addstr(err,
1770 _("ref updates forbidden inside quarantine environment"));
1771 return -1;
1772 }
1773
30173b88
MH
1774 return refs->be->transaction_prepare(refs, transaction, err);
1775}
1776
1777int ref_transaction_abort(struct ref_transaction *transaction,
1778 struct strbuf *err)
1779{
1780 struct ref_store *refs = transaction->ref_store;
1781 int ret = 0;
1782
1783 switch (transaction->state) {
1784 case REF_TRANSACTION_OPEN:
1785 /* No need to abort explicitly. */
1786 break;
1787 case REF_TRANSACTION_PREPARED:
1788 ret = refs->be->transaction_abort(refs, transaction, err);
1789 break;
1790 case REF_TRANSACTION_CLOSED:
1791 die("BUG: abort called on a closed reference transaction");
1792 break;
1793 default:
1794 die("BUG: unexpected reference transaction state");
1795 break;
1796 }
1797
1798 ref_transaction_free(transaction);
1799 return ret;
1800}
1801
1802int ref_transaction_commit(struct ref_transaction *transaction,
1803 struct strbuf *err)
1804{
1805 struct ref_store *refs = transaction->ref_store;
1806 int ret;
1807
1808 switch (transaction->state) {
1809 case REF_TRANSACTION_OPEN:
1810 /* Need to prepare first. */
1811 ret = ref_transaction_prepare(transaction, err);
1812 if (ret)
1813 return ret;
1814 break;
1815 case REF_TRANSACTION_PREPARED:
1816 /* Fall through to finish. */
1817 break;
1818 case REF_TRANSACTION_CLOSED:
1819 die("BUG: commit called on a closed reference transaction");
1820 break;
1821 default:
1822 die("BUG: unexpected reference transaction state");
1823 break;
1824 }
1825
1826 return refs->be->transaction_finish(refs, transaction, err);
127b42a1 1827}
62665823 1828
7d2df051
NTND
1829int refs_verify_refname_available(struct ref_store *refs,
1830 const char *refname,
b05855b5 1831 const struct string_list *extras,
7d2df051
NTND
1832 const struct string_list *skip,
1833 struct strbuf *err)
62665823 1834{
b05855b5
MH
1835 const char *slash;
1836 const char *extra_refname;
1837 struct strbuf dirname = STRBUF_INIT;
1838 struct strbuf referent = STRBUF_INIT;
1839 struct object_id oid;
1840 unsigned int type;
1841 struct ref_iterator *iter;
1842 int ok;
1843 int ret = -1;
1844
1845 /*
1846 * For the sake of comments in this function, suppose that
1847 * refname is "refs/foo/bar".
1848 */
1849
1850 assert(err);
1851
1852 strbuf_grow(&dirname, strlen(refname) + 1);
1853 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
1854 /* Expand dirname to the new prefix, not including the trailing slash: */
1855 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
1856
1857 /*
1858 * We are still at a leading dir of the refname (e.g.,
1859 * "refs/foo"; if there is a reference with that name,
1860 * it is a conflict, *unless* it is in skip.
1861 */
1862 if (skip && string_list_has_string(skip, dirname.buf))
1863 continue;
1864
1865 if (!refs_read_raw_ref(refs, dirname.buf, oid.hash, &referent, &type)) {
1866 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1867 dirname.buf, refname);
1868 goto cleanup;
1869 }
1870
1871 if (extras && string_list_has_string(extras, dirname.buf)) {
1872 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1873 refname, dirname.buf);
1874 goto cleanup;
1875 }
1876 }
1877
1878 /*
1879 * We are at the leaf of our refname (e.g., "refs/foo/bar").
1880 * There is no point in searching for a reference with that
1881 * name, because a refname isn't considered to conflict with
1882 * itself. But we still need to check for references whose
1883 * names are in the "refs/foo/bar/" namespace, because they
1884 * *do* conflict.
1885 */
1886 strbuf_addstr(&dirname, refname + dirname.len);
1887 strbuf_addch(&dirname, '/');
1888
1889 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
1890 DO_FOR_EACH_INCLUDE_BROKEN);
1891 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
1892 if (skip &&
1893 string_list_has_string(skip, iter->refname))
1894 continue;
1895
1896 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1897 iter->refname, refname);
1898 ref_iterator_abort(iter);
1899 goto cleanup;
1900 }
1901
1902 if (ok != ITER_DONE)
1903 die("BUG: error while iterating over references");
1904
1905 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
1906 if (extra_refname)
1907 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1908 refname, extra_refname);
1909 else
1910 ret = 0;
1911
1912cleanup:
1913 strbuf_release(&referent);
1914 strbuf_release(&dirname);
1915 return ret;
62665823 1916}
e3688bd6 1917
7d2df051 1918int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
e3688bd6 1919{
e3688bd6
DT
1920 struct ref_iterator *iter;
1921
1922 iter = refs->be->reflog_iterator_begin(refs);
1923
1924 return do_for_each_ref_iterator(iter, fn, cb_data);
1925}
1926
7d2df051 1927int for_each_reflog(each_ref_fn fn, void *cb_data)
e3688bd6 1928{
7d2df051
NTND
1929 return refs_for_each_reflog(get_main_ref_store(), fn, cb_data);
1930}
e3688bd6 1931
7d2df051
NTND
1932int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
1933 const char *refname,
1934 each_reflog_ent_fn fn,
1935 void *cb_data)
1936{
e3688bd6
DT
1937 return refs->be->for_each_reflog_ent_reverse(refs, refname,
1938 fn, cb_data);
1939}
1940
7d2df051
NTND
1941int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
1942 void *cb_data)
1943{
1944 return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
1945 refname, fn, cb_data);
1946}
1947
1948int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
1949 each_reflog_ent_fn fn, void *cb_data)
1950{
1951 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
1952}
1953
e3688bd6
DT
1954int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
1955 void *cb_data)
1956{
7d2df051
NTND
1957 return refs_for_each_reflog_ent(get_main_ref_store(), refname,
1958 fn, cb_data);
1959}
e3688bd6 1960
7d2df051
NTND
1961int refs_reflog_exists(struct ref_store *refs, const char *refname)
1962{
1963 return refs->be->reflog_exists(refs, refname);
e3688bd6
DT
1964}
1965
1966int reflog_exists(const char *refname)
1967{
7d2df051
NTND
1968 return refs_reflog_exists(get_main_ref_store(), refname);
1969}
e3688bd6 1970
7d2df051
NTND
1971int refs_create_reflog(struct ref_store *refs, const char *refname,
1972 int force_create, struct strbuf *err)
1973{
1974 return refs->be->create_reflog(refs, refname, force_create, err);
e3688bd6
DT
1975}
1976
1977int safe_create_reflog(const char *refname, int force_create,
1978 struct strbuf *err)
1979{
7d2df051
NTND
1980 return refs_create_reflog(get_main_ref_store(), refname,
1981 force_create, err);
1982}
e3688bd6 1983
7d2df051
NTND
1984int refs_delete_reflog(struct ref_store *refs, const char *refname)
1985{
1986 return refs->be->delete_reflog(refs, refname);
e3688bd6
DT
1987}
1988
1989int delete_reflog(const char *refname)
1990{
7d2df051
NTND
1991 return refs_delete_reflog(get_main_ref_store(), refname);
1992}
e3688bd6 1993
7d2df051
NTND
1994int refs_reflog_expire(struct ref_store *refs,
1995 const char *refname, const unsigned char *sha1,
1996 unsigned int flags,
1997 reflog_expiry_prepare_fn prepare_fn,
1998 reflog_expiry_should_prune_fn should_prune_fn,
1999 reflog_expiry_cleanup_fn cleanup_fn,
2000 void *policy_cb_data)
2001{
2002 return refs->be->reflog_expire(refs, refname, sha1, flags,
2003 prepare_fn, should_prune_fn,
2004 cleanup_fn, policy_cb_data);
e3688bd6
DT
2005}
2006
2007int reflog_expire(const char *refname, const unsigned char *sha1,
2008 unsigned int flags,
2009 reflog_expiry_prepare_fn prepare_fn,
2010 reflog_expiry_should_prune_fn should_prune_fn,
2011 reflog_expiry_cleanup_fn cleanup_fn,
2012 void *policy_cb_data)
2013{
7d2df051
NTND
2014 return refs_reflog_expire(get_main_ref_store(),
2015 refname, sha1, flags,
2016 prepare_fn, should_prune_fn,
2017 cleanup_fn, policy_cb_data);
e3688bd6 2018}
fc681463
DT
2019
2020int initial_ref_transaction_commit(struct ref_transaction *transaction,
2021 struct strbuf *err)
2022{
c0fe4e8b 2023 struct ref_store *refs = transaction->ref_store;
fc681463
DT
2024
2025 return refs->be->initial_transaction_commit(refs, transaction, err);
2026}
a27dcf89 2027
64da4199
MH
2028int refs_delete_refs(struct ref_store *refs, const char *msg,
2029 struct string_list *refnames, unsigned int flags)
a27dcf89 2030{
64da4199 2031 return refs->be->delete_refs(refs, msg, refnames, flags);
a27dcf89 2032}
9b6b40d9 2033
64da4199
MH
2034int delete_refs(const char *msg, struct string_list *refnames,
2035 unsigned int flags)
9b6b40d9 2036{
64da4199 2037 return refs_delete_refs(get_main_ref_store(), msg, refnames, flags);
7d2df051 2038}
9b6b40d9 2039
7d2df051
NTND
2040int refs_rename_ref(struct ref_store *refs, const char *oldref,
2041 const char *newref, const char *logmsg)
2042{
9b6b40d9
DT
2043 return refs->be->rename_ref(refs, oldref, newref, logmsg);
2044}
7d2df051
NTND
2045
2046int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2047{
2048 return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
2049}