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