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