]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
object: add repository argument to parse_object_buffer
[thirdparty/git.git] / refs.c
CommitLineData
7bd9bcf3
MH
1/*
2 * The backend-independent part of the reference module.
3 */
4
95fc7512 5#include "cache.h"
b2141fc1 6#include "config.h"
7d4558c4 7#include "hashmap.h"
697cc8ef 8#include "lockfile.h"
b05855b5 9#include "iterator.h"
85023577 10#include "refs.h"
4cb77009 11#include "refs/refs-internal.h"
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);
7bd9bcf3
MH
308 if (type < 0 || !object_as_type(o, type, 0))
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
4cb77009 790int copy_reflog_msg(char *buf, const char *msg)
0ec29a47
JH
791{
792 char *cp = buf;
793 char c;
794 int wasspace = 1;
8b5157e4 795
0ec29a47
JH
796 *cp++ = '\t';
797 while ((c = *msg++)) {
798 if (wasspace && isspace(c))
799 continue;
800 wasspace = isspace(c);
801 if (wasspace)
802 c = ' ';
803 *cp++ = c;
a4c653df 804 }
0ec29a47
JH
805 while (buf < cp && isspace(cp[-1]))
806 cp--;
807 *cp++ = '\n';
808 return cp - buf;
809}
8b5157e4 810
4cb77009 811int should_autocreate_reflog(const char *refname)
4e2bef57 812{
341fb286
CW
813 switch (log_all_ref_updates) {
814 case LOG_REFS_ALWAYS:
815 return 1;
816 case LOG_REFS_NORMAL:
817 return starts_with(refname, "refs/heads/") ||
818 starts_with(refname, "refs/remotes/") ||
819 starts_with(refname, "refs/notes/") ||
820 !strcmp(refname, "HEAD");
821 default:
4e2bef57 822 return 0;
341fb286 823 }
4e2bef57
DT
824}
825
e7e0f26e 826int is_branch(const char *refname)
c3b0dec5 827{
59556548 828 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
829}
830
4207ed28
RS
831struct read_ref_at_cb {
832 const char *refname;
dddbad72 833 timestamp_t at_time;
4207ed28
RS
834 int cnt;
835 int reccnt;
8eb36d94 836 struct object_id *oid;
4207ed28
RS
837 int found_it;
838
8eb36d94 839 struct object_id ooid;
840 struct object_id noid;
4207ed28 841 int tz;
dddbad72 842 timestamp_t date;
4207ed28 843 char **msg;
dddbad72 844 timestamp_t *cutoff_time;
4207ed28
RS
845 int *cutoff_tz;
846 int *cutoff_cnt;
847};
848
9461d272 849static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
dddbad72 850 const char *email, timestamp_t timestamp, int tz,
4207ed28
RS
851 const char *message, void *cb_data)
852{
853 struct read_ref_at_cb *cb = cb_data;
854
855 cb->reccnt++;
856 cb->tz = tz;
857 cb->date = timestamp;
858
859 if (timestamp <= cb->at_time || cb->cnt == 0) {
860 if (cb->msg)
861 *cb->msg = xstrdup(message);
862 if (cb->cutoff_time)
863 *cb->cutoff_time = timestamp;
864 if (cb->cutoff_tz)
865 *cb->cutoff_tz = tz;
866 if (cb->cutoff_cnt)
867 *cb->cutoff_cnt = cb->reccnt - 1;
868 /*
78fb4579 869 * we have not yet updated cb->[n|o]oid so they still
4207ed28
RS
870 * hold the values for the previous record.
871 */
8eb36d94 872 if (!is_null_oid(&cb->ooid)) {
873 oidcpy(cb->oid, noid);
874 if (oidcmp(&cb->ooid, noid))
4207ed28 875 warning("Log for ref %s has gap after %s.",
a5481a6c 876 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
4207ed28
RS
877 }
878 else if (cb->date == cb->at_time)
8eb36d94 879 oidcpy(cb->oid, noid);
880 else if (oidcmp(noid, cb->oid))
4207ed28
RS
881 warning("Log for ref %s unexpectedly ended on %s.",
882 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 883 DATE_MODE(RFC2822)));
8eb36d94 884 oidcpy(&cb->ooid, ooid);
885 oidcpy(&cb->noid, noid);
4207ed28
RS
886 cb->found_it = 1;
887 return 1;
888 }
8eb36d94 889 oidcpy(&cb->ooid, ooid);
890 oidcpy(&cb->noid, noid);
4207ed28
RS
891 if (cb->cnt > 0)
892 cb->cnt--;
893 return 0;
894}
895
9461d272 896static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
dddbad72 897 const char *email, timestamp_t timestamp,
4207ed28
RS
898 int tz, const char *message, void *cb_data)
899{
900 struct read_ref_at_cb *cb = cb_data;
901
902 if (cb->msg)
903 *cb->msg = xstrdup(message);
904 if (cb->cutoff_time)
905 *cb->cutoff_time = timestamp;
906 if (cb->cutoff_tz)
907 *cb->cutoff_tz = tz;
908 if (cb->cutoff_cnt)
909 *cb->cutoff_cnt = cb->reccnt;
8eb36d94 910 oidcpy(cb->oid, ooid);
911 if (is_null_oid(cb->oid))
912 oidcpy(cb->oid, noid);
4207ed28
RS
913 /* We just want the first entry */
914 return 1;
16d7cc90
JH
915}
916
dddbad72 917int read_ref_at(const char *refname, unsigned int flags, timestamp_t at_time, int cnt,
8eb36d94 918 struct object_id *oid, char **msg,
dddbad72 919 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 920{
4207ed28 921 struct read_ref_at_cb cb;
d556fae2 922
4207ed28
RS
923 memset(&cb, 0, sizeof(cb));
924 cb.refname = refname;
925 cb.at_time = at_time;
926 cb.cnt = cnt;
927 cb.msg = msg;
928 cb.cutoff_time = cutoff_time;
929 cb.cutoff_tz = cutoff_tz;
930 cb.cutoff_cnt = cutoff_cnt;
8eb36d94 931 cb.oid = oid;
4207ed28
RS
932
933 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
934
c41a87dd 935 if (!cb.reccnt) {
321c89bf 936 if (flags & GET_OID_QUIETLY)
c41a87dd
DA
937 exit(128);
938 else
939 die("Log for %s is empty.", refname);
940 }
4207ed28
RS
941 if (cb.found_it)
942 return 0;
943
944 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
d556fae2 945
16d7cc90 946 return 1;
d556fae2 947}
2ff81662 948
c0fe4e8b
NTND
949struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
950 struct strbuf *err)
caa4046c 951{
c0fe4e8b 952 struct ref_transaction *tr;
5a603b04
JN
953 assert(err);
954
c0fe4e8b
NTND
955 tr = xcalloc(1, sizeof(struct ref_transaction));
956 tr->ref_store = refs;
957 return tr;
958}
959
960struct ref_transaction *ref_transaction_begin(struct strbuf *err)
961{
23a3f0cb 962 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
caa4046c
MH
963}
964
026bd1d3 965void ref_transaction_free(struct ref_transaction *transaction)
caa4046c 966{
43a2dfde 967 size_t i;
caa4046c 968
1b07255c
RS
969 if (!transaction)
970 return;
971
30173b88
MH
972 switch (transaction->state) {
973 case REF_TRANSACTION_OPEN:
974 case REF_TRANSACTION_CLOSED:
975 /* OK */
976 break;
977 case REF_TRANSACTION_PREPARED:
033abf97 978 BUG("free called on a prepared reference transaction");
30173b88
MH
979 break;
980 default:
033abf97 981 BUG("unexpected reference transaction state");
30173b88
MH
982 break;
983 }
984
db7516ab
RS
985 for (i = 0; i < transaction->nr; i++) {
986 free(transaction->updates[i]->msg);
88615910 987 free(transaction->updates[i]);
db7516ab 988 }
caa4046c
MH
989 free(transaction->updates);
990 free(transaction);
991}
992
71564516
MH
993struct ref_update *ref_transaction_add_update(
994 struct ref_transaction *transaction,
995 const char *refname, unsigned int flags,
89f3bbdd 996 const struct object_id *new_oid,
997 const struct object_id *old_oid,
71564516 998 const char *msg)
caa4046c 999{
96ffc06f 1000 struct ref_update *update;
71564516
MH
1001
1002 if (transaction->state != REF_TRANSACTION_OPEN)
033abf97 1003 BUG("update called for transaction that is not open");
71564516 1004
96ffc06f 1005 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
1006 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1007 transaction->updates[transaction->nr++] = update;
71564516
MH
1008
1009 update->flags = flags;
1010
1011 if (flags & REF_HAVE_NEW)
89f3bbdd 1012 oidcpy(&update->new_oid, new_oid);
71564516 1013 if (flags & REF_HAVE_OLD)
89f3bbdd 1014 oidcpy(&update->old_oid, old_oid);
13092a91 1015 update->msg = xstrdup_or_null(msg);
caa4046c
MH
1016 return update;
1017}
1018
8e34800e
RS
1019int ref_transaction_update(struct ref_transaction *transaction,
1020 const char *refname,
89f3bbdd 1021 const struct object_id *new_oid,
1022 const struct object_id *old_oid,
1d147bdf 1023 unsigned int flags, const char *msg,
8e34800e 1024 struct strbuf *err)
caa4046c 1025{
5a603b04
JN
1026 assert(err);
1027
89f3bbdd 1028 if ((new_oid && !is_null_oid(new_oid)) ?
8a679de6
MH
1029 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1030 !refname_is_safe(refname)) {
0568c8e9 1031 strbuf_addf(err, "refusing to update ref with bad name '%s'",
d0f810f0
RS
1032 refname);
1033 return -1;
1034 }
1035
a9bbbcec
MH
1036 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1037 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
c788c54c 1038
89f3bbdd 1039 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
71564516
MH
1040
1041 ref_transaction_add_update(transaction, refname, flags,
89f3bbdd 1042 new_oid, old_oid, msg);
8e34800e 1043 return 0;
caa4046c
MH
1044}
1045
b416af5b
RS
1046int ref_transaction_create(struct ref_transaction *transaction,
1047 const char *refname,
89f3bbdd 1048 const struct object_id *new_oid,
fec14ec3 1049 unsigned int flags, const char *msg,
b416af5b 1050 struct strbuf *err)
caa4046c 1051{
89f3bbdd 1052 if (!new_oid || is_null_oid(new_oid))
033abf97 1053 BUG("create called without valid new_oid");
89f3bbdd 1054 return ref_transaction_update(transaction, refname, new_oid,
1055 &null_oid, flags, msg, err);
caa4046c
MH
1056}
1057
8c8bdc0d
RS
1058int ref_transaction_delete(struct ref_transaction *transaction,
1059 const char *refname,
89f3bbdd 1060 const struct object_id *old_oid,
fb5a6bb6 1061 unsigned int flags, const char *msg,
8c8bdc0d 1062 struct strbuf *err)
caa4046c 1063{
89f3bbdd 1064 if (old_oid && is_null_oid(old_oid))
033abf97 1065 BUG("delete called with old_oid set to zeros");
1d147bdf 1066 return ref_transaction_update(transaction, refname,
89f3bbdd 1067 &null_oid, old_oid,
1d147bdf 1068 flags, msg, err);
caa4046c
MH
1069}
1070
16180334
MH
1071int ref_transaction_verify(struct ref_transaction *transaction,
1072 const char *refname,
89f3bbdd 1073 const struct object_id *old_oid,
16180334
MH
1074 unsigned int flags,
1075 struct strbuf *err)
1076{
89f3bbdd 1077 if (!old_oid)
033abf97 1078 BUG("verify called with old_oid set to NULL");
16180334 1079 return ref_transaction_update(transaction, refname,
89f3bbdd 1080 NULL, old_oid,
16180334
MH
1081 flags, NULL, err);
1082}
1083
c0fe4e8b 1084int refs_update_ref(struct ref_store *refs, const char *msg,
ae077771 1085 const char *refname, const struct object_id *new_oid,
1086 const struct object_id *old_oid, unsigned int flags,
c0fe4e8b 1087 enum action_on_err onerr)
4738a333 1088{
74ec19d4 1089 struct ref_transaction *t = NULL;
b4d75ac1 1090 struct strbuf err = STRBUF_INIT;
74ec19d4 1091 int ret = 0;
b4d75ac1 1092
74ec19d4 1093 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
23a3f0cb 1094 assert(refs == get_main_ref_store(the_repository));
ae077771 1095 ret = write_pseudoref(refname, new_oid, old_oid, &err);
74ec19d4 1096 } else {
c0fe4e8b 1097 t = ref_store_transaction_begin(refs, &err);
74ec19d4 1098 if (!t ||
89f3bbdd 1099 ref_transaction_update(t, refname, new_oid, old_oid,
74ec19d4
DT
1100 flags, msg, &err) ||
1101 ref_transaction_commit(t, &err)) {
1102 ret = 1;
1103 ref_transaction_free(t);
1104 }
1105 }
1106 if (ret) {
b4d75ac1
RS
1107 const char *str = "update_ref failed for ref '%s': %s";
1108
b4d75ac1
RS
1109 switch (onerr) {
1110 case UPDATE_REFS_MSG_ON_ERR:
1111 error(str, refname, err.buf);
1112 break;
1113 case UPDATE_REFS_DIE_ON_ERR:
1114 die(str, refname, err.buf);
1115 break;
1116 case UPDATE_REFS_QUIET_ON_ERR:
1117 break;
1118 }
1119 strbuf_release(&err);
4738a333 1120 return 1;
b4d75ac1
RS
1121 }
1122 strbuf_release(&err);
74ec19d4
DT
1123 if (t)
1124 ref_transaction_free(t);
b4d75ac1 1125 return 0;
4738a333
BK
1126}
1127
c0fe4e8b 1128int update_ref(const char *msg, const char *refname,
ae077771 1129 const struct object_id *new_oid,
1130 const struct object_id *old_oid,
c0fe4e8b
NTND
1131 unsigned int flags, enum action_on_err onerr)
1132{
23a3f0cb 1133 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
ae077771 1134 old_oid, flags, onerr);
c0fe4e8b
NTND
1135}
1136
dfefa935 1137char *shorten_unambiguous_ref(const char *refname, int strict)
7c2b3029
JK
1138{
1139 int i;
1140 static char **scanf_fmts;
1141 static int nr_rules;
1142 char *short_name;
6cd4a898 1143 struct strbuf resolved_buf = STRBUF_INIT;
7c2b3029 1144
7c2b3029 1145 if (!nr_rules) {
4346663a
MH
1146 /*
1147 * Pre-generate scanf formats from ref_rev_parse_rules[].
1148 * Generate a format suitable for scanf from a
1149 * ref_rev_parse_rules rule by interpolating "%s" at the
1150 * location of the "%.*s".
1151 */
7c2b3029 1152 size_t total_len = 0;
84d5633f 1153 size_t offset = 0;
7c2b3029
JK
1154
1155 /* the rule list is NULL terminated, count them first */
a4165851 1156 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
1157 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1158 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 1159
50492f7b 1160 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 1161
84d5633f 1162 offset = 0;
7c2b3029 1163 for (i = 0; i < nr_rules; i++) {
4346663a 1164 assert(offset < total_len);
84d5633f 1165 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
bf4baf1f
JK
1166 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1167 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
1168 }
1169 }
1170
1171 /* bail out if there are no rules */
1172 if (!nr_rules)
dfefa935 1173 return xstrdup(refname);
7c2b3029 1174
dfefa935
MH
1175 /* buffer for scanf result, at most refname must fit */
1176 short_name = xstrdup(refname);
7c2b3029
JK
1177
1178 /* skip first rule, it will always match */
1179 for (i = nr_rules - 1; i > 0 ; --i) {
1180 int j;
6e7b3309 1181 int rules_to_fail = i;
7c2b3029
JK
1182 int short_name_len;
1183
dfefa935 1184 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
1185 continue;
1186
1187 short_name_len = strlen(short_name);
1188
6e7b3309
BW
1189 /*
1190 * in strict mode, all (except the matched one) rules
1191 * must fail to resolve to a valid non-ambiguous ref
1192 */
1193 if (strict)
1194 rules_to_fail = nr_rules;
1195
7c2b3029
JK
1196 /*
1197 * check if the short name resolves to a valid ref,
1198 * but use only rules prior to the matched one
1199 */
6e7b3309 1200 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 1201 const char *rule = ref_rev_parse_rules[j];
7c2b3029 1202
6e7b3309
BW
1203 /* skip matched rule */
1204 if (i == j)
1205 continue;
1206
7c2b3029
JK
1207 /*
1208 * the short name is ambiguous, if it resolves
1209 * (with this previous rule) to a valid ref
1210 * read_ref() returns 0 on success
1211 */
6cd4a898
JK
1212 strbuf_reset(&resolved_buf);
1213 strbuf_addf(&resolved_buf, rule,
1214 short_name_len, short_name);
1215 if (ref_exists(resolved_buf.buf))
7c2b3029
JK
1216 break;
1217 }
1218
1219 /*
1220 * short name is non-ambiguous if all previous rules
1221 * haven't resolved to a valid ref
1222 */
6cd4a898
JK
1223 if (j == rules_to_fail) {
1224 strbuf_release(&resolved_buf);
7c2b3029 1225 return short_name;
6cd4a898 1226 }
7c2b3029
JK
1227 }
1228
6cd4a898 1229 strbuf_release(&resolved_buf);
7c2b3029 1230 free(short_name);
dfefa935 1231 return xstrdup(refname);
7c2b3029 1232}
daebaa78
JH
1233
1234static struct string_list *hide_refs;
1235
1236int parse_hide_refs_config(const char *var, const char *value, const char *section)
1237{
ad8c7cda 1238 const char *key;
daebaa78 1239 if (!strcmp("transfer.hiderefs", var) ||
ad8c7cda
JK
1240 (!parse_config_key(var, section, NULL, NULL, &key) &&
1241 !strcmp(key, "hiderefs"))) {
daebaa78
JH
1242 char *ref;
1243 int len;
1244
1245 if (!value)
1246 return config_error_nonbool(var);
1247 ref = xstrdup(value);
1248 len = strlen(ref);
1249 while (len && ref[len - 1] == '/')
1250 ref[--len] = '\0';
1251 if (!hide_refs) {
1252 hide_refs = xcalloc(1, sizeof(*hide_refs));
1253 hide_refs->strdup_strings = 1;
1254 }
1255 string_list_append(hide_refs, ref);
1256 }
1257 return 0;
1258}
1259
78a766ab 1260int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1261{
2bc31d16 1262 int i;
daebaa78
JH
1263
1264 if (!hide_refs)
1265 return 0;
2bc31d16
JK
1266 for (i = hide_refs->nr - 1; i >= 0; i--) {
1267 const char *match = hide_refs->items[i].string;
78a766ab 1268 const char *subject;
2bc31d16 1269 int neg = 0;
7a40a95e 1270 const char *p;
2bc31d16
JK
1271
1272 if (*match == '!') {
1273 neg = 1;
1274 match++;
1275 }
1276
78a766ab
LF
1277 if (*match == '^') {
1278 subject = refname_full;
1279 match++;
1280 } else {
1281 subject = refname;
1282 }
1283
1284 /* refname can be NULL when namespaces are used. */
7a40a95e
CC
1285 if (subject &&
1286 skip_prefix(subject, match, &p) &&
1287 (!*p || *p == '/'))
2bc31d16 1288 return !neg;
daebaa78
JH
1289 }
1290 return 0;
1291}
fa5b1830 1292
0845122c
DT
1293const char *find_descendant_ref(const char *dirname,
1294 const struct string_list *extras,
1295 const struct string_list *skip)
fa5b1830 1296{
0845122c 1297 int pos;
fa5b1830 1298
0845122c
DT
1299 if (!extras)
1300 return NULL;
fa5b1830
MH
1301
1302 /*
0845122c
DT
1303 * Look at the place where dirname would be inserted into
1304 * extras. If there is an entry at that position that starts
1305 * with dirname (remember, dirname includes the trailing
1306 * slash) and is not in skip, then we have a conflict.
fa5b1830 1307 */
0845122c
DT
1308 for (pos = string_list_find_insert_index(extras, dirname, 0);
1309 pos < extras->nr; pos++) {
1310 const char *extra_refname = extras->items[pos].string;
fa5b1830 1311
0845122c
DT
1312 if (!starts_with(extra_refname, dirname))
1313 break;
1314
1315 if (!skip || !string_list_has_string(skip, extra_refname))
1316 return extra_refname;
fa5b1830 1317 }
0845122c
DT
1318 return NULL;
1319}
fa5b1830 1320
7d2df051
NTND
1321int refs_rename_ref_available(struct ref_store *refs,
1322 const char *old_refname,
1323 const char *new_refname)
0845122c
DT
1324{
1325 struct string_list skip = STRING_LIST_INIT_NODUP;
1326 struct strbuf err = STRBUF_INIT;
ff3a299c 1327 int ok;
fa5b1830 1328
ff3a299c 1329 string_list_insert(&skip, old_refname);
7d2df051
NTND
1330 ok = !refs_verify_refname_available(refs, new_refname,
1331 NULL, &skip, &err);
ff3a299c 1332 if (!ok)
0845122c
DT
1333 error("%s", err.buf);
1334
1335 string_list_clear(&skip, 0);
1336 strbuf_release(&err);
ff3a299c 1337 return ok;
fa5b1830 1338}
2bf68ed5 1339
62f0b399 1340int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2bf68ed5
DT
1341{
1342 struct object_id oid;
1343 int flag;
1344
62f0b399 1345 if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
34c290a6 1346 &oid, &flag))
2bf68ed5
DT
1347 return fn("HEAD", &oid, flag, cb_data);
1348
1349 return 0;
1350}
1351
1352int head_ref(each_ref_fn fn, void *cb_data)
1353{
23a3f0cb 1354 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
2bf68ed5 1355}
93770590 1356
e121b9cb
MH
1357struct ref_iterator *refs_ref_iterator_begin(
1358 struct ref_store *refs,
1359 const char *prefix, int trim, int flags)
1360{
1361 struct ref_iterator *iter;
1362
0a0865b8
MH
1363 if (ref_paranoia < 0)
1364 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
1365 if (ref_paranoia)
1366 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1367
e121b9cb 1368 iter = refs->be->iterator_begin(refs, prefix, flags);
c7599718
MH
1369
1370 /*
1371 * `iterator_begin()` already takes care of prefix, but we
1372 * might need to do some trimming:
1373 */
1374 if (trim)
1375 iter = prefix_ref_iterator_begin(iter, "", trim);
e121b9cb 1376
8738a8a4
MH
1377 /* Sanity check for subclasses: */
1378 if (!iter->ordered)
1379 BUG("reference iterator is not ordered");
1380
e121b9cb
MH
1381 return iter;
1382}
1383
4c4de895
MH
1384/*
1385 * Call fn for each reference in the specified submodule for which the
1386 * refname begins with prefix. If trim is non-zero, then trim that
1387 * many characters off the beginning of each refname before passing
1388 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1389 * include broken references in the iteration. If fn ever returns a
1390 * non-zero value, stop the iteration and return that value;
1391 * otherwise, return 0.
1392 */
7d2df051 1393static int do_for_each_ref(struct ref_store *refs, const char *prefix,
4c4de895
MH
1394 each_ref_fn fn, int trim, int flags, void *cb_data)
1395{
1396 struct ref_iterator *iter;
1397
00eebe35
MH
1398 if (!refs)
1399 return 0;
1400
e121b9cb 1401 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
4c4de895
MH
1402
1403 return do_for_each_ref_iterator(iter, fn, cb_data);
1404}
1405
7d2df051
NTND
1406int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1407{
1408 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1409}
1410
93770590
DT
1411int for_each_ref(each_ref_fn fn, void *cb_data)
1412{
23a3f0cb 1413 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
93770590
DT
1414}
1415
7d2df051
NTND
1416int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1417 each_ref_fn fn, void *cb_data)
1418{
1419 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
93770590
DT
1420}
1421
1422int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1423{
23a3f0cb 1424 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
93770590
DT
1425}
1426
1427int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1428{
1429 unsigned int flag = 0;
1430
1431 if (broken)
1432 flag = DO_FOR_EACH_INCLUDE_BROKEN;
23a3f0cb 1433 return do_for_each_ref(get_main_ref_store(the_repository),
7d2df051 1434 prefix, fn, 0, flag, cb_data);
93770590
DT
1435}
1436
073cf63c
NTND
1437int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1438 each_ref_fn fn, void *cb_data,
1439 unsigned int broken)
03df567f
MH
1440{
1441 unsigned int flag = 0;
1442
1443 if (broken)
1444 flag = DO_FOR_EACH_INCLUDE_BROKEN;
073cf63c 1445 return do_for_each_ref(refs, prefix, fn, 0, flag, cb_data);
03df567f
MH
1446}
1447
0d296c57 1448int for_each_replace_ref(struct repository *r, each_ref_fn fn, void *cb_data)
93770590 1449{
0d296c57 1450 return do_for_each_ref(get_main_ref_store(r),
7d2df051
NTND
1451 git_replace_ref_base, fn,
1452 strlen(git_replace_ref_base),
006f3f28 1453 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
93770590
DT
1454}
1455
1456int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1457{
1458 struct strbuf buf = STRBUF_INIT;
1459 int ret;
1460 strbuf_addf(&buf, "%srefs/", get_git_namespace());
23a3f0cb 1461 ret = do_for_each_ref(get_main_ref_store(the_repository),
7d2df051 1462 buf.buf, fn, 0, 0, cb_data);
93770590
DT
1463 strbuf_release(&buf);
1464 return ret;
1465}
1466
7d2df051 1467int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
93770590 1468{
7d2df051 1469 return do_for_each_ref(refs, "", fn, 0,
93770590
DT
1470 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1471}
2d0663b2 1472
7d2df051
NTND
1473int for_each_rawref(each_ref_fn fn, void *cb_data)
1474{
23a3f0cb 1475 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
7d2df051
NTND
1476}
1477
470be518 1478int refs_read_raw_ref(struct ref_store *ref_store,
99afe91a 1479 const char *refname, struct object_id *oid,
470be518
MH
1480 struct strbuf *referent, unsigned int *type)
1481{
99afe91a 1482 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent, type);
470be518
MH
1483}
1484
2d0663b2 1485/* This function needs to return a meaningful errno on failure */
7d2df051 1486const char *refs_resolve_ref_unsafe(struct ref_store *refs,
3c0cb0cb
MH
1487 const char *refname,
1488 int resolve_flags,
49e61479 1489 struct object_id *oid, int *flags)
2d0663b2
DT
1490{
1491 static struct strbuf sb_refname = STRBUF_INIT;
54fad661 1492 struct object_id unused_oid;
2d0663b2
DT
1493 int unused_flags;
1494 int symref_count;
1495
49e61479 1496 if (!oid)
1497 oid = &unused_oid;
2d0663b2
DT
1498 if (!flags)
1499 flags = &unused_flags;
1500
1501 *flags = 0;
1502
1503 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1504 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1505 !refname_is_safe(refname)) {
1506 errno = EINVAL;
1507 return NULL;
1508 }
1509
1510 /*
1511 * dwim_ref() uses REF_ISBROKEN to distinguish between
1512 * missing refs and refs that were present but invalid,
1513 * to complain about the latter to stderr.
1514 *
1515 * We don't know whether the ref exists, so don't set
1516 * REF_ISBROKEN yet.
1517 */
1518 *flags |= REF_BAD_NAME;
1519 }
1520
1521 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1522 unsigned int read_flags = 0;
1523
470be518 1524 if (refs_read_raw_ref(refs, refname,
99afe91a 1525 oid, &sb_refname, &read_flags)) {
2d0663b2 1526 *flags |= read_flags;
a1c1d817
JK
1527
1528 /* In reading mode, refs must eventually resolve */
1529 if (resolve_flags & RESOLVE_REF_READING)
1530 return NULL;
1531
1532 /*
1533 * Otherwise a missing ref is OK. But the files backend
1534 * may show errors besides ENOENT if there are
1535 * similarly-named refs.
1536 */
1537 if (errno != ENOENT &&
1538 errno != EISDIR &&
1539 errno != ENOTDIR)
2d0663b2 1540 return NULL;
a1c1d817 1541
49e61479 1542 oidclr(oid);
2d0663b2
DT
1543 if (*flags & REF_BAD_NAME)
1544 *flags |= REF_ISBROKEN;
1545 return refname;
1546 }
1547
1548 *flags |= read_flags;
1549
1550 if (!(read_flags & REF_ISSYMREF)) {
1551 if (*flags & REF_BAD_NAME) {
49e61479 1552 oidclr(oid);
2d0663b2
DT
1553 *flags |= REF_ISBROKEN;
1554 }
1555 return refname;
1556 }
1557
1558 refname = sb_refname.buf;
1559 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
49e61479 1560 oidclr(oid);
2d0663b2
DT
1561 return refname;
1562 }
1563 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1564 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1565 !refname_is_safe(refname)) {
1566 errno = EINVAL;
1567 return NULL;
1568 }
1569
1570 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1571 }
1572 }
1573
1574 errno = ELOOP;
1575 return NULL;
1576}
00eebe35 1577
6fb5acfd
DT
1578/* backend functions */
1579int refs_init_db(struct strbuf *err)
1580{
23a3f0cb 1581 struct ref_store *refs = get_main_ref_store(the_repository);
6fb5acfd
DT
1582
1583 return refs->be->init_db(refs, err);
1584}
1585
bd40dcda 1586const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
49e61479 1587 struct object_id *oid, int *flags)
bd40dcda 1588{
23a3f0cb 1589 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
49e61479 1590 resolve_flags, oid, flags);
bd40dcda
MH
1591}
1592
a8355bb7 1593int resolve_gitlink_ref(const char *submodule, const char *refname,
a98e6101 1594 struct object_id *oid)
424dcc76 1595{
424dcc76
MH
1596 struct ref_store *refs;
1597 int flags;
1598
29babbee 1599 refs = get_submodule_ref_store(submodule);
48a8475f 1600
424dcc76
MH
1601 if (!refs)
1602 return -1;
1603
49e61479 1604 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
a98e6101 1605 is_null_oid(oid))
424dcc76
MH
1606 return -1;
1607 return 0;
1608}
1609
0c064d90 1610struct ref_store_hash_entry
7d4558c4
MH
1611{
1612 struct hashmap_entry ent; /* must be the first member! */
1613
1614 struct ref_store *refs;
1615
0c064d90
NTND
1616 /* NUL-terminated identifier of the ref store: */
1617 char name[FLEX_ARRAY];
7d4558c4
MH
1618};
1619
7663cdc8
SB
1620static int ref_store_hash_cmp(const void *unused_cmp_data,
1621 const void *entry, const void *entry_or_key,
7d4558c4
MH
1622 const void *keydata)
1623{
0c064d90
NTND
1624 const struct ref_store_hash_entry *e1 = entry, *e2 = entry_or_key;
1625 const char *name = keydata ? keydata : e2->name;
7d4558c4 1626
0c064d90 1627 return strcmp(e1->name, name);
7d4558c4
MH
1628}
1629
0c064d90
NTND
1630static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1631 const char *name, struct ref_store *refs)
7d4558c4 1632{
0c064d90 1633 struct ref_store_hash_entry *entry;
7d4558c4 1634
0c064d90
NTND
1635 FLEX_ALLOC_STR(entry, name, name);
1636 hashmap_entry_init(entry, strhash(name));
7d4558c4
MH
1637 entry->refs = refs;
1638 return entry;
1639}
1640
7d4558c4
MH
1641/* A hashmap of ref_stores, stored by submodule name: */
1642static struct hashmap submodule_ref_stores;
00eebe35 1643
17eff96b
NTND
1644/* A hashmap of ref_stores, stored by worktree id: */
1645static struct hashmap worktree_ref_stores;
1646
c468da4e 1647/*
0c064d90
NTND
1648 * Look up a ref store by name. If that ref_store hasn't been
1649 * registered yet, return NULL.
c468da4e 1650 */
0c064d90
NTND
1651static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1652 const char *name)
00eebe35 1653{
0c064d90 1654 struct ref_store_hash_entry *entry;
00eebe35 1655
0c064d90 1656 if (!map->tablesize)
7d4558c4
MH
1657 /* It's initialized on demand in register_ref_store(). */
1658 return NULL;
620a66b9 1659
0c064d90 1660 entry = hashmap_get_from_hash(map, strhash(name), name);
7d4558c4 1661 return entry ? entry->refs : NULL;
00eebe35
MH
1662}
1663
c468da4e
MH
1664/*
1665 * Create, record, and return a ref_store instance for the specified
5d0bc90e 1666 * gitdir.
c468da4e 1667 */
9e7ec634
NTND
1668static struct ref_store *ref_store_init(const char *gitdir,
1669 unsigned int flags)
00eebe35
MH
1670{
1671 const char *be_name = "files";
1672 struct ref_storage_be *be = find_ref_storage_backend(be_name);
ba88add5 1673 struct ref_store *refs;
00eebe35
MH
1674
1675 if (!be)
033abf97 1676 BUG("reference backend %s is unknown", be_name);
00eebe35 1677
9e7ec634 1678 refs = be->init(gitdir, flags);
ba88add5 1679 return refs;
00eebe35
MH
1680}
1681
64a74161 1682struct ref_store *get_main_ref_store(struct repository *r)
24c8407e 1683{
64a74161
SB
1684 if (r->refs)
1685 return r->refs;
24c8407e 1686
2dc417ab
JK
1687 if (!r->gitdir)
1688 BUG("attempting to get main_ref_store outside of repository");
1689
64a74161
SB
1690 r->refs = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
1691 return r->refs;
378dc910
NTND
1692}
1693
1694/*
0c064d90
NTND
1695 * Associate a ref store with a name. It is a fatal error to call this
1696 * function twice for the same name.
378dc910 1697 */
0c064d90
NTND
1698static void register_ref_store_map(struct hashmap *map,
1699 const char *type,
1700 struct ref_store *refs,
1701 const char *name)
378dc910 1702{
0c064d90 1703 if (!map->tablesize)
7663cdc8 1704 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
378dc910 1705
0c064d90 1706 if (hashmap_put(map, alloc_ref_store_hash_entry(name, refs)))
033abf97 1707 BUG("%s ref_store '%s' initialized twice", type, name);
24c8407e
NTND
1708}
1709
18d0002d 1710struct ref_store *get_submodule_ref_store(const char *submodule)
00eebe35 1711{
126c9e05 1712 struct strbuf submodule_sb = STRBUF_INIT;
00eebe35 1713 struct ref_store *refs;
29babbee
NTND
1714 char *to_free = NULL;
1715 size_t len;
00eebe35 1716
82a150f2
NTND
1717 if (!submodule)
1718 return NULL;
1719
873ea90d
NTND
1720 len = strlen(submodule);
1721 while (len && is_dir_sep(submodule[len - 1]))
1722 len--;
1723 if (!len)
1724 return NULL;
00eebe35 1725
29babbee
NTND
1726 if (submodule[len])
1727 /* We need to strip off one or more trailing slashes */
1728 submodule = to_free = xmemdupz(submodule, len);
00eebe35 1729
0c064d90 1730 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
126c9e05 1731 if (refs)
2c616c17 1732 goto done;
00eebe35 1733
126c9e05 1734 strbuf_addstr(&submodule_sb, submodule);
2c616c17
NTND
1735 if (!is_nonbare_repository_dir(&submodule_sb))
1736 goto done;
00eebe35 1737
2c616c17
NTND
1738 if (submodule_to_gitdir(&submodule_sb, submodule))
1739 goto done;
00eebe35 1740
9e7ec634
NTND
1741 /* assume that add_submodule_odb() has been called */
1742 refs = ref_store_init(submodule_sb.buf,
1743 REF_STORE_READ | REF_STORE_ODB);
0c064d90
NTND
1744 register_ref_store_map(&submodule_ref_stores, "submodule",
1745 refs, submodule);
5d0bc90e 1746
2c616c17 1747done:
5d0bc90e 1748 strbuf_release(&submodule_sb);
29babbee
NTND
1749 free(to_free);
1750
00eebe35
MH
1751 return refs;
1752}
1753
17eff96b
NTND
1754struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1755{
1756 struct ref_store *refs;
1757 const char *id;
1758
1759 if (wt->is_current)
23a3f0cb 1760 return get_main_ref_store(the_repository);
17eff96b
NTND
1761
1762 id = wt->id ? wt->id : "/";
1763 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1764 if (refs)
1765 return refs;
1766
1767 if (wt->id)
1768 refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
1769 REF_STORE_ALL_CAPS);
1770 else
1771 refs = ref_store_init(get_git_common_dir(),
1772 REF_STORE_ALL_CAPS);
1773
1774 if (refs)
1775 register_ref_store_map(&worktree_ref_stores, "worktree",
1776 refs, id);
1777 return refs;
1778}
1779
620a66b9 1780void base_ref_store_init(struct ref_store *refs,
fbfd0a29 1781 const struct ref_storage_be *be)
00eebe35 1782{
620a66b9 1783 refs->be = be;
00eebe35 1784}
127b42a1
RS
1785
1786/* backend functions */
7d2df051 1787int refs_pack_refs(struct ref_store *refs, unsigned int flags)
8231527e 1788{
8231527e
MH
1789 return refs->be->pack_refs(refs, flags);
1790}
1791
7d2df051 1792int refs_peel_ref(struct ref_store *refs, const char *refname,
b420d909 1793 struct object_id *oid)
7d2df051 1794{
ba1c052f 1795 int flag;
34c290a6 1796 struct object_id base;
ba1c052f
MH
1797
1798 if (current_ref_iter && current_ref_iter->refname == refname) {
1799 struct object_id peeled;
1800
1801 if (ref_iterator_peel(current_ref_iter, &peeled))
1802 return -1;
b420d909 1803 oidcpy(oid, &peeled);
ba1c052f
MH
1804 return 0;
1805 }
1806
1807 if (refs_read_ref_full(refs, refname,
34c290a6 1808 RESOLVE_REF_READING, &base, &flag))
ba1c052f
MH
1809 return -1;
1810
ac2ed0d7 1811 return peel_object(&base, oid);
8231527e
MH
1812}
1813
b420d909 1814int peel_ref(const char *refname, struct object_id *oid)
bd427cf2 1815{
23a3f0cb 1816 return refs_peel_ref(get_main_ref_store(the_repository), refname, oid);
7d2df051 1817}
bd427cf2 1818
7d2df051
NTND
1819int refs_create_symref(struct ref_store *refs,
1820 const char *ref_target,
1821 const char *refs_heads_master,
1822 const char *logmsg)
1823{
1824 return refs->be->create_symref(refs, ref_target,
1825 refs_heads_master,
1826 logmsg);
bd427cf2
MH
1827}
1828
284689ba
MH
1829int create_symref(const char *ref_target, const char *refs_heads_master,
1830 const char *logmsg)
1831{
23a3f0cb 1832 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
7d2df051 1833 refs_heads_master, logmsg);
284689ba
MH
1834}
1835
2ced105c
MH
1836int ref_update_reject_duplicates(struct string_list *refnames,
1837 struct strbuf *err)
1838{
a552e50e 1839 size_t i, n = refnames->nr;
2ced105c
MH
1840
1841 assert(err);
1842
8556f8d6
MH
1843 for (i = 1; i < n; i++) {
1844 int cmp = strcmp(refnames->items[i - 1].string,
1845 refnames->items[i].string);
1846
1847 if (!cmp) {
2ced105c
MH
1848 strbuf_addf(err,
1849 "multiple updates for ref '%s' not allowed.",
1850 refnames->items[i].string);
1851 return 1;
8556f8d6 1852 } else if (cmp > 0) {
033abf97 1853 BUG("ref_update_reject_duplicates() received unsorted list");
2ced105c 1854 }
8556f8d6 1855 }
2ced105c
MH
1856 return 0;
1857}
1858
30173b88
MH
1859int ref_transaction_prepare(struct ref_transaction *transaction,
1860 struct strbuf *err)
127b42a1 1861{
c0fe4e8b 1862 struct ref_store *refs = transaction->ref_store;
127b42a1 1863
8d4240d3
MH
1864 switch (transaction->state) {
1865 case REF_TRANSACTION_OPEN:
1866 /* Good. */
1867 break;
30173b88 1868 case REF_TRANSACTION_PREPARED:
033abf97 1869 BUG("prepare called twice on reference transaction");
30173b88 1870 break;
8d4240d3 1871 case REF_TRANSACTION_CLOSED:
033abf97 1872 BUG("prepare called on a closed reference transaction");
8d4240d3
MH
1873 break;
1874 default:
033abf97 1875 BUG("unexpected reference transaction state");
8d4240d3
MH
1876 break;
1877 }
1878
d8f4481c
JK
1879 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
1880 strbuf_addstr(err,
1881 _("ref updates forbidden inside quarantine environment"));
1882 return -1;
1883 }
1884
30173b88
MH
1885 return refs->be->transaction_prepare(refs, transaction, err);
1886}
1887
1888int ref_transaction_abort(struct ref_transaction *transaction,
1889 struct strbuf *err)
1890{
1891 struct ref_store *refs = transaction->ref_store;
1892 int ret = 0;
1893
1894 switch (transaction->state) {
1895 case REF_TRANSACTION_OPEN:
1896 /* No need to abort explicitly. */
1897 break;
1898 case REF_TRANSACTION_PREPARED:
1899 ret = refs->be->transaction_abort(refs, transaction, err);
1900 break;
1901 case REF_TRANSACTION_CLOSED:
033abf97 1902 BUG("abort called on a closed reference transaction");
30173b88
MH
1903 break;
1904 default:
033abf97 1905 BUG("unexpected reference transaction state");
30173b88
MH
1906 break;
1907 }
1908
1909 ref_transaction_free(transaction);
1910 return ret;
1911}
1912
1913int ref_transaction_commit(struct ref_transaction *transaction,
1914 struct strbuf *err)
1915{
1916 struct ref_store *refs = transaction->ref_store;
1917 int ret;
1918
1919 switch (transaction->state) {
1920 case REF_TRANSACTION_OPEN:
1921 /* Need to prepare first. */
1922 ret = ref_transaction_prepare(transaction, err);
1923 if (ret)
1924 return ret;
1925 break;
1926 case REF_TRANSACTION_PREPARED:
1927 /* Fall through to finish. */
1928 break;
1929 case REF_TRANSACTION_CLOSED:
033abf97 1930 BUG("commit called on a closed reference transaction");
30173b88
MH
1931 break;
1932 default:
033abf97 1933 BUG("unexpected reference transaction state");
30173b88
MH
1934 break;
1935 }
1936
1937 return refs->be->transaction_finish(refs, transaction, err);
127b42a1 1938}
62665823 1939
7d2df051
NTND
1940int refs_verify_refname_available(struct ref_store *refs,
1941 const char *refname,
b05855b5 1942 const struct string_list *extras,
7d2df051
NTND
1943 const struct string_list *skip,
1944 struct strbuf *err)
62665823 1945{
b05855b5
MH
1946 const char *slash;
1947 const char *extra_refname;
1948 struct strbuf dirname = STRBUF_INIT;
1949 struct strbuf referent = STRBUF_INIT;
1950 struct object_id oid;
1951 unsigned int type;
1952 struct ref_iterator *iter;
1953 int ok;
1954 int ret = -1;
1955
1956 /*
1957 * For the sake of comments in this function, suppose that
1958 * refname is "refs/foo/bar".
1959 */
1960
1961 assert(err);
1962
1963 strbuf_grow(&dirname, strlen(refname) + 1);
1964 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
1965 /* Expand dirname to the new prefix, not including the trailing slash: */
1966 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
1967
1968 /*
1969 * We are still at a leading dir of the refname (e.g.,
1970 * "refs/foo"; if there is a reference with that name,
1971 * it is a conflict, *unless* it is in skip.
1972 */
1973 if (skip && string_list_has_string(skip, dirname.buf))
1974 continue;
1975
99afe91a 1976 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent, &type)) {
b05855b5
MH
1977 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1978 dirname.buf, refname);
1979 goto cleanup;
1980 }
1981
1982 if (extras && string_list_has_string(extras, dirname.buf)) {
1983 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1984 refname, dirname.buf);
1985 goto cleanup;
1986 }
1987 }
1988
1989 /*
1990 * We are at the leaf of our refname (e.g., "refs/foo/bar").
1991 * There is no point in searching for a reference with that
1992 * name, because a refname isn't considered to conflict with
1993 * itself. But we still need to check for references whose
1994 * names are in the "refs/foo/bar/" namespace, because they
1995 * *do* conflict.
1996 */
1997 strbuf_addstr(&dirname, refname + dirname.len);
1998 strbuf_addch(&dirname, '/');
1999
2000 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2001 DO_FOR_EACH_INCLUDE_BROKEN);
2002 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2003 if (skip &&
2004 string_list_has_string(skip, iter->refname))
2005 continue;
2006
2007 strbuf_addf(err, "'%s' exists; cannot create '%s'",
2008 iter->refname, refname);
2009 ref_iterator_abort(iter);
2010 goto cleanup;
2011 }
2012
2013 if (ok != ITER_DONE)
033abf97 2014 BUG("error while iterating over references");
b05855b5
MH
2015
2016 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2017 if (extra_refname)
2018 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
2019 refname, extra_refname);
2020 else
2021 ret = 0;
2022
2023cleanup:
2024 strbuf_release(&referent);
2025 strbuf_release(&dirname);
2026 return ret;
62665823 2027}
e3688bd6 2028
7d2df051 2029int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
e3688bd6 2030{
e3688bd6
DT
2031 struct ref_iterator *iter;
2032
2033 iter = refs->be->reflog_iterator_begin(refs);
2034
2035 return do_for_each_ref_iterator(iter, fn, cb_data);
2036}
2037
7d2df051 2038int for_each_reflog(each_ref_fn fn, void *cb_data)
e3688bd6 2039{
23a3f0cb 2040 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
7d2df051 2041}
e3688bd6 2042
7d2df051
NTND
2043int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2044 const char *refname,
2045 each_reflog_ent_fn fn,
2046 void *cb_data)
2047{
e3688bd6
DT
2048 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2049 fn, cb_data);
2050}
2051
7d2df051
NTND
2052int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2053 void *cb_data)
2054{
23a3f0cb 2055 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
7d2df051
NTND
2056 refname, fn, cb_data);
2057}
2058
2059int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2060 each_reflog_ent_fn fn, void *cb_data)
2061{
2062 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2063}
2064
e3688bd6
DT
2065int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2066 void *cb_data)
2067{
23a3f0cb 2068 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
7d2df051
NTND
2069 fn, cb_data);
2070}
e3688bd6 2071
7d2df051
NTND
2072int refs_reflog_exists(struct ref_store *refs, const char *refname)
2073{
2074 return refs->be->reflog_exists(refs, refname);
e3688bd6
DT
2075}
2076
2077int reflog_exists(const char *refname)
2078{
23a3f0cb 2079 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
7d2df051 2080}
e3688bd6 2081
7d2df051
NTND
2082int refs_create_reflog(struct ref_store *refs, const char *refname,
2083 int force_create, struct strbuf *err)
2084{
2085 return refs->be->create_reflog(refs, refname, force_create, err);
e3688bd6
DT
2086}
2087
2088int safe_create_reflog(const char *refname, int force_create,
2089 struct strbuf *err)
2090{
23a3f0cb 2091 return refs_create_reflog(get_main_ref_store(the_repository), refname,
7d2df051
NTND
2092 force_create, err);
2093}
e3688bd6 2094
7d2df051
NTND
2095int refs_delete_reflog(struct ref_store *refs, const char *refname)
2096{
2097 return refs->be->delete_reflog(refs, refname);
e3688bd6
DT
2098}
2099
2100int delete_reflog(const char *refname)
2101{
23a3f0cb 2102 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
7d2df051 2103}
e3688bd6 2104
7d2df051 2105int refs_reflog_expire(struct ref_store *refs,
0155f710 2106 const char *refname, const struct object_id *oid,
7d2df051
NTND
2107 unsigned int flags,
2108 reflog_expiry_prepare_fn prepare_fn,
2109 reflog_expiry_should_prune_fn should_prune_fn,
2110 reflog_expiry_cleanup_fn cleanup_fn,
2111 void *policy_cb_data)
2112{
0155f710 2113 return refs->be->reflog_expire(refs, refname, oid, flags,
7d2df051
NTND
2114 prepare_fn, should_prune_fn,
2115 cleanup_fn, policy_cb_data);
e3688bd6
DT
2116}
2117
0155f710 2118int reflog_expire(const char *refname, const struct object_id *oid,
e3688bd6
DT
2119 unsigned int flags,
2120 reflog_expiry_prepare_fn prepare_fn,
2121 reflog_expiry_should_prune_fn should_prune_fn,
2122 reflog_expiry_cleanup_fn cleanup_fn,
2123 void *policy_cb_data)
2124{
23a3f0cb 2125 return refs_reflog_expire(get_main_ref_store(the_repository),
0155f710 2126 refname, oid, flags,
7d2df051
NTND
2127 prepare_fn, should_prune_fn,
2128 cleanup_fn, policy_cb_data);
e3688bd6 2129}
fc681463
DT
2130
2131int initial_ref_transaction_commit(struct ref_transaction *transaction,
2132 struct strbuf *err)
2133{
c0fe4e8b 2134 struct ref_store *refs = transaction->ref_store;
fc681463
DT
2135
2136 return refs->be->initial_transaction_commit(refs, transaction, err);
2137}
a27dcf89 2138
64da4199
MH
2139int refs_delete_refs(struct ref_store *refs, const char *msg,
2140 struct string_list *refnames, unsigned int flags)
a27dcf89 2141{
64da4199 2142 return refs->be->delete_refs(refs, msg, refnames, flags);
a27dcf89 2143}
9b6b40d9 2144
64da4199
MH
2145int delete_refs(const char *msg, struct string_list *refnames,
2146 unsigned int flags)
9b6b40d9 2147{
23a3f0cb 2148 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
7d2df051 2149}
9b6b40d9 2150
7d2df051
NTND
2151int refs_rename_ref(struct ref_store *refs, const char *oldref,
2152 const char *newref, const char *logmsg)
2153{
9b6b40d9
DT
2154 return refs->be->rename_ref(refs, oldref, newref, logmsg);
2155}
7d2df051
NTND
2156
2157int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2158{
23a3f0cb 2159 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
7d2df051 2160}
52d59cc6
SD
2161
2162int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2163 const char *newref, const char *logmsg)
2164{
2165 return refs->be->copy_ref(refs, oldref, newref, logmsg);
2166}
2167
2168int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2169{
23a3f0cb 2170 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
52d59cc6 2171}