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