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