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