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