]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
Merge branch 'js/misc-fixes'
[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"
67541597 12#include "run-command.h"
5e3aba33 13#include "hook.h"
cbd53a21 14#include "object-store.h"
cf0adba7
JH
15#include "object.h"
16#include "tag.h"
5d0bc90e 17#include "submodule.h"
17eff96b 18#include "worktree.h"
dbbcd44f 19#include "strvec.h"
23a3f0cb 20#include "repository.h"
67541597 21#include "sigchain.h"
88c7b4c3 22#include "date.h"
3581d793 23
3dce444f
RS
24/*
25 * List of all available backends
26 */
27static struct ref_storage_be *refs_backends = &refs_be_files;
28
29static struct ref_storage_be *find_ref_storage_backend(const char *name)
30{
31 struct ref_storage_be *be;
32 for (be = refs_backends; be; be = be->next)
33 if (!strcmp(be->name, name))
34 return be;
35 return 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 64 *
1de16aec 65 * - it begins with ".", or
bc5fd6d3 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
1de16aec
NTND
73 *
74 * When sanitized is not NULL, instead of rejecting the input refname
75 * as an error, try to come up with a usable replacement for the input
76 * refname in it.
bc5fd6d3 77 */
1de16aec
NTND
78static int check_refname_component(const char *refname, int *flags,
79 struct strbuf *sanitized)
bc5fd6d3
MH
80{
81 const char *cp;
82 char last = '\0';
1de16aec
NTND
83 size_t component_start = 0; /* garbage - not a reasonable initial value */
84
85 if (sanitized)
86 component_start = sanitized->len;
bc5fd6d3
MH
87
88 for (cp = refname; ; cp++) {
dde8a902
DT
89 int ch = *cp & 255;
90 unsigned char disp = refname_disposition[ch];
1de16aec
NTND
91
92 if (sanitized && disp != 1)
93 strbuf_addch(sanitized, ch);
94
dde8a902 95 switch (disp) {
5e650228 96 case 1:
dde8a902 97 goto out;
5e650228 98 case 2:
1de16aec
NTND
99 if (last == '.') { /* Refname contains "..". */
100 if (sanitized)
101 /* collapse ".." to single "." */
102 strbuf_setlen(sanitized, sanitized->len - 1);
103 else
104 return -1;
105 }
dde8a902 106 break;
5e650228 107 case 3:
1de16aec
NTND
108 if (last == '@') { /* Refname contains "@{". */
109 if (sanitized)
110 sanitized->buf[sanitized->len-1] = '-';
111 else
112 return -1;
113 }
bc5fd6d3 114 break;
5e650228 115 case 4:
1de16aec
NTND
116 /* forbidden char */
117 if (sanitized)
118 sanitized->buf[sanitized->len-1] = '-';
119 else
120 return -1;
121 break;
cd377f45 122 case 5:
1de16aec
NTND
123 if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
124 /* refspec can't be a pattern */
125 if (sanitized)
126 sanitized->buf[sanitized->len-1] = '-';
127 else
128 return -1;
129 }
cd377f45
JK
130
131 /*
132 * Unset the pattern flag so that we only accept
133 * a single asterisk for one side of refspec.
134 */
135 *flags &= ~ REFNAME_REFSPEC_PATTERN;
136 break;
dde8a902 137 }
bc5fd6d3
MH
138 last = ch;
139 }
dde8a902 140out:
bc5fd6d3 141 if (cp == refname)
dac529e4 142 return 0; /* Component has zero length. */
1de16aec
NTND
143
144 if (refname[0] == '.') { /* Component starts with '.'. */
145 if (sanitized)
146 sanitized->buf[component_start] = '-';
147 else
148 return -1;
149 }
7108ad23 150 if (cp - refname >= LOCK_SUFFIX_LEN &&
1de16aec
NTND
151 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
152 if (!sanitized)
153 return -1;
154 /* Refname ends with ".lock". */
155 while (strbuf_strip_suffix(sanitized, LOCK_SUFFIX)) {
156 /* try again in case we have .lock.lock */
157 }
158 }
bc5fd6d3
MH
159 return cp - refname;
160}
161
1de16aec
NTND
162static int check_or_sanitize_refname(const char *refname, int flags,
163 struct strbuf *sanitized)
bc5fd6d3
MH
164{
165 int component_len, component_count = 0;
166
1de16aec 167 if (!strcmp(refname, "@")) {
9ba89f48 168 /* Refname is a single character '@'. */
1de16aec
NTND
169 if (sanitized)
170 strbuf_addch(sanitized, '-');
171 else
172 return -1;
173 }
9ba89f48 174
bc5fd6d3 175 while (1) {
1de16aec
NTND
176 if (sanitized && sanitized->len)
177 strbuf_complete(sanitized, '/');
178
bc5fd6d3 179 /* We are at the start of a path component. */
1de16aec
NTND
180 component_len = check_refname_component(refname, &flags,
181 sanitized);
182 if (sanitized && component_len == 0)
183 ; /* OK, omit empty component */
184 else if (component_len <= 0)
cd377f45
JK
185 return -1;
186
bc5fd6d3
MH
187 component_count++;
188 if (refname[component_len] == '\0')
189 break;
190 /* Skip to next component. */
191 refname += component_len + 1;
192 }
193
1de16aec
NTND
194 if (refname[component_len - 1] == '.') {
195 /* Refname ends with '.'. */
196 if (sanitized)
197 ; /* omit ending dot */
198 else
199 return -1;
200 }
bc5fd6d3
MH
201 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
202 return -1; /* Refname has only one component. */
203 return 0;
204}
205
1de16aec
NTND
206int check_refname_format(const char *refname, int flags)
207{
208 return check_or_sanitize_refname(refname, flags, NULL);
209}
210
211void sanitize_refname_component(const char *refname, struct strbuf *out)
212{
213 if (check_or_sanitize_refname(refname, REFNAME_ALLOW_ONELEVEL, out))
214 BUG("sanitizing refname '%s' check returned error", refname);
215}
216
4cb77009 217int refname_is_safe(const char *refname)
d0f810f0 218{
39950fef
MH
219 const char *rest;
220
221 if (skip_prefix(refname, "refs/", &rest)) {
d0f810f0
RS
222 char *buf;
223 int result;
e40f3557
MH
224 size_t restlen = strlen(rest);
225
226 /* rest must not be empty, or start or end with "/" */
227 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
228 return 0;
d0f810f0 229
d0f810f0
RS
230 /*
231 * Does the refname try to escape refs/?
232 * For example: refs/foo/../bar is safe but refs/foo/../../bar
233 * is not.
234 */
e40f3557
MH
235 buf = xmallocz(restlen);
236 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
d0f810f0
RS
237 free(buf);
238 return result;
239 }
35db25c6
MH
240
241 do {
d0f810f0
RS
242 if (!isupper(*refname) && *refname != '_')
243 return 0;
244 refname++;
35db25c6 245 } while (*refname);
d0f810f0
RS
246 return 1;
247}
248
67be7c5a
MH
249/*
250 * Return true if refname, which has the specified oid and flags, can
251 * be resolved to an object in the database. If the referred-to object
252 * does not exist, emit a warning and return false.
253 */
254int ref_resolves_to_object(const char *refname,
9bc45a28 255 struct repository *repo,
67be7c5a
MH
256 const struct object_id *oid,
257 unsigned int flags)
258{
259 if (flags & REF_ISBROKEN)
260 return 0;
9bc45a28 261 if (!repo_has_object_file(repo, oid)) {
661558f0 262 error(_("%s does not point to a valid object!"), refname);
67be7c5a
MH
263 return 0;
264 }
265 return 1;
266}
267
7d2df051
NTND
268char *refs_resolve_refdup(struct ref_store *refs,
269 const char *refname, int resolve_flags,
0f2dc722 270 struct object_id *oid, int *flags)
7d2df051
NTND
271{
272 const char *result;
273
274 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
ce14de03 275 oid, flags);
7d2df051
NTND
276 return xstrdup_or_null(result);
277}
278
7bd9bcf3 279char *resolve_refdup(const char *refname, int resolve_flags,
0f2dc722 280 struct object_id *oid, int *flags)
e1e22e37 281{
23a3f0cb 282 return refs_resolve_refdup(get_main_ref_store(the_repository),
7d2df051 283 refname, resolve_flags,
0f2dc722 284 oid, flags);
cddc4258
MH
285}
286
7bd9bcf3
MH
287/* The argument to filter_refs */
288struct ref_filter {
289 const char *pattern;
9ab9b5df 290 const char *prefix;
7bd9bcf3
MH
291 each_ref_fn *fn;
292 void *cb_data;
293};
432ad41e 294
76887df0 295int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
732134ed 296{
76887df0
ÆAB
297 struct ref_store *refs = get_main_ref_store(the_repository);
298
f1da24ca 299 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
ce14de03 300 oid, flags))
7bd9bcf3
MH
301 return 0;
302 return -1;
732134ed
MH
303}
304
34c290a6 305int read_ref(const char *refname, struct object_id *oid)
cddc4258 306{
34c290a6 307 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
c774aab9
JP
308}
309
3f9f1acc 310int refs_ref_exists(struct ref_store *refs, const char *refname)
b3cd33d0 311{
f1da24ca 312 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
ce14de03 313 NULL, NULL);
b3cd33d0
NTND
314}
315
7bd9bcf3 316int ref_exists(const char *refname)
bc5fd6d3 317{
b3cd33d0 318 return refs_ref_exists(get_main_ref_store(the_repository), refname);
bc5fd6d3
MH
319}
320
7bd9bcf3
MH
321static int filter_refs(const char *refname, const struct object_id *oid,
322 int flags, void *data)
432ad41e 323{
7bd9bcf3
MH
324 struct ref_filter *filter = (struct ref_filter *)data;
325
55d34269 326 if (wildmatch(filter->pattern, refname, 0))
7bd9bcf3 327 return 0;
9ab9b5df
RA
328 if (filter->prefix)
329 skip_prefix(refname, filter->prefix, &refname);
7bd9bcf3 330 return filter->fn(refname, oid, flags, filter->cb_data);
432ad41e
MH
331}
332
ac2ed0d7 333enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
c774aab9 334{
45a187cc 335 struct object *o = lookup_unknown_object(the_repository, name);
c774aab9 336
7bd9bcf3 337 if (o->type == OBJ_NONE) {
0df8e965 338 int type = oid_object_info(the_repository, name, NULL);
6da43d93 339 if (type < 0 || !object_as_type(o, type, 0))
7bd9bcf3
MH
340 return PEEL_INVALID;
341 }
bc5fd6d3 342
7bd9bcf3
MH
343 if (o->type != OBJ_TAG)
344 return PEEL_NON_TAG;
e1980c9d 345
7bd9bcf3
MH
346 o = deref_tag_noverify(o);
347 if (!o)
348 return PEEL_INVALID;
349
ac2ed0d7 350 oidcpy(oid, &o->oid);
7bd9bcf3 351 return PEEL_PEELED;
e1980c9d
JH
352}
353
7bd9bcf3
MH
354struct warn_if_dangling_data {
355 FILE *fp;
356 const char *refname;
357 const struct string_list *refnames;
358 const char *msg_fmt;
359};
bc5fd6d3 360
7bd9bcf3
MH
361static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
362 int flags, void *cb_data)
363{
364 struct warn_if_dangling_data *d = cb_data;
365 const char *resolves_to;
bc5fd6d3 366
7bd9bcf3
MH
367 if (!(flags & REF_ISSYMREF))
368 return 0;
bc5fd6d3 369
744c040b 370 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
7bd9bcf3
MH
371 if (!resolves_to
372 || (d->refname
373 ? strcmp(resolves_to, d->refname)
374 : !string_list_has_string(d->refnames, resolves_to))) {
375 return 0;
376 }
bc5fd6d3 377
7bd9bcf3
MH
378 fprintf(d->fp, d->msg_fmt, refname);
379 fputc('\n', d->fp);
380 return 0;
bc5fd6d3
MH
381}
382
7bd9bcf3 383void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
f348ac92 384{
7bd9bcf3
MH
385 struct warn_if_dangling_data data;
386
387 data.fp = fp;
388 data.refname = refname;
389 data.refnames = NULL;
390 data.msg_fmt = msg_fmt;
391 for_each_rawref(warn_if_dangling_symref, &data);
f348ac92
MH
392}
393
7bd9bcf3 394void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
432ad41e 395{
7bd9bcf3 396 struct warn_if_dangling_data data;
432ad41e 397
7bd9bcf3
MH
398 data.fp = fp;
399 data.refname = NULL;
400 data.refnames = refnames;
401 data.msg_fmt = msg_fmt;
402 for_each_rawref(warn_if_dangling_symref, &data);
432ad41e
MH
403}
404
7d2df051
NTND
405int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
406{
407 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
408}
409
7bd9bcf3 410int for_each_tag_ref(each_ref_fn fn, void *cb_data)
432ad41e 411{
23a3f0cb 412 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
432ad41e
MH
413}
414
7d2df051
NTND
415int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
416{
417 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
432ad41e
MH
418}
419
7bd9bcf3 420int for_each_branch_ref(each_ref_fn fn, void *cb_data)
432ad41e 421{
23a3f0cb 422 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
432ad41e
MH
423}
424
7d2df051
NTND
425int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
426{
427 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
202a56a9 428}
432ad41e 429
7bd9bcf3 430int for_each_remote_ref(each_ref_fn fn, void *cb_data)
e9c4c111 431{
23a3f0cb 432 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
202a56a9
MH
433}
434
7bd9bcf3
MH
435int head_ref_namespaced(each_ref_fn fn, void *cb_data)
436{
437 struct strbuf buf = STRBUF_INIT;
438 int ret = 0;
439 struct object_id oid;
440 int flag;
c774aab9 441
7bd9bcf3 442 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
34c290a6 443 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
7bd9bcf3
MH
444 ret = fn(buf.buf, &oid, flag, cb_data);
445 strbuf_release(&buf);
c774aab9 446
7bd9bcf3 447 return ret;
e9c4c111 448}
c774aab9 449
65516f58
RA
450void normalize_glob_ref(struct string_list_item *item, const char *prefix,
451 const char *pattern)
452{
453 struct strbuf normalized_pattern = STRBUF_INIT;
454
455 if (*pattern == '/')
456 BUG("pattern must not start with '/'");
457
458 if (prefix) {
459 strbuf_addstr(&normalized_pattern, prefix);
460 }
461 else if (!starts_with(pattern, "refs/"))
462 strbuf_addstr(&normalized_pattern, "refs/");
463 strbuf_addstr(&normalized_pattern, pattern);
464 strbuf_strip_suffix(&normalized_pattern, "/");
465
466 item->string = strbuf_detach(&normalized_pattern, NULL);
467 item->util = has_glob_specials(pattern) ? NULL : item->string;
468 strbuf_release(&normalized_pattern);
469}
470
7bd9bcf3
MH
471int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
472 const char *prefix, void *cb_data)
662428f4 473{
7bd9bcf3
MH
474 struct strbuf real_pattern = STRBUF_INIT;
475 struct ref_filter filter;
476 int ret;
d08bae7e 477
59556548 478 if (!prefix && !starts_with(pattern, "refs/"))
d08bae7e 479 strbuf_addstr(&real_pattern, "refs/");
b09fe971
IL
480 else if (prefix)
481 strbuf_addstr(&real_pattern, prefix);
d08bae7e
IL
482 strbuf_addstr(&real_pattern, pattern);
483
894a9d33 484 if (!has_glob_specials(pattern)) {
9517e6b8 485 /* Append implied '/' '*' if not present. */
00b6c178 486 strbuf_complete(&real_pattern, '/');
d08bae7e
IL
487 /* No need to check for '*', there is none. */
488 strbuf_addch(&real_pattern, '*');
489 }
490
491 filter.pattern = real_pattern.buf;
9ab9b5df 492 filter.prefix = prefix;
d08bae7e
IL
493 filter.fn = fn;
494 filter.cb_data = cb_data;
495 ret = for_each_ref(filter_refs, &filter);
496
497 strbuf_release(&real_pattern);
498 return ret;
499}
500
b09fe971
IL
501int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
502{
503 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
504}
505
4577e483 506const char *prettify_refname(const char *name)
a9c37a72 507{
3e5b36c6
SG
508 if (skip_prefix(name, "refs/heads/", &name) ||
509 skip_prefix(name, "refs/tags/", &name) ||
510 skip_prefix(name, "refs/remotes/", &name))
511 ; /* nothing */
512 return name;
a9c37a72
DB
513}
514
54457fe5 515static const char *ref_rev_parse_rules[] = {
79803322
SP
516 "%.*s",
517 "refs/%.*s",
518 "refs/tags/%.*s",
519 "refs/heads/%.*s",
520 "refs/remotes/%.*s",
521 "refs/remotes/%.*s/HEAD",
522 NULL
523};
524
60650a48
JH
525#define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
526
527/*
528 * Is it possible that the caller meant full_name with abbrev_name?
529 * If so return a non-zero value to signal "yes"; the magnitude of
530 * the returned value gives the precedence used for disambiguation.
531 *
532 * If abbrev_name cannot mean full_name, return 0.
533 */
54457fe5 534int refname_match(const char *abbrev_name, const char *full_name)
79803322
SP
535{
536 const char **p;
537 const int abbrev_name_len = strlen(abbrev_name);
60650a48 538 const int num_rules = NUM_REV_PARSE_RULES;
79803322 539
60650a48
JH
540 for (p = ref_rev_parse_rules; *p; p++)
541 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
542 return &ref_rev_parse_rules[num_rules] - p;
79803322
SP
543
544 return 0;
545}
546
b4be7410
BW
547/*
548 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
549 * the results to 'prefixes'
550 */
c972bf4c 551void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
b4be7410
BW
552{
553 const char **p;
554 int len = strlen(prefix);
555
556 for (p = ref_rev_parse_rules; *p; p++)
c972bf4c 557 strvec_pushf(prefixes, *p, len, prefix);
b4be7410
BW
558}
559
675704c7
JS
560static const char default_branch_name_advice[] = N_(
561"Using '%s' as the name for the initial branch. This default branch name\n"
562"is subject to change. To configure the initial branch name to use in all\n"
563"of your new repositories, which will suppress this warning, call:\n"
564"\n"
565"\tgit config --global init.defaultBranch <name>\n"
566"\n"
567"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
568"'development'. The just-created branch can be renamed via this command:\n"
569"\n"
570"\tgit branch -m <name>\n"
571);
572
cc0f13c5 573char *repo_default_branch_name(struct repository *r, int quiet)
8747ebb7
DGW
574{
575 const char *config_key = "init.defaultbranch";
576 const char *config_display_key = "init.defaultBranch";
577 char *ret = NULL, *full_ref;
704fed9e 578 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
8747ebb7 579
704fed9e
JS
580 if (env && *env)
581 ret = xstrdup(env);
582 else if (repo_config_get_string(r, config_key, &ret) < 0)
8747ebb7
DGW
583 die(_("could not retrieve `%s`"), config_display_key);
584
675704c7 585 if (!ret) {
8747ebb7 586 ret = xstrdup("master");
675704c7
JS
587 if (!quiet)
588 advise(_(default_branch_name_advice), ret);
589 }
8747ebb7
DGW
590
591 full_ref = xstrfmt("refs/heads/%s", ret);
592 if (check_refname_format(full_ref, 0))
593 die(_("invalid branch name: %s = %s"), config_display_key, ret);
594 free(full_ref);
595
596 return ret;
597}
598
cc0f13c5 599const char *git_default_branch_name(int quiet)
8747ebb7
DGW
600{
601 static char *ret;
602
603 if (!ret)
cc0f13c5 604 ret = repo_default_branch_name(the_repository, quiet);
8747ebb7
DGW
605
606 return ret;
607}
608
ff74f7f1
JH
609/*
610 * *string and *len will only be substituted, and *string returned (for
611 * later free()ing) if the string passed in is a magic short-hand form
612 * to name a branch.
613 */
8f56e9d4 614static char *substitute_branch_name(struct repository *r,
f24c30e0
JT
615 const char **string, int *len,
616 int nonfatal_dangling_mark)
ff74f7f1
JH
617{
618 struct strbuf buf = STRBUF_INIT;
f24c30e0
JT
619 struct interpret_branch_name_options options = {
620 .nonfatal_dangling_mark = nonfatal_dangling_mark
621 };
a4f66a78 622 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
ff74f7f1
JH
623
624 if (ret == *len) {
625 size_t size;
626 *string = strbuf_detach(&buf, &size);
627 *len = size;
628 return (char *)*string;
629 }
630
631 return NULL;
632}
633
d8984c53 634int repo_dwim_ref(struct repository *r, const char *str, int len,
f24c30e0 635 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
ff74f7f1 636{
f24c30e0
JT
637 char *last_branch = substitute_branch_name(r, &str, &len,
638 nonfatal_dangling_mark);
d8984c53 639 int refs_found = expand_ref(r, str, len, oid, ref);
41da7111
NTND
640 free(last_branch);
641 return refs_found;
642}
643
0b1dbf53
NTND
644int expand_ref(struct repository *repo, const char *str, int len,
645 struct object_id *oid, char **ref)
41da7111 646{
ff74f7f1
JH
647 const char **p, *r;
648 int refs_found = 0;
6cd4a898 649 struct strbuf fullref = STRBUF_INIT;
ff74f7f1
JH
650
651 *ref = NULL;
652 for (p = ref_rev_parse_rules; *p; p++) {
cca5fa64 653 struct object_id oid_from_ref;
654 struct object_id *this_result;
ff74f7f1 655 int flag;
6582bd31 656 struct ref_store *refs = get_main_ref_store(repo);
ff74f7f1 657
cca5fa64 658 this_result = refs_found ? &oid_from_ref : oid;
6cd4a898
JK
659 strbuf_reset(&fullref);
660 strbuf_addf(&fullref, *p, len, str);
f1da24ca 661 r = refs_resolve_ref_unsafe(refs, fullref.buf,
6582bd31 662 RESOLVE_REF_READING,
ce14de03 663 this_result, &flag);
ff74f7f1
JH
664 if (r) {
665 if (!refs_found++)
666 *ref = xstrdup(r);
667 if (!warn_ambiguous_refs)
668 break;
6cd4a898 669 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
661558f0 670 warning(_("ignoring dangling symref %s"), fullref.buf);
6cd4a898 671 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
661558f0 672 warning(_("ignoring broken ref %s"), fullref.buf);
55956350 673 }
ff74f7f1 674 }
6cd4a898 675 strbuf_release(&fullref);
ff74f7f1
JH
676 return refs_found;
677}
678
56700903
NTND
679int repo_dwim_log(struct repository *r, const char *str, int len,
680 struct object_id *oid, char **log)
ff74f7f1 681{
56700903 682 struct ref_store *refs = get_main_ref_store(r);
f24c30e0 683 char *last_branch = substitute_branch_name(r, &str, &len, 0);
ff74f7f1
JH
684 const char **p;
685 int logs_found = 0;
6cd4a898 686 struct strbuf path = STRBUF_INIT;
ff74f7f1
JH
687
688 *log = NULL;
689 for (p = ref_rev_parse_rules; *p; p++) {
334dc52f 690 struct object_id hash;
ff74f7f1
JH
691 const char *ref, *it;
692
6cd4a898
JK
693 strbuf_reset(&path);
694 strbuf_addf(&path, *p, len, str);
56700903
NTND
695 ref = refs_resolve_ref_unsafe(refs, path.buf,
696 RESOLVE_REF_READING,
ce14de03 697 oid ? &hash : NULL, NULL);
ff74f7f1
JH
698 if (!ref)
699 continue;
56700903 700 if (refs_reflog_exists(refs, path.buf))
6cd4a898 701 it = path.buf;
56700903
NTND
702 else if (strcmp(ref, path.buf) &&
703 refs_reflog_exists(refs, ref))
ff74f7f1
JH
704 it = ref;
705 else
706 continue;
707 if (!logs_found++) {
708 *log = xstrdup(it);
6f45ec88
ÆAB
709 if (oid)
710 oidcpy(oid, &hash);
ff74f7f1 711 }
7bd9bcf3
MH
712 if (!warn_ambiguous_refs)
713 break;
c0277d15 714 }
6cd4a898 715 strbuf_release(&path);
7bd9bcf3
MH
716 free(last_branch);
717 return logs_found;
2ddb5d17
BK
718}
719
56700903
NTND
720int dwim_log(const char *str, int len, struct object_id *oid, char **log)
721{
722 return repo_dwim_log(the_repository, str, len, oid, log);
723}
724
266b1827
DT
725static int is_per_worktree_ref(const char *refname)
726{
55dd8b91
HWN
727 return starts_with(refname, "refs/worktree/") ||
728 starts_with(refname, "refs/bisect/") ||
729 starts_with(refname, "refs/rewritten/");
266b1827
DT
730}
731
732static int is_pseudoref_syntax(const char *refname)
733{
734 const char *c;
735
736 for (c = refname; *c; c++) {
737 if (!isupper(*c) && *c != '-' && *c != '_')
738 return 0;
739 }
740
741 return 1;
742}
743
3a3b9d8c
NTND
744static int is_main_pseudoref_syntax(const char *refname)
745{
746 return skip_prefix(refname, "main-worktree/", &refname) &&
747 *refname &&
748 is_pseudoref_syntax(refname);
749}
750
751static int is_other_pseudoref_syntax(const char *refname)
752{
753 if (!skip_prefix(refname, "worktrees/", &refname))
754 return 0;
755 refname = strchr(refname, '/');
756 if (!refname || !refname[1])
757 return 0;
758 return is_pseudoref_syntax(refname + 1);
759}
760
266b1827
DT
761enum ref_type ref_type(const char *refname)
762{
763 if (is_per_worktree_ref(refname))
764 return REF_TYPE_PER_WORKTREE;
765 if (is_pseudoref_syntax(refname))
766 return REF_TYPE_PSEUDOREF;
3a3b9d8c
NTND
767 if (is_main_pseudoref_syntax(refname))
768 return REF_TYPE_MAIN_PSEUDOREF;
769 if (is_other_pseudoref_syntax(refname))
770 return REF_TYPE_OTHER_PSEUDOREF;
5c79f74f 771 return REF_TYPE_NORMAL;
266b1827
DT
772}
773
4ff0f01c
MH
774long get_files_ref_lock_timeout_ms(void)
775{
776 static int configured = 0;
777
778 /* The default timeout is 100 ms: */
779 static int timeout_ms = 100;
780
781 if (!configured) {
782 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
783 configured = 1;
784 }
785
786 return timeout_ms;
787}
788
c0fe4e8b
NTND
789int refs_delete_ref(struct ref_store *refs, const char *msg,
790 const char *refname,
2616a5e5 791 const struct object_id *old_oid,
c0fe4e8b 792 unsigned int flags)
41b625b0 793{
7521cc46 794 struct ref_transaction *transaction;
a4c653df 795 struct strbuf err = STRBUF_INIT;
8b5157e4 796
c6da34a6 797 transaction = ref_store_transaction_begin(refs, &err);
7521cc46 798 if (!transaction ||
89f3bbdd 799 ref_transaction_delete(transaction, refname, old_oid,
755b49ae 800 flags, msg, &err) ||
db7516ab 801 ref_transaction_commit(transaction, &err)) {
7521cc46
RS
802 error("%s", err.buf);
803 ref_transaction_free(transaction);
804 strbuf_release(&err);
c0277d15 805 return 1;
41b625b0 806 }
7bd9bcf3
MH
807 ref_transaction_free(transaction);
808 strbuf_release(&err);
b531394d
BC
809 return 0;
810}
41b625b0 811
c0fe4e8b 812int delete_ref(const char *msg, const char *refname,
2616a5e5 813 const struct object_id *old_oid, unsigned int flags)
c0fe4e8b 814{
23a3f0cb 815 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
2616a5e5 816 old_oid, flags);
c0fe4e8b
NTND
817}
818
523fa69c 819static void copy_reflog_msg(struct strbuf *sb, const char *msg)
0ec29a47 820{
0ec29a47
JH
821 char c;
822 int wasspace = 1;
8b5157e4 823
0ec29a47
JH
824 while ((c = *msg++)) {
825 if (wasspace && isspace(c))
826 continue;
827 wasspace = isspace(c);
828 if (wasspace)
829 c = ' ';
80a6c207 830 strbuf_addch(sb, c);
a4c653df 831 }
80a6c207 832 strbuf_rtrim(sb);
0ec29a47 833}
8b5157e4 834
523fa69c
JH
835static char *normalize_reflog_message(const char *msg)
836{
837 struct strbuf sb = STRBUF_INIT;
838
839 if (msg && *msg)
840 copy_reflog_msg(&sb, msg);
841 return strbuf_detach(&sb, NULL);
842}
843
4cb77009 844int should_autocreate_reflog(const char *refname)
4e2bef57 845{
341fb286
CW
846 switch (log_all_ref_updates) {
847 case LOG_REFS_ALWAYS:
848 return 1;
849 case LOG_REFS_NORMAL:
850 return starts_with(refname, "refs/heads/") ||
851 starts_with(refname, "refs/remotes/") ||
852 starts_with(refname, "refs/notes/") ||
853 !strcmp(refname, "HEAD");
854 default:
4e2bef57 855 return 0;
341fb286 856 }
4e2bef57
DT
857}
858
e7e0f26e 859int is_branch(const char *refname)
c3b0dec5 860{
59556548 861 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
862}
863
4207ed28
RS
864struct read_ref_at_cb {
865 const char *refname;
dddbad72 866 timestamp_t at_time;
4207ed28
RS
867 int cnt;
868 int reccnt;
8eb36d94 869 struct object_id *oid;
4207ed28
RS
870 int found_it;
871
8eb36d94 872 struct object_id ooid;
873 struct object_id noid;
4207ed28 874 int tz;
dddbad72 875 timestamp_t date;
4207ed28 876 char **msg;
dddbad72 877 timestamp_t *cutoff_time;
4207ed28
RS
878 int *cutoff_tz;
879 int *cutoff_cnt;
880};
881
95c2a718
DL
882static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
883 timestamp_t timestamp, int tz, const char *message)
884{
885 if (cb->msg)
886 *cb->msg = xstrdup(message);
887 if (cb->cutoff_time)
888 *cb->cutoff_time = timestamp;
889 if (cb->cutoff_tz)
890 *cb->cutoff_tz = tz;
891 if (cb->cutoff_cnt)
892 *cb->cutoff_cnt = cb->reccnt;
893}
894
9461d272 895static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
dddbad72 896 const char *email, timestamp_t timestamp, int tz,
4207ed28
RS
897 const char *message, void *cb_data)
898{
899 struct read_ref_at_cb *cb = cb_data;
6436a202 900 int reached_count;
4207ed28 901
4207ed28
RS
902 cb->tz = tz;
903 cb->date = timestamp;
904
6436a202
DL
905 /*
906 * It is not possible for cb->cnt == 0 on the first iteration because
907 * that special case is handled in read_ref_at().
908 */
909 if (cb->cnt > 0)
910 cb->cnt--;
911 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
912 if (timestamp <= cb->at_time || reached_count) {
95c2a718 913 set_read_ref_cutoffs(cb, timestamp, tz, message);
4207ed28 914 /*
78fb4579 915 * we have not yet updated cb->[n|o]oid so they still
4207ed28
RS
916 * hold the values for the previous record.
917 */
6436a202
DL
918 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
919 warning(_("log for ref %s has gap after %s"),
a5481a6c 920 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
6436a202
DL
921 if (reached_count)
922 oidcpy(cb->oid, ooid);
923 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
8eb36d94 924 oidcpy(cb->oid, noid);
9001dc2a 925 else if (!oideq(noid, cb->oid))
661558f0 926 warning(_("log for ref %s unexpectedly ended on %s"),
4207ed28 927 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 928 DATE_MODE(RFC2822)));
4207ed28 929 cb->found_it = 1;
4207ed28 930 }
95c2a718 931 cb->reccnt++;
8eb36d94 932 oidcpy(&cb->ooid, ooid);
933 oidcpy(&cb->noid, noid);
6436a202
DL
934 return cb->found_it;
935}
936
937static int read_ref_at_ent_newest(struct object_id *ooid, struct object_id *noid,
938 const char *email, timestamp_t timestamp,
939 int tz, const char *message, void *cb_data)
940{
941 struct read_ref_at_cb *cb = cb_data;
942
943 set_read_ref_cutoffs(cb, timestamp, tz, message);
944 oidcpy(cb->oid, noid);
945 /* We just want the first entry */
946 return 1;
4207ed28
RS
947}
948
9461d272 949static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
dddbad72 950 const char *email, timestamp_t timestamp,
4207ed28
RS
951 int tz, const char *message, void *cb_data)
952{
953 struct read_ref_at_cb *cb = cb_data;
954
95c2a718 955 set_read_ref_cutoffs(cb, timestamp, tz, message);
8eb36d94 956 oidcpy(cb->oid, ooid);
957 if (is_null_oid(cb->oid))
958 oidcpy(cb->oid, noid);
4207ed28
RS
959 /* We just want the first entry */
960 return 1;
16d7cc90
JH
961}
962
7fdff474
NTND
963int read_ref_at(struct ref_store *refs, const char *refname,
964 unsigned int flags, timestamp_t at_time, int cnt,
8eb36d94 965 struct object_id *oid, char **msg,
dddbad72 966 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 967{
4207ed28 968 struct read_ref_at_cb cb;
d556fae2 969
4207ed28
RS
970 memset(&cb, 0, sizeof(cb));
971 cb.refname = refname;
972 cb.at_time = at_time;
973 cb.cnt = cnt;
974 cb.msg = msg;
975 cb.cutoff_time = cutoff_time;
976 cb.cutoff_tz = cutoff_tz;
977 cb.cutoff_cnt = cutoff_cnt;
8eb36d94 978 cb.oid = oid;
4207ed28 979
6436a202
DL
980 if (cb.cnt == 0) {
981 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
982 return 0;
983 }
984
7fdff474 985 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
4207ed28 986
c41a87dd 987 if (!cb.reccnt) {
321c89bf 988 if (flags & GET_OID_QUIETLY)
c41a87dd
DA
989 exit(128);
990 else
661558f0 991 die(_("log for %s is empty"), refname);
c41a87dd 992 }
4207ed28
RS
993 if (cb.found_it)
994 return 0;
995
7fdff474 996 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
d556fae2 997
16d7cc90 998 return 1;
d556fae2 999}
2ff81662 1000
c0fe4e8b
NTND
1001struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1002 struct strbuf *err)
caa4046c 1003{
c0fe4e8b 1004 struct ref_transaction *tr;
5a603b04
JN
1005 assert(err);
1006
ca56dadb 1007 CALLOC_ARRAY(tr, 1);
c0fe4e8b
NTND
1008 tr->ref_store = refs;
1009 return tr;
1010}
1011
1012struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1013{
c6da34a6 1014 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
caa4046c
MH
1015}
1016
026bd1d3 1017void ref_transaction_free(struct ref_transaction *transaction)
caa4046c 1018{
43a2dfde 1019 size_t i;
caa4046c 1020
1b07255c
RS
1021 if (!transaction)
1022 return;
1023
30173b88
MH
1024 switch (transaction->state) {
1025 case REF_TRANSACTION_OPEN:
1026 case REF_TRANSACTION_CLOSED:
1027 /* OK */
1028 break;
1029 case REF_TRANSACTION_PREPARED:
033abf97 1030 BUG("free called on a prepared reference transaction");
30173b88
MH
1031 break;
1032 default:
033abf97 1033 BUG("unexpected reference transaction state");
30173b88
MH
1034 break;
1035 }
1036
db7516ab
RS
1037 for (i = 0; i < transaction->nr; i++) {
1038 free(transaction->updates[i]->msg);
88615910 1039 free(transaction->updates[i]);
db7516ab 1040 }
caa4046c
MH
1041 free(transaction->updates);
1042 free(transaction);
1043}
1044
71564516
MH
1045struct ref_update *ref_transaction_add_update(
1046 struct ref_transaction *transaction,
1047 const char *refname, unsigned int flags,
89f3bbdd 1048 const struct object_id *new_oid,
1049 const struct object_id *old_oid,
71564516 1050 const char *msg)
caa4046c 1051{
96ffc06f 1052 struct ref_update *update;
71564516
MH
1053
1054 if (transaction->state != REF_TRANSACTION_OPEN)
033abf97 1055 BUG("update called for transaction that is not open");
71564516 1056
96ffc06f 1057 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
1058 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1059 transaction->updates[transaction->nr++] = update;
71564516
MH
1060
1061 update->flags = flags;
1062
1063 if (flags & REF_HAVE_NEW)
89f3bbdd 1064 oidcpy(&update->new_oid, new_oid);
71564516 1065 if (flags & REF_HAVE_OLD)
89f3bbdd 1066 oidcpy(&update->old_oid, old_oid);
523fa69c 1067 update->msg = normalize_reflog_message(msg);
caa4046c
MH
1068 return update;
1069}
1070
8e34800e
RS
1071int ref_transaction_update(struct ref_transaction *transaction,
1072 const char *refname,
89f3bbdd 1073 const struct object_id *new_oid,
1074 const struct object_id *old_oid,
1d147bdf 1075 unsigned int flags, const char *msg,
8e34800e 1076 struct strbuf *err)
caa4046c 1077{
5a603b04
JN
1078 assert(err);
1079
3c966c7b
HWN
1080 if (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
1081 ((new_oid && !is_null_oid(new_oid)) ?
1082 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1083 !refname_is_safe(refname))) {
661558f0 1084 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
d0f810f0
RS
1085 refname);
1086 return -1;
1087 }
1088
a9bbbcec
MH
1089 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1090 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
c788c54c 1091
49f1eb3b
JK
1092 /*
1093 * Clear flags outside the allowed set; this should be a noop because
1094 * of the BUG() check above, but it works around a -Wnonnull warning
1095 * with some versions of "gcc -O3".
1096 */
1097 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1098
89f3bbdd 1099 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
71564516
MH
1100
1101 ref_transaction_add_update(transaction, refname, flags,
89f3bbdd 1102 new_oid, old_oid, msg);
8e34800e 1103 return 0;
caa4046c
MH
1104}
1105
b416af5b
RS
1106int ref_transaction_create(struct ref_transaction *transaction,
1107 const char *refname,
89f3bbdd 1108 const struct object_id *new_oid,
fec14ec3 1109 unsigned int flags, const char *msg,
b416af5b 1110 struct strbuf *err)
caa4046c 1111{
d097a23b
DS
1112 if (!new_oid || is_null_oid(new_oid)) {
1113 strbuf_addf(err, "'%s' has a null OID", refname);
1114 return 1;
1115 }
89f3bbdd 1116 return ref_transaction_update(transaction, refname, new_oid,
14228447 1117 null_oid(), flags, msg, err);
caa4046c
MH
1118}
1119
8c8bdc0d
RS
1120int ref_transaction_delete(struct ref_transaction *transaction,
1121 const char *refname,
89f3bbdd 1122 const struct object_id *old_oid,
fb5a6bb6 1123 unsigned int flags, const char *msg,
8c8bdc0d 1124 struct strbuf *err)
caa4046c 1125{
89f3bbdd 1126 if (old_oid && is_null_oid(old_oid))
033abf97 1127 BUG("delete called with old_oid set to zeros");
1d147bdf 1128 return ref_transaction_update(transaction, refname,
14228447 1129 null_oid(), old_oid,
1d147bdf 1130 flags, msg, err);
caa4046c
MH
1131}
1132
16180334
MH
1133int ref_transaction_verify(struct ref_transaction *transaction,
1134 const char *refname,
89f3bbdd 1135 const struct object_id *old_oid,
16180334
MH
1136 unsigned int flags,
1137 struct strbuf *err)
1138{
89f3bbdd 1139 if (!old_oid)
033abf97 1140 BUG("verify called with old_oid set to NULL");
16180334 1141 return ref_transaction_update(transaction, refname,
89f3bbdd 1142 NULL, old_oid,
16180334
MH
1143 flags, NULL, err);
1144}
1145
c0fe4e8b 1146int refs_update_ref(struct ref_store *refs, const char *msg,
ae077771 1147 const char *refname, const struct object_id *new_oid,
1148 const struct object_id *old_oid, unsigned int flags,
c0fe4e8b 1149 enum action_on_err onerr)
4738a333 1150{
74ec19d4 1151 struct ref_transaction *t = NULL;
b4d75ac1 1152 struct strbuf err = STRBUF_INIT;
74ec19d4 1153 int ret = 0;
b4d75ac1 1154
c6da34a6 1155 t = ref_store_transaction_begin(refs, &err);
09743417
HWN
1156 if (!t ||
1157 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1158 &err) ||
1159 ref_transaction_commit(t, &err)) {
1160 ret = 1;
1161 ref_transaction_free(t);
74ec19d4
DT
1162 }
1163 if (ret) {
661558f0 1164 const char *str = _("update_ref failed for ref '%s': %s");
b4d75ac1 1165
b4d75ac1
RS
1166 switch (onerr) {
1167 case UPDATE_REFS_MSG_ON_ERR:
1168 error(str, refname, err.buf);
1169 break;
1170 case UPDATE_REFS_DIE_ON_ERR:
1171 die(str, refname, err.buf);
1172 break;
1173 case UPDATE_REFS_QUIET_ON_ERR:
1174 break;
1175 }
1176 strbuf_release(&err);
4738a333 1177 return 1;
b4d75ac1
RS
1178 }
1179 strbuf_release(&err);
74ec19d4
DT
1180 if (t)
1181 ref_transaction_free(t);
b4d75ac1 1182 return 0;
4738a333
BK
1183}
1184
c0fe4e8b 1185int update_ref(const char *msg, const char *refname,
ae077771 1186 const struct object_id *new_oid,
1187 const struct object_id *old_oid,
c0fe4e8b
NTND
1188 unsigned int flags, enum action_on_err onerr)
1189{
23a3f0cb 1190 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
ae077771 1191 old_oid, flags, onerr);
c0fe4e8b
NTND
1192}
1193
546edf37
NTND
1194char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1195 const char *refname, int strict)
7c2b3029
JK
1196{
1197 int i;
1198 static char **scanf_fmts;
1199 static int nr_rules;
1200 char *short_name;
6cd4a898 1201 struct strbuf resolved_buf = STRBUF_INIT;
7c2b3029 1202
7c2b3029 1203 if (!nr_rules) {
4346663a
MH
1204 /*
1205 * Pre-generate scanf formats from ref_rev_parse_rules[].
1206 * Generate a format suitable for scanf from a
1207 * ref_rev_parse_rules rule by interpolating "%s" at the
1208 * location of the "%.*s".
1209 */
7c2b3029 1210 size_t total_len = 0;
84d5633f 1211 size_t offset = 0;
7c2b3029
JK
1212
1213 /* the rule list is NULL terminated, count them first */
a4165851 1214 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
1215 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1216 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 1217
50492f7b 1218 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 1219
84d5633f 1220 offset = 0;
7c2b3029 1221 for (i = 0; i < nr_rules; i++) {
4346663a 1222 assert(offset < total_len);
84d5633f 1223 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
bf4baf1f
JK
1224 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1225 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
1226 }
1227 }
1228
1229 /* bail out if there are no rules */
1230 if (!nr_rules)
dfefa935 1231 return xstrdup(refname);
7c2b3029 1232
dfefa935
MH
1233 /* buffer for scanf result, at most refname must fit */
1234 short_name = xstrdup(refname);
7c2b3029
JK
1235
1236 /* skip first rule, it will always match */
1237 for (i = nr_rules - 1; i > 0 ; --i) {
1238 int j;
6e7b3309 1239 int rules_to_fail = i;
7c2b3029
JK
1240 int short_name_len;
1241
dfefa935 1242 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
1243 continue;
1244
1245 short_name_len = strlen(short_name);
1246
6e7b3309
BW
1247 /*
1248 * in strict mode, all (except the matched one) rules
1249 * must fail to resolve to a valid non-ambiguous ref
1250 */
1251 if (strict)
1252 rules_to_fail = nr_rules;
1253
7c2b3029
JK
1254 /*
1255 * check if the short name resolves to a valid ref,
1256 * but use only rules prior to the matched one
1257 */
6e7b3309 1258 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 1259 const char *rule = ref_rev_parse_rules[j];
7c2b3029 1260
6e7b3309
BW
1261 /* skip matched rule */
1262 if (i == j)
1263 continue;
1264
7c2b3029
JK
1265 /*
1266 * the short name is ambiguous, if it resolves
1267 * (with this previous rule) to a valid ref
1268 * read_ref() returns 0 on success
1269 */
6cd4a898
JK
1270 strbuf_reset(&resolved_buf);
1271 strbuf_addf(&resolved_buf, rule,
1272 short_name_len, short_name);
546edf37 1273 if (refs_ref_exists(refs, resolved_buf.buf))
7c2b3029
JK
1274 break;
1275 }
1276
1277 /*
1278 * short name is non-ambiguous if all previous rules
1279 * haven't resolved to a valid ref
1280 */
6cd4a898
JK
1281 if (j == rules_to_fail) {
1282 strbuf_release(&resolved_buf);
7c2b3029 1283 return short_name;
6cd4a898 1284 }
7c2b3029
JK
1285 }
1286
6cd4a898 1287 strbuf_release(&resolved_buf);
7c2b3029 1288 free(short_name);
dfefa935 1289 return xstrdup(refname);
7c2b3029 1290}
daebaa78 1291
546edf37
NTND
1292char *shorten_unambiguous_ref(const char *refname, int strict)
1293{
1294 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1295 refname, strict);
1296}
1297
daebaa78
JH
1298static struct string_list *hide_refs;
1299
1300int parse_hide_refs_config(const char *var, const char *value, const char *section)
1301{
ad8c7cda 1302 const char *key;
daebaa78 1303 if (!strcmp("transfer.hiderefs", var) ||
ad8c7cda
JK
1304 (!parse_config_key(var, section, NULL, NULL, &key) &&
1305 !strcmp(key, "hiderefs"))) {
daebaa78
JH
1306 char *ref;
1307 int len;
1308
1309 if (!value)
1310 return config_error_nonbool(var);
1311 ref = xstrdup(value);
1312 len = strlen(ref);
1313 while (len && ref[len - 1] == '/')
1314 ref[--len] = '\0';
1315 if (!hide_refs) {
ca56dadb 1316 CALLOC_ARRAY(hide_refs, 1);
daebaa78
JH
1317 hide_refs->strdup_strings = 1;
1318 }
1319 string_list_append(hide_refs, ref);
1320 }
1321 return 0;
1322}
1323
78a766ab 1324int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1325{
2bc31d16 1326 int i;
daebaa78
JH
1327
1328 if (!hide_refs)
1329 return 0;
2bc31d16
JK
1330 for (i = hide_refs->nr - 1; i >= 0; i--) {
1331 const char *match = hide_refs->items[i].string;
78a766ab 1332 const char *subject;
2bc31d16 1333 int neg = 0;
7a40a95e 1334 const char *p;
2bc31d16
JK
1335
1336 if (*match == '!') {
1337 neg = 1;
1338 match++;
1339 }
1340
78a766ab
LF
1341 if (*match == '^') {
1342 subject = refname_full;
1343 match++;
1344 } else {
1345 subject = refname;
1346 }
1347
1348 /* refname can be NULL when namespaces are used. */
7a40a95e
CC
1349 if (subject &&
1350 skip_prefix(subject, match, &p) &&
1351 (!*p || *p == '/'))
2bc31d16 1352 return !neg;
daebaa78
JH
1353 }
1354 return 0;
1355}
fa5b1830 1356
0845122c
DT
1357const char *find_descendant_ref(const char *dirname,
1358 const struct string_list *extras,
1359 const struct string_list *skip)
fa5b1830 1360{
0845122c 1361 int pos;
fa5b1830 1362
0845122c
DT
1363 if (!extras)
1364 return NULL;
fa5b1830
MH
1365
1366 /*
0845122c
DT
1367 * Look at the place where dirname would be inserted into
1368 * extras. If there is an entry at that position that starts
1369 * with dirname (remember, dirname includes the trailing
1370 * slash) and is not in skip, then we have a conflict.
fa5b1830 1371 */
0845122c
DT
1372 for (pos = string_list_find_insert_index(extras, dirname, 0);
1373 pos < extras->nr; pos++) {
1374 const char *extra_refname = extras->items[pos].string;
fa5b1830 1375
0845122c
DT
1376 if (!starts_with(extra_refname, dirname))
1377 break;
1378
1379 if (!skip || !string_list_has_string(skip, extra_refname))
1380 return extra_refname;
fa5b1830 1381 }
0845122c
DT
1382 return NULL;
1383}
fa5b1830 1384
62f0b399 1385int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2bf68ed5
DT
1386{
1387 struct object_id oid;
1388 int flag;
1389
f1da24ca 1390 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
ce14de03 1391 &oid, &flag))
2bf68ed5
DT
1392 return fn("HEAD", &oid, flag, cb_data);
1393
1394 return 0;
1395}
1396
1397int head_ref(each_ref_fn fn, void *cb_data)
1398{
23a3f0cb 1399 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
2bf68ed5 1400}
93770590 1401
e121b9cb
MH
1402struct ref_iterator *refs_ref_iterator_begin(
1403 struct ref_store *refs,
9aab952e
JK
1404 const char *prefix, int trim,
1405 enum do_for_each_ref_flags flags)
e121b9cb
MH
1406{
1407 struct ref_iterator *iter;
1408
6d751be4 1409 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
5d1f5b8c
JK
1410 static int ref_paranoia = -1;
1411
6d751be4 1412 if (ref_paranoia < 0)
968f12fd 1413 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
6d751be4
JK
1414 if (ref_paranoia) {
1415 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1416 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1417 }
1418 }
0a0865b8 1419
e121b9cb 1420 iter = refs->be->iterator_begin(refs, prefix, flags);
c7599718
MH
1421
1422 /*
1423 * `iterator_begin()` already takes care of prefix, but we
1424 * might need to do some trimming:
1425 */
1426 if (trim)
1427 iter = prefix_ref_iterator_begin(iter, "", trim);
e121b9cb 1428
8738a8a4
MH
1429 /* Sanity check for subclasses: */
1430 if (!iter->ordered)
1431 BUG("reference iterator is not ordered");
1432
e121b9cb
MH
1433 return iter;
1434}
1435
4c4de895
MH
1436/*
1437 * Call fn for each reference in the specified submodule for which the
1438 * refname begins with prefix. If trim is non-zero, then trim that
1439 * many characters off the beginning of each refname before passing
1440 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1441 * include broken references in the iteration. If fn ever returns a
1442 * non-zero value, stop the iteration and return that value;
1443 * otherwise, return 0.
1444 */
4a6067cd
SB
1445static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1446 each_repo_ref_fn fn, int trim, int flags,
1447 void *cb_data)
1448{
1449 struct ref_iterator *iter;
1450 struct ref_store *refs = get_main_ref_store(r);
1451
1452 if (!refs)
1453 return 0;
1454
1455 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1456
1457 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1458}
1459
1460struct do_for_each_ref_help {
1461 each_ref_fn *fn;
1462 void *cb_data;
1463};
1464
1465static int do_for_each_ref_helper(struct repository *r,
1466 const char *refname,
1467 const struct object_id *oid,
1468 int flags,
1469 void *cb_data)
1470{
1471 struct do_for_each_ref_help *hp = cb_data;
1472
1473 return hp->fn(refname, oid, flags, hp->cb_data);
1474}
1475
7d2df051 1476static int do_for_each_ref(struct ref_store *refs, const char *prefix,
9aab952e
JK
1477 each_ref_fn fn, int trim,
1478 enum do_for_each_ref_flags flags, void *cb_data)
4c4de895
MH
1479{
1480 struct ref_iterator *iter;
4a6067cd 1481 struct do_for_each_ref_help hp = { fn, cb_data };
4c4de895 1482
00eebe35
MH
1483 if (!refs)
1484 return 0;
1485
e121b9cb 1486 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
4c4de895 1487
4a6067cd
SB
1488 return do_for_each_repo_ref_iterator(the_repository, iter,
1489 do_for_each_ref_helper, &hp);
4c4de895
MH
1490}
1491
7d2df051
NTND
1492int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1493{
1494 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1495}
1496
93770590
DT
1497int for_each_ref(each_ref_fn fn, void *cb_data)
1498{
23a3f0cb 1499 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
93770590
DT
1500}
1501
7d2df051
NTND
1502int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1503 each_ref_fn fn, void *cb_data)
1504{
1505 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
93770590
DT
1506}
1507
1508int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1509{
23a3f0cb 1510 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
93770590
DT
1511}
1512
67985e4e 1513int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
93770590 1514{
23a3f0cb 1515 return do_for_each_ref(get_main_ref_store(the_repository),
67985e4e 1516 prefix, fn, 0, 0, cb_data);
93770590
DT
1517}
1518
073cf63c 1519int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
67985e4e 1520 each_ref_fn fn, void *cb_data)
03df567f 1521{
67985e4e 1522 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
03df567f
MH
1523}
1524
212e0f7e 1525int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
93770590 1526{
212e0f7e
SB
1527 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1528 strlen(git_replace_ref_base),
1529 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
93770590
DT
1530}
1531
1532int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1533{
1534 struct strbuf buf = STRBUF_INIT;
1535 int ret;
1536 strbuf_addf(&buf, "%srefs/", get_git_namespace());
23a3f0cb 1537 ret = do_for_each_ref(get_main_ref_store(the_repository),
7d2df051 1538 buf.buf, fn, 0, 0, cb_data);
93770590
DT
1539 strbuf_release(&buf);
1540 return ret;
1541}
1542
7d2df051 1543int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
93770590 1544{
7d2df051 1545 return do_for_each_ref(refs, "", fn, 0,
93770590
DT
1546 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1547}
2d0663b2 1548
7d2df051
NTND
1549int for_each_rawref(each_ref_fn fn, void *cb_data)
1550{
23a3f0cb 1551 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
7d2df051
NTND
1552}
1553
16b1985b
TB
1554static int qsort_strcmp(const void *va, const void *vb)
1555{
1556 const char *a = *(const char **)va;
1557 const char *b = *(const char **)vb;
1558
1559 return strcmp(a, b);
1560}
1561
1562static void find_longest_prefixes_1(struct string_list *out,
1563 struct strbuf *prefix,
1564 const char **patterns, size_t nr)
1565{
1566 size_t i;
1567
1568 for (i = 0; i < nr; i++) {
1569 char c = patterns[i][prefix->len];
1570 if (!c || is_glob_special(c)) {
1571 string_list_append(out, prefix->buf);
1572 return;
1573 }
1574 }
1575
1576 i = 0;
1577 while (i < nr) {
1578 size_t end;
1579
1580 /*
1581 * Set "end" to the index of the element _after_ the last one
1582 * in our group.
1583 */
1584 for (end = i + 1; end < nr; end++) {
1585 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1586 break;
1587 }
1588
1589 strbuf_addch(prefix, patterns[i][prefix->len]);
1590 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1591 strbuf_setlen(prefix, prefix->len - 1);
1592
1593 i = end;
1594 }
1595}
1596
1597static void find_longest_prefixes(struct string_list *out,
1598 const char **patterns)
1599{
1600 struct strvec sorted = STRVEC_INIT;
1601 struct strbuf prefix = STRBUF_INIT;
1602
1603 strvec_pushv(&sorted, patterns);
1604 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1605
1606 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1607
1608 strvec_clear(&sorted);
1609 strbuf_release(&prefix);
1610}
1611
1612int for_each_fullref_in_prefixes(const char *namespace,
1613 const char **patterns,
67985e4e 1614 each_ref_fn fn, void *cb_data)
16b1985b
TB
1615{
1616 struct string_list prefixes = STRING_LIST_INIT_DUP;
1617 struct string_list_item *prefix;
1618 struct strbuf buf = STRBUF_INIT;
1619 int ret = 0, namespace_len;
1620
1621 find_longest_prefixes(&prefixes, patterns);
1622
1623 if (namespace)
1624 strbuf_addstr(&buf, namespace);
1625 namespace_len = buf.len;
1626
1627 for_each_string_list_item(prefix, &prefixes) {
1628 strbuf_addstr(&buf, prefix->string);
67985e4e 1629 ret = for_each_fullref_in(buf.buf, fn, cb_data);
16b1985b
TB
1630 if (ret)
1631 break;
1632 strbuf_setlen(&buf, namespace_len);
1633 }
1634
1635 string_list_clear(&prefixes, 0);
1636 strbuf_release(&buf);
1637 return ret;
1638}
1639
e8115302
HWN
1640static int refs_read_special_head(struct ref_store *ref_store,
1641 const char *refname, struct object_id *oid,
df3458e9
HWN
1642 struct strbuf *referent, unsigned int *type,
1643 int *failure_errno)
e8115302
HWN
1644{
1645 struct strbuf full_path = STRBUF_INIT;
1646 struct strbuf content = STRBUF_INIT;
1647 int result = -1;
1648 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1649
1650 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1651 goto done;
1652
df3458e9
HWN
1653 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1654 failure_errno);
e8115302
HWN
1655
1656done:
1657 strbuf_release(&full_path);
1658 strbuf_release(&content);
1659 return result;
1660}
1661
8b72fea7
HWN
1662int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1663 struct object_id *oid, struct strbuf *referent,
1664 unsigned int *type, int *failure_errno)
470be518 1665{
8b72fea7 1666 assert(failure_errno);
e8115302
HWN
1667 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1668 return refs_read_special_head(ref_store, refname, oid, referent,
df3458e9 1669 type, failure_errno);
e8115302
HWN
1670 }
1671
1672 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
8b72fea7 1673 type, failure_errno);
470be518
MH
1674}
1675
cd475b3b
PS
1676int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
1677 struct strbuf *referent)
1678{
5b875404 1679 return ref_store->be->read_symbolic_ref(ref_store, refname, referent);
cd475b3b
PS
1680}
1681
7d2df051 1682const char *refs_resolve_ref_unsafe(struct ref_store *refs,
3c0cb0cb
MH
1683 const char *refname,
1684 int resolve_flags,
ef18119d 1685 struct object_id *oid,
ce14de03 1686 int *flags)
2d0663b2
DT
1687{
1688 static struct strbuf sb_refname = STRBUF_INIT;
54fad661 1689 struct object_id unused_oid;
2d0663b2
DT
1690 int unused_flags;
1691 int symref_count;
1692
49e61479 1693 if (!oid)
1694 oid = &unused_oid;
2d0663b2
DT
1695 if (!flags)
1696 flags = &unused_flags;
1697
1698 *flags = 0;
1699
1700 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1701 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
ce14de03 1702 !refname_is_safe(refname))
2d0663b2 1703 return NULL;
2d0663b2
DT
1704
1705 /*
1706 * dwim_ref() uses REF_ISBROKEN to distinguish between
1707 * missing refs and refs that were present but invalid,
1708 * to complain about the latter to stderr.
1709 *
1710 * We don't know whether the ref exists, so don't set
1711 * REF_ISBROKEN yet.
1712 */
1713 *flags |= REF_BAD_NAME;
1714 }
1715
1716 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1717 unsigned int read_flags = 0;
ce14de03 1718 int failure_errno;
2d0663b2 1719
8b72fea7 1720 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
ce14de03 1721 &read_flags, &failure_errno)) {
2d0663b2 1722 *flags |= read_flags;
a1c1d817
JK
1723
1724 /* In reading mode, refs must eventually resolve */
1725 if (resolve_flags & RESOLVE_REF_READING)
1726 return NULL;
1727
1728 /*
1729 * Otherwise a missing ref is OK. But the files backend
1730 * may show errors besides ENOENT if there are
1731 * similarly-named refs.
1732 */
ce14de03
ÆAB
1733 if (failure_errno != ENOENT &&
1734 failure_errno != EISDIR &&
1735 failure_errno != ENOTDIR)
2d0663b2 1736 return NULL;
a1c1d817 1737
49e61479 1738 oidclr(oid);
2d0663b2
DT
1739 if (*flags & REF_BAD_NAME)
1740 *flags |= REF_ISBROKEN;
1741 return refname;
1742 }
1743
1744 *flags |= read_flags;
1745
1746 if (!(read_flags & REF_ISSYMREF)) {
1747 if (*flags & REF_BAD_NAME) {
49e61479 1748 oidclr(oid);
2d0663b2
DT
1749 *flags |= REF_ISBROKEN;
1750 }
1751 return refname;
1752 }
1753
1754 refname = sb_refname.buf;
1755 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
49e61479 1756 oidclr(oid);
2d0663b2
DT
1757 return refname;
1758 }
1759 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1760 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
ce14de03 1761 !refname_is_safe(refname))
2d0663b2 1762 return NULL;
2d0663b2
DT
1763
1764 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1765 }
1766 }
1767
2d0663b2
DT
1768 return NULL;
1769}
00eebe35 1770
6fb5acfd
DT
1771/* backend functions */
1772int refs_init_db(struct strbuf *err)
1773{
23a3f0cb 1774 struct ref_store *refs = get_main_ref_store(the_repository);
6fb5acfd
DT
1775
1776 return refs->be->init_db(refs, err);
1777}
1778
bd40dcda 1779const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
49e61479 1780 struct object_id *oid, int *flags)
bd40dcda 1781{
23a3f0cb 1782 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
ce14de03 1783 resolve_flags, oid, flags);
bd40dcda
MH
1784}
1785
a8355bb7 1786int resolve_gitlink_ref(const char *submodule, const char *refname,
a98e6101 1787 struct object_id *oid)
424dcc76 1788{
424dcc76
MH
1789 struct ref_store *refs;
1790 int flags;
1791
29babbee 1792 refs = get_submodule_ref_store(submodule);
48a8475f 1793
424dcc76
MH
1794 if (!refs)
1795 return -1;
1796
ce14de03
ÆAB
1797 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1798 is_null_oid(oid))
424dcc76
MH
1799 return -1;
1800 return 0;
1801}
1802
0c064d90 1803struct ref_store_hash_entry
7d4558c4 1804{
e2b5038d 1805 struct hashmap_entry ent;
7d4558c4
MH
1806
1807 struct ref_store *refs;
1808
0c064d90
NTND
1809 /* NUL-terminated identifier of the ref store: */
1810 char name[FLEX_ARRAY];
7d4558c4
MH
1811};
1812
7663cdc8 1813static int ref_store_hash_cmp(const void *unused_cmp_data,
939af16e
EW
1814 const struct hashmap_entry *eptr,
1815 const struct hashmap_entry *entry_or_key,
7d4558c4
MH
1816 const void *keydata)
1817{
939af16e
EW
1818 const struct ref_store_hash_entry *e1, *e2;
1819 const char *name;
1820
1821 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1822 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1823 name = keydata ? keydata : e2->name;
7d4558c4 1824
0c064d90 1825 return strcmp(e1->name, name);
7d4558c4
MH
1826}
1827
0c064d90
NTND
1828static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1829 const char *name, struct ref_store *refs)
7d4558c4 1830{
0c064d90 1831 struct ref_store_hash_entry *entry;
7d4558c4 1832
0c064d90 1833 FLEX_ALLOC_STR(entry, name, name);
d22245a2 1834 hashmap_entry_init(&entry->ent, strhash(name));
7d4558c4
MH
1835 entry->refs = refs;
1836 return entry;
1837}
1838
7d4558c4
MH
1839/* A hashmap of ref_stores, stored by submodule name: */
1840static struct hashmap submodule_ref_stores;
00eebe35 1841
17eff96b
NTND
1842/* A hashmap of ref_stores, stored by worktree id: */
1843static struct hashmap worktree_ref_stores;
1844
c468da4e 1845/*
0c064d90
NTND
1846 * Look up a ref store by name. If that ref_store hasn't been
1847 * registered yet, return NULL.
c468da4e 1848 */
0c064d90
NTND
1849static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1850 const char *name)
00eebe35 1851{
0c064d90 1852 struct ref_store_hash_entry *entry;
f23a4651 1853 unsigned int hash;
00eebe35 1854
0c064d90 1855 if (!map->tablesize)
7d4558c4
MH
1856 /* It's initialized on demand in register_ref_store(). */
1857 return NULL;
620a66b9 1858
f23a4651
EW
1859 hash = strhash(name);
1860 entry = hashmap_get_entry_from_hash(map, hash, name,
1861 struct ref_store_hash_entry, ent);
7d4558c4 1862 return entry ? entry->refs : NULL;
00eebe35
MH
1863}
1864
c468da4e
MH
1865/*
1866 * Create, record, and return a ref_store instance for the specified
5d0bc90e 1867 * gitdir.
c468da4e 1868 */
34224e14
JT
1869static struct ref_store *ref_store_init(struct repository *repo,
1870 const char *gitdir,
9e7ec634 1871 unsigned int flags)
00eebe35
MH
1872{
1873 const char *be_name = "files";
1874 struct ref_storage_be *be = find_ref_storage_backend(be_name);
ba88add5 1875 struct ref_store *refs;
00eebe35
MH
1876
1877 if (!be)
033abf97 1878 BUG("reference backend %s is unknown", be_name);
00eebe35 1879
34224e14 1880 refs = be->init(repo, gitdir, flags);
ba88add5 1881 return refs;
00eebe35
MH
1882}
1883
64a74161 1884struct ref_store *get_main_ref_store(struct repository *r)
24c8407e 1885{
02204610
JK
1886 if (r->refs_private)
1887 return r->refs_private;
24c8407e 1888
2dc417ab
JK
1889 if (!r->gitdir)
1890 BUG("attempting to get main_ref_store outside of repository");
1891
34224e14 1892 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
4441f427 1893 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
02204610 1894 return r->refs_private;
378dc910
NTND
1895}
1896
1897/*
0c064d90
NTND
1898 * Associate a ref store with a name. It is a fatal error to call this
1899 * function twice for the same name.
378dc910 1900 */
0c064d90
NTND
1901static void register_ref_store_map(struct hashmap *map,
1902 const char *type,
1903 struct ref_store *refs,
1904 const char *name)
378dc910 1905{
26b455f2
EW
1906 struct ref_store_hash_entry *entry;
1907
0c064d90 1908 if (!map->tablesize)
7663cdc8 1909 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
378dc910 1910
26b455f2
EW
1911 entry = alloc_ref_store_hash_entry(name, refs);
1912 if (hashmap_put(map, &entry->ent))
033abf97 1913 BUG("%s ref_store '%s' initialized twice", type, name);
24c8407e
NTND
1914}
1915
18d0002d 1916struct ref_store *get_submodule_ref_store(const char *submodule)
00eebe35 1917{
126c9e05 1918 struct strbuf submodule_sb = STRBUF_INIT;
00eebe35 1919 struct ref_store *refs;
29babbee
NTND
1920 char *to_free = NULL;
1921 size_t len;
34224e14 1922 struct repository *subrepo;
00eebe35 1923
82a150f2
NTND
1924 if (!submodule)
1925 return NULL;
1926
873ea90d
NTND
1927 len = strlen(submodule);
1928 while (len && is_dir_sep(submodule[len - 1]))
1929 len--;
1930 if (!len)
1931 return NULL;
00eebe35 1932
29babbee
NTND
1933 if (submodule[len])
1934 /* We need to strip off one or more trailing slashes */
1935 submodule = to_free = xmemdupz(submodule, len);
00eebe35 1936
0c064d90 1937 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
126c9e05 1938 if (refs)
2c616c17 1939 goto done;
00eebe35 1940
126c9e05 1941 strbuf_addstr(&submodule_sb, submodule);
2c616c17
NTND
1942 if (!is_nonbare_repository_dir(&submodule_sb))
1943 goto done;
00eebe35 1944
2c616c17
NTND
1945 if (submodule_to_gitdir(&submodule_sb, submodule))
1946 goto done;
00eebe35 1947
34224e14
JT
1948 subrepo = xmalloc(sizeof(*subrepo));
1949 /*
1950 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
1951 * superprojects other than the_repository. This probably should be
1952 * done by making it take a struct repository * parameter instead of a
1953 * submodule path.
1954 */
1955 if (repo_submodule_init(subrepo, the_repository, submodule,
1956 null_oid())) {
1957 free(subrepo);
1958 goto done;
1959 }
1960 refs = ref_store_init(subrepo, submodule_sb.buf,
9e7ec634 1961 REF_STORE_READ | REF_STORE_ODB);
0c064d90
NTND
1962 register_ref_store_map(&submodule_ref_stores, "submodule",
1963 refs, submodule);
5d0bc90e 1964
2c616c17 1965done:
5d0bc90e 1966 strbuf_release(&submodule_sb);
29babbee
NTND
1967 free(to_free);
1968
00eebe35
MH
1969 return refs;
1970}
1971
17eff96b
NTND
1972struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1973{
1974 struct ref_store *refs;
1975 const char *id;
1976
1977 if (wt->is_current)
23a3f0cb 1978 return get_main_ref_store(the_repository);
17eff96b
NTND
1979
1980 id = wt->id ? wt->id : "/";
1981 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1982 if (refs)
1983 return refs;
1984
1985 if (wt->id)
34224e14
JT
1986 refs = ref_store_init(the_repository,
1987 git_common_path("worktrees/%s", wt->id),
17eff96b
NTND
1988 REF_STORE_ALL_CAPS);
1989 else
34224e14
JT
1990 refs = ref_store_init(the_repository,
1991 get_git_common_dir(),
17eff96b
NTND
1992 REF_STORE_ALL_CAPS);
1993
1994 if (refs)
1995 register_ref_store_map(&worktree_ref_stores, "worktree",
1996 refs, id);
1997 return refs;
1998}
1999
f9f7fd3b
HWN
2000void base_ref_store_init(struct ref_store *refs, struct repository *repo,
2001 const char *path, const struct ref_storage_be *be)
00eebe35 2002{
620a66b9 2003 refs->be = be;
f9f7fd3b
HWN
2004 refs->repo = repo;
2005 refs->gitdir = xstrdup(path);
00eebe35 2006}
127b42a1
RS
2007
2008/* backend functions */
7d2df051 2009int refs_pack_refs(struct ref_store *refs, unsigned int flags)
8231527e 2010{
8231527e
MH
2011 return refs->be->pack_refs(refs, flags);
2012}
2013
36a31792 2014int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
7d2df051 2015{
36a31792
JK
2016 if (current_ref_iter &&
2017 (current_ref_iter->oid == base ||
2018 oideq(current_ref_iter->oid, base)))
2019 return ref_iterator_peel(current_ref_iter, peeled);
ba1c052f 2020
617480d7 2021 return peel_object(base, peeled) ? -1 : 0;
7d2df051 2022}
bd427cf2 2023
7d2df051
NTND
2024int refs_create_symref(struct ref_store *refs,
2025 const char *ref_target,
2026 const char *refs_heads_master,
2027 const char *logmsg)
2028{
523fa69c
JH
2029 char *msg;
2030 int retval;
2031
2032 msg = normalize_reflog_message(logmsg);
2033 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2034 msg);
2035 free(msg);
2036 return retval;
bd427cf2
MH
2037}
2038
284689ba
MH
2039int create_symref(const char *ref_target, const char *refs_heads_master,
2040 const char *logmsg)
2041{
23a3f0cb 2042 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
7d2df051 2043 refs_heads_master, logmsg);
284689ba
MH
2044}
2045
2ced105c
MH
2046int ref_update_reject_duplicates(struct string_list *refnames,
2047 struct strbuf *err)
2048{
a552e50e 2049 size_t i, n = refnames->nr;
2ced105c
MH
2050
2051 assert(err);
2052
8556f8d6
MH
2053 for (i = 1; i < n; i++) {
2054 int cmp = strcmp(refnames->items[i - 1].string,
2055 refnames->items[i].string);
2056
2057 if (!cmp) {
2ced105c 2058 strbuf_addf(err,
661558f0 2059 _("multiple updates for ref '%s' not allowed"),
2ced105c
MH
2060 refnames->items[i].string);
2061 return 1;
8556f8d6 2062 } else if (cmp > 0) {
033abf97 2063 BUG("ref_update_reject_duplicates() received unsorted list");
2ced105c 2064 }
8556f8d6 2065 }
2ced105c
MH
2066 return 0;
2067}
2068
67541597
PS
2069static int run_transaction_hook(struct ref_transaction *transaction,
2070 const char *state)
2071{
2072 struct child_process proc = CHILD_PROCESS_INIT;
2073 struct strbuf buf = STRBUF_INIT;
0a0fbbe3 2074 const char *hook;
67541597
PS
2075 int ret = 0, i;
2076
0a0fbbe3 2077 hook = find_hook("reference-transaction");
67541597 2078 if (!hook)
67541597 2079 return ret;
67541597 2080
c972bf4c 2081 strvec_pushl(&proc.args, hook, state, NULL);
67541597
PS
2082 proc.in = -1;
2083 proc.stdout_to_stderr = 1;
2084 proc.trace2_hook_name = "reference-transaction";
2085
2086 ret = start_command(&proc);
2087 if (ret)
2088 return ret;
2089
2090 sigchain_push(SIGPIPE, SIG_IGN);
2091
2092 for (i = 0; i < transaction->nr; i++) {
2093 struct ref_update *update = transaction->updates[i];
2094
2095 strbuf_reset(&buf);
2096 strbuf_addf(&buf, "%s %s %s\n",
2097 oid_to_hex(&update->old_oid),
2098 oid_to_hex(&update->new_oid),
2099 update->refname);
2100
2101 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
4755d7df
ÆAB
2102 if (errno != EPIPE) {
2103 /* Don't leak errno outside this API */
2104 errno = 0;
67541597 2105 ret = -1;
4755d7df 2106 }
67541597
PS
2107 break;
2108 }
2109 }
2110
2111 close(proc.in);
2112 sigchain_pop(SIGPIPE);
2113 strbuf_release(&buf);
2114
2115 ret |= finish_command(&proc);
2116 return ret;
2117}
2118
30173b88
MH
2119int ref_transaction_prepare(struct ref_transaction *transaction,
2120 struct strbuf *err)
127b42a1 2121{
c0fe4e8b 2122 struct ref_store *refs = transaction->ref_store;
67541597 2123 int ret;
127b42a1 2124
8d4240d3
MH
2125 switch (transaction->state) {
2126 case REF_TRANSACTION_OPEN:
2127 /* Good. */
2128 break;
30173b88 2129 case REF_TRANSACTION_PREPARED:
033abf97 2130 BUG("prepare called twice on reference transaction");
30173b88 2131 break;
8d4240d3 2132 case REF_TRANSACTION_CLOSED:
033abf97 2133 BUG("prepare called on a closed reference transaction");
8d4240d3
MH
2134 break;
2135 default:
033abf97 2136 BUG("unexpected reference transaction state");
8d4240d3
MH
2137 break;
2138 }
2139
ecd81dfc 2140 if (refs->repo->objects->odb->disable_ref_updates) {
d8f4481c
JK
2141 strbuf_addstr(err,
2142 _("ref updates forbidden inside quarantine environment"));
2143 return -1;
2144 }
2145
67541597
PS
2146 ret = refs->be->transaction_prepare(refs, transaction, err);
2147 if (ret)
2148 return ret;
2149
2150 ret = run_transaction_hook(transaction, "prepared");
2151 if (ret) {
2152 ref_transaction_abort(transaction, err);
2153 die(_("ref updates aborted by hook"));
2154 }
2155
2156 return 0;
30173b88
MH
2157}
2158
2159int ref_transaction_abort(struct ref_transaction *transaction,
2160 struct strbuf *err)
2161{
2162 struct ref_store *refs = transaction->ref_store;
2163 int ret = 0;
2164
2165 switch (transaction->state) {
2166 case REF_TRANSACTION_OPEN:
2167 /* No need to abort explicitly. */
2168 break;
2169 case REF_TRANSACTION_PREPARED:
2170 ret = refs->be->transaction_abort(refs, transaction, err);
2171 break;
2172 case REF_TRANSACTION_CLOSED:
033abf97 2173 BUG("abort called on a closed reference transaction");
30173b88
MH
2174 break;
2175 default:
033abf97 2176 BUG("unexpected reference transaction state");
30173b88
MH
2177 break;
2178 }
2179
67541597
PS
2180 run_transaction_hook(transaction, "aborted");
2181
30173b88
MH
2182 ref_transaction_free(transaction);
2183 return ret;
2184}
2185
2186int ref_transaction_commit(struct ref_transaction *transaction,
2187 struct strbuf *err)
2188{
2189 struct ref_store *refs = transaction->ref_store;
2190 int ret;
2191
2192 switch (transaction->state) {
2193 case REF_TRANSACTION_OPEN:
2194 /* Need to prepare first. */
2195 ret = ref_transaction_prepare(transaction, err);
2196 if (ret)
2197 return ret;
2198 break;
2199 case REF_TRANSACTION_PREPARED:
2200 /* Fall through to finish. */
2201 break;
2202 case REF_TRANSACTION_CLOSED:
033abf97 2203 BUG("commit called on a closed reference transaction");
30173b88
MH
2204 break;
2205 default:
033abf97 2206 BUG("unexpected reference transaction state");
30173b88
MH
2207 break;
2208 }
2209
67541597
PS
2210 ret = refs->be->transaction_finish(refs, transaction, err);
2211 if (!ret)
2212 run_transaction_hook(transaction, "committed");
2213 return ret;
127b42a1 2214}
62665823 2215
7d2df051
NTND
2216int refs_verify_refname_available(struct ref_store *refs,
2217 const char *refname,
b05855b5 2218 const struct string_list *extras,
7d2df051
NTND
2219 const struct string_list *skip,
2220 struct strbuf *err)
62665823 2221{
b05855b5
MH
2222 const char *slash;
2223 const char *extra_refname;
2224 struct strbuf dirname = STRBUF_INIT;
2225 struct strbuf referent = STRBUF_INIT;
2226 struct object_id oid;
2227 unsigned int type;
2228 struct ref_iterator *iter;
2229 int ok;
2230 int ret = -1;
2231
2232 /*
2233 * For the sake of comments in this function, suppose that
2234 * refname is "refs/foo/bar".
2235 */
2236
2237 assert(err);
2238
2239 strbuf_grow(&dirname, strlen(refname) + 1);
2240 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
8b72fea7
HWN
2241 /*
2242 * Just saying "Is a directory" when we e.g. can't
2243 * lock some multi-level ref isn't very informative,
2244 * the user won't be told *what* is a directory, so
2245 * let's not use strerror() below.
2246 */
2247 int ignore_errno;
b05855b5
MH
2248 /* Expand dirname to the new prefix, not including the trailing slash: */
2249 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2250
2251 /*
2252 * We are still at a leading dir of the refname (e.g.,
2253 * "refs/foo"; if there is a reference with that name,
2254 * it is a conflict, *unless* it is in skip.
2255 */
2256 if (skip && string_list_has_string(skip, dirname.buf))
2257 continue;
2258
8b72fea7
HWN
2259 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2260 &type, &ignore_errno)) {
661558f0 2261 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
b05855b5
MH
2262 dirname.buf, refname);
2263 goto cleanup;
2264 }
2265
2266 if (extras && string_list_has_string(extras, dirname.buf)) {
661558f0 2267 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
b05855b5
MH
2268 refname, dirname.buf);
2269 goto cleanup;
2270 }
2271 }
2272
2273 /*
2274 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2275 * There is no point in searching for a reference with that
2276 * name, because a refname isn't considered to conflict with
2277 * itself. But we still need to check for references whose
2278 * names are in the "refs/foo/bar/" namespace, because they
2279 * *do* conflict.
2280 */
2281 strbuf_addstr(&dirname, refname + dirname.len);
2282 strbuf_addch(&dirname, '/');
2283
2284 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2285 DO_FOR_EACH_INCLUDE_BROKEN);
2286 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2287 if (skip &&
2288 string_list_has_string(skip, iter->refname))
2289 continue;
2290
661558f0 2291 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
b05855b5
MH
2292 iter->refname, refname);
2293 ref_iterator_abort(iter);
2294 goto cleanup;
2295 }
2296
2297 if (ok != ITER_DONE)
033abf97 2298 BUG("error while iterating over references");
b05855b5
MH
2299
2300 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2301 if (extra_refname)
661558f0 2302 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
b05855b5
MH
2303 refname, extra_refname);
2304 else
2305 ret = 0;
2306
2307cleanup:
2308 strbuf_release(&referent);
2309 strbuf_release(&dirname);
2310 return ret;
62665823 2311}
e3688bd6 2312
7d2df051 2313int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
e3688bd6 2314{
e3688bd6 2315 struct ref_iterator *iter;
4a6067cd 2316 struct do_for_each_ref_help hp = { fn, cb_data };
e3688bd6
DT
2317
2318 iter = refs->be->reflog_iterator_begin(refs);
2319
4a6067cd
SB
2320 return do_for_each_repo_ref_iterator(the_repository, iter,
2321 do_for_each_ref_helper, &hp);
e3688bd6
DT
2322}
2323
7d2df051 2324int for_each_reflog(each_ref_fn fn, void *cb_data)
e3688bd6 2325{
23a3f0cb 2326 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
7d2df051 2327}
e3688bd6 2328
7d2df051
NTND
2329int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2330 const char *refname,
2331 each_reflog_ent_fn fn,
2332 void *cb_data)
2333{
e3688bd6
DT
2334 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2335 fn, cb_data);
2336}
2337
7d2df051
NTND
2338int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2339 void *cb_data)
2340{
23a3f0cb 2341 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
7d2df051
NTND
2342 refname, fn, cb_data);
2343}
2344
2345int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2346 each_reflog_ent_fn fn, void *cb_data)
2347{
2348 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2349}
2350
e3688bd6
DT
2351int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2352 void *cb_data)
2353{
23a3f0cb 2354 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
7d2df051
NTND
2355 fn, cb_data);
2356}
e3688bd6 2357
7d2df051
NTND
2358int refs_reflog_exists(struct ref_store *refs, const char *refname)
2359{
2360 return refs->be->reflog_exists(refs, refname);
e3688bd6
DT
2361}
2362
2363int reflog_exists(const char *refname)
2364{
23a3f0cb 2365 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
7d2df051 2366}
e3688bd6 2367
7d2df051 2368int refs_create_reflog(struct ref_store *refs, const char *refname,
7b089120 2369 struct strbuf *err)
7d2df051 2370{
7b089120 2371 return refs->be->create_reflog(refs, refname, err);
e3688bd6
DT
2372}
2373
7b089120 2374int safe_create_reflog(const char *refname, struct strbuf *err)
e3688bd6 2375{
23a3f0cb 2376 return refs_create_reflog(get_main_ref_store(the_repository), refname,
7b089120 2377 err);
7d2df051 2378}
e3688bd6 2379
7d2df051
NTND
2380int refs_delete_reflog(struct ref_store *refs, const char *refname)
2381{
2382 return refs->be->delete_reflog(refs, refname);
e3688bd6
DT
2383}
2384
2385int delete_reflog(const char *refname)
2386{
23a3f0cb 2387 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
7d2df051 2388}
e3688bd6 2389
7d2df051 2390int refs_reflog_expire(struct ref_store *refs,
cc40b5ce 2391 const char *refname,
7d2df051
NTND
2392 unsigned int flags,
2393 reflog_expiry_prepare_fn prepare_fn,
2394 reflog_expiry_should_prune_fn should_prune_fn,
2395 reflog_expiry_cleanup_fn cleanup_fn,
2396 void *policy_cb_data)
2397{
cc40b5ce 2398 return refs->be->reflog_expire(refs, refname, flags,
7d2df051
NTND
2399 prepare_fn, should_prune_fn,
2400 cleanup_fn, policy_cb_data);
e3688bd6
DT
2401}
2402
cc40b5ce 2403int reflog_expire(const char *refname,
e3688bd6
DT
2404 unsigned int flags,
2405 reflog_expiry_prepare_fn prepare_fn,
2406 reflog_expiry_should_prune_fn should_prune_fn,
2407 reflog_expiry_cleanup_fn cleanup_fn,
2408 void *policy_cb_data)
2409{
23a3f0cb 2410 return refs_reflog_expire(get_main_ref_store(the_repository),
cc40b5ce 2411 refname, flags,
7d2df051
NTND
2412 prepare_fn, should_prune_fn,
2413 cleanup_fn, policy_cb_data);
e3688bd6 2414}
fc681463
DT
2415
2416int initial_ref_transaction_commit(struct ref_transaction *transaction,
2417 struct strbuf *err)
2418{
c0fe4e8b 2419 struct ref_store *refs = transaction->ref_store;
fc681463
DT
2420
2421 return refs->be->initial_transaction_commit(refs, transaction, err);
2422}
a27dcf89 2423
4f2ba2d0
PS
2424void ref_transaction_for_each_queued_update(struct ref_transaction *transaction,
2425 ref_transaction_for_each_queued_update_fn cb,
2426 void *cb_data)
2427{
2428 int i;
2429
2430 for (i = 0; i < transaction->nr; i++) {
2431 struct ref_update *update = transaction->updates[i];
2432
2433 cb(update->refname,
2434 (update->flags & REF_HAVE_OLD) ? &update->old_oid : NULL,
2435 (update->flags & REF_HAVE_NEW) ? &update->new_oid : NULL,
2436 cb_data);
2437 }
2438}
2439
523fa69c 2440int refs_delete_refs(struct ref_store *refs, const char *logmsg,
64da4199 2441 struct string_list *refnames, unsigned int flags)
a27dcf89 2442{
523fa69c
JH
2443 char *msg;
2444 int retval;
2445
2446 msg = normalize_reflog_message(logmsg);
2447 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2448 free(msg);
2449 return retval;
a27dcf89 2450}
9b6b40d9 2451
64da4199
MH
2452int delete_refs(const char *msg, struct string_list *refnames,
2453 unsigned int flags)
9b6b40d9 2454{
23a3f0cb 2455 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
7d2df051 2456}
9b6b40d9 2457
7d2df051
NTND
2458int refs_rename_ref(struct ref_store *refs, const char *oldref,
2459 const char *newref, const char *logmsg)
2460{
523fa69c
JH
2461 char *msg;
2462 int retval;
2463
2464 msg = normalize_reflog_message(logmsg);
2465 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2466 free(msg);
2467 return retval;
9b6b40d9 2468}
7d2df051
NTND
2469
2470int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2471{
23a3f0cb 2472 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
7d2df051 2473}
52d59cc6
SD
2474
2475int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2476 const char *newref, const char *logmsg)
2477{
523fa69c
JH
2478 char *msg;
2479 int retval;
2480
2481 msg = normalize_reflog_message(logmsg);
2482 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2483 free(msg);
2484 return retval;
52d59cc6
SD
2485}
2486
2487int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2488{
23a3f0cb 2489 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
52d59cc6 2490}