]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
object-store: move object access functions to object-store.h
[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"
cbd53a21 12#include "object-store.h"
cf0adba7
JH
13#include "object.h"
14#include "tag.h"
5d0bc90e 15#include "submodule.h"
17eff96b 16#include "worktree.h"
23a3f0cb 17#include "repository.h"
3581d793 18
3dce444f
RS
19/*
20 * List of all available backends
21 */
22static struct ref_storage_be *refs_backends = &refs_be_files;
23
24static struct ref_storage_be *find_ref_storage_backend(const char *name)
25{
26 struct ref_storage_be *be;
27 for (be = refs_backends; be; be = be->next)
28 if (!strcmp(be->name, name))
29 return be;
30 return NULL;
31}
32
33int ref_storage_backend_exists(const char *name)
34{
35 return find_ref_storage_backend(name) != NULL;
36}
37
bc5fd6d3 38/*
dde8a902
DT
39 * How to handle various characters in refnames:
40 * 0: An acceptable character for refs
5e650228
JH
41 * 1: End-of-component
42 * 2: ., look for a preceding . to reject .. in refs
43 * 3: {, look for a preceding @ to reject @{ in refs
53a8555e 44 * 4: A bad character: ASCII control characters, and
cd377f45
JK
45 * ":", "?", "[", "\", "^", "~", SP, or TAB
46 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
dde8a902
DT
47 */
48static unsigned char refname_disposition[256] = {
5e650228
JH
49 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
50 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
cd377f45 51 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
5e650228 52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
dde8a902 53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5e650228
JH
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
dde8a902
DT
57};
58
59/*
60 * Try to read one refname component from the front of refname.
61 * Return the length of the component found, or -1 if the component is
62 * not legal. It is legal if it is something reasonable to have under
63 * ".git/refs/"; We do not like it if:
bc5fd6d3
MH
64 *
65 * - any path component of it begins with ".", or
66 * - it has double dots "..", or
53a8555e 67 * - it has ASCII control characters, or
cd377f45
JK
68 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
69 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
53a8555e
JK
70 * - it ends with a "/", or
71 * - it ends with ".lock", or
72 * - it contains a "@{" portion
bc5fd6d3 73 */
cd377f45 74static int check_refname_component(const char *refname, int *flags)
bc5fd6d3
MH
75{
76 const char *cp;
77 char last = '\0';
78
79 for (cp = refname; ; cp++) {
dde8a902
DT
80 int ch = *cp & 255;
81 unsigned char disp = refname_disposition[ch];
82 switch (disp) {
5e650228 83 case 1:
dde8a902 84 goto out;
5e650228 85 case 2:
dde8a902
DT
86 if (last == '.')
87 return -1; /* Refname contains "..". */
88 break;
5e650228 89 case 3:
dde8a902
DT
90 if (last == '@')
91 return -1; /* Refname contains "@{". */
bc5fd6d3 92 break;
5e650228 93 case 4:
dde8a902 94 return -1;
cd377f45
JK
95 case 5:
96 if (!(*flags & REFNAME_REFSPEC_PATTERN))
97 return -1; /* refspec can't be a pattern */
98
99 /*
100 * Unset the pattern flag so that we only accept
101 * a single asterisk for one side of refspec.
102 */
103 *flags &= ~ REFNAME_REFSPEC_PATTERN;
104 break;
dde8a902 105 }
bc5fd6d3
MH
106 last = ch;
107 }
dde8a902 108out:
bc5fd6d3 109 if (cp == refname)
dac529e4 110 return 0; /* Component has zero length. */
f3cc52d8
JN
111 if (refname[0] == '.')
112 return -1; /* Component starts with '.'. */
7108ad23
MH
113 if (cp - refname >= LOCK_SUFFIX_LEN &&
114 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
bc5fd6d3
MH
115 return -1; /* Refname ends with ".lock". */
116 return cp - refname;
117}
118
5e650228 119int check_refname_format(const char *refname, int flags)
bc5fd6d3
MH
120{
121 int component_len, component_count = 0;
122
9ba89f48
FC
123 if (!strcmp(refname, "@"))
124 /* Refname is a single character '@'. */
125 return -1;
126
bc5fd6d3
MH
127 while (1) {
128 /* We are at the start of a path component. */
cd377f45
JK
129 component_len = check_refname_component(refname, &flags);
130 if (component_len <= 0)
131 return -1;
132
bc5fd6d3
MH
133 component_count++;
134 if (refname[component_len] == '\0')
135 break;
136 /* Skip to next component. */
137 refname += component_len + 1;
138 }
139
140 if (refname[component_len - 1] == '.')
141 return -1; /* Refname ends with '.'. */
142 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
143 return -1; /* Refname has only one component. */
144 return 0;
145}
146
4cb77009 147int refname_is_safe(const char *refname)
d0f810f0 148{
39950fef
MH
149 const char *rest;
150
151 if (skip_prefix(refname, "refs/", &rest)) {
d0f810f0
RS
152 char *buf;
153 int result;
e40f3557
MH
154 size_t restlen = strlen(rest);
155
156 /* rest must not be empty, or start or end with "/" */
157 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
158 return 0;
d0f810f0 159
d0f810f0
RS
160 /*
161 * Does the refname try to escape refs/?
162 * For example: refs/foo/../bar is safe but refs/foo/../../bar
163 * is not.
164 */
e40f3557
MH
165 buf = xmallocz(restlen);
166 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
d0f810f0
RS
167 free(buf);
168 return result;
169 }
35db25c6
MH
170
171 do {
d0f810f0
RS
172 if (!isupper(*refname) && *refname != '_')
173 return 0;
174 refname++;
35db25c6 175 } while (*refname);
d0f810f0
RS
176 return 1;
177}
178
67be7c5a
MH
179/*
180 * Return true if refname, which has the specified oid and flags, can
181 * be resolved to an object in the database. If the referred-to object
182 * does not exist, emit a warning and return false.
183 */
184int ref_resolves_to_object(const char *refname,
185 const struct object_id *oid,
186 unsigned int flags)
187{
188 if (flags & REF_ISBROKEN)
189 return 0;
190 if (!has_sha1_file(oid->hash)) {
191 error("%s does not point to a valid object!", refname);
192 return 0;
193 }
194 return 1;
195}
196
7d2df051
NTND
197char *refs_resolve_refdup(struct ref_store *refs,
198 const char *refname, int resolve_flags,
0f2dc722 199 struct object_id *oid, int *flags)
7d2df051
NTND
200{
201 const char *result;
202
203 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
49e61479 204 oid, flags);
7d2df051
NTND
205 return xstrdup_or_null(result);
206}
207
7bd9bcf3 208char *resolve_refdup(const char *refname, int resolve_flags,
0f2dc722 209 struct object_id *oid, int *flags)
e1e22e37 210{
23a3f0cb 211 return refs_resolve_refdup(get_main_ref_store(the_repository),
7d2df051 212 refname, resolve_flags,
0f2dc722 213 oid, flags);
cddc4258
MH
214}
215
7bd9bcf3
MH
216/* The argument to filter_refs */
217struct ref_filter {
218 const char *pattern;
219 each_ref_fn *fn;
220 void *cb_data;
221};
432ad41e 222
7d2df051 223int refs_read_ref_full(struct ref_store *refs, const char *refname,
34c290a6 224 int resolve_flags, struct object_id *oid, int *flags)
732134ed 225{
49e61479 226 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, oid, flags))
7bd9bcf3
MH
227 return 0;
228 return -1;
732134ed
MH
229}
230
34c290a6 231int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
7d2df051 232{
23a3f0cb 233 return refs_read_ref_full(get_main_ref_store(the_repository), refname,
34c290a6 234 resolve_flags, oid, flags);
7d2df051
NTND
235}
236
34c290a6 237int read_ref(const char *refname, struct object_id *oid)
cddc4258 238{
34c290a6 239 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
c774aab9
JP
240}
241
7bd9bcf3 242int ref_exists(const char *refname)
bc5fd6d3 243{
744c040b 244 return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, NULL, NULL);
bc5fd6d3
MH
245}
246
65516f58
RA
247static int match_ref_pattern(const char *refname,
248 const struct string_list_item *item)
249{
250 int matched = 0;
251 if (item->util == NULL) {
252 if (!wildmatch(item->string, refname, 0))
253 matched = 1;
254 } else {
255 const char *rest;
256 if (skip_prefix(refname, item->string, &rest) &&
257 (!*rest || *rest == '/'))
258 matched = 1;
259 }
260 return matched;
261}
262
263int ref_filter_match(const char *refname,
264 const struct string_list *include_patterns,
265 const struct string_list *exclude_patterns)
266{
267 struct string_list_item *item;
268
269 if (exclude_patterns && exclude_patterns->nr) {
270 for_each_string_list_item(item, exclude_patterns) {
271 if (match_ref_pattern(refname, item))
272 return 0;
273 }
274 }
275
276 if (include_patterns && include_patterns->nr) {
277 int found = 0;
278 for_each_string_list_item(item, include_patterns) {
279 if (match_ref_pattern(refname, item)) {
280 found = 1;
281 break;
282 }
283 }
284
285 if (!found)
286 return 0;
287 }
288 return 1;
289}
290
7bd9bcf3
MH
291static int filter_refs(const char *refname, const struct object_id *oid,
292 int flags, void *data)
432ad41e 293{
7bd9bcf3
MH
294 struct ref_filter *filter = (struct ref_filter *)data;
295
55d34269 296 if (wildmatch(filter->pattern, refname, 0))
7bd9bcf3
MH
297 return 0;
298 return filter->fn(refname, oid, flags, filter->cb_data);
432ad41e
MH
299}
300
ac2ed0d7 301enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
c774aab9 302{
ac2ed0d7 303 struct object *o = lookup_unknown_object(name->hash);
c774aab9 304
7bd9bcf3 305 if (o->type == OBJ_NONE) {
0df8e965 306 int type = oid_object_info(the_repository, name, NULL);
7bd9bcf3
MH
307 if (type < 0 || !object_as_type(o, type, 0))
308 return PEEL_INVALID;
309 }
bc5fd6d3 310
7bd9bcf3
MH
311 if (o->type != OBJ_TAG)
312 return PEEL_NON_TAG;
e1980c9d 313
7bd9bcf3
MH
314 o = deref_tag_noverify(o);
315 if (!o)
316 return PEEL_INVALID;
317
ac2ed0d7 318 oidcpy(oid, &o->oid);
7bd9bcf3 319 return PEEL_PEELED;
e1980c9d
JH
320}
321
7bd9bcf3
MH
322struct warn_if_dangling_data {
323 FILE *fp;
324 const char *refname;
325 const struct string_list *refnames;
326 const char *msg_fmt;
327};
bc5fd6d3 328
7bd9bcf3
MH
329static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
330 int flags, void *cb_data)
331{
332 struct warn_if_dangling_data *d = cb_data;
333 const char *resolves_to;
bc5fd6d3 334
7bd9bcf3
MH
335 if (!(flags & REF_ISSYMREF))
336 return 0;
bc5fd6d3 337
744c040b 338 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
7bd9bcf3
MH
339 if (!resolves_to
340 || (d->refname
341 ? strcmp(resolves_to, d->refname)
342 : !string_list_has_string(d->refnames, resolves_to))) {
343 return 0;
344 }
bc5fd6d3 345
7bd9bcf3
MH
346 fprintf(d->fp, d->msg_fmt, refname);
347 fputc('\n', d->fp);
348 return 0;
bc5fd6d3
MH
349}
350
7bd9bcf3 351void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
f348ac92 352{
7bd9bcf3
MH
353 struct warn_if_dangling_data data;
354
355 data.fp = fp;
356 data.refname = refname;
357 data.refnames = NULL;
358 data.msg_fmt = msg_fmt;
359 for_each_rawref(warn_if_dangling_symref, &data);
f348ac92
MH
360}
361
7bd9bcf3 362void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
432ad41e 363{
7bd9bcf3 364 struct warn_if_dangling_data data;
432ad41e 365
7bd9bcf3
MH
366 data.fp = fp;
367 data.refname = NULL;
368 data.refnames = refnames;
369 data.msg_fmt = msg_fmt;
370 for_each_rawref(warn_if_dangling_symref, &data);
432ad41e
MH
371}
372
7d2df051
NTND
373int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
374{
375 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
376}
377
7bd9bcf3 378int for_each_tag_ref(each_ref_fn fn, void *cb_data)
432ad41e 379{
23a3f0cb 380 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
432ad41e
MH
381}
382
7d2df051
NTND
383int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
384{
385 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
432ad41e
MH
386}
387
7bd9bcf3 388int for_each_branch_ref(each_ref_fn fn, void *cb_data)
432ad41e 389{
23a3f0cb 390 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
432ad41e
MH
391}
392
7d2df051
NTND
393int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
394{
395 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
202a56a9 396}
432ad41e 397
7bd9bcf3 398int for_each_remote_ref(each_ref_fn fn, void *cb_data)
e9c4c111 399{
23a3f0cb 400 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
202a56a9
MH
401}
402
7bd9bcf3
MH
403int head_ref_namespaced(each_ref_fn fn, void *cb_data)
404{
405 struct strbuf buf = STRBUF_INIT;
406 int ret = 0;
407 struct object_id oid;
408 int flag;
c774aab9 409
7bd9bcf3 410 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
34c290a6 411 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
7bd9bcf3
MH
412 ret = fn(buf.buf, &oid, flag, cb_data);
413 strbuf_release(&buf);
c774aab9 414
7bd9bcf3 415 return ret;
e9c4c111 416}
c774aab9 417
65516f58
RA
418void normalize_glob_ref(struct string_list_item *item, const char *prefix,
419 const char *pattern)
420{
421 struct strbuf normalized_pattern = STRBUF_INIT;
422
423 if (*pattern == '/')
424 BUG("pattern must not start with '/'");
425
426 if (prefix) {
427 strbuf_addstr(&normalized_pattern, prefix);
428 }
429 else if (!starts_with(pattern, "refs/"))
430 strbuf_addstr(&normalized_pattern, "refs/");
431 strbuf_addstr(&normalized_pattern, pattern);
432 strbuf_strip_suffix(&normalized_pattern, "/");
433
434 item->string = strbuf_detach(&normalized_pattern, NULL);
435 item->util = has_glob_specials(pattern) ? NULL : item->string;
436 strbuf_release(&normalized_pattern);
437}
438
7bd9bcf3
MH
439int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
440 const char *prefix, void *cb_data)
662428f4 441{
7bd9bcf3
MH
442 struct strbuf real_pattern = STRBUF_INIT;
443 struct ref_filter filter;
444 int ret;
d08bae7e 445
59556548 446 if (!prefix && !starts_with(pattern, "refs/"))
d08bae7e 447 strbuf_addstr(&real_pattern, "refs/");
b09fe971
IL
448 else if (prefix)
449 strbuf_addstr(&real_pattern, prefix);
d08bae7e
IL
450 strbuf_addstr(&real_pattern, pattern);
451
894a9d33 452 if (!has_glob_specials(pattern)) {
9517e6b8 453 /* Append implied '/' '*' if not present. */
00b6c178 454 strbuf_complete(&real_pattern, '/');
d08bae7e
IL
455 /* No need to check for '*', there is none. */
456 strbuf_addch(&real_pattern, '*');
457 }
458
459 filter.pattern = real_pattern.buf;
460 filter.fn = fn;
461 filter.cb_data = cb_data;
462 ret = for_each_ref(filter_refs, &filter);
463
464 strbuf_release(&real_pattern);
465 return ret;
466}
467
b09fe971
IL
468int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
469{
470 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
471}
472
4577e483 473const char *prettify_refname(const char *name)
a9c37a72 474{
3e5b36c6
SG
475 if (skip_prefix(name, "refs/heads/", &name) ||
476 skip_prefix(name, "refs/tags/", &name) ||
477 skip_prefix(name, "refs/remotes/", &name))
478 ; /* nothing */
479 return name;
a9c37a72
DB
480}
481
54457fe5 482static const char *ref_rev_parse_rules[] = {
79803322
SP
483 "%.*s",
484 "refs/%.*s",
485 "refs/tags/%.*s",
486 "refs/heads/%.*s",
487 "refs/remotes/%.*s",
488 "refs/remotes/%.*s/HEAD",
489 NULL
490};
491
54457fe5 492int refname_match(const char *abbrev_name, const char *full_name)
79803322
SP
493{
494 const char **p;
495 const int abbrev_name_len = strlen(abbrev_name);
496
54457fe5 497 for (p = ref_rev_parse_rules; *p; p++) {
79803322
SP
498 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
499 return 1;
500 }
501 }
502
503 return 0;
504}
505
ff74f7f1
JH
506/*
507 * *string and *len will only be substituted, and *string returned (for
508 * later free()ing) if the string passed in is a magic short-hand form
509 * to name a branch.
510 */
511static char *substitute_branch_name(const char **string, int *len)
512{
513 struct strbuf buf = STRBUF_INIT;
0e9f62da 514 int ret = interpret_branch_name(*string, *len, &buf, 0);
ff74f7f1
JH
515
516 if (ret == *len) {
517 size_t size;
518 *string = strbuf_detach(&buf, &size);
519 *len = size;
520 return (char *)*string;
521 }
522
523 return NULL;
524}
525
cca5fa64 526int dwim_ref(const char *str, int len, struct object_id *oid, char **ref)
ff74f7f1
JH
527{
528 char *last_branch = substitute_branch_name(&str, &len);
cca5fa64 529 int refs_found = expand_ref(str, len, oid, ref);
41da7111
NTND
530 free(last_branch);
531 return refs_found;
532}
533
cca5fa64 534int expand_ref(const char *str, int len, struct object_id *oid, char **ref)
41da7111 535{
ff74f7f1
JH
536 const char **p, *r;
537 int refs_found = 0;
6cd4a898 538 struct strbuf fullref = STRBUF_INIT;
ff74f7f1
JH
539
540 *ref = NULL;
541 for (p = ref_rev_parse_rules; *p; p++) {
cca5fa64 542 struct object_id oid_from_ref;
543 struct object_id *this_result;
ff74f7f1
JH
544 int flag;
545
cca5fa64 546 this_result = refs_found ? &oid_from_ref : oid;
6cd4a898
JK
547 strbuf_reset(&fullref);
548 strbuf_addf(&fullref, *p, len, str);
549 r = resolve_ref_unsafe(fullref.buf, RESOLVE_REF_READING,
49e61479 550 this_result, &flag);
ff74f7f1
JH
551 if (r) {
552 if (!refs_found++)
553 *ref = xstrdup(r);
554 if (!warn_ambiguous_refs)
555 break;
6cd4a898
JK
556 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
557 warning("ignoring dangling symref %s.", fullref.buf);
558 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
559 warning("ignoring broken ref %s.", fullref.buf);
55956350 560 }
ff74f7f1 561 }
6cd4a898 562 strbuf_release(&fullref);
ff74f7f1
JH
563 return refs_found;
564}
565
334dc52f 566int dwim_log(const char *str, int len, struct object_id *oid, char **log)
ff74f7f1
JH
567{
568 char *last_branch = substitute_branch_name(&str, &len);
569 const char **p;
570 int logs_found = 0;
6cd4a898 571 struct strbuf path = STRBUF_INIT;
ff74f7f1
JH
572
573 *log = NULL;
574 for (p = ref_rev_parse_rules; *p; p++) {
334dc52f 575 struct object_id hash;
ff74f7f1
JH
576 const char *ref, *it;
577
6cd4a898
JK
578 strbuf_reset(&path);
579 strbuf_addf(&path, *p, len, str);
580 ref = resolve_ref_unsafe(path.buf, RESOLVE_REF_READING,
49e61479 581 &hash, NULL);
ff74f7f1
JH
582 if (!ref)
583 continue;
6cd4a898
JK
584 if (reflog_exists(path.buf))
585 it = path.buf;
586 else if (strcmp(ref, path.buf) && reflog_exists(ref))
ff74f7f1
JH
587 it = ref;
588 else
589 continue;
590 if (!logs_found++) {
591 *log = xstrdup(it);
334dc52f 592 oidcpy(oid, &hash);
ff74f7f1 593 }
7bd9bcf3
MH
594 if (!warn_ambiguous_refs)
595 break;
c0277d15 596 }
6cd4a898 597 strbuf_release(&path);
7bd9bcf3
MH
598 free(last_branch);
599 return logs_found;
2ddb5d17
BK
600}
601
266b1827
DT
602static int is_per_worktree_ref(const char *refname)
603{
ce414b33
DT
604 return !strcmp(refname, "HEAD") ||
605 starts_with(refname, "refs/bisect/");
266b1827
DT
606}
607
608static int is_pseudoref_syntax(const char *refname)
609{
610 const char *c;
611
612 for (c = refname; *c; c++) {
613 if (!isupper(*c) && *c != '-' && *c != '_')
614 return 0;
615 }
616
617 return 1;
618}
619
620enum ref_type ref_type(const char *refname)
621{
622 if (is_per_worktree_ref(refname))
623 return REF_TYPE_PER_WORKTREE;
624 if (is_pseudoref_syntax(refname))
625 return REF_TYPE_PSEUDOREF;
626 return REF_TYPE_NORMAL;
627}
628
4ff0f01c
MH
629long get_files_ref_lock_timeout_ms(void)
630{
631 static int configured = 0;
632
633 /* The default timeout is 100 ms: */
634 static int timeout_ms = 100;
635
636 if (!configured) {
637 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
638 configured = 1;
639 }
640
641 return timeout_ms;
642}
643
ae077771 644static int write_pseudoref(const char *pseudoref, const struct object_id *oid,
645 const struct object_id *old_oid, struct strbuf *err)
74ec19d4
DT
646{
647 const char *filename;
648 int fd;
649 static struct lock_file lock;
650 struct strbuf buf = STRBUF_INIT;
651 int ret = -1;
652
6ee18216 653 if (!oid)
654 return 0;
655
ae077771 656 strbuf_addf(&buf, "%s\n", oid_to_hex(oid));
74ec19d4
DT
657
658 filename = git_path("%s", pseudoref);
4ff0f01c
MH
659 fd = hold_lock_file_for_update_timeout(&lock, filename,
660 LOCK_DIE_ON_ERROR,
661 get_files_ref_lock_timeout_ms());
74ec19d4 662 if (fd < 0) {
0568c8e9 663 strbuf_addf(err, "could not open '%s' for writing: %s",
74ec19d4 664 filename, strerror(errno));
aeb014f6 665 goto done;
74ec19d4
DT
666 }
667
ae077771 668 if (old_oid) {
669 struct object_id actual_old_oid;
2c3aed13 670
34c290a6 671 if (read_ref(pseudoref, &actual_old_oid))
2c3aed13 672 die("could not read ref '%s'", pseudoref);
ae077771 673 if (oidcmp(&actual_old_oid, old_oid)) {
0568c8e9 674 strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
74ec19d4
DT
675 rollback_lock_file(&lock);
676 goto done;
677 }
678 }
679
06f46f23 680 if (write_in_full(fd, buf.buf, buf.len) < 0) {
0568c8e9 681 strbuf_addf(err, "could not write to '%s'", filename);
74ec19d4
DT
682 rollback_lock_file(&lock);
683 goto done;
684 }
685
686 commit_lock_file(&lock);
687 ret = 0;
688done:
689 strbuf_release(&buf);
690 return ret;
691}
692
2616a5e5 693static int delete_pseudoref(const char *pseudoref, const struct object_id *old_oid)
74ec19d4
DT
694{
695 static struct lock_file lock;
696 const char *filename;
697
698 filename = git_path("%s", pseudoref);
699
2616a5e5 700 if (old_oid && !is_null_oid(old_oid)) {
74ec19d4 701 int fd;
2616a5e5 702 struct object_id actual_old_oid;
74ec19d4 703
4ff0f01c
MH
704 fd = hold_lock_file_for_update_timeout(
705 &lock, filename, LOCK_DIE_ON_ERROR,
706 get_files_ref_lock_timeout_ms());
74ec19d4
DT
707 if (fd < 0)
708 die_errno(_("Could not open '%s' for writing"), filename);
34c290a6 709 if (read_ref(pseudoref, &actual_old_oid))
2c3aed13 710 die("could not read ref '%s'", pseudoref);
2616a5e5 711 if (oidcmp(&actual_old_oid, old_oid)) {
74ec19d4
DT
712 warning("Unexpected sha1 when deleting %s", pseudoref);
713 rollback_lock_file(&lock);
714 return -1;
a4c653df 715 }
74ec19d4
DT
716
717 unlink(filename);
718 rollback_lock_file(&lock);
719 } else {
720 unlink(filename);
4bd18c43 721 }
a4c653df 722
4bd18c43 723 return 0;
95fc7512 724}
d556fae2 725
c0fe4e8b
NTND
726int refs_delete_ref(struct ref_store *refs, const char *msg,
727 const char *refname,
2616a5e5 728 const struct object_id *old_oid,
c0fe4e8b 729 unsigned int flags)
41b625b0 730{
7521cc46 731 struct ref_transaction *transaction;
a4c653df 732 struct strbuf err = STRBUF_INIT;
8b5157e4 733
c0fe4e8b 734 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
23a3f0cb 735 assert(refs == get_main_ref_store(the_repository));
2616a5e5 736 return delete_pseudoref(refname, old_oid);
c0fe4e8b 737 }
d48744d1 738
c0fe4e8b 739 transaction = ref_store_transaction_begin(refs, &err);
7521cc46 740 if (!transaction ||
89f3bbdd 741 ref_transaction_delete(transaction, refname, old_oid,
755b49ae 742 flags, msg, &err) ||
db7516ab 743 ref_transaction_commit(transaction, &err)) {
7521cc46
RS
744 error("%s", err.buf);
745 ref_transaction_free(transaction);
746 strbuf_release(&err);
c0277d15 747 return 1;
41b625b0 748 }
7bd9bcf3
MH
749 ref_transaction_free(transaction);
750 strbuf_release(&err);
b531394d
BC
751 return 0;
752}
41b625b0 753
c0fe4e8b 754int delete_ref(const char *msg, const char *refname,
2616a5e5 755 const struct object_id *old_oid, unsigned int flags)
c0fe4e8b 756{
23a3f0cb 757 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
2616a5e5 758 old_oid, flags);
c0fe4e8b
NTND
759}
760
4cb77009 761int copy_reflog_msg(char *buf, const char *msg)
0ec29a47
JH
762{
763 char *cp = buf;
764 char c;
765 int wasspace = 1;
8b5157e4 766
0ec29a47
JH
767 *cp++ = '\t';
768 while ((c = *msg++)) {
769 if (wasspace && isspace(c))
770 continue;
771 wasspace = isspace(c);
772 if (wasspace)
773 c = ' ';
774 *cp++ = c;
a4c653df 775 }
0ec29a47
JH
776 while (buf < cp && isspace(cp[-1]))
777 cp--;
778 *cp++ = '\n';
779 return cp - buf;
780}
8b5157e4 781
4cb77009 782int should_autocreate_reflog(const char *refname)
4e2bef57 783{
341fb286
CW
784 switch (log_all_ref_updates) {
785 case LOG_REFS_ALWAYS:
786 return 1;
787 case LOG_REFS_NORMAL:
788 return starts_with(refname, "refs/heads/") ||
789 starts_with(refname, "refs/remotes/") ||
790 starts_with(refname, "refs/notes/") ||
791 !strcmp(refname, "HEAD");
792 default:
4e2bef57 793 return 0;
341fb286 794 }
4e2bef57
DT
795}
796
e7e0f26e 797int is_branch(const char *refname)
c3b0dec5 798{
59556548 799 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
800}
801
4207ed28
RS
802struct read_ref_at_cb {
803 const char *refname;
dddbad72 804 timestamp_t at_time;
4207ed28
RS
805 int cnt;
806 int reccnt;
8eb36d94 807 struct object_id *oid;
4207ed28
RS
808 int found_it;
809
8eb36d94 810 struct object_id ooid;
811 struct object_id noid;
4207ed28 812 int tz;
dddbad72 813 timestamp_t date;
4207ed28 814 char **msg;
dddbad72 815 timestamp_t *cutoff_time;
4207ed28
RS
816 int *cutoff_tz;
817 int *cutoff_cnt;
818};
819
9461d272 820static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
dddbad72 821 const char *email, timestamp_t timestamp, int tz,
4207ed28
RS
822 const char *message, void *cb_data)
823{
824 struct read_ref_at_cb *cb = cb_data;
825
826 cb->reccnt++;
827 cb->tz = tz;
828 cb->date = timestamp;
829
830 if (timestamp <= cb->at_time || cb->cnt == 0) {
831 if (cb->msg)
832 *cb->msg = xstrdup(message);
833 if (cb->cutoff_time)
834 *cb->cutoff_time = timestamp;
835 if (cb->cutoff_tz)
836 *cb->cutoff_tz = tz;
837 if (cb->cutoff_cnt)
838 *cb->cutoff_cnt = cb->reccnt - 1;
839 /*
78fb4579 840 * we have not yet updated cb->[n|o]oid so they still
4207ed28
RS
841 * hold the values for the previous record.
842 */
8eb36d94 843 if (!is_null_oid(&cb->ooid)) {
844 oidcpy(cb->oid, noid);
845 if (oidcmp(&cb->ooid, noid))
4207ed28 846 warning("Log for ref %s has gap after %s.",
a5481a6c 847 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
4207ed28
RS
848 }
849 else if (cb->date == cb->at_time)
8eb36d94 850 oidcpy(cb->oid, noid);
851 else if (oidcmp(noid, cb->oid))
4207ed28
RS
852 warning("Log for ref %s unexpectedly ended on %s.",
853 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 854 DATE_MODE(RFC2822)));
8eb36d94 855 oidcpy(&cb->ooid, ooid);
856 oidcpy(&cb->noid, noid);
4207ed28
RS
857 cb->found_it = 1;
858 return 1;
859 }
8eb36d94 860 oidcpy(&cb->ooid, ooid);
861 oidcpy(&cb->noid, noid);
4207ed28
RS
862 if (cb->cnt > 0)
863 cb->cnt--;
864 return 0;
865}
866
9461d272 867static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
dddbad72 868 const char *email, timestamp_t timestamp,
4207ed28
RS
869 int tz, const char *message, void *cb_data)
870{
871 struct read_ref_at_cb *cb = cb_data;
872
873 if (cb->msg)
874 *cb->msg = xstrdup(message);
875 if (cb->cutoff_time)
876 *cb->cutoff_time = timestamp;
877 if (cb->cutoff_tz)
878 *cb->cutoff_tz = tz;
879 if (cb->cutoff_cnt)
880 *cb->cutoff_cnt = cb->reccnt;
8eb36d94 881 oidcpy(cb->oid, ooid);
882 if (is_null_oid(cb->oid))
883 oidcpy(cb->oid, noid);
4207ed28
RS
884 /* We just want the first entry */
885 return 1;
16d7cc90
JH
886}
887
dddbad72 888int read_ref_at(const char *refname, unsigned int flags, timestamp_t at_time, int cnt,
8eb36d94 889 struct object_id *oid, char **msg,
dddbad72 890 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 891{
4207ed28 892 struct read_ref_at_cb cb;
d556fae2 893
4207ed28
RS
894 memset(&cb, 0, sizeof(cb));
895 cb.refname = refname;
896 cb.at_time = at_time;
897 cb.cnt = cnt;
898 cb.msg = msg;
899 cb.cutoff_time = cutoff_time;
900 cb.cutoff_tz = cutoff_tz;
901 cb.cutoff_cnt = cutoff_cnt;
8eb36d94 902 cb.oid = oid;
4207ed28
RS
903
904 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
905
c41a87dd 906 if (!cb.reccnt) {
321c89bf 907 if (flags & GET_OID_QUIETLY)
c41a87dd
DA
908 exit(128);
909 else
910 die("Log for %s is empty.", refname);
911 }
4207ed28
RS
912 if (cb.found_it)
913 return 0;
914
915 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
d556fae2 916
16d7cc90 917 return 1;
d556fae2 918}
2ff81662 919
c0fe4e8b
NTND
920struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
921 struct strbuf *err)
caa4046c 922{
c0fe4e8b 923 struct ref_transaction *tr;
5a603b04
JN
924 assert(err);
925
c0fe4e8b
NTND
926 tr = xcalloc(1, sizeof(struct ref_transaction));
927 tr->ref_store = refs;
928 return tr;
929}
930
931struct ref_transaction *ref_transaction_begin(struct strbuf *err)
932{
23a3f0cb 933 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
caa4046c
MH
934}
935
026bd1d3 936void ref_transaction_free(struct ref_transaction *transaction)
caa4046c 937{
43a2dfde 938 size_t i;
caa4046c 939
1b07255c
RS
940 if (!transaction)
941 return;
942
30173b88
MH
943 switch (transaction->state) {
944 case REF_TRANSACTION_OPEN:
945 case REF_TRANSACTION_CLOSED:
946 /* OK */
947 break;
948 case REF_TRANSACTION_PREPARED:
949 die("BUG: free called on a prepared reference transaction");
950 break;
951 default:
952 die("BUG: unexpected reference transaction state");
953 break;
954 }
955
db7516ab
RS
956 for (i = 0; i < transaction->nr; i++) {
957 free(transaction->updates[i]->msg);
88615910 958 free(transaction->updates[i]);
db7516ab 959 }
caa4046c
MH
960 free(transaction->updates);
961 free(transaction);
962}
963
71564516
MH
964struct ref_update *ref_transaction_add_update(
965 struct ref_transaction *transaction,
966 const char *refname, unsigned int flags,
89f3bbdd 967 const struct object_id *new_oid,
968 const struct object_id *old_oid,
71564516 969 const char *msg)
caa4046c 970{
96ffc06f 971 struct ref_update *update;
71564516
MH
972
973 if (transaction->state != REF_TRANSACTION_OPEN)
974 die("BUG: update called for transaction that is not open");
975
96ffc06f 976 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
977 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
978 transaction->updates[transaction->nr++] = update;
71564516
MH
979
980 update->flags = flags;
981
982 if (flags & REF_HAVE_NEW)
89f3bbdd 983 oidcpy(&update->new_oid, new_oid);
71564516 984 if (flags & REF_HAVE_OLD)
89f3bbdd 985 oidcpy(&update->old_oid, old_oid);
13092a91 986 update->msg = xstrdup_or_null(msg);
caa4046c
MH
987 return update;
988}
989
8e34800e
RS
990int ref_transaction_update(struct ref_transaction *transaction,
991 const char *refname,
89f3bbdd 992 const struct object_id *new_oid,
993 const struct object_id *old_oid,
1d147bdf 994 unsigned int flags, const char *msg,
8e34800e 995 struct strbuf *err)
caa4046c 996{
5a603b04
JN
997 assert(err);
998
89f3bbdd 999 if ((new_oid && !is_null_oid(new_oid)) ?
8a679de6
MH
1000 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1001 !refname_is_safe(refname)) {
0568c8e9 1002 strbuf_addf(err, "refusing to update ref with bad name '%s'",
d0f810f0
RS
1003 refname);
1004 return -1;
1005 }
1006
a9bbbcec
MH
1007 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1008 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
c788c54c 1009
89f3bbdd 1010 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
71564516
MH
1011
1012 ref_transaction_add_update(transaction, refname, flags,
89f3bbdd 1013 new_oid, old_oid, msg);
8e34800e 1014 return 0;
caa4046c
MH
1015}
1016
b416af5b
RS
1017int ref_transaction_create(struct ref_transaction *transaction,
1018 const char *refname,
89f3bbdd 1019 const struct object_id *new_oid,
fec14ec3 1020 unsigned int flags, const char *msg,
b416af5b 1021 struct strbuf *err)
caa4046c 1022{
89f3bbdd 1023 if (!new_oid || is_null_oid(new_oid))
1024 die("BUG: create called without valid new_oid");
1025 return ref_transaction_update(transaction, refname, new_oid,
1026 &null_oid, flags, msg, err);
caa4046c
MH
1027}
1028
8c8bdc0d
RS
1029int ref_transaction_delete(struct ref_transaction *transaction,
1030 const char *refname,
89f3bbdd 1031 const struct object_id *old_oid,
fb5a6bb6 1032 unsigned int flags, const char *msg,
8c8bdc0d 1033 struct strbuf *err)
caa4046c 1034{
89f3bbdd 1035 if (old_oid && is_null_oid(old_oid))
1036 die("BUG: delete called with old_oid set to zeros");
1d147bdf 1037 return ref_transaction_update(transaction, refname,
89f3bbdd 1038 &null_oid, old_oid,
1d147bdf 1039 flags, msg, err);
caa4046c
MH
1040}
1041
16180334
MH
1042int ref_transaction_verify(struct ref_transaction *transaction,
1043 const char *refname,
89f3bbdd 1044 const struct object_id *old_oid,
16180334
MH
1045 unsigned int flags,
1046 struct strbuf *err)
1047{
89f3bbdd 1048 if (!old_oid)
1049 die("BUG: verify called with old_oid set to NULL");
16180334 1050 return ref_transaction_update(transaction, refname,
89f3bbdd 1051 NULL, old_oid,
16180334
MH
1052 flags, NULL, err);
1053}
1054
c0fe4e8b 1055int refs_update_ref(struct ref_store *refs, const char *msg,
ae077771 1056 const char *refname, const struct object_id *new_oid,
1057 const struct object_id *old_oid, unsigned int flags,
c0fe4e8b 1058 enum action_on_err onerr)
4738a333 1059{
74ec19d4 1060 struct ref_transaction *t = NULL;
b4d75ac1 1061 struct strbuf err = STRBUF_INIT;
74ec19d4 1062 int ret = 0;
b4d75ac1 1063
74ec19d4 1064 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
23a3f0cb 1065 assert(refs == get_main_ref_store(the_repository));
ae077771 1066 ret = write_pseudoref(refname, new_oid, old_oid, &err);
74ec19d4 1067 } else {
c0fe4e8b 1068 t = ref_store_transaction_begin(refs, &err);
74ec19d4 1069 if (!t ||
89f3bbdd 1070 ref_transaction_update(t, refname, new_oid, old_oid,
74ec19d4
DT
1071 flags, msg, &err) ||
1072 ref_transaction_commit(t, &err)) {
1073 ret = 1;
1074 ref_transaction_free(t);
1075 }
1076 }
1077 if (ret) {
b4d75ac1
RS
1078 const char *str = "update_ref failed for ref '%s': %s";
1079
b4d75ac1
RS
1080 switch (onerr) {
1081 case UPDATE_REFS_MSG_ON_ERR:
1082 error(str, refname, err.buf);
1083 break;
1084 case UPDATE_REFS_DIE_ON_ERR:
1085 die(str, refname, err.buf);
1086 break;
1087 case UPDATE_REFS_QUIET_ON_ERR:
1088 break;
1089 }
1090 strbuf_release(&err);
4738a333 1091 return 1;
b4d75ac1
RS
1092 }
1093 strbuf_release(&err);
74ec19d4
DT
1094 if (t)
1095 ref_transaction_free(t);
b4d75ac1 1096 return 0;
4738a333
BK
1097}
1098
c0fe4e8b 1099int update_ref(const char *msg, const char *refname,
ae077771 1100 const struct object_id *new_oid,
1101 const struct object_id *old_oid,
c0fe4e8b
NTND
1102 unsigned int flags, enum action_on_err onerr)
1103{
23a3f0cb 1104 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
ae077771 1105 old_oid, flags, onerr);
c0fe4e8b
NTND
1106}
1107
dfefa935 1108char *shorten_unambiguous_ref(const char *refname, int strict)
7c2b3029
JK
1109{
1110 int i;
1111 static char **scanf_fmts;
1112 static int nr_rules;
1113 char *short_name;
6cd4a898 1114 struct strbuf resolved_buf = STRBUF_INIT;
7c2b3029 1115
7c2b3029 1116 if (!nr_rules) {
4346663a
MH
1117 /*
1118 * Pre-generate scanf formats from ref_rev_parse_rules[].
1119 * Generate a format suitable for scanf from a
1120 * ref_rev_parse_rules rule by interpolating "%s" at the
1121 * location of the "%.*s".
1122 */
7c2b3029 1123 size_t total_len = 0;
84d5633f 1124 size_t offset = 0;
7c2b3029
JK
1125
1126 /* the rule list is NULL terminated, count them first */
a4165851 1127 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
1128 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1129 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 1130
50492f7b 1131 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 1132
84d5633f 1133 offset = 0;
7c2b3029 1134 for (i = 0; i < nr_rules; i++) {
4346663a 1135 assert(offset < total_len);
84d5633f 1136 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
4346663a
MH
1137 offset += snprintf(scanf_fmts[i], total_len - offset,
1138 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
1139 }
1140 }
1141
1142 /* bail out if there are no rules */
1143 if (!nr_rules)
dfefa935 1144 return xstrdup(refname);
7c2b3029 1145
dfefa935
MH
1146 /* buffer for scanf result, at most refname must fit */
1147 short_name = xstrdup(refname);
7c2b3029
JK
1148
1149 /* skip first rule, it will always match */
1150 for (i = nr_rules - 1; i > 0 ; --i) {
1151 int j;
6e7b3309 1152 int rules_to_fail = i;
7c2b3029
JK
1153 int short_name_len;
1154
dfefa935 1155 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
1156 continue;
1157
1158 short_name_len = strlen(short_name);
1159
6e7b3309
BW
1160 /*
1161 * in strict mode, all (except the matched one) rules
1162 * must fail to resolve to a valid non-ambiguous ref
1163 */
1164 if (strict)
1165 rules_to_fail = nr_rules;
1166
7c2b3029
JK
1167 /*
1168 * check if the short name resolves to a valid ref,
1169 * but use only rules prior to the matched one
1170 */
6e7b3309 1171 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 1172 const char *rule = ref_rev_parse_rules[j];
7c2b3029 1173
6e7b3309
BW
1174 /* skip matched rule */
1175 if (i == j)
1176 continue;
1177
7c2b3029
JK
1178 /*
1179 * the short name is ambiguous, if it resolves
1180 * (with this previous rule) to a valid ref
1181 * read_ref() returns 0 on success
1182 */
6cd4a898
JK
1183 strbuf_reset(&resolved_buf);
1184 strbuf_addf(&resolved_buf, rule,
1185 short_name_len, short_name);
1186 if (ref_exists(resolved_buf.buf))
7c2b3029
JK
1187 break;
1188 }
1189
1190 /*
1191 * short name is non-ambiguous if all previous rules
1192 * haven't resolved to a valid ref
1193 */
6cd4a898
JK
1194 if (j == rules_to_fail) {
1195 strbuf_release(&resolved_buf);
7c2b3029 1196 return short_name;
6cd4a898 1197 }
7c2b3029
JK
1198 }
1199
6cd4a898 1200 strbuf_release(&resolved_buf);
7c2b3029 1201 free(short_name);
dfefa935 1202 return xstrdup(refname);
7c2b3029 1203}
daebaa78
JH
1204
1205static struct string_list *hide_refs;
1206
1207int parse_hide_refs_config(const char *var, const char *value, const char *section)
1208{
ad8c7cda 1209 const char *key;
daebaa78 1210 if (!strcmp("transfer.hiderefs", var) ||
ad8c7cda
JK
1211 (!parse_config_key(var, section, NULL, NULL, &key) &&
1212 !strcmp(key, "hiderefs"))) {
daebaa78
JH
1213 char *ref;
1214 int len;
1215
1216 if (!value)
1217 return config_error_nonbool(var);
1218 ref = xstrdup(value);
1219 len = strlen(ref);
1220 while (len && ref[len - 1] == '/')
1221 ref[--len] = '\0';
1222 if (!hide_refs) {
1223 hide_refs = xcalloc(1, sizeof(*hide_refs));
1224 hide_refs->strdup_strings = 1;
1225 }
1226 string_list_append(hide_refs, ref);
1227 }
1228 return 0;
1229}
1230
78a766ab 1231int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1232{
2bc31d16 1233 int i;
daebaa78
JH
1234
1235 if (!hide_refs)
1236 return 0;
2bc31d16
JK
1237 for (i = hide_refs->nr - 1; i >= 0; i--) {
1238 const char *match = hide_refs->items[i].string;
78a766ab 1239 const char *subject;
2bc31d16 1240 int neg = 0;
7a40a95e 1241 const char *p;
2bc31d16
JK
1242
1243 if (*match == '!') {
1244 neg = 1;
1245 match++;
1246 }
1247
78a766ab
LF
1248 if (*match == '^') {
1249 subject = refname_full;
1250 match++;
1251 } else {
1252 subject = refname;
1253 }
1254
1255 /* refname can be NULL when namespaces are used. */
7a40a95e
CC
1256 if (subject &&
1257 skip_prefix(subject, match, &p) &&
1258 (!*p || *p == '/'))
2bc31d16 1259 return !neg;
daebaa78
JH
1260 }
1261 return 0;
1262}
fa5b1830 1263
0845122c
DT
1264const char *find_descendant_ref(const char *dirname,
1265 const struct string_list *extras,
1266 const struct string_list *skip)
fa5b1830 1267{
0845122c 1268 int pos;
fa5b1830 1269
0845122c
DT
1270 if (!extras)
1271 return NULL;
fa5b1830
MH
1272
1273 /*
0845122c
DT
1274 * Look at the place where dirname would be inserted into
1275 * extras. If there is an entry at that position that starts
1276 * with dirname (remember, dirname includes the trailing
1277 * slash) and is not in skip, then we have a conflict.
fa5b1830 1278 */
0845122c
DT
1279 for (pos = string_list_find_insert_index(extras, dirname, 0);
1280 pos < extras->nr; pos++) {
1281 const char *extra_refname = extras->items[pos].string;
fa5b1830 1282
0845122c
DT
1283 if (!starts_with(extra_refname, dirname))
1284 break;
1285
1286 if (!skip || !string_list_has_string(skip, extra_refname))
1287 return extra_refname;
fa5b1830 1288 }
0845122c
DT
1289 return NULL;
1290}
fa5b1830 1291
7d2df051
NTND
1292int refs_rename_ref_available(struct ref_store *refs,
1293 const char *old_refname,
1294 const char *new_refname)
0845122c
DT
1295{
1296 struct string_list skip = STRING_LIST_INIT_NODUP;
1297 struct strbuf err = STRBUF_INIT;
ff3a299c 1298 int ok;
fa5b1830 1299
ff3a299c 1300 string_list_insert(&skip, old_refname);
7d2df051
NTND
1301 ok = !refs_verify_refname_available(refs, new_refname,
1302 NULL, &skip, &err);
ff3a299c 1303 if (!ok)
0845122c
DT
1304 error("%s", err.buf);
1305
1306 string_list_clear(&skip, 0);
1307 strbuf_release(&err);
ff3a299c 1308 return ok;
fa5b1830 1309}
2bf68ed5 1310
62f0b399 1311int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2bf68ed5
DT
1312{
1313 struct object_id oid;
1314 int flag;
1315
62f0b399 1316 if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
34c290a6 1317 &oid, &flag))
2bf68ed5
DT
1318 return fn("HEAD", &oid, flag, cb_data);
1319
1320 return 0;
1321}
1322
1323int head_ref(each_ref_fn fn, void *cb_data)
1324{
23a3f0cb 1325 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
2bf68ed5 1326}
93770590 1327
e121b9cb
MH
1328struct ref_iterator *refs_ref_iterator_begin(
1329 struct ref_store *refs,
1330 const char *prefix, int trim, int flags)
1331{
1332 struct ref_iterator *iter;
1333
0a0865b8
MH
1334 if (ref_paranoia < 0)
1335 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
1336 if (ref_paranoia)
1337 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1338
e121b9cb 1339 iter = refs->be->iterator_begin(refs, prefix, flags);
c7599718
MH
1340
1341 /*
1342 * `iterator_begin()` already takes care of prefix, but we
1343 * might need to do some trimming:
1344 */
1345 if (trim)
1346 iter = prefix_ref_iterator_begin(iter, "", trim);
e121b9cb 1347
8738a8a4
MH
1348 /* Sanity check for subclasses: */
1349 if (!iter->ordered)
1350 BUG("reference iterator is not ordered");
1351
e121b9cb
MH
1352 return iter;
1353}
1354
4c4de895
MH
1355/*
1356 * Call fn for each reference in the specified submodule for which the
1357 * refname begins with prefix. If trim is non-zero, then trim that
1358 * many characters off the beginning of each refname before passing
1359 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1360 * include broken references in the iteration. If fn ever returns a
1361 * non-zero value, stop the iteration and return that value;
1362 * otherwise, return 0.
1363 */
7d2df051 1364static int do_for_each_ref(struct ref_store *refs, const char *prefix,
4c4de895
MH
1365 each_ref_fn fn, int trim, int flags, void *cb_data)
1366{
1367 struct ref_iterator *iter;
1368
00eebe35
MH
1369 if (!refs)
1370 return 0;
1371
e121b9cb 1372 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
4c4de895
MH
1373
1374 return do_for_each_ref_iterator(iter, fn, cb_data);
1375}
1376
7d2df051
NTND
1377int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1378{
1379 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1380}
1381
93770590
DT
1382int for_each_ref(each_ref_fn fn, void *cb_data)
1383{
23a3f0cb 1384 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
93770590
DT
1385}
1386
7d2df051
NTND
1387int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1388 each_ref_fn fn, void *cb_data)
1389{
1390 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
93770590
DT
1391}
1392
1393int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1394{
23a3f0cb 1395 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
93770590
DT
1396}
1397
1398int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1399{
1400 unsigned int flag = 0;
1401
1402 if (broken)
1403 flag = DO_FOR_EACH_INCLUDE_BROKEN;
23a3f0cb 1404 return do_for_each_ref(get_main_ref_store(the_repository),
7d2df051 1405 prefix, fn, 0, flag, cb_data);
93770590
DT
1406}
1407
073cf63c
NTND
1408int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1409 each_ref_fn fn, void *cb_data,
1410 unsigned int broken)
03df567f
MH
1411{
1412 unsigned int flag = 0;
1413
1414 if (broken)
1415 flag = DO_FOR_EACH_INCLUDE_BROKEN;
073cf63c 1416 return do_for_each_ref(refs, prefix, fn, 0, flag, cb_data);
03df567f
MH
1417}
1418
0d296c57 1419int for_each_replace_ref(struct repository *r, each_ref_fn fn, void *cb_data)
93770590 1420{
0d296c57 1421 return do_for_each_ref(get_main_ref_store(r),
7d2df051
NTND
1422 git_replace_ref_base, fn,
1423 strlen(git_replace_ref_base),
006f3f28 1424 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
93770590
DT
1425}
1426
1427int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1428{
1429 struct strbuf buf = STRBUF_INIT;
1430 int ret;
1431 strbuf_addf(&buf, "%srefs/", get_git_namespace());
23a3f0cb 1432 ret = do_for_each_ref(get_main_ref_store(the_repository),
7d2df051 1433 buf.buf, fn, 0, 0, cb_data);
93770590
DT
1434 strbuf_release(&buf);
1435 return ret;
1436}
1437
7d2df051 1438int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
93770590 1439{
7d2df051 1440 return do_for_each_ref(refs, "", fn, 0,
93770590
DT
1441 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1442}
2d0663b2 1443
7d2df051
NTND
1444int for_each_rawref(each_ref_fn fn, void *cb_data)
1445{
23a3f0cb 1446 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
7d2df051
NTND
1447}
1448
470be518 1449int refs_read_raw_ref(struct ref_store *ref_store,
99afe91a 1450 const char *refname, struct object_id *oid,
470be518
MH
1451 struct strbuf *referent, unsigned int *type)
1452{
99afe91a 1453 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent, type);
470be518
MH
1454}
1455
2d0663b2 1456/* This function needs to return a meaningful errno on failure */
7d2df051 1457const char *refs_resolve_ref_unsafe(struct ref_store *refs,
3c0cb0cb
MH
1458 const char *refname,
1459 int resolve_flags,
49e61479 1460 struct object_id *oid, int *flags)
2d0663b2
DT
1461{
1462 static struct strbuf sb_refname = STRBUF_INIT;
54fad661 1463 struct object_id unused_oid;
2d0663b2
DT
1464 int unused_flags;
1465 int symref_count;
1466
49e61479 1467 if (!oid)
1468 oid = &unused_oid;
2d0663b2
DT
1469 if (!flags)
1470 flags = &unused_flags;
1471
1472 *flags = 0;
1473
1474 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1475 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1476 !refname_is_safe(refname)) {
1477 errno = EINVAL;
1478 return NULL;
1479 }
1480
1481 /*
1482 * dwim_ref() uses REF_ISBROKEN to distinguish between
1483 * missing refs and refs that were present but invalid,
1484 * to complain about the latter to stderr.
1485 *
1486 * We don't know whether the ref exists, so don't set
1487 * REF_ISBROKEN yet.
1488 */
1489 *flags |= REF_BAD_NAME;
1490 }
1491
1492 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1493 unsigned int read_flags = 0;
1494
470be518 1495 if (refs_read_raw_ref(refs, refname,
99afe91a 1496 oid, &sb_refname, &read_flags)) {
2d0663b2 1497 *flags |= read_flags;
a1c1d817
JK
1498
1499 /* In reading mode, refs must eventually resolve */
1500 if (resolve_flags & RESOLVE_REF_READING)
1501 return NULL;
1502
1503 /*
1504 * Otherwise a missing ref is OK. But the files backend
1505 * may show errors besides ENOENT if there are
1506 * similarly-named refs.
1507 */
1508 if (errno != ENOENT &&
1509 errno != EISDIR &&
1510 errno != ENOTDIR)
2d0663b2 1511 return NULL;
a1c1d817 1512
49e61479 1513 oidclr(oid);
2d0663b2
DT
1514 if (*flags & REF_BAD_NAME)
1515 *flags |= REF_ISBROKEN;
1516 return refname;
1517 }
1518
1519 *flags |= read_flags;
1520
1521 if (!(read_flags & REF_ISSYMREF)) {
1522 if (*flags & REF_BAD_NAME) {
49e61479 1523 oidclr(oid);
2d0663b2
DT
1524 *flags |= REF_ISBROKEN;
1525 }
1526 return refname;
1527 }
1528
1529 refname = sb_refname.buf;
1530 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
49e61479 1531 oidclr(oid);
2d0663b2
DT
1532 return refname;
1533 }
1534 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1535 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1536 !refname_is_safe(refname)) {
1537 errno = EINVAL;
1538 return NULL;
1539 }
1540
1541 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1542 }
1543 }
1544
1545 errno = ELOOP;
1546 return NULL;
1547}
00eebe35 1548
6fb5acfd
DT
1549/* backend functions */
1550int refs_init_db(struct strbuf *err)
1551{
23a3f0cb 1552 struct ref_store *refs = get_main_ref_store(the_repository);
6fb5acfd
DT
1553
1554 return refs->be->init_db(refs, err);
1555}
1556
bd40dcda 1557const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
49e61479 1558 struct object_id *oid, int *flags)
bd40dcda 1559{
23a3f0cb 1560 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
49e61479 1561 resolve_flags, oid, flags);
bd40dcda
MH
1562}
1563
a8355bb7 1564int resolve_gitlink_ref(const char *submodule, const char *refname,
a98e6101 1565 struct object_id *oid)
424dcc76 1566{
424dcc76
MH
1567 struct ref_store *refs;
1568 int flags;
1569
29babbee 1570 refs = get_submodule_ref_store(submodule);
48a8475f 1571
424dcc76
MH
1572 if (!refs)
1573 return -1;
1574
49e61479 1575 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
a98e6101 1576 is_null_oid(oid))
424dcc76
MH
1577 return -1;
1578 return 0;
1579}
1580
0c064d90 1581struct ref_store_hash_entry
7d4558c4
MH
1582{
1583 struct hashmap_entry ent; /* must be the first member! */
1584
1585 struct ref_store *refs;
1586
0c064d90
NTND
1587 /* NUL-terminated identifier of the ref store: */
1588 char name[FLEX_ARRAY];
7d4558c4
MH
1589};
1590
7663cdc8
SB
1591static int ref_store_hash_cmp(const void *unused_cmp_data,
1592 const void *entry, const void *entry_or_key,
7d4558c4
MH
1593 const void *keydata)
1594{
0c064d90
NTND
1595 const struct ref_store_hash_entry *e1 = entry, *e2 = entry_or_key;
1596 const char *name = keydata ? keydata : e2->name;
7d4558c4 1597
0c064d90 1598 return strcmp(e1->name, name);
7d4558c4
MH
1599}
1600
0c064d90
NTND
1601static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1602 const char *name, struct ref_store *refs)
7d4558c4 1603{
0c064d90 1604 struct ref_store_hash_entry *entry;
7d4558c4 1605
0c064d90
NTND
1606 FLEX_ALLOC_STR(entry, name, name);
1607 hashmap_entry_init(entry, strhash(name));
7d4558c4
MH
1608 entry->refs = refs;
1609 return entry;
1610}
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
64a74161 1653struct ref_store *get_main_ref_store(struct repository *r)
24c8407e 1654{
64a74161
SB
1655 if (r->refs)
1656 return r->refs;
24c8407e 1657
64a74161
SB
1658 r->refs = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
1659 return r->refs;
378dc910
NTND
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)
23a3f0cb 1728 return get_main_ref_store(the_repository);
17eff96b
NTND
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{
23a3f0cb 1784 return refs_peel_ref(get_main_ref_store(the_repository), 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{
23a3f0cb 1800 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
7d2df051 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{
23a3f0cb 2008 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
7d2df051 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{
23a3f0cb 2023 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
7d2df051
NTND
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{
23a3f0cb 2036 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
7d2df051
NTND
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{
23a3f0cb 2047 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
7d2df051 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{
23a3f0cb 2059 return refs_create_reflog(get_main_ref_store(the_repository), refname,
7d2df051
NTND
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{
23a3f0cb 2070 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
7d2df051 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{
23a3f0cb 2093 return refs_reflog_expire(get_main_ref_store(the_repository),
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{
23a3f0cb 2116 return refs_delete_refs(get_main_ref_store(the_repository), 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{
23a3f0cb 2127 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
7d2df051 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{
23a3f0cb 2138 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
52d59cc6 2139}