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