]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
rev-list: expose and document --single-worktree
[thirdparty/git.git] / refs.c
CommitLineData
7bd9bcf3
MH
1/*
2 * The backend-independent part of the reference module.
3 */
4
95fc7512 5#include "cache.h"
b2141fc1 6#include "config.h"
7d4558c4 7#include "hashmap.h"
697cc8ef 8#include "lockfile.h"
b05855b5 9#include "iterator.h"
85023577 10#include "refs.h"
4cb77009 11#include "refs/refs-internal.h"
cf0adba7
JH
12#include "object.h"
13#include "tag.h"
5d0bc90e 14#include "submodule.h"
17eff96b 15#include "worktree.h"
3581d793 16
3dce444f
RS
17/*
18 * List of all available backends
19 */
20static struct ref_storage_be *refs_backends = &refs_be_files;
21
22static struct ref_storage_be *find_ref_storage_backend(const char *name)
23{
24 struct ref_storage_be *be;
25 for (be = refs_backends; be; be = be->next)
26 if (!strcmp(be->name, name))
27 return be;
28 return NULL;
29}
30
31int ref_storage_backend_exists(const char *name)
32{
33 return find_ref_storage_backend(name) != NULL;
34}
35
bc5fd6d3 36/*
dde8a902
DT
37 * How to handle various characters in refnames:
38 * 0: An acceptable character for refs
5e650228
JH
39 * 1: End-of-component
40 * 2: ., look for a preceding . to reject .. in refs
41 * 3: {, look for a preceding @ to reject @{ in refs
53a8555e 42 * 4: A bad character: ASCII control characters, and
cd377f45
JK
43 * ":", "?", "[", "\", "^", "~", SP, or TAB
44 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
dde8a902
DT
45 */
46static unsigned char refname_disposition[256] = {
5e650228
JH
47 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
48 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
cd377f45 49 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
5e650228 50 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
dde8a902 51 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5e650228
JH
52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
dde8a902
DT
55};
56
57/*
58 * Try to read one refname component from the front of refname.
59 * Return the length of the component found, or -1 if the component is
60 * not legal. It is legal if it is something reasonable to have under
61 * ".git/refs/"; We do not like it if:
bc5fd6d3
MH
62 *
63 * - any path component of it begins with ".", or
64 * - it has double dots "..", or
53a8555e 65 * - it has ASCII control characters, or
cd377f45
JK
66 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
67 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
53a8555e
JK
68 * - it ends with a "/", or
69 * - it ends with ".lock", or
70 * - it contains a "@{" portion
bc5fd6d3 71 */
cd377f45 72static int check_refname_component(const char *refname, int *flags)
bc5fd6d3
MH
73{
74 const char *cp;
75 char last = '\0';
76
77 for (cp = refname; ; cp++) {
dde8a902
DT
78 int ch = *cp & 255;
79 unsigned char disp = refname_disposition[ch];
80 switch (disp) {
5e650228 81 case 1:
dde8a902 82 goto out;
5e650228 83 case 2:
dde8a902
DT
84 if (last == '.')
85 return -1; /* Refname contains "..". */
86 break;
5e650228 87 case 3:
dde8a902
DT
88 if (last == '@')
89 return -1; /* Refname contains "@{". */
bc5fd6d3 90 break;
5e650228 91 case 4:
dde8a902 92 return -1;
cd377f45
JK
93 case 5:
94 if (!(*flags & REFNAME_REFSPEC_PATTERN))
95 return -1; /* refspec can't be a pattern */
96
97 /*
98 * Unset the pattern flag so that we only accept
99 * a single asterisk for one side of refspec.
100 */
101 *flags &= ~ REFNAME_REFSPEC_PATTERN;
102 break;
dde8a902 103 }
bc5fd6d3
MH
104 last = ch;
105 }
dde8a902 106out:
bc5fd6d3 107 if (cp == refname)
dac529e4 108 return 0; /* Component has zero length. */
f3cc52d8
JN
109 if (refname[0] == '.')
110 return -1; /* Component starts with '.'. */
7108ad23
MH
111 if (cp - refname >= LOCK_SUFFIX_LEN &&
112 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
bc5fd6d3
MH
113 return -1; /* Refname ends with ".lock". */
114 return cp - refname;
115}
116
5e650228 117int check_refname_format(const char *refname, int flags)
bc5fd6d3
MH
118{
119 int component_len, component_count = 0;
120
9ba89f48
FC
121 if (!strcmp(refname, "@"))
122 /* Refname is a single character '@'. */
123 return -1;
124
bc5fd6d3
MH
125 while (1) {
126 /* We are at the start of a path component. */
cd377f45
JK
127 component_len = check_refname_component(refname, &flags);
128 if (component_len <= 0)
129 return -1;
130
bc5fd6d3
MH
131 component_count++;
132 if (refname[component_len] == '\0')
133 break;
134 /* Skip to next component. */
135 refname += component_len + 1;
136 }
137
138 if (refname[component_len - 1] == '.')
139 return -1; /* Refname ends with '.'. */
140 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
141 return -1; /* Refname has only one component. */
142 return 0;
143}
144
4cb77009 145int refname_is_safe(const char *refname)
d0f810f0 146{
39950fef
MH
147 const char *rest;
148
149 if (skip_prefix(refname, "refs/", &rest)) {
d0f810f0
RS
150 char *buf;
151 int result;
e40f3557
MH
152 size_t restlen = strlen(rest);
153
154 /* rest must not be empty, or start or end with "/" */
155 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
156 return 0;
d0f810f0 157
d0f810f0
RS
158 /*
159 * Does the refname try to escape refs/?
160 * For example: refs/foo/../bar is safe but refs/foo/../../bar
161 * is not.
162 */
e40f3557
MH
163 buf = xmallocz(restlen);
164 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
d0f810f0
RS
165 free(buf);
166 return result;
167 }
35db25c6
MH
168
169 do {
d0f810f0
RS
170 if (!isupper(*refname) && *refname != '_')
171 return 0;
172 refname++;
35db25c6 173 } while (*refname);
d0f810f0
RS
174 return 1;
175}
176
67be7c5a
MH
177/*
178 * Return true if refname, which has the specified oid and flags, can
179 * be resolved to an object in the database. If the referred-to object
180 * does not exist, emit a warning and return false.
181 */
182int ref_resolves_to_object(const char *refname,
183 const struct object_id *oid,
184 unsigned int flags)
185{
186 if (flags & REF_ISBROKEN)
187 return 0;
188 if (!has_sha1_file(oid->hash)) {
189 error("%s does not point to a valid object!", refname);
190 return 0;
191 }
192 return 1;
193}
194
7d2df051
NTND
195char *refs_resolve_refdup(struct ref_store *refs,
196 const char *refname, int resolve_flags,
197 unsigned char *sha1, int *flags)
198{
199 const char *result;
200
201 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
202 sha1, flags);
203 return xstrdup_or_null(result);
204}
205
7bd9bcf3
MH
206char *resolve_refdup(const char *refname, int resolve_flags,
207 unsigned char *sha1, int *flags)
e1e22e37 208{
7d2df051
NTND
209 return refs_resolve_refdup(get_main_ref_store(),
210 refname, resolve_flags,
211 sha1, flags);
cddc4258
MH
212}
213
7bd9bcf3
MH
214/* The argument to filter_refs */
215struct ref_filter {
216 const char *pattern;
217 each_ref_fn *fn;
218 void *cb_data;
219};
432ad41e 220
7d2df051
NTND
221int refs_read_ref_full(struct ref_store *refs, const char *refname,
222 int resolve_flags, unsigned char *sha1, int *flags)
732134ed 223{
7d2df051 224 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags))
7bd9bcf3
MH
225 return 0;
226 return -1;
732134ed
MH
227}
228
7d2df051
NTND
229int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
230{
231 return refs_read_ref_full(get_main_ref_store(), refname,
232 resolve_flags, sha1, flags);
233}
234
7bd9bcf3 235int read_ref(const char *refname, unsigned char *sha1)
cddc4258 236{
7bd9bcf3 237 return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
c774aab9
JP
238}
239
7bd9bcf3 240int ref_exists(const char *refname)
bc5fd6d3 241{
7bd9bcf3
MH
242 unsigned char sha1[20];
243 return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
bc5fd6d3
MH
244}
245
7bd9bcf3
MH
246static int filter_refs(const char *refname, const struct object_id *oid,
247 int flags, void *data)
432ad41e 248{
7bd9bcf3
MH
249 struct ref_filter *filter = (struct ref_filter *)data;
250
55d34269 251 if (wildmatch(filter->pattern, refname, 0))
7bd9bcf3
MH
252 return 0;
253 return filter->fn(refname, oid, flags, filter->cb_data);
432ad41e
MH
254}
255
7bd9bcf3 256enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
c774aab9 257{
7bd9bcf3 258 struct object *o = lookup_unknown_object(name);
c774aab9 259
7bd9bcf3
MH
260 if (o->type == OBJ_NONE) {
261 int type = sha1_object_info(name, NULL);
262 if (type < 0 || !object_as_type(o, type, 0))
263 return PEEL_INVALID;
264 }
bc5fd6d3 265
7bd9bcf3
MH
266 if (o->type != OBJ_TAG)
267 return PEEL_NON_TAG;
e1980c9d 268
7bd9bcf3
MH
269 o = deref_tag_noverify(o);
270 if (!o)
271 return PEEL_INVALID;
272
844a9ce4 273 hashcpy(sha1, o->oid.hash);
7bd9bcf3 274 return PEEL_PEELED;
e1980c9d
JH
275}
276
7bd9bcf3
MH
277struct warn_if_dangling_data {
278 FILE *fp;
279 const char *refname;
280 const struct string_list *refnames;
281 const char *msg_fmt;
282};
bc5fd6d3 283
7bd9bcf3
MH
284static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
285 int flags, void *cb_data)
286{
287 struct warn_if_dangling_data *d = cb_data;
288 const char *resolves_to;
289 struct object_id junk;
bc5fd6d3 290
7bd9bcf3
MH
291 if (!(flags & REF_ISSYMREF))
292 return 0;
bc5fd6d3 293
7bd9bcf3
MH
294 resolves_to = resolve_ref_unsafe(refname, 0, junk.hash, NULL);
295 if (!resolves_to
296 || (d->refname
297 ? strcmp(resolves_to, d->refname)
298 : !string_list_has_string(d->refnames, resolves_to))) {
299 return 0;
300 }
bc5fd6d3 301
7bd9bcf3
MH
302 fprintf(d->fp, d->msg_fmt, refname);
303 fputc('\n', d->fp);
304 return 0;
bc5fd6d3
MH
305}
306
7bd9bcf3 307void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
f348ac92 308{
7bd9bcf3
MH
309 struct warn_if_dangling_data data;
310
311 data.fp = fp;
312 data.refname = refname;
313 data.refnames = NULL;
314 data.msg_fmt = msg_fmt;
315 for_each_rawref(warn_if_dangling_symref, &data);
f348ac92
MH
316}
317
7bd9bcf3 318void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
432ad41e 319{
7bd9bcf3 320 struct warn_if_dangling_data data;
432ad41e 321
7bd9bcf3
MH
322 data.fp = fp;
323 data.refname = NULL;
324 data.refnames = refnames;
325 data.msg_fmt = msg_fmt;
326 for_each_rawref(warn_if_dangling_symref, &data);
432ad41e
MH
327}
328
7d2df051
NTND
329int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
330{
331 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
332}
333
7bd9bcf3 334int for_each_tag_ref(each_ref_fn fn, void *cb_data)
432ad41e 335{
7d2df051 336 return refs_for_each_tag_ref(get_main_ref_store(), fn, cb_data);
432ad41e
MH
337}
338
7d2df051
NTND
339int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
340{
341 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
432ad41e
MH
342}
343
7bd9bcf3 344int for_each_branch_ref(each_ref_fn fn, void *cb_data)
432ad41e 345{
7d2df051 346 return refs_for_each_branch_ref(get_main_ref_store(), fn, cb_data);
432ad41e
MH
347}
348
7d2df051
NTND
349int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
350{
351 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
202a56a9 352}
432ad41e 353
7bd9bcf3 354int for_each_remote_ref(each_ref_fn fn, void *cb_data)
e9c4c111 355{
7d2df051 356 return refs_for_each_remote_ref(get_main_ref_store(), fn, cb_data);
202a56a9
MH
357}
358
7bd9bcf3
MH
359int head_ref_namespaced(each_ref_fn fn, void *cb_data)
360{
361 struct strbuf buf = STRBUF_INIT;
362 int ret = 0;
363 struct object_id oid;
364 int flag;
c774aab9 365
7bd9bcf3
MH
366 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
367 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, oid.hash, &flag))
368 ret = fn(buf.buf, &oid, flag, cb_data);
369 strbuf_release(&buf);
c774aab9 370
7bd9bcf3 371 return ret;
e9c4c111 372}
c774aab9 373
7bd9bcf3
MH
374int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
375 const char *prefix, void *cb_data)
662428f4 376{
7bd9bcf3
MH
377 struct strbuf real_pattern = STRBUF_INIT;
378 struct ref_filter filter;
379 int ret;
d08bae7e 380
59556548 381 if (!prefix && !starts_with(pattern, "refs/"))
d08bae7e 382 strbuf_addstr(&real_pattern, "refs/");
b09fe971
IL
383 else if (prefix)
384 strbuf_addstr(&real_pattern, prefix);
d08bae7e
IL
385 strbuf_addstr(&real_pattern, pattern);
386
894a9d33 387 if (!has_glob_specials(pattern)) {
9517e6b8 388 /* Append implied '/' '*' if not present. */
00b6c178 389 strbuf_complete(&real_pattern, '/');
d08bae7e
IL
390 /* No need to check for '*', there is none. */
391 strbuf_addch(&real_pattern, '*');
392 }
393
394 filter.pattern = real_pattern.buf;
395 filter.fn = fn;
396 filter.cb_data = cb_data;
397 ret = for_each_ref(filter_refs, &filter);
398
399 strbuf_release(&real_pattern);
400 return ret;
401}
402
b09fe971
IL
403int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
404{
405 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
406}
407
4577e483 408const char *prettify_refname(const char *name)
a9c37a72 409{
3e5b36c6
SG
410 if (skip_prefix(name, "refs/heads/", &name) ||
411 skip_prefix(name, "refs/tags/", &name) ||
412 skip_prefix(name, "refs/remotes/", &name))
413 ; /* nothing */
414 return name;
a9c37a72
DB
415}
416
54457fe5 417static const char *ref_rev_parse_rules[] = {
79803322
SP
418 "%.*s",
419 "refs/%.*s",
420 "refs/tags/%.*s",
421 "refs/heads/%.*s",
422 "refs/remotes/%.*s",
423 "refs/remotes/%.*s/HEAD",
424 NULL
425};
426
54457fe5 427int refname_match(const char *abbrev_name, const char *full_name)
79803322
SP
428{
429 const char **p;
430 const int abbrev_name_len = strlen(abbrev_name);
431
54457fe5 432 for (p = ref_rev_parse_rules; *p; p++) {
79803322
SP
433 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
434 return 1;
435 }
436 }
437
438 return 0;
439}
440
ff74f7f1
JH
441/*
442 * *string and *len will only be substituted, and *string returned (for
443 * later free()ing) if the string passed in is a magic short-hand form
444 * to name a branch.
445 */
446static char *substitute_branch_name(const char **string, int *len)
447{
448 struct strbuf buf = STRBUF_INIT;
0e9f62da 449 int ret = interpret_branch_name(*string, *len, &buf, 0);
ff74f7f1
JH
450
451 if (ret == *len) {
452 size_t size;
453 *string = strbuf_detach(&buf, &size);
454 *len = size;
455 return (char *)*string;
456 }
457
458 return NULL;
459}
460
461int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
462{
463 char *last_branch = substitute_branch_name(&str, &len);
41da7111
NTND
464 int refs_found = expand_ref(str, len, sha1, ref);
465 free(last_branch);
466 return refs_found;
467}
468
469int expand_ref(const char *str, int len, unsigned char *sha1, char **ref)
470{
ff74f7f1
JH
471 const char **p, *r;
472 int refs_found = 0;
6cd4a898 473 struct strbuf fullref = STRBUF_INIT;
ff74f7f1
JH
474
475 *ref = NULL;
476 for (p = ref_rev_parse_rules; *p; p++) {
ff74f7f1
JH
477 unsigned char sha1_from_ref[20];
478 unsigned char *this_result;
479 int flag;
480
481 this_result = refs_found ? sha1_from_ref : sha1;
6cd4a898
JK
482 strbuf_reset(&fullref);
483 strbuf_addf(&fullref, *p, len, str);
484 r = resolve_ref_unsafe(fullref.buf, RESOLVE_REF_READING,
7695d118 485 this_result, &flag);
ff74f7f1
JH
486 if (r) {
487 if (!refs_found++)
488 *ref = xstrdup(r);
489 if (!warn_ambiguous_refs)
490 break;
6cd4a898
JK
491 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
492 warning("ignoring dangling symref %s.", fullref.buf);
493 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
494 warning("ignoring broken ref %s.", fullref.buf);
55956350 495 }
ff74f7f1 496 }
6cd4a898 497 strbuf_release(&fullref);
ff74f7f1
JH
498 return refs_found;
499}
500
501int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
502{
503 char *last_branch = substitute_branch_name(&str, &len);
504 const char **p;
505 int logs_found = 0;
6cd4a898 506 struct strbuf path = STRBUF_INIT;
ff74f7f1
JH
507
508 *log = NULL;
509 for (p = ref_rev_parse_rules; *p; p++) {
ff74f7f1 510 unsigned char hash[20];
ff74f7f1
JH
511 const char *ref, *it;
512
6cd4a898
JK
513 strbuf_reset(&path);
514 strbuf_addf(&path, *p, len, str);
515 ref = resolve_ref_unsafe(path.buf, RESOLVE_REF_READING,
7695d118 516 hash, NULL);
ff74f7f1
JH
517 if (!ref)
518 continue;
6cd4a898
JK
519 if (reflog_exists(path.buf))
520 it = path.buf;
521 else if (strcmp(ref, path.buf) && reflog_exists(ref))
ff74f7f1
JH
522 it = ref;
523 else
524 continue;
525 if (!logs_found++) {
526 *log = xstrdup(it);
527 hashcpy(sha1, hash);
528 }
7bd9bcf3
MH
529 if (!warn_ambiguous_refs)
530 break;
c0277d15 531 }
6cd4a898 532 strbuf_release(&path);
7bd9bcf3
MH
533 free(last_branch);
534 return logs_found;
2ddb5d17
BK
535}
536
266b1827
DT
537static int is_per_worktree_ref(const char *refname)
538{
ce414b33
DT
539 return !strcmp(refname, "HEAD") ||
540 starts_with(refname, "refs/bisect/");
266b1827
DT
541}
542
543static int is_pseudoref_syntax(const char *refname)
544{
545 const char *c;
546
547 for (c = refname; *c; c++) {
548 if (!isupper(*c) && *c != '-' && *c != '_')
549 return 0;
550 }
551
552 return 1;
553}
554
555enum ref_type ref_type(const char *refname)
556{
557 if (is_per_worktree_ref(refname))
558 return REF_TYPE_PER_WORKTREE;
559 if (is_pseudoref_syntax(refname))
560 return REF_TYPE_PSEUDOREF;
561 return REF_TYPE_NORMAL;
562}
563
74ec19d4
DT
564static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
565 const unsigned char *old_sha1, struct strbuf *err)
566{
567 const char *filename;
568 int fd;
569 static struct lock_file lock;
570 struct strbuf buf = STRBUF_INIT;
571 int ret = -1;
572
573 strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
574
575 filename = git_path("%s", pseudoref);
576 fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
577 if (fd < 0) {
0568c8e9 578 strbuf_addf(err, "could not open '%s' for writing: %s",
74ec19d4
DT
579 filename, strerror(errno));
580 return -1;
581 }
582
583 if (old_sha1) {
584 unsigned char actual_old_sha1[20];
2c3aed13
DT
585
586 if (read_ref(pseudoref, actual_old_sha1))
587 die("could not read ref '%s'", pseudoref);
74ec19d4 588 if (hashcmp(actual_old_sha1, old_sha1)) {
0568c8e9 589 strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
74ec19d4
DT
590 rollback_lock_file(&lock);
591 goto done;
592 }
593 }
594
595 if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
0568c8e9 596 strbuf_addf(err, "could not write to '%s'", filename);
74ec19d4
DT
597 rollback_lock_file(&lock);
598 goto done;
599 }
600
601 commit_lock_file(&lock);
602 ret = 0;
603done:
604 strbuf_release(&buf);
605 return ret;
606}
607
608static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1)
609{
610 static struct lock_file lock;
611 const char *filename;
612
613 filename = git_path("%s", pseudoref);
614
615 if (old_sha1 && !is_null_sha1(old_sha1)) {
616 int fd;
617 unsigned char actual_old_sha1[20];
618
619 fd = hold_lock_file_for_update(&lock, filename,
620 LOCK_DIE_ON_ERROR);
621 if (fd < 0)
622 die_errno(_("Could not open '%s' for writing"), filename);
2c3aed13
DT
623 if (read_ref(pseudoref, actual_old_sha1))
624 die("could not read ref '%s'", pseudoref);
74ec19d4
DT
625 if (hashcmp(actual_old_sha1, old_sha1)) {
626 warning("Unexpected sha1 when deleting %s", pseudoref);
627 rollback_lock_file(&lock);
628 return -1;
a4c653df 629 }
74ec19d4
DT
630
631 unlink(filename);
632 rollback_lock_file(&lock);
633 } else {
634 unlink(filename);
4bd18c43 635 }
a4c653df 636
4bd18c43 637 return 0;
95fc7512 638}
d556fae2 639
c0fe4e8b
NTND
640int refs_delete_ref(struct ref_store *refs, const char *msg,
641 const char *refname,
642 const unsigned char *old_sha1,
643 unsigned int flags)
41b625b0 644{
7521cc46 645 struct ref_transaction *transaction;
a4c653df 646 struct strbuf err = STRBUF_INIT;
8b5157e4 647
c0fe4e8b
NTND
648 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
649 assert(refs == get_main_ref_store());
080cc646 650 return delete_pseudoref(refname, old_sha1);
c0fe4e8b 651 }
d48744d1 652
c0fe4e8b 653 transaction = ref_store_transaction_begin(refs, &err);
7521cc46 654 if (!transaction ||
fc67a082 655 ref_transaction_delete(transaction, refname, old_sha1,
755b49ae 656 flags, msg, &err) ||
db7516ab 657 ref_transaction_commit(transaction, &err)) {
7521cc46
RS
658 error("%s", err.buf);
659 ref_transaction_free(transaction);
660 strbuf_release(&err);
c0277d15 661 return 1;
41b625b0 662 }
7bd9bcf3
MH
663 ref_transaction_free(transaction);
664 strbuf_release(&err);
b531394d
BC
665 return 0;
666}
41b625b0 667
c0fe4e8b
NTND
668int delete_ref(const char *msg, const char *refname,
669 const unsigned char *old_sha1, unsigned int flags)
670{
671 return refs_delete_ref(get_main_ref_store(), msg, refname,
672 old_sha1, flags);
673}
674
4cb77009 675int copy_reflog_msg(char *buf, const char *msg)
0ec29a47
JH
676{
677 char *cp = buf;
678 char c;
679 int wasspace = 1;
8b5157e4 680
0ec29a47
JH
681 *cp++ = '\t';
682 while ((c = *msg++)) {
683 if (wasspace && isspace(c))
684 continue;
685 wasspace = isspace(c);
686 if (wasspace)
687 c = ' ';
688 *cp++ = c;
a4c653df 689 }
0ec29a47
JH
690 while (buf < cp && isspace(cp[-1]))
691 cp--;
692 *cp++ = '\n';
693 return cp - buf;
694}
8b5157e4 695
4cb77009 696int should_autocreate_reflog(const char *refname)
4e2bef57 697{
341fb286
CW
698 switch (log_all_ref_updates) {
699 case LOG_REFS_ALWAYS:
700 return 1;
701 case LOG_REFS_NORMAL:
702 return starts_with(refname, "refs/heads/") ||
703 starts_with(refname, "refs/remotes/") ||
704 starts_with(refname, "refs/notes/") ||
705 !strcmp(refname, "HEAD");
706 default:
4e2bef57 707 return 0;
341fb286 708 }
4e2bef57
DT
709}
710
e7e0f26e 711int is_branch(const char *refname)
c3b0dec5 712{
59556548 713 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
714}
715
4207ed28
RS
716struct read_ref_at_cb {
717 const char *refname;
dddbad72 718 timestamp_t at_time;
4207ed28
RS
719 int cnt;
720 int reccnt;
721 unsigned char *sha1;
722 int found_it;
723
724 unsigned char osha1[20];
725 unsigned char nsha1[20];
726 int tz;
dddbad72 727 timestamp_t date;
4207ed28 728 char **msg;
dddbad72 729 timestamp_t *cutoff_time;
4207ed28
RS
730 int *cutoff_tz;
731 int *cutoff_cnt;
732};
733
9461d272 734static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
dddbad72 735 const char *email, timestamp_t timestamp, int tz,
4207ed28
RS
736 const char *message, void *cb_data)
737{
738 struct read_ref_at_cb *cb = cb_data;
739
740 cb->reccnt++;
741 cb->tz = tz;
742 cb->date = timestamp;
743
744 if (timestamp <= cb->at_time || cb->cnt == 0) {
745 if (cb->msg)
746 *cb->msg = xstrdup(message);
747 if (cb->cutoff_time)
748 *cb->cutoff_time = timestamp;
749 if (cb->cutoff_tz)
750 *cb->cutoff_tz = tz;
751 if (cb->cutoff_cnt)
752 *cb->cutoff_cnt = cb->reccnt - 1;
753 /*
754 * we have not yet updated cb->[n|o]sha1 so they still
755 * hold the values for the previous record.
756 */
757 if (!is_null_sha1(cb->osha1)) {
9461d272 758 hashcpy(cb->sha1, noid->hash);
759 if (hashcmp(cb->osha1, noid->hash))
4207ed28 760 warning("Log for ref %s has gap after %s.",
a5481a6c 761 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
4207ed28
RS
762 }
763 else if (cb->date == cb->at_time)
9461d272 764 hashcpy(cb->sha1, noid->hash);
765 else if (hashcmp(noid->hash, cb->sha1))
4207ed28
RS
766 warning("Log for ref %s unexpectedly ended on %s.",
767 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 768 DATE_MODE(RFC2822)));
9461d272 769 hashcpy(cb->osha1, ooid->hash);
770 hashcpy(cb->nsha1, noid->hash);
4207ed28
RS
771 cb->found_it = 1;
772 return 1;
773 }
9461d272 774 hashcpy(cb->osha1, ooid->hash);
775 hashcpy(cb->nsha1, noid->hash);
4207ed28
RS
776 if (cb->cnt > 0)
777 cb->cnt--;
778 return 0;
779}
780
9461d272 781static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
dddbad72 782 const char *email, timestamp_t timestamp,
4207ed28
RS
783 int tz, const char *message, void *cb_data)
784{
785 struct read_ref_at_cb *cb = cb_data;
786
787 if (cb->msg)
788 *cb->msg = xstrdup(message);
789 if (cb->cutoff_time)
790 *cb->cutoff_time = timestamp;
791 if (cb->cutoff_tz)
792 *cb->cutoff_tz = tz;
793 if (cb->cutoff_cnt)
794 *cb->cutoff_cnt = cb->reccnt;
9461d272 795 hashcpy(cb->sha1, ooid->hash);
4207ed28 796 if (is_null_sha1(cb->sha1))
9461d272 797 hashcpy(cb->sha1, noid->hash);
4207ed28
RS
798 /* We just want the first entry */
799 return 1;
16d7cc90
JH
800}
801
dddbad72 802int read_ref_at(const char *refname, unsigned int flags, timestamp_t at_time, int cnt,
dfefa935 803 unsigned char *sha1, char **msg,
dddbad72 804 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 805{
4207ed28 806 struct read_ref_at_cb cb;
d556fae2 807
4207ed28
RS
808 memset(&cb, 0, sizeof(cb));
809 cb.refname = refname;
810 cb.at_time = at_time;
811 cb.cnt = cnt;
812 cb.msg = msg;
813 cb.cutoff_time = cutoff_time;
814 cb.cutoff_tz = cutoff_tz;
815 cb.cutoff_cnt = cutoff_cnt;
816 cb.sha1 = sha1;
817
818 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
819
c41a87dd 820 if (!cb.reccnt) {
321c89bf 821 if (flags & GET_OID_QUIETLY)
c41a87dd
DA
822 exit(128);
823 else
824 die("Log for %s is empty.", refname);
825 }
4207ed28
RS
826 if (cb.found_it)
827 return 0;
828
829 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
d556fae2 830
16d7cc90 831 return 1;
d556fae2 832}
2ff81662 833
c0fe4e8b
NTND
834struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
835 struct strbuf *err)
caa4046c 836{
c0fe4e8b 837 struct ref_transaction *tr;
5a603b04
JN
838 assert(err);
839
c0fe4e8b
NTND
840 tr = xcalloc(1, sizeof(struct ref_transaction));
841 tr->ref_store = refs;
842 return tr;
843}
844
845struct ref_transaction *ref_transaction_begin(struct strbuf *err)
846{
847 return ref_store_transaction_begin(get_main_ref_store(), err);
caa4046c
MH
848}
849
026bd1d3 850void ref_transaction_free(struct ref_transaction *transaction)
caa4046c 851{
43a2dfde 852 size_t i;
caa4046c 853
1b07255c
RS
854 if (!transaction)
855 return;
856
30173b88
MH
857 switch (transaction->state) {
858 case REF_TRANSACTION_OPEN:
859 case REF_TRANSACTION_CLOSED:
860 /* OK */
861 break;
862 case REF_TRANSACTION_PREPARED:
863 die("BUG: free called on a prepared reference transaction");
864 break;
865 default:
866 die("BUG: unexpected reference transaction state");
867 break;
868 }
869
db7516ab
RS
870 for (i = 0; i < transaction->nr; i++) {
871 free(transaction->updates[i]->msg);
88615910 872 free(transaction->updates[i]);
db7516ab 873 }
caa4046c
MH
874 free(transaction->updates);
875 free(transaction);
876}
877
71564516
MH
878struct ref_update *ref_transaction_add_update(
879 struct ref_transaction *transaction,
880 const char *refname, unsigned int flags,
881 const unsigned char *new_sha1,
882 const unsigned char *old_sha1,
883 const char *msg)
caa4046c 884{
96ffc06f 885 struct ref_update *update;
71564516
MH
886
887 if (transaction->state != REF_TRANSACTION_OPEN)
888 die("BUG: update called for transaction that is not open");
889
890 if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
891 die("BUG: REF_ISPRUNING set without REF_NODEREF");
892
96ffc06f 893 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
894 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
895 transaction->updates[transaction->nr++] = update;
71564516
MH
896
897 update->flags = flags;
898
899 if (flags & REF_HAVE_NEW)
98491298 900 hashcpy(update->new_oid.hash, new_sha1);
71564516 901 if (flags & REF_HAVE_OLD)
98491298 902 hashcpy(update->old_oid.hash, old_sha1);
13092a91 903 update->msg = xstrdup_or_null(msg);
caa4046c
MH
904 return update;
905}
906
8e34800e
RS
907int ref_transaction_update(struct ref_transaction *transaction,
908 const char *refname,
909 const unsigned char *new_sha1,
910 const unsigned char *old_sha1,
1d147bdf 911 unsigned int flags, const char *msg,
8e34800e 912 struct strbuf *err)
caa4046c 913{
5a603b04
JN
914 assert(err);
915
8a679de6
MH
916 if ((new_sha1 && !is_null_sha1(new_sha1)) ?
917 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
918 !refname_is_safe(refname)) {
0568c8e9 919 strbuf_addf(err, "refusing to update ref with bad name '%s'",
d0f810f0
RS
920 refname);
921 return -1;
922 }
923
71564516
MH
924 flags |= (new_sha1 ? REF_HAVE_NEW : 0) | (old_sha1 ? REF_HAVE_OLD : 0);
925
926 ref_transaction_add_update(transaction, refname, flags,
927 new_sha1, old_sha1, msg);
8e34800e 928 return 0;
caa4046c
MH
929}
930
b416af5b
RS
931int ref_transaction_create(struct ref_transaction *transaction,
932 const char *refname,
933 const unsigned char *new_sha1,
fec14ec3 934 unsigned int flags, const char *msg,
b416af5b 935 struct strbuf *err)
caa4046c 936{
f04c5b55
MH
937 if (!new_sha1 || is_null_sha1(new_sha1))
938 die("BUG: create called without valid new_sha1");
bc9f2925 939 return ref_transaction_update(transaction, refname, new_sha1,
1d147bdf 940 null_sha1, flags, msg, err);
caa4046c
MH
941}
942
8c8bdc0d
RS
943int ref_transaction_delete(struct ref_transaction *transaction,
944 const char *refname,
945 const unsigned char *old_sha1,
fb5a6bb6 946 unsigned int flags, const char *msg,
8c8bdc0d 947 struct strbuf *err)
caa4046c 948{
60294596
MH
949 if (old_sha1 && is_null_sha1(old_sha1))
950 die("BUG: delete called with old_sha1 set to zeros");
1d147bdf 951 return ref_transaction_update(transaction, refname,
fb5a6bb6 952 null_sha1, old_sha1,
1d147bdf 953 flags, msg, err);
caa4046c
MH
954}
955
16180334
MH
956int ref_transaction_verify(struct ref_transaction *transaction,
957 const char *refname,
958 const unsigned char *old_sha1,
959 unsigned int flags,
960 struct strbuf *err)
961{
962 if (!old_sha1)
963 die("BUG: verify called with old_sha1 set to NULL");
964 return ref_transaction_update(transaction, refname,
965 NULL, old_sha1,
966 flags, NULL, err);
967}
968
8f6dc7e3 969int update_ref_oid(const char *msg, const char *refname,
970 const struct object_id *new_oid, const struct object_id *old_oid,
971 unsigned int flags, enum action_on_err onerr)
972{
973 return update_ref(msg, refname, new_oid ? new_oid->hash : NULL,
974 old_oid ? old_oid->hash : NULL, flags, onerr);
975}
976
c0fe4e8b
NTND
977int refs_update_ref(struct ref_store *refs, const char *msg,
978 const char *refname, const unsigned char *new_sha1,
979 const unsigned char *old_sha1, unsigned int flags,
980 enum action_on_err onerr)
4738a333 981{
74ec19d4 982 struct ref_transaction *t = NULL;
b4d75ac1 983 struct strbuf err = STRBUF_INIT;
74ec19d4 984 int ret = 0;
b4d75ac1 985
74ec19d4 986 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
c0fe4e8b 987 assert(refs == get_main_ref_store());
74ec19d4
DT
988 ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
989 } else {
c0fe4e8b 990 t = ref_store_transaction_begin(refs, &err);
74ec19d4
DT
991 if (!t ||
992 ref_transaction_update(t, refname, new_sha1, old_sha1,
993 flags, msg, &err) ||
994 ref_transaction_commit(t, &err)) {
995 ret = 1;
996 ref_transaction_free(t);
997 }
998 }
999 if (ret) {
b4d75ac1
RS
1000 const char *str = "update_ref failed for ref '%s': %s";
1001
b4d75ac1
RS
1002 switch (onerr) {
1003 case UPDATE_REFS_MSG_ON_ERR:
1004 error(str, refname, err.buf);
1005 break;
1006 case UPDATE_REFS_DIE_ON_ERR:
1007 die(str, refname, err.buf);
1008 break;
1009 case UPDATE_REFS_QUIET_ON_ERR:
1010 break;
1011 }
1012 strbuf_release(&err);
4738a333 1013 return 1;
b4d75ac1
RS
1014 }
1015 strbuf_release(&err);
74ec19d4
DT
1016 if (t)
1017 ref_transaction_free(t);
b4d75ac1 1018 return 0;
4738a333
BK
1019}
1020
c0fe4e8b
NTND
1021int update_ref(const char *msg, const char *refname,
1022 const unsigned char *new_sha1,
1023 const unsigned char *old_sha1,
1024 unsigned int flags, enum action_on_err onerr)
1025{
1026 return refs_update_ref(get_main_ref_store(), msg, refname, new_sha1,
1027 old_sha1, flags, onerr);
1028}
1029
dfefa935 1030char *shorten_unambiguous_ref(const char *refname, int strict)
7c2b3029
JK
1031{
1032 int i;
1033 static char **scanf_fmts;
1034 static int nr_rules;
1035 char *short_name;
6cd4a898 1036 struct strbuf resolved_buf = STRBUF_INIT;
7c2b3029 1037
7c2b3029 1038 if (!nr_rules) {
4346663a
MH
1039 /*
1040 * Pre-generate scanf formats from ref_rev_parse_rules[].
1041 * Generate a format suitable for scanf from a
1042 * ref_rev_parse_rules rule by interpolating "%s" at the
1043 * location of the "%.*s".
1044 */
7c2b3029 1045 size_t total_len = 0;
84d5633f 1046 size_t offset = 0;
7c2b3029
JK
1047
1048 /* the rule list is NULL terminated, count them first */
a4165851 1049 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
1050 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1051 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 1052
50492f7b 1053 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 1054
84d5633f 1055 offset = 0;
7c2b3029 1056 for (i = 0; i < nr_rules; i++) {
4346663a 1057 assert(offset < total_len);
84d5633f 1058 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
4346663a
MH
1059 offset += snprintf(scanf_fmts[i], total_len - offset,
1060 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
1061 }
1062 }
1063
1064 /* bail out if there are no rules */
1065 if (!nr_rules)
dfefa935 1066 return xstrdup(refname);
7c2b3029 1067
dfefa935
MH
1068 /* buffer for scanf result, at most refname must fit */
1069 short_name = xstrdup(refname);
7c2b3029
JK
1070
1071 /* skip first rule, it will always match */
1072 for (i = nr_rules - 1; i > 0 ; --i) {
1073 int j;
6e7b3309 1074 int rules_to_fail = i;
7c2b3029
JK
1075 int short_name_len;
1076
dfefa935 1077 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
1078 continue;
1079
1080 short_name_len = strlen(short_name);
1081
6e7b3309
BW
1082 /*
1083 * in strict mode, all (except the matched one) rules
1084 * must fail to resolve to a valid non-ambiguous ref
1085 */
1086 if (strict)
1087 rules_to_fail = nr_rules;
1088
7c2b3029
JK
1089 /*
1090 * check if the short name resolves to a valid ref,
1091 * but use only rules prior to the matched one
1092 */
6e7b3309 1093 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 1094 const char *rule = ref_rev_parse_rules[j];
7c2b3029 1095
6e7b3309
BW
1096 /* skip matched rule */
1097 if (i == j)
1098 continue;
1099
7c2b3029
JK
1100 /*
1101 * the short name is ambiguous, if it resolves
1102 * (with this previous rule) to a valid ref
1103 * read_ref() returns 0 on success
1104 */
6cd4a898
JK
1105 strbuf_reset(&resolved_buf);
1106 strbuf_addf(&resolved_buf, rule,
1107 short_name_len, short_name);
1108 if (ref_exists(resolved_buf.buf))
7c2b3029
JK
1109 break;
1110 }
1111
1112 /*
1113 * short name is non-ambiguous if all previous rules
1114 * haven't resolved to a valid ref
1115 */
6cd4a898
JK
1116 if (j == rules_to_fail) {
1117 strbuf_release(&resolved_buf);
7c2b3029 1118 return short_name;
6cd4a898 1119 }
7c2b3029
JK
1120 }
1121
6cd4a898 1122 strbuf_release(&resolved_buf);
7c2b3029 1123 free(short_name);
dfefa935 1124 return xstrdup(refname);
7c2b3029 1125}
daebaa78
JH
1126
1127static struct string_list *hide_refs;
1128
1129int parse_hide_refs_config(const char *var, const char *value, const char *section)
1130{
ad8c7cda 1131 const char *key;
daebaa78 1132 if (!strcmp("transfer.hiderefs", var) ||
ad8c7cda
JK
1133 (!parse_config_key(var, section, NULL, NULL, &key) &&
1134 !strcmp(key, "hiderefs"))) {
daebaa78
JH
1135 char *ref;
1136 int len;
1137
1138 if (!value)
1139 return config_error_nonbool(var);
1140 ref = xstrdup(value);
1141 len = strlen(ref);
1142 while (len && ref[len - 1] == '/')
1143 ref[--len] = '\0';
1144 if (!hide_refs) {
1145 hide_refs = xcalloc(1, sizeof(*hide_refs));
1146 hide_refs->strdup_strings = 1;
1147 }
1148 string_list_append(hide_refs, ref);
1149 }
1150 return 0;
1151}
1152
78a766ab 1153int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1154{
2bc31d16 1155 int i;
daebaa78
JH
1156
1157 if (!hide_refs)
1158 return 0;
2bc31d16
JK
1159 for (i = hide_refs->nr - 1; i >= 0; i--) {
1160 const char *match = hide_refs->items[i].string;
78a766ab 1161 const char *subject;
2bc31d16 1162 int neg = 0;
7a40a95e 1163 const char *p;
2bc31d16
JK
1164
1165 if (*match == '!') {
1166 neg = 1;
1167 match++;
1168 }
1169
78a766ab
LF
1170 if (*match == '^') {
1171 subject = refname_full;
1172 match++;
1173 } else {
1174 subject = refname;
1175 }
1176
1177 /* refname can be NULL when namespaces are used. */
7a40a95e
CC
1178 if (subject &&
1179 skip_prefix(subject, match, &p) &&
1180 (!*p || *p == '/'))
2bc31d16 1181 return !neg;
daebaa78
JH
1182 }
1183 return 0;
1184}
fa5b1830 1185
0845122c
DT
1186const char *find_descendant_ref(const char *dirname,
1187 const struct string_list *extras,
1188 const struct string_list *skip)
fa5b1830 1189{
0845122c 1190 int pos;
fa5b1830 1191
0845122c
DT
1192 if (!extras)
1193 return NULL;
fa5b1830
MH
1194
1195 /*
0845122c
DT
1196 * Look at the place where dirname would be inserted into
1197 * extras. If there is an entry at that position that starts
1198 * with dirname (remember, dirname includes the trailing
1199 * slash) and is not in skip, then we have a conflict.
fa5b1830 1200 */
0845122c
DT
1201 for (pos = string_list_find_insert_index(extras, dirname, 0);
1202 pos < extras->nr; pos++) {
1203 const char *extra_refname = extras->items[pos].string;
fa5b1830 1204
0845122c
DT
1205 if (!starts_with(extra_refname, dirname))
1206 break;
1207
1208 if (!skip || !string_list_has_string(skip, extra_refname))
1209 return extra_refname;
fa5b1830 1210 }
0845122c
DT
1211 return NULL;
1212}
fa5b1830 1213
7d2df051
NTND
1214int refs_rename_ref_available(struct ref_store *refs,
1215 const char *old_refname,
1216 const char *new_refname)
0845122c
DT
1217{
1218 struct string_list skip = STRING_LIST_INIT_NODUP;
1219 struct strbuf err = STRBUF_INIT;
ff3a299c 1220 int ok;
fa5b1830 1221
ff3a299c 1222 string_list_insert(&skip, old_refname);
7d2df051
NTND
1223 ok = !refs_verify_refname_available(refs, new_refname,
1224 NULL, &skip, &err);
ff3a299c 1225 if (!ok)
0845122c
DT
1226 error("%s", err.buf);
1227
1228 string_list_clear(&skip, 0);
1229 strbuf_release(&err);
ff3a299c 1230 return ok;
fa5b1830 1231}
2bf68ed5 1232
62f0b399 1233int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2bf68ed5
DT
1234{
1235 struct object_id oid;
1236 int flag;
1237
62f0b399
NTND
1238 if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
1239 oid.hash, &flag))
2bf68ed5
DT
1240 return fn("HEAD", &oid, flag, cb_data);
1241
1242 return 0;
1243}
1244
1245int head_ref(each_ref_fn fn, void *cb_data)
1246{
62f0b399 1247 return refs_head_ref(get_main_ref_store(), fn, cb_data);
2bf68ed5 1248}
93770590 1249
e121b9cb
MH
1250struct ref_iterator *refs_ref_iterator_begin(
1251 struct ref_store *refs,
1252 const char *prefix, int trim, int flags)
1253{
1254 struct ref_iterator *iter;
1255
0a0865b8
MH
1256 if (ref_paranoia < 0)
1257 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
1258 if (ref_paranoia)
1259 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1260
e121b9cb 1261 iter = refs->be->iterator_begin(refs, prefix, flags);
c7599718
MH
1262
1263 /*
1264 * `iterator_begin()` already takes care of prefix, but we
1265 * might need to do some trimming:
1266 */
1267 if (trim)
1268 iter = prefix_ref_iterator_begin(iter, "", trim);
e121b9cb
MH
1269
1270 return iter;
1271}
1272
4c4de895
MH
1273/*
1274 * Call fn for each reference in the specified submodule for which the
1275 * refname begins with prefix. If trim is non-zero, then trim that
1276 * many characters off the beginning of each refname before passing
1277 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1278 * include broken references in the iteration. If fn ever returns a
1279 * non-zero value, stop the iteration and return that value;
1280 * otherwise, return 0.
1281 */
7d2df051 1282static int do_for_each_ref(struct ref_store *refs, const char *prefix,
4c4de895
MH
1283 each_ref_fn fn, int trim, int flags, void *cb_data)
1284{
1285 struct ref_iterator *iter;
1286
00eebe35
MH
1287 if (!refs)
1288 return 0;
1289
e121b9cb 1290 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
4c4de895
MH
1291
1292 return do_for_each_ref_iterator(iter, fn, cb_data);
1293}
1294
7d2df051
NTND
1295int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1296{
1297 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1298}
1299
93770590
DT
1300int for_each_ref(each_ref_fn fn, void *cb_data)
1301{
7d2df051 1302 return refs_for_each_ref(get_main_ref_store(), fn, cb_data);
93770590
DT
1303}
1304
7d2df051
NTND
1305int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1306 each_ref_fn fn, void *cb_data)
1307{
1308 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
93770590
DT
1309}
1310
1311int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1312{
7d2df051 1313 return refs_for_each_ref_in(get_main_ref_store(), prefix, fn, cb_data);
93770590
DT
1314}
1315
1316int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1317{
1318 unsigned int flag = 0;
1319
1320 if (broken)
1321 flag = DO_FOR_EACH_INCLUDE_BROKEN;
7d2df051
NTND
1322 return do_for_each_ref(get_main_ref_store(),
1323 prefix, fn, 0, flag, cb_data);
93770590
DT
1324}
1325
073cf63c
NTND
1326int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1327 each_ref_fn fn, void *cb_data,
1328 unsigned int broken)
03df567f
MH
1329{
1330 unsigned int flag = 0;
1331
1332 if (broken)
1333 flag = DO_FOR_EACH_INCLUDE_BROKEN;
073cf63c 1334 return do_for_each_ref(refs, prefix, fn, 0, flag, cb_data);
03df567f
MH
1335}
1336
93770590
DT
1337int for_each_replace_ref(each_ref_fn fn, void *cb_data)
1338{
7d2df051
NTND
1339 return do_for_each_ref(get_main_ref_store(),
1340 git_replace_ref_base, fn,
1341 strlen(git_replace_ref_base),
1342 0, cb_data);
93770590
DT
1343}
1344
1345int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1346{
1347 struct strbuf buf = STRBUF_INIT;
1348 int ret;
1349 strbuf_addf(&buf, "%srefs/", get_git_namespace());
7d2df051
NTND
1350 ret = do_for_each_ref(get_main_ref_store(),
1351 buf.buf, fn, 0, 0, cb_data);
93770590
DT
1352 strbuf_release(&buf);
1353 return ret;
1354}
1355
7d2df051 1356int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
93770590 1357{
7d2df051 1358 return do_for_each_ref(refs, "", fn, 0,
93770590
DT
1359 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1360}
2d0663b2 1361
7d2df051
NTND
1362int for_each_rawref(each_ref_fn fn, void *cb_data)
1363{
1364 return refs_for_each_rawref(get_main_ref_store(), fn, cb_data);
1365}
1366
470be518
MH
1367int refs_read_raw_ref(struct ref_store *ref_store,
1368 const char *refname, unsigned char *sha1,
1369 struct strbuf *referent, unsigned int *type)
1370{
1371 return ref_store->be->read_raw_ref(ref_store, refname, sha1, referent, type);
1372}
1373
2d0663b2 1374/* This function needs to return a meaningful errno on failure */
7d2df051 1375const char *refs_resolve_ref_unsafe(struct ref_store *refs,
3c0cb0cb
MH
1376 const char *refname,
1377 int resolve_flags,
1378 unsigned char *sha1, int *flags)
2d0663b2
DT
1379{
1380 static struct strbuf sb_refname = STRBUF_INIT;
1381 int unused_flags;
1382 int symref_count;
1383
1384 if (!flags)
1385 flags = &unused_flags;
1386
1387 *flags = 0;
1388
1389 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1390 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1391 !refname_is_safe(refname)) {
1392 errno = EINVAL;
1393 return NULL;
1394 }
1395
1396 /*
1397 * dwim_ref() uses REF_ISBROKEN to distinguish between
1398 * missing refs and refs that were present but invalid,
1399 * to complain about the latter to stderr.
1400 *
1401 * We don't know whether the ref exists, so don't set
1402 * REF_ISBROKEN yet.
1403 */
1404 *flags |= REF_BAD_NAME;
1405 }
1406
1407 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1408 unsigned int read_flags = 0;
1409
470be518
MH
1410 if (refs_read_raw_ref(refs, refname,
1411 sha1, &sb_refname, &read_flags)) {
2d0663b2
DT
1412 *flags |= read_flags;
1413 if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
1414 return NULL;
1415 hashclr(sha1);
1416 if (*flags & REF_BAD_NAME)
1417 *flags |= REF_ISBROKEN;
1418 return refname;
1419 }
1420
1421 *flags |= read_flags;
1422
1423 if (!(read_flags & REF_ISSYMREF)) {
1424 if (*flags & REF_BAD_NAME) {
1425 hashclr(sha1);
1426 *flags |= REF_ISBROKEN;
1427 }
1428 return refname;
1429 }
1430
1431 refname = sb_refname.buf;
1432 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1433 hashclr(sha1);
1434 return refname;
1435 }
1436 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1437 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1438 !refname_is_safe(refname)) {
1439 errno = EINVAL;
1440 return NULL;
1441 }
1442
1443 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1444 }
1445 }
1446
1447 errno = ELOOP;
1448 return NULL;
1449}
00eebe35 1450
6fb5acfd
DT
1451/* backend functions */
1452int refs_init_db(struct strbuf *err)
1453{
077be78d 1454 struct ref_store *refs = get_main_ref_store();
6fb5acfd
DT
1455
1456 return refs->be->init_db(refs, err);
1457}
1458
bd40dcda
MH
1459const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1460 unsigned char *sha1, int *flags)
1461{
7d2df051 1462 return refs_resolve_ref_unsafe(get_main_ref_store(), refname,
bd40dcda
MH
1463 resolve_flags, sha1, flags);
1464}
1465
a8355bb7
MH
1466int resolve_gitlink_ref(const char *submodule, const char *refname,
1467 unsigned char *sha1)
424dcc76 1468{
424dcc76
MH
1469 struct ref_store *refs;
1470 int flags;
1471
29babbee 1472 refs = get_submodule_ref_store(submodule);
48a8475f 1473
424dcc76
MH
1474 if (!refs)
1475 return -1;
1476
7d2df051 1477 if (!refs_resolve_ref_unsafe(refs, refname, 0, sha1, &flags) ||
424dcc76
MH
1478 is_null_sha1(sha1))
1479 return -1;
1480 return 0;
1481}
1482
0c064d90 1483struct ref_store_hash_entry
7d4558c4
MH
1484{
1485 struct hashmap_entry ent; /* must be the first member! */
1486
1487 struct ref_store *refs;
1488
0c064d90
NTND
1489 /* NUL-terminated identifier of the ref store: */
1490 char name[FLEX_ARRAY];
7d4558c4
MH
1491};
1492
7663cdc8
SB
1493static int ref_store_hash_cmp(const void *unused_cmp_data,
1494 const void *entry, const void *entry_or_key,
7d4558c4
MH
1495 const void *keydata)
1496{
0c064d90
NTND
1497 const struct ref_store_hash_entry *e1 = entry, *e2 = entry_or_key;
1498 const char *name = keydata ? keydata : e2->name;
7d4558c4 1499
0c064d90 1500 return strcmp(e1->name, name);
7d4558c4
MH
1501}
1502
0c064d90
NTND
1503static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1504 const char *name, struct ref_store *refs)
7d4558c4 1505{
0c064d90 1506 struct ref_store_hash_entry *entry;
7d4558c4 1507
0c064d90
NTND
1508 FLEX_ALLOC_STR(entry, name, name);
1509 hashmap_entry_init(entry, strhash(name));
7d4558c4
MH
1510 entry->refs = refs;
1511 return entry;
1512}
1513
00eebe35
MH
1514/* A pointer to the ref_store for the main repository: */
1515static struct ref_store *main_ref_store;
1516
7d4558c4
MH
1517/* A hashmap of ref_stores, stored by submodule name: */
1518static struct hashmap submodule_ref_stores;
00eebe35 1519
17eff96b
NTND
1520/* A hashmap of ref_stores, stored by worktree id: */
1521static struct hashmap worktree_ref_stores;
1522
c468da4e 1523/*
0c064d90
NTND
1524 * Look up a ref store by name. If that ref_store hasn't been
1525 * registered yet, return NULL.
c468da4e 1526 */
0c064d90
NTND
1527static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1528 const char *name)
00eebe35 1529{
0c064d90 1530 struct ref_store_hash_entry *entry;
00eebe35 1531
0c064d90 1532 if (!map->tablesize)
7d4558c4
MH
1533 /* It's initialized on demand in register_ref_store(). */
1534 return NULL;
620a66b9 1535
0c064d90 1536 entry = hashmap_get_from_hash(map, strhash(name), name);
7d4558c4 1537 return entry ? entry->refs : NULL;
00eebe35
MH
1538}
1539
c468da4e
MH
1540/*
1541 * Create, record, and return a ref_store instance for the specified
5d0bc90e 1542 * gitdir.
c468da4e 1543 */
9e7ec634
NTND
1544static struct ref_store *ref_store_init(const char *gitdir,
1545 unsigned int flags)
00eebe35
MH
1546{
1547 const char *be_name = "files";
1548 struct ref_storage_be *be = find_ref_storage_backend(be_name);
ba88add5 1549 struct ref_store *refs;
00eebe35
MH
1550
1551 if (!be)
1552 die("BUG: reference backend %s is unknown", be_name);
1553
9e7ec634 1554 refs = be->init(gitdir, flags);
ba88add5 1555 return refs;
00eebe35
MH
1556}
1557
077be78d 1558struct ref_store *get_main_ref_store(void)
24c8407e
NTND
1559{
1560 if (main_ref_store)
1561 return main_ref_store;
1562
0d8a814d 1563 main_ref_store = ref_store_init(get_git_dir(), REF_STORE_ALL_CAPS);
378dc910
NTND
1564 return main_ref_store;
1565}
1566
1567/*
0c064d90
NTND
1568 * Associate a ref store with a name. It is a fatal error to call this
1569 * function twice for the same name.
378dc910 1570 */
0c064d90
NTND
1571static void register_ref_store_map(struct hashmap *map,
1572 const char *type,
1573 struct ref_store *refs,
1574 const char *name)
378dc910 1575{
0c064d90 1576 if (!map->tablesize)
7663cdc8 1577 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
378dc910 1578
0c064d90
NTND
1579 if (hashmap_put(map, alloc_ref_store_hash_entry(name, refs)))
1580 die("BUG: %s ref_store '%s' initialized twice", type, name);
24c8407e
NTND
1581}
1582
18d0002d 1583struct ref_store *get_submodule_ref_store(const char *submodule)
00eebe35 1584{
126c9e05 1585 struct strbuf submodule_sb = STRBUF_INIT;
00eebe35 1586 struct ref_store *refs;
29babbee
NTND
1587 char *to_free = NULL;
1588 size_t len;
1589
1590 if (submodule) {
1591 len = strlen(submodule);
1592 while (len && is_dir_sep(submodule[len - 1]))
1593 len--;
1594 if (!len)
1595 return NULL;
1596 }
00eebe35
MH
1597
1598 if (!submodule || !*submodule) {
18d0002d
NTND
1599 /*
1600 * FIXME: This case is ideally not allowed. But that
1601 * can't happen until we clean up all the callers.
1602 */
24c8407e 1603 return get_main_ref_store();
126c9e05 1604 }
00eebe35 1605
29babbee
NTND
1606 if (submodule[len])
1607 /* We need to strip off one or more trailing slashes */
1608 submodule = to_free = xmemdupz(submodule, len);
1609
0c064d90 1610 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
126c9e05 1611 if (refs)
2c616c17 1612 goto done;
00eebe35 1613
126c9e05 1614 strbuf_addstr(&submodule_sb, submodule);
2c616c17
NTND
1615 if (!is_nonbare_repository_dir(&submodule_sb))
1616 goto done;
00eebe35 1617
2c616c17
NTND
1618 if (submodule_to_gitdir(&submodule_sb, submodule))
1619 goto done;
00eebe35 1620
9e7ec634
NTND
1621 /* assume that add_submodule_odb() has been called */
1622 refs = ref_store_init(submodule_sb.buf,
1623 REF_STORE_READ | REF_STORE_ODB);
0c064d90
NTND
1624 register_ref_store_map(&submodule_ref_stores, "submodule",
1625 refs, submodule);
5d0bc90e 1626
2c616c17 1627done:
5d0bc90e 1628 strbuf_release(&submodule_sb);
29babbee
NTND
1629 free(to_free);
1630
00eebe35
MH
1631 return refs;
1632}
1633
17eff96b
NTND
1634struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1635{
1636 struct ref_store *refs;
1637 const char *id;
1638
1639 if (wt->is_current)
1640 return get_main_ref_store();
1641
1642 id = wt->id ? wt->id : "/";
1643 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1644 if (refs)
1645 return refs;
1646
1647 if (wt->id)
1648 refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
1649 REF_STORE_ALL_CAPS);
1650 else
1651 refs = ref_store_init(get_git_common_dir(),
1652 REF_STORE_ALL_CAPS);
1653
1654 if (refs)
1655 register_ref_store_map(&worktree_ref_stores, "worktree",
1656 refs, id);
1657 return refs;
1658}
1659
620a66b9 1660void base_ref_store_init(struct ref_store *refs,
fbfd0a29 1661 const struct ref_storage_be *be)
00eebe35 1662{
620a66b9 1663 refs->be = be;
00eebe35 1664}
127b42a1
RS
1665
1666/* backend functions */
7d2df051 1667int refs_pack_refs(struct ref_store *refs, unsigned int flags)
8231527e 1668{
8231527e
MH
1669 return refs->be->pack_refs(refs, flags);
1670}
1671
7d2df051
NTND
1672int refs_peel_ref(struct ref_store *refs, const char *refname,
1673 unsigned char *sha1)
1674{
1675 return refs->be->peel_ref(refs, refname, sha1);
8231527e
MH
1676}
1677
bd427cf2
MH
1678int peel_ref(const char *refname, unsigned char *sha1)
1679{
7d2df051
NTND
1680 return refs_peel_ref(get_main_ref_store(), refname, sha1);
1681}
bd427cf2 1682
7d2df051
NTND
1683int refs_create_symref(struct ref_store *refs,
1684 const char *ref_target,
1685 const char *refs_heads_master,
1686 const char *logmsg)
1687{
1688 return refs->be->create_symref(refs, ref_target,
1689 refs_heads_master,
1690 logmsg);
bd427cf2
MH
1691}
1692
284689ba
MH
1693int create_symref(const char *ref_target, const char *refs_heads_master,
1694 const char *logmsg)
1695{
7d2df051
NTND
1696 return refs_create_symref(get_main_ref_store(), ref_target,
1697 refs_heads_master, logmsg);
284689ba
MH
1698}
1699
2ced105c
MH
1700int ref_update_reject_duplicates(struct string_list *refnames,
1701 struct strbuf *err)
1702{
a552e50e 1703 size_t i, n = refnames->nr;
2ced105c
MH
1704
1705 assert(err);
1706
8556f8d6
MH
1707 for (i = 1; i < n; i++) {
1708 int cmp = strcmp(refnames->items[i - 1].string,
1709 refnames->items[i].string);
1710
1711 if (!cmp) {
2ced105c
MH
1712 strbuf_addf(err,
1713 "multiple updates for ref '%s' not allowed.",
1714 refnames->items[i].string);
1715 return 1;
8556f8d6
MH
1716 } else if (cmp > 0) {
1717 die("BUG: ref_update_reject_duplicates() received unsorted list");
2ced105c 1718 }
8556f8d6 1719 }
2ced105c
MH
1720 return 0;
1721}
1722
30173b88
MH
1723int ref_transaction_prepare(struct ref_transaction *transaction,
1724 struct strbuf *err)
127b42a1 1725{
c0fe4e8b 1726 struct ref_store *refs = transaction->ref_store;
127b42a1 1727
8d4240d3
MH
1728 switch (transaction->state) {
1729 case REF_TRANSACTION_OPEN:
1730 /* Good. */
1731 break;
30173b88
MH
1732 case REF_TRANSACTION_PREPARED:
1733 die("BUG: prepare called twice on reference transaction");
1734 break;
8d4240d3
MH
1735 case REF_TRANSACTION_CLOSED:
1736 die("BUG: prepare called on a closed reference transaction");
1737 break;
1738 default:
1739 die("BUG: unexpected reference transaction state");
1740 break;
1741 }
1742
d8f4481c
JK
1743 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
1744 strbuf_addstr(err,
1745 _("ref updates forbidden inside quarantine environment"));
1746 return -1;
1747 }
1748
30173b88
MH
1749 return refs->be->transaction_prepare(refs, transaction, err);
1750}
1751
1752int ref_transaction_abort(struct ref_transaction *transaction,
1753 struct strbuf *err)
1754{
1755 struct ref_store *refs = transaction->ref_store;
1756 int ret = 0;
1757
1758 switch (transaction->state) {
1759 case REF_TRANSACTION_OPEN:
1760 /* No need to abort explicitly. */
1761 break;
1762 case REF_TRANSACTION_PREPARED:
1763 ret = refs->be->transaction_abort(refs, transaction, err);
1764 break;
1765 case REF_TRANSACTION_CLOSED:
1766 die("BUG: abort called on a closed reference transaction");
1767 break;
1768 default:
1769 die("BUG: unexpected reference transaction state");
1770 break;
1771 }
1772
1773 ref_transaction_free(transaction);
1774 return ret;
1775}
1776
1777int ref_transaction_commit(struct ref_transaction *transaction,
1778 struct strbuf *err)
1779{
1780 struct ref_store *refs = transaction->ref_store;
1781 int ret;
1782
1783 switch (transaction->state) {
1784 case REF_TRANSACTION_OPEN:
1785 /* Need to prepare first. */
1786 ret = ref_transaction_prepare(transaction, err);
1787 if (ret)
1788 return ret;
1789 break;
1790 case REF_TRANSACTION_PREPARED:
1791 /* Fall through to finish. */
1792 break;
1793 case REF_TRANSACTION_CLOSED:
1794 die("BUG: commit called on a closed reference transaction");
1795 break;
1796 default:
1797 die("BUG: unexpected reference transaction state");
1798 break;
1799 }
1800
1801 return refs->be->transaction_finish(refs, transaction, err);
127b42a1 1802}
62665823 1803
7d2df051
NTND
1804int refs_verify_refname_available(struct ref_store *refs,
1805 const char *refname,
b05855b5 1806 const struct string_list *extras,
7d2df051
NTND
1807 const struct string_list *skip,
1808 struct strbuf *err)
62665823 1809{
b05855b5
MH
1810 const char *slash;
1811 const char *extra_refname;
1812 struct strbuf dirname = STRBUF_INIT;
1813 struct strbuf referent = STRBUF_INIT;
1814 struct object_id oid;
1815 unsigned int type;
1816 struct ref_iterator *iter;
1817 int ok;
1818 int ret = -1;
1819
1820 /*
1821 * For the sake of comments in this function, suppose that
1822 * refname is "refs/foo/bar".
1823 */
1824
1825 assert(err);
1826
1827 strbuf_grow(&dirname, strlen(refname) + 1);
1828 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
1829 /* Expand dirname to the new prefix, not including the trailing slash: */
1830 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
1831
1832 /*
1833 * We are still at a leading dir of the refname (e.g.,
1834 * "refs/foo"; if there is a reference with that name,
1835 * it is a conflict, *unless* it is in skip.
1836 */
1837 if (skip && string_list_has_string(skip, dirname.buf))
1838 continue;
1839
1840 if (!refs_read_raw_ref(refs, dirname.buf, oid.hash, &referent, &type)) {
1841 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1842 dirname.buf, refname);
1843 goto cleanup;
1844 }
1845
1846 if (extras && string_list_has_string(extras, dirname.buf)) {
1847 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1848 refname, dirname.buf);
1849 goto cleanup;
1850 }
1851 }
1852
1853 /*
1854 * We are at the leaf of our refname (e.g., "refs/foo/bar").
1855 * There is no point in searching for a reference with that
1856 * name, because a refname isn't considered to conflict with
1857 * itself. But we still need to check for references whose
1858 * names are in the "refs/foo/bar/" namespace, because they
1859 * *do* conflict.
1860 */
1861 strbuf_addstr(&dirname, refname + dirname.len);
1862 strbuf_addch(&dirname, '/');
1863
1864 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
1865 DO_FOR_EACH_INCLUDE_BROKEN);
1866 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
1867 if (skip &&
1868 string_list_has_string(skip, iter->refname))
1869 continue;
1870
1871 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1872 iter->refname, refname);
1873 ref_iterator_abort(iter);
1874 goto cleanup;
1875 }
1876
1877 if (ok != ITER_DONE)
1878 die("BUG: error while iterating over references");
1879
1880 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
1881 if (extra_refname)
1882 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1883 refname, extra_refname);
1884 else
1885 ret = 0;
1886
1887cleanup:
1888 strbuf_release(&referent);
1889 strbuf_release(&dirname);
1890 return ret;
62665823 1891}
e3688bd6 1892
7d2df051 1893int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
e3688bd6 1894{
e3688bd6
DT
1895 struct ref_iterator *iter;
1896
1897 iter = refs->be->reflog_iterator_begin(refs);
1898
1899 return do_for_each_ref_iterator(iter, fn, cb_data);
1900}
1901
7d2df051 1902int for_each_reflog(each_ref_fn fn, void *cb_data)
e3688bd6 1903{
7d2df051
NTND
1904 return refs_for_each_reflog(get_main_ref_store(), fn, cb_data);
1905}
e3688bd6 1906
7d2df051
NTND
1907int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
1908 const char *refname,
1909 each_reflog_ent_fn fn,
1910 void *cb_data)
1911{
e3688bd6
DT
1912 return refs->be->for_each_reflog_ent_reverse(refs, refname,
1913 fn, cb_data);
1914}
1915
7d2df051
NTND
1916int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
1917 void *cb_data)
1918{
1919 return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
1920 refname, fn, cb_data);
1921}
1922
1923int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
1924 each_reflog_ent_fn fn, void *cb_data)
1925{
1926 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
1927}
1928
e3688bd6
DT
1929int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
1930 void *cb_data)
1931{
7d2df051
NTND
1932 return refs_for_each_reflog_ent(get_main_ref_store(), refname,
1933 fn, cb_data);
1934}
e3688bd6 1935
7d2df051
NTND
1936int refs_reflog_exists(struct ref_store *refs, const char *refname)
1937{
1938 return refs->be->reflog_exists(refs, refname);
e3688bd6
DT
1939}
1940
1941int reflog_exists(const char *refname)
1942{
7d2df051
NTND
1943 return refs_reflog_exists(get_main_ref_store(), refname);
1944}
e3688bd6 1945
7d2df051
NTND
1946int refs_create_reflog(struct ref_store *refs, const char *refname,
1947 int force_create, struct strbuf *err)
1948{
1949 return refs->be->create_reflog(refs, refname, force_create, err);
e3688bd6
DT
1950}
1951
1952int safe_create_reflog(const char *refname, int force_create,
1953 struct strbuf *err)
1954{
7d2df051
NTND
1955 return refs_create_reflog(get_main_ref_store(), refname,
1956 force_create, err);
1957}
e3688bd6 1958
7d2df051
NTND
1959int refs_delete_reflog(struct ref_store *refs, const char *refname)
1960{
1961 return refs->be->delete_reflog(refs, refname);
e3688bd6
DT
1962}
1963
1964int delete_reflog(const char *refname)
1965{
7d2df051
NTND
1966 return refs_delete_reflog(get_main_ref_store(), refname);
1967}
e3688bd6 1968
7d2df051
NTND
1969int refs_reflog_expire(struct ref_store *refs,
1970 const char *refname, const unsigned char *sha1,
1971 unsigned int flags,
1972 reflog_expiry_prepare_fn prepare_fn,
1973 reflog_expiry_should_prune_fn should_prune_fn,
1974 reflog_expiry_cleanup_fn cleanup_fn,
1975 void *policy_cb_data)
1976{
1977 return refs->be->reflog_expire(refs, refname, sha1, flags,
1978 prepare_fn, should_prune_fn,
1979 cleanup_fn, policy_cb_data);
e3688bd6
DT
1980}
1981
1982int reflog_expire(const char *refname, const unsigned char *sha1,
1983 unsigned int flags,
1984 reflog_expiry_prepare_fn prepare_fn,
1985 reflog_expiry_should_prune_fn should_prune_fn,
1986 reflog_expiry_cleanup_fn cleanup_fn,
1987 void *policy_cb_data)
1988{
7d2df051
NTND
1989 return refs_reflog_expire(get_main_ref_store(),
1990 refname, sha1, flags,
1991 prepare_fn, should_prune_fn,
1992 cleanup_fn, policy_cb_data);
e3688bd6 1993}
fc681463
DT
1994
1995int initial_ref_transaction_commit(struct ref_transaction *transaction,
1996 struct strbuf *err)
1997{
c0fe4e8b 1998 struct ref_store *refs = transaction->ref_store;
fc681463
DT
1999
2000 return refs->be->initial_transaction_commit(refs, transaction, err);
2001}
a27dcf89 2002
64da4199
MH
2003int refs_delete_refs(struct ref_store *refs, const char *msg,
2004 struct string_list *refnames, unsigned int flags)
a27dcf89 2005{
64da4199 2006 return refs->be->delete_refs(refs, msg, refnames, flags);
a27dcf89 2007}
9b6b40d9 2008
64da4199
MH
2009int delete_refs(const char *msg, struct string_list *refnames,
2010 unsigned int flags)
9b6b40d9 2011{
64da4199 2012 return refs_delete_refs(get_main_ref_store(), msg, refnames, flags);
7d2df051 2013}
9b6b40d9 2014
7d2df051
NTND
2015int refs_rename_ref(struct ref_store *refs, const char *oldref,
2016 const char *newref, const char *logmsg)
2017{
9b6b40d9
DT
2018 return refs->be->rename_ref(refs, oldref, newref, logmsg);
2019}
7d2df051
NTND
2020
2021int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2022{
2023 return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
2024}