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