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