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