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