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