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