blob: 5ffdd778d9766cad21e251e9020e2be2ce677acf [file] [log] [blame]
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001/*
2 * The backend-independent part of the reference module.
3 */
4
Daniel Barkalow95fc7512005-06-06 16:31:29 -04005#include "cache.h"
Michael Haggerty697cc8e2014-10-01 12:28:42 +02006#include "lockfile.h"
Junio C Hamano85023572006-12-19 14:34:12 -08007#include "refs.h"
Michael Haggerty4cb77002015-11-10 12:42:36 +01008#include "refs/refs-internal.h"
Junio C Hamanocf0adba2006-11-19 13:22:44 -08009#include "object.h"
10#include "tag.h"
Stefan Beller3581d792014-12-12 09:57:02 +010011
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020012/*
Ronnie Sahlberg3dce4442016-09-04 18:08:10 +020013 * List of all available backends
14 */
15static struct ref_storage_be *refs_backends = &refs_be_files;
16
17static struct ref_storage_be *find_ref_storage_backend(const char *name)
18{
19 struct ref_storage_be *be;
20 for (be = refs_backends; be; be = be->next)
21 if (!strcmp(be->name, name))
22 return be;
23 return NULL;
24}
25
26int ref_storage_backend_exists(const char *name)
27{
28 return find_ref_storage_backend(name) != NULL;
29}
30
31/*
David Turnerdde8a902014-06-03 23:38:10 -040032 * How to handle various characters in refnames:
33 * 0: An acceptable character for refs
Junio C Hamano5e650222014-07-28 10:41:53 -070034 * 1: End-of-component
35 * 2: ., look for a preceding . to reject .. in refs
36 * 3: {, look for a preceding @ to reject @{ in refs
Jacob Keller53a85552015-07-22 14:05:32 -070037 * 4: A bad character: ASCII control characters, and
Jacob Kellercd377f42015-07-22 14:05:33 -070038 * ":", "?", "[", "\", "^", "~", SP, or TAB
39 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
David Turnerdde8a902014-06-03 23:38:10 -040040 */
41static unsigned char refname_disposition[256] = {
Junio C Hamano5e650222014-07-28 10:41:53 -070042 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
43 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
Jacob Kellercd377f42015-07-22 14:05:33 -070044 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
Junio C Hamano5e650222014-07-28 10:41:53 -070045 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
David Turnerdde8a902014-06-03 23:38:10 -040046 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Junio C Hamano5e650222014-07-28 10:41:53 -070047 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
48 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
David Turnerdde8a902014-06-03 23:38:10 -040050};
51
52/*
53 * Try to read one refname component from the front of refname.
54 * Return the length of the component found, or -1 if the component is
55 * not legal. It is legal if it is something reasonable to have under
56 * ".git/refs/"; We do not like it if:
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020057 *
58 * - any path component of it begins with ".", or
59 * - it has double dots "..", or
Jacob Keller53a85552015-07-22 14:05:32 -070060 * - it has ASCII control characters, or
Jacob Kellercd377f42015-07-22 14:05:33 -070061 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
62 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
Jacob Keller53a85552015-07-22 14:05:32 -070063 * - it ends with a "/", or
64 * - it ends with ".lock", or
65 * - it contains a "@{" portion
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020066 */
Jacob Kellercd377f42015-07-22 14:05:33 -070067static int check_refname_component(const char *refname, int *flags)
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020068{
69 const char *cp;
70 char last = '\0';
71
72 for (cp = refname; ; cp++) {
David Turnerdde8a902014-06-03 23:38:10 -040073 int ch = *cp & 255;
74 unsigned char disp = refname_disposition[ch];
75 switch (disp) {
Junio C Hamano5e650222014-07-28 10:41:53 -070076 case 1:
David Turnerdde8a902014-06-03 23:38:10 -040077 goto out;
Junio C Hamano5e650222014-07-28 10:41:53 -070078 case 2:
David Turnerdde8a902014-06-03 23:38:10 -040079 if (last == '.')
80 return -1; /* Refname contains "..". */
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020081 break;
Junio C Hamano5e650222014-07-28 10:41:53 -070082 case 3:
David Turnerdde8a902014-06-03 23:38:10 -040083 if (last == '@')
84 return -1; /* Refname contains "@{". */
85 break;
Junio C Hamano5e650222014-07-28 10:41:53 -070086 case 4:
David Turnerdde8a902014-06-03 23:38:10 -040087 return -1;
Jacob Kellercd377f42015-07-22 14:05:33 -070088 case 5:
89 if (!(*flags & REFNAME_REFSPEC_PATTERN))
90 return -1; /* refspec can't be a pattern */
91
92 /*
93 * Unset the pattern flag so that we only accept
94 * a single asterisk for one side of refspec.
95 */
96 *flags &= ~ REFNAME_REFSPEC_PATTERN;
97 break;
David Turnerdde8a902014-06-03 23:38:10 -040098 }
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020099 last = ch;
100 }
David Turnerdde8a902014-06-03 23:38:10 -0400101out:
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200102 if (cp == refname)
Michael Haggertydac529e2012-04-10 07:30:22 +0200103 return 0; /* Component has zero length. */
Jonathan Niederf3cc52d2014-09-26 12:22:22 -0700104 if (refname[0] == '.')
105 return -1; /* Component starts with '.'. */
Michael Haggerty7108ad22014-10-01 12:28:15 +0200106 if (cp - refname >= LOCK_SUFFIX_LEN &&
107 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200108 return -1; /* Refname ends with ".lock". */
109 return cp - refname;
110}
111
Junio C Hamano5e650222014-07-28 10:41:53 -0700112int check_refname_format(const char *refname, int flags)
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200113{
114 int component_len, component_count = 0;
115
Felipe Contreras9ba89f42013-09-02 01:34:30 -0500116 if (!strcmp(refname, "@"))
117 /* Refname is a single character '@'. */
118 return -1;
119
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200120 while (1) {
121 /* We are at the start of a path component. */
Jacob Kellercd377f42015-07-22 14:05:33 -0700122 component_len = check_refname_component(refname, &flags);
123 if (component_len <= 0)
124 return -1;
125
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200126 component_count++;
127 if (refname[component_len] == '\0')
128 break;
129 /* Skip to next component. */
130 refname += component_len + 1;
131 }
132
133 if (refname[component_len - 1] == '.')
134 return -1; /* Refname ends with '.'. */
135 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
136 return -1; /* Refname has only one component. */
137 return 0;
138}
139
Michael Haggerty4cb77002015-11-10 12:42:36 +0100140int refname_is_safe(const char *refname)
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700141{
Michael Haggerty39950fe2016-04-27 12:39:11 +0200142 const char *rest;
143
144 if (skip_prefix(refname, "refs/", &rest)) {
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700145 char *buf;
146 int result;
Michael Haggertye40f3552016-04-27 12:40:39 +0200147 size_t restlen = strlen(rest);
148
149 /* rest must not be empty, or start or end with "/" */
150 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
151 return 0;
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700152
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700153 /*
154 * Does the refname try to escape refs/?
155 * For example: refs/foo/../bar is safe but refs/foo/../../bar
156 * is not.
157 */
Michael Haggertye40f3552016-04-27 12:40:39 +0200158 buf = xmallocz(restlen);
159 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700160 free(buf);
161 return result;
162 }
Michael Haggerty35db25c2016-04-27 12:42:27 +0200163
164 do {
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700165 if (!isupper(*refname) && *refname != '_')
166 return 0;
167 refname++;
Michael Haggerty35db25c2016-04-27 12:42:27 +0200168 } while (*refname);
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700169 return 1;
170}
171
Michael Haggertyfb58c8d2015-06-22 16:03:05 +0200172char *resolve_refdup(const char *refname, int resolve_flags,
173 unsigned char *sha1, int *flags)
Nguyễn Thái Ngọc Duy96ec7b12011-12-13 21:17:48 +0700174{
Michael Haggertyfb58c8d2015-06-22 16:03:05 +0200175 return xstrdup_or_null(resolve_ref_unsafe(refname, resolve_flags,
176 sha1, flags));
Nguyễn Thái Ngọc Duy96ec7b12011-12-13 21:17:48 +0700177}
178
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200179/* The argument to filter_refs */
180struct ref_filter {
181 const char *pattern;
182 each_ref_fn *fn;
183 void *cb_data;
184};
185
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700186int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
Linus Torvalds8a65ff72005-07-02 20:23:36 -0700187{
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700188 if (resolve_ref_unsafe(refname, resolve_flags, sha1, flags))
Junio C Hamanoa876ed82005-09-30 14:08:25 -0700189 return 0;
190 return -1;
Linus Torvalds8a65ff72005-07-02 20:23:36 -0700191}
192
Michael Haggertydfefa932011-12-12 06:38:09 +0100193int read_ref(const char *refname, unsigned char *sha1)
Nguyễn Thái Ngọc Duyc6893322011-11-13 17:22:14 +0700194{
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700195 return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
Nguyễn Thái Ngọc Duyc6893322011-11-13 17:22:14 +0700196}
197
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200198int ref_exists(const char *refname)
Junio C Hamanoef06b912006-11-18 22:13:33 -0800199{
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200200 unsigned char sha1[20];
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700201 return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
Junio C Hamanoef06b912006-11-18 22:13:33 -0800202}
203
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000204static int filter_refs(const char *refname, const struct object_id *oid,
Michael Haggerty4e675d12015-05-25 18:39:21 +0000205 int flags, void *data)
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200206{
207 struct ref_filter *filter = (struct ref_filter *)data;
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000208
Nguyễn Thái Ngọc Duyeb078942014-02-15 09:01:46 +0700209 if (wildmatch(filter->pattern, refname, 0, NULL))
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200210 return 0;
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000211 return filter->fn(refname, oid, flags, filter->cb_data);
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200212}
213
Michael Haggerty4cb77002015-11-10 12:42:36 +0100214enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200215{
216 struct object *o = lookup_unknown_object(name);
217
218 if (o->type == OBJ_NONE) {
219 int type = sha1_object_info(name, NULL);
Jeff King8ff226a2014-07-13 02:42:03 -0400220 if (type < 0 || !object_as_type(o, type, 0))
Michael Haggerty68cf8702013-04-22 21:52:20 +0200221 return PEEL_INVALID;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200222 }
223
224 if (o->type != OBJ_TAG)
Michael Haggerty68cf8702013-04-22 21:52:20 +0200225 return PEEL_NON_TAG;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200226
227 o = deref_tag_noverify(o);
228 if (!o)
Michael Haggerty68cf8702013-04-22 21:52:20 +0200229 return PEEL_INVALID;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200230
brian m. carlsoned1c9972015-11-10 02:22:29 +0000231 hashcpy(sha1, o->oid.hash);
Michael Haggerty68cf8702013-04-22 21:52:20 +0200232 return PEEL_PEELED;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200233}
234
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200235struct warn_if_dangling_data {
236 FILE *fp;
237 const char *refname;
Jens Lindströme6bea662014-05-23 12:30:25 +0200238 const struct string_list *refnames;
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200239 const char *msg_fmt;
240};
241
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000242static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200243 int flags, void *cb_data)
244{
245 struct warn_if_dangling_data *d = cb_data;
246 const char *resolves_to;
Michael Haggerty4e675d12015-05-25 18:39:21 +0000247 struct object_id junk;
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200248
249 if (!(flags & REF_ISSYMREF))
250 return 0;
251
Michael Haggerty4e675d12015-05-25 18:39:21 +0000252 resolves_to = resolve_ref_unsafe(refname, 0, junk.hash, NULL);
Jens Lindströme6bea662014-05-23 12:30:25 +0200253 if (!resolves_to
254 || (d->refname
255 ? strcmp(resolves_to, d->refname)
256 : !string_list_has_string(d->refnames, resolves_to))) {
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200257 return 0;
Jens Lindströme6bea662014-05-23 12:30:25 +0200258 }
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200259
260 fprintf(d->fp, d->msg_fmt, refname);
Junio C Hamano1be65ed2012-05-02 13:51:35 -0700261 fputc('\n', d->fp);
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200262 return 0;
263}
264
265void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
266{
267 struct warn_if_dangling_data data;
268
269 data.fp = fp;
270 data.refname = refname;
Jens Lindströme6bea662014-05-23 12:30:25 +0200271 data.refnames = NULL;
272 data.msg_fmt = msg_fmt;
273 for_each_rawref(warn_if_dangling_symref, &data);
274}
275
276void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
277{
278 struct warn_if_dangling_data data;
279
280 data.fp = fp;
281 data.refname = NULL;
282 data.refnames = refnames;
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200283 data.msg_fmt = msg_fmt;
284 for_each_rawref(warn_if_dangling_symref, &data);
285}
286
Junio C Hamanocb5d7092006-09-20 21:47:42 -0700287int for_each_tag_ref(each_ref_fn fn, void *cb_data)
Seana62be772006-05-13 21:43:00 -0400288{
Christian Couder2a8177b2009-03-30 05:07:15 +0200289 return for_each_ref_in("refs/tags/", fn, cb_data);
Seana62be772006-05-13 21:43:00 -0400290}
291
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200292int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
293{
294 return for_each_ref_in_submodule(submodule, "refs/tags/", fn, cb_data);
295}
296
Junio C Hamanocb5d7092006-09-20 21:47:42 -0700297int for_each_branch_ref(each_ref_fn fn, void *cb_data)
Seana62be772006-05-13 21:43:00 -0400298{
Christian Couder2a8177b2009-03-30 05:07:15 +0200299 return for_each_ref_in("refs/heads/", fn, cb_data);
Seana62be772006-05-13 21:43:00 -0400300}
301
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200302int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
303{
304 return for_each_ref_in_submodule(submodule, "refs/heads/", fn, cb_data);
305}
306
Junio C Hamanocb5d7092006-09-20 21:47:42 -0700307int for_each_remote_ref(each_ref_fn fn, void *cb_data)
Seana62be772006-05-13 21:43:00 -0400308{
Christian Couder2a8177b2009-03-30 05:07:15 +0200309 return for_each_ref_in("refs/remotes/", fn, cb_data);
Junio C Hamanof8948e22009-02-08 23:27:10 -0800310}
311
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200312int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
313{
314 return for_each_ref_in_submodule(submodule, "refs/remotes/", fn, cb_data);
315}
316
Josh Tripletta1bea2c2011-07-05 10:54:44 -0700317int head_ref_namespaced(each_ref_fn fn, void *cb_data)
318{
319 struct strbuf buf = STRBUF_INIT;
320 int ret = 0;
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000321 struct object_id oid;
Josh Tripletta1bea2c2011-07-05 10:54:44 -0700322 int flag;
323
324 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000325 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, oid.hash, &flag))
326 ret = fn(buf.buf, &oid, flag, cb_data);
Josh Tripletta1bea2c2011-07-05 10:54:44 -0700327 strbuf_release(&buf);
328
329 return ret;
330}
331
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200332int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
333 const char *prefix, void *cb_data)
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200334{
335 struct strbuf real_pattern = STRBUF_INIT;
336 struct ref_filter filter;
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200337 int ret;
338
Christian Couder59556542013-11-30 21:55:40 +0100339 if (!prefix && !starts_with(pattern, "refs/"))
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200340 strbuf_addstr(&real_pattern, "refs/");
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200341 else if (prefix)
342 strbuf_addstr(&real_pattern, prefix);
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200343 strbuf_addstr(&real_pattern, pattern);
344
Thomas Rast894a9d32010-03-12 18:04:26 +0100345 if (!has_glob_specials(pattern)) {
Junio C Hamano9517e6b2010-02-03 21:23:18 -0800346 /* Append implied '/' '*' if not present. */
Jeff King00b6c172015-09-24 17:08:35 -0400347 strbuf_complete(&real_pattern, '/');
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200348 /* No need to check for '*', there is none. */
349 strbuf_addch(&real_pattern, '*');
350 }
351
352 filter.pattern = real_pattern.buf;
353 filter.fn = fn;
354 filter.cb_data = cb_data;
355 ret = for_each_ref(filter_refs, &filter);
356
357 strbuf_release(&real_pattern);
358 return ret;
359}
360
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200361int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
362{
363 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
364}
365
Felipe Contreras4577e482009-05-14 00:22:04 +0300366const char *prettify_refname(const char *name)
Daniel Barkalowa9c37a72009-03-08 21:06:05 -0400367{
Daniel Barkalowa9c37a72009-03-08 21:06:05 -0400368 return name + (
Christian Couder59556542013-11-30 21:55:40 +0100369 starts_with(name, "refs/heads/") ? 11 :
370 starts_with(name, "refs/tags/") ? 10 :
371 starts_with(name, "refs/remotes/") ? 13 :
Daniel Barkalowa9c37a72009-03-08 21:06:05 -0400372 0);
373}
374
Michael Haggerty54457fe2014-01-14 04:16:07 +0100375static const char *ref_rev_parse_rules[] = {
Steffen Prohaska79803322007-11-11 15:01:46 +0100376 "%.*s",
377 "refs/%.*s",
378 "refs/tags/%.*s",
379 "refs/heads/%.*s",
380 "refs/remotes/%.*s",
381 "refs/remotes/%.*s/HEAD",
382 NULL
383};
384
Michael Haggerty54457fe2014-01-14 04:16:07 +0100385int refname_match(const char *abbrev_name, const char *full_name)
Steffen Prohaska79803322007-11-11 15:01:46 +0100386{
387 const char **p;
388 const int abbrev_name_len = strlen(abbrev_name);
389
Michael Haggerty54457fe2014-01-14 04:16:07 +0100390 for (p = ref_rev_parse_rules; *p; p++) {
Steffen Prohaska79803322007-11-11 15:01:46 +0100391 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
392 return 1;
393 }
394 }
395
396 return 0;
397}
398
Michael Haggerty19b68b12011-12-12 06:38:12 +0100399/*
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700400 * *string and *len will only be substituted, and *string returned (for
401 * later free()ing) if the string passed in is a magic short-hand form
402 * to name a branch.
403 */
404static char *substitute_branch_name(const char **string, int *len)
405{
406 struct strbuf buf = STRBUF_INIT;
Felipe Contrerascf99a762013-09-02 01:34:29 -0500407 int ret = interpret_branch_name(*string, *len, &buf);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700408
409 if (ret == *len) {
410 size_t size;
411 *string = strbuf_detach(&buf, &size);
412 *len = size;
413 return (char *)*string;
414 }
415
416 return NULL;
417}
418
419int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
420{
421 char *last_branch = substitute_branch_name(&str, &len);
422 const char **p, *r;
423 int refs_found = 0;
424
425 *ref = NULL;
426 for (p = ref_rev_parse_rules; *p; p++) {
427 char fullref[PATH_MAX];
428 unsigned char sha1_from_ref[20];
429 unsigned char *this_result;
430 int flag;
431
432 this_result = refs_found ? sha1_from_ref : sha1;
433 mksnpath(fullref, sizeof(fullref), *p, len, str);
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700434 r = resolve_ref_unsafe(fullref, RESOLVE_REF_READING,
435 this_result, &flag);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700436 if (r) {
437 if (!refs_found++)
438 *ref = xstrdup(r);
439 if (!warn_ambiguous_refs)
440 break;
Junio C Hamano55956352011-10-19 13:55:49 -0700441 } else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD")) {
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700442 warning("ignoring dangling symref %s.", fullref);
Junio C Hamano55956352011-10-19 13:55:49 -0700443 } else if ((flag & REF_ISBROKEN) && strchr(fullref, '/')) {
444 warning("ignoring broken ref %s.", fullref);
445 }
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700446 }
447 free(last_branch);
448 return refs_found;
449}
450
451int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
452{
453 char *last_branch = substitute_branch_name(&str, &len);
454 const char **p;
455 int logs_found = 0;
456
457 *log = NULL;
458 for (p = ref_rev_parse_rules; *p; p++) {
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700459 unsigned char hash[20];
460 char path[PATH_MAX];
461 const char *ref, *it;
462
463 mksnpath(path, sizeof(path), *p, len, str);
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700464 ref = resolve_ref_unsafe(path, RESOLVE_REF_READING,
465 hash, NULL);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700466 if (!ref)
467 continue;
Ronnie Sahlberg4da58832014-05-06 15:45:52 -0700468 if (reflog_exists(path))
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700469 it = path;
Ronnie Sahlberg4da58832014-05-06 15:45:52 -0700470 else if (strcmp(ref, path) && reflog_exists(ref))
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700471 it = ref;
472 else
473 continue;
474 if (!logs_found++) {
475 *log = xstrdup(it);
476 hashcpy(sha1, hash);
477 }
478 if (!warn_ambiguous_refs)
479 break;
480 }
481 free(last_branch);
482 return logs_found;
483}
484
David Turner266b1822015-07-31 02:06:18 -0400485static int is_per_worktree_ref(const char *refname)
486{
David Turnerce414b32015-08-31 22:13:11 -0400487 return !strcmp(refname, "HEAD") ||
488 starts_with(refname, "refs/bisect/");
David Turner266b1822015-07-31 02:06:18 -0400489}
490
491static int is_pseudoref_syntax(const char *refname)
492{
493 const char *c;
494
495 for (c = refname; *c; c++) {
496 if (!isupper(*c) && *c != '-' && *c != '_')
497 return 0;
498 }
499
500 return 1;
501}
502
503enum ref_type ref_type(const char *refname)
504{
505 if (is_per_worktree_ref(refname))
506 return REF_TYPE_PER_WORKTREE;
507 if (is_pseudoref_syntax(refname))
508 return REF_TYPE_PSEUDOREF;
509 return REF_TYPE_NORMAL;
510}
511
David Turner74ec19d2015-07-31 02:06:19 -0400512static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
513 const unsigned char *old_sha1, struct strbuf *err)
514{
515 const char *filename;
516 int fd;
517 static struct lock_file lock;
518 struct strbuf buf = STRBUF_INIT;
519 int ret = -1;
520
521 strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
522
523 filename = git_path("%s", pseudoref);
524 fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
525 if (fd < 0) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200526 strbuf_addf(err, "could not open '%s' for writing: %s",
David Turner74ec19d2015-07-31 02:06:19 -0400527 filename, strerror(errno));
528 return -1;
529 }
530
531 if (old_sha1) {
532 unsigned char actual_old_sha1[20];
David Turner2c3aed12015-07-15 18:05:28 -0400533
534 if (read_ref(pseudoref, actual_old_sha1))
535 die("could not read ref '%s'", pseudoref);
David Turner74ec19d2015-07-31 02:06:19 -0400536 if (hashcmp(actual_old_sha1, old_sha1)) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200537 strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
David Turner74ec19d2015-07-31 02:06:19 -0400538 rollback_lock_file(&lock);
539 goto done;
540 }
541 }
542
543 if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200544 strbuf_addf(err, "could not write to '%s'", filename);
David Turner74ec19d2015-07-31 02:06:19 -0400545 rollback_lock_file(&lock);
546 goto done;
547 }
548
549 commit_lock_file(&lock);
550 ret = 0;
551done:
552 strbuf_release(&buf);
553 return ret;
554}
555
556static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1)
557{
558 static struct lock_file lock;
559 const char *filename;
560
561 filename = git_path("%s", pseudoref);
562
563 if (old_sha1 && !is_null_sha1(old_sha1)) {
564 int fd;
565 unsigned char actual_old_sha1[20];
566
567 fd = hold_lock_file_for_update(&lock, filename,
568 LOCK_DIE_ON_ERROR);
569 if (fd < 0)
570 die_errno(_("Could not open '%s' for writing"), filename);
David Turner2c3aed12015-07-15 18:05:28 -0400571 if (read_ref(pseudoref, actual_old_sha1))
572 die("could not read ref '%s'", pseudoref);
David Turner74ec19d2015-07-31 02:06:19 -0400573 if (hashcmp(actual_old_sha1, old_sha1)) {
574 warning("Unexpected sha1 when deleting %s", pseudoref);
575 rollback_lock_file(&lock);
576 return -1;
577 }
578
579 unlink(filename);
580 rollback_lock_file(&lock);
581 } else {
582 unlink(filename);
583 }
584
585 return 0;
586}
587
Michael Haggertyfc1c2162015-06-22 16:02:52 +0200588int delete_ref(const char *refname, const unsigned char *old_sha1,
589 unsigned int flags)
Junio C Hamanoc0277d12006-09-30 15:02:00 -0700590{
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700591 struct ref_transaction *transaction;
592 struct strbuf err = STRBUF_INIT;
Junio C Hamanoc0277d12006-09-30 15:02:00 -0700593
David Turner74ec19d2015-07-31 02:06:19 -0400594 if (ref_type(refname) == REF_TYPE_PSEUDOREF)
Junio C Hamano080cc642015-08-25 14:57:08 -0700595 return delete_pseudoref(refname, old_sha1);
David Turner74ec19d2015-07-31 02:06:19 -0400596
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700597 transaction = ref_transaction_begin(&err);
598 if (!transaction ||
Michael Haggertyfc67a082015-06-22 16:02:54 +0200599 ref_transaction_delete(transaction, refname, old_sha1,
Michael Haggertyfb5a6bb2015-02-17 18:00:16 +0100600 flags, NULL, &err) ||
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700601 ref_transaction_commit(transaction, &err)) {
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700602 error("%s", err.buf);
603 ref_transaction_free(transaction);
604 strbuf_release(&err);
Junio C Hamanoc0277d12006-09-30 15:02:00 -0700605 return 1;
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700606 }
607 ref_transaction_free(transaction);
608 strbuf_release(&err);
609 return 0;
Shawn Pearce4bd18c42006-05-17 05:55:02 -0400610}
611
Michael Haggerty4cb77002015-11-10 12:42:36 +0100612int copy_reflog_msg(char *buf, const char *msg)
Junio C Hamano0ec29a42007-07-28 17:17:17 -0700613{
614 char *cp = buf;
615 char c;
616 int wasspace = 1;
617
618 *cp++ = '\t';
619 while ((c = *msg++)) {
620 if (wasspace && isspace(c))
621 continue;
622 wasspace = isspace(c);
623 if (wasspace)
624 c = ' ';
625 *cp++ = c;
626 }
627 while (buf < cp && isspace(cp[-1]))
628 cp--;
629 *cp++ = '\n';
630 return cp - buf;
631}
632
Michael Haggerty4cb77002015-11-10 12:42:36 +0100633int should_autocreate_reflog(const char *refname)
David Turner4e2bef52015-07-21 17:04:51 -0400634{
635 if (!log_all_ref_updates)
636 return 0;
637 return starts_with(refname, "refs/heads/") ||
638 starts_with(refname, "refs/remotes/") ||
639 starts_with(refname, "refs/notes/") ||
640 !strcmp(refname, "HEAD");
641}
642
Ronnie Sahlberge7e0f262014-07-15 16:02:38 -0700643int is_branch(const char *refname)
Linus Torvaldsc3b0dec2008-01-15 15:50:17 -0800644{
Christian Couder59556542013-11-30 21:55:40 +0100645 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
Linus Torvaldsc3b0dec2008-01-15 15:50:17 -0800646}
647
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700648struct read_ref_at_cb {
649 const char *refname;
650 unsigned long at_time;
651 int cnt;
652 int reccnt;
653 unsigned char *sha1;
654 int found_it;
655
656 unsigned char osha1[20];
657 unsigned char nsha1[20];
658 int tz;
659 unsigned long date;
660 char **msg;
661 unsigned long *cutoff_time;
662 int *cutoff_tz;
663 int *cutoff_cnt;
664};
665
666static int read_ref_at_ent(unsigned char *osha1, unsigned char *nsha1,
667 const char *email, unsigned long timestamp, int tz,
668 const char *message, void *cb_data)
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800669{
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700670 struct read_ref_at_cb *cb = cb_data;
671
672 cb->reccnt++;
673 cb->tz = tz;
674 cb->date = timestamp;
675
676 if (timestamp <= cb->at_time || cb->cnt == 0) {
677 if (cb->msg)
678 *cb->msg = xstrdup(message);
679 if (cb->cutoff_time)
680 *cb->cutoff_time = timestamp;
681 if (cb->cutoff_tz)
682 *cb->cutoff_tz = tz;
683 if (cb->cutoff_cnt)
684 *cb->cutoff_cnt = cb->reccnt - 1;
685 /*
686 * we have not yet updated cb->[n|o]sha1 so they still
687 * hold the values for the previous record.
688 */
689 if (!is_null_sha1(cb->osha1)) {
690 hashcpy(cb->sha1, nsha1);
691 if (hashcmp(cb->osha1, nsha1))
692 warning("Log for ref %s has gap after %s.",
Jeff Kinga5481a62015-06-25 12:55:02 -0400693 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700694 }
695 else if (cb->date == cb->at_time)
696 hashcpy(cb->sha1, nsha1);
697 else if (hashcmp(nsha1, cb->sha1))
698 warning("Log for ref %s unexpectedly ended on %s.",
699 cb->refname, show_date(cb->date, cb->tz,
Jeff Kinga5481a62015-06-25 12:55:02 -0400700 DATE_MODE(RFC2822)));
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700701 hashcpy(cb->osha1, osha1);
702 hashcpy(cb->nsha1, nsha1);
703 cb->found_it = 1;
704 return 1;
705 }
706 hashcpy(cb->osha1, osha1);
707 hashcpy(cb->nsha1, nsha1);
708 if (cb->cnt > 0)
709 cb->cnt--;
710 return 0;
711}
712
713static int read_ref_at_ent_oldest(unsigned char *osha1, unsigned char *nsha1,
714 const char *email, unsigned long timestamp,
715 int tz, const char *message, void *cb_data)
716{
717 struct read_ref_at_cb *cb = cb_data;
718
719 if (cb->msg)
720 *cb->msg = xstrdup(message);
721 if (cb->cutoff_time)
722 *cb->cutoff_time = timestamp;
723 if (cb->cutoff_tz)
724 *cb->cutoff_tz = tz;
725 if (cb->cutoff_cnt)
726 *cb->cutoff_cnt = cb->reccnt;
727 hashcpy(cb->sha1, osha1);
728 if (is_null_sha1(cb->sha1))
729 hashcpy(cb->sha1, nsha1);
730 /* We just want the first entry */
731 return 1;
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800732}
733
David Aguilarc41a87d2014-09-18 20:45:37 -0700734int read_ref_at(const char *refname, unsigned int flags, unsigned long at_time, int cnt,
Michael Haggertydfefa932011-12-12 06:38:09 +0100735 unsigned char *sha1, char **msg,
736 unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
Shawn Pearced556fae2006-05-17 05:56:09 -0400737{
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700738 struct read_ref_at_cb cb;
Shawn Pearced556fae2006-05-17 05:56:09 -0400739
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700740 memset(&cb, 0, sizeof(cb));
741 cb.refname = refname;
742 cb.at_time = at_time;
743 cb.cnt = cnt;
744 cb.msg = msg;
745 cb.cutoff_time = cutoff_time;
746 cb.cutoff_tz = cutoff_tz;
747 cb.cutoff_cnt = cutoff_cnt;
748 cb.sha1 = sha1;
Shawn Pearced556fae2006-05-17 05:56:09 -0400749
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700750 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
Shawn Pearced556fae2006-05-17 05:56:09 -0400751
David Aguilarc41a87d2014-09-18 20:45:37 -0700752 if (!cb.reccnt) {
753 if (flags & GET_SHA1_QUIETLY)
754 exit(128);
755 else
756 die("Log for %s is empty.", refname);
757 }
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700758 if (cb.found_it)
759 return 0;
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800760
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700761 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
762
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800763 return 1;
Shawn Pearced556fae2006-05-17 05:56:09 -0400764}
Junio C Hamano2ff81662006-12-18 01:18:16 -0800765
Ronnie Sahlberg93a644e2014-05-19 10:42:34 -0700766struct ref_transaction *ref_transaction_begin(struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200767{
Jonathan Nieder5a603b02014-08-28 16:42:37 -0700768 assert(err);
769
Michael Haggertycaa40462014-04-07 15:48:10 +0200770 return xcalloc(1, sizeof(struct ref_transaction));
771}
772
Ronnie Sahlberg026bd1d2014-06-20 07:42:42 -0700773void ref_transaction_free(struct ref_transaction *transaction)
Michael Haggertycaa40462014-04-07 15:48:10 +0200774{
775 int i;
776
Ronnie Sahlberg1b072552014-06-20 07:42:45 -0700777 if (!transaction)
778 return;
779
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700780 for (i = 0; i < transaction->nr; i++) {
781 free(transaction->updates[i]->msg);
Michael Haggerty88615912014-04-07 15:48:14 +0200782 free(transaction->updates[i]);
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700783 }
Michael Haggertycaa40462014-04-07 15:48:10 +0200784 free(transaction->updates);
785 free(transaction);
786}
787
Michael Haggerty71564512016-04-25 11:39:54 +0200788struct ref_update *ref_transaction_add_update(
789 struct ref_transaction *transaction,
790 const char *refname, unsigned int flags,
791 const unsigned char *new_sha1,
792 const unsigned char *old_sha1,
793 const char *msg)
Michael Haggertycaa40462014-04-07 15:48:10 +0200794{
Jeff King96ffc062016-02-22 17:44:32 -0500795 struct ref_update *update;
Michael Haggerty71564512016-04-25 11:39:54 +0200796
797 if (transaction->state != REF_TRANSACTION_OPEN)
798 die("BUG: update called for transaction that is not open");
799
800 if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
801 die("BUG: REF_ISPRUNING set without REF_NODEREF");
802
Jeff King96ffc062016-02-22 17:44:32 -0500803 FLEX_ALLOC_STR(update, refname, refname);
Michael Haggertycaa40462014-04-07 15:48:10 +0200804 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
805 transaction->updates[transaction->nr++] = update;
Michael Haggerty71564512016-04-25 11:39:54 +0200806
807 update->flags = flags;
808
809 if (flags & REF_HAVE_NEW)
810 hashcpy(update->new_sha1, new_sha1);
811 if (flags & REF_HAVE_OLD)
812 hashcpy(update->old_sha1, old_sha1);
813 if (msg)
814 update->msg = xstrdup(msg);
Michael Haggertycaa40462014-04-07 15:48:10 +0200815 return update;
816}
817
Ronnie Sahlberg8e348002014-06-20 07:43:00 -0700818int ref_transaction_update(struct ref_transaction *transaction,
819 const char *refname,
820 const unsigned char *new_sha1,
821 const unsigned char *old_sha1,
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100822 unsigned int flags, const char *msg,
Ronnie Sahlberg8e348002014-06-20 07:43:00 -0700823 struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200824{
Jonathan Nieder5a603b02014-08-28 16:42:37 -0700825 assert(err);
826
Michael Haggerty8a679de2016-04-27 15:54:45 +0200827 if ((new_sha1 && !is_null_sha1(new_sha1)) ?
828 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
829 !refname_is_safe(refname)) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200830 strbuf_addf(err, "refusing to update ref with bad name '%s'",
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700831 refname);
832 return -1;
833 }
834
Michael Haggerty71564512016-04-25 11:39:54 +0200835 flags |= (new_sha1 ? REF_HAVE_NEW : 0) | (old_sha1 ? REF_HAVE_OLD : 0);
836
837 ref_transaction_add_update(transaction, refname, flags,
838 new_sha1, old_sha1, msg);
Ronnie Sahlberg8e348002014-06-20 07:43:00 -0700839 return 0;
Michael Haggertycaa40462014-04-07 15:48:10 +0200840}
841
Ronnie Sahlbergb416af52014-04-16 15:26:44 -0700842int ref_transaction_create(struct ref_transaction *transaction,
843 const char *refname,
844 const unsigned char *new_sha1,
Michael Haggertyfec14ec2015-02-17 18:00:13 +0100845 unsigned int flags, const char *msg,
Ronnie Sahlbergb416af52014-04-16 15:26:44 -0700846 struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200847{
Michael Haggertyf04c5b52015-02-17 18:00:19 +0100848 if (!new_sha1 || is_null_sha1(new_sha1))
849 die("BUG: create called without valid new_sha1");
Ronnie Sahlbergbc9f2922014-12-05 00:08:13 +0100850 return ref_transaction_update(transaction, refname, new_sha1,
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100851 null_sha1, flags, msg, err);
Michael Haggertycaa40462014-04-07 15:48:10 +0200852}
853
Ronnie Sahlberg8c8bdc02014-04-16 15:27:45 -0700854int ref_transaction_delete(struct ref_transaction *transaction,
855 const char *refname,
856 const unsigned char *old_sha1,
Michael Haggertyfb5a6bb2015-02-17 18:00:16 +0100857 unsigned int flags, const char *msg,
Ronnie Sahlberg8c8bdc02014-04-16 15:27:45 -0700858 struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200859{
Michael Haggerty60294592015-02-17 18:00:20 +0100860 if (old_sha1 && is_null_sha1(old_sha1))
861 die("BUG: delete called with old_sha1 set to zeros");
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100862 return ref_transaction_update(transaction, refname,
Michael Haggertyfb5a6bb2015-02-17 18:00:16 +0100863 null_sha1, old_sha1,
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100864 flags, msg, err);
Michael Haggertycaa40462014-04-07 15:48:10 +0200865}
866
Michael Haggerty16180332015-02-17 18:00:21 +0100867int ref_transaction_verify(struct ref_transaction *transaction,
868 const char *refname,
869 const unsigned char *old_sha1,
870 unsigned int flags,
871 struct strbuf *err)
872{
873 if (!old_sha1)
874 die("BUG: verify called with old_sha1 set to NULL");
875 return ref_transaction_update(transaction, refname,
876 NULL, old_sha1,
877 flags, NULL, err);
878}
879
brian m. carlson8f6dc7e2016-09-05 20:08:08 +0000880int update_ref_oid(const char *msg, const char *refname,
881 const struct object_id *new_oid, const struct object_id *old_oid,
882 unsigned int flags, enum action_on_err onerr)
883{
884 return update_ref(msg, refname, new_oid ? new_oid->hash : NULL,
885 old_oid ? old_oid->hash : NULL, flags, onerr);
886}
887
Michael Haggerty4b7b5202015-02-17 18:00:22 +0100888int update_ref(const char *msg, const char *refname,
889 const unsigned char *new_sha1, const unsigned char *old_sha1,
Michael Haggertyfec14ec2015-02-17 18:00:13 +0100890 unsigned int flags, enum action_on_err onerr)
Brad King4738a332013-09-04 11:22:40 -0400891{
David Turner74ec19d2015-07-31 02:06:19 -0400892 struct ref_transaction *t = NULL;
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700893 struct strbuf err = STRBUF_INIT;
David Turner74ec19d2015-07-31 02:06:19 -0400894 int ret = 0;
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700895
David Turner74ec19d2015-07-31 02:06:19 -0400896 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
897 ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
898 } else {
899 t = ref_transaction_begin(&err);
900 if (!t ||
901 ref_transaction_update(t, refname, new_sha1, old_sha1,
902 flags, msg, &err) ||
903 ref_transaction_commit(t, &err)) {
904 ret = 1;
905 ref_transaction_free(t);
906 }
907 }
908 if (ret) {
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700909 const char *str = "update_ref failed for ref '%s': %s";
910
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700911 switch (onerr) {
912 case UPDATE_REFS_MSG_ON_ERR:
913 error(str, refname, err.buf);
914 break;
915 case UPDATE_REFS_DIE_ON_ERR:
916 die(str, refname, err.buf);
917 break;
918 case UPDATE_REFS_QUIET_ON_ERR:
919 break;
920 }
921 strbuf_release(&err);
Brad King4738a332013-09-04 11:22:40 -0400922 return 1;
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700923 }
924 strbuf_release(&err);
David Turner74ec19d2015-07-31 02:06:19 -0400925 if (t)
926 ref_transaction_free(t);
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700927 return 0;
Brad King4738a332013-09-04 11:22:40 -0400928}
929
Michael Haggertydfefa932011-12-12 06:38:09 +0100930char *shorten_unambiguous_ref(const char *refname, int strict)
Jeff King7c2b3022009-04-07 03:14:20 -0400931{
932 int i;
933 static char **scanf_fmts;
934 static int nr_rules;
935 char *short_name;
936
Jeff King7c2b3022009-04-07 03:14:20 -0400937 if (!nr_rules) {
Michael Haggerty43466632014-01-08 15:43:39 +0100938 /*
939 * Pre-generate scanf formats from ref_rev_parse_rules[].
940 * Generate a format suitable for scanf from a
941 * ref_rev_parse_rules rule by interpolating "%s" at the
942 * location of the "%.*s".
943 */
Jeff King7c2b3022009-04-07 03:14:20 -0400944 size_t total_len = 0;
Michael Haggerty84d56332014-01-08 15:43:38 +0100945 size_t offset = 0;
Jeff King7c2b3022009-04-07 03:14:20 -0400946
947 /* the rule list is NULL terminated, count them first */
Jeff Kinga4165852013-10-24 04:45:13 -0400948 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
Michael Haggerty7902fe02014-01-08 15:43:40 +0100949 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
950 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
Jeff King7c2b3022009-04-07 03:14:20 -0400951
René Scharfe50492f72016-07-30 20:18:31 +0200952 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
Jeff King7c2b3022009-04-07 03:14:20 -0400953
Michael Haggerty84d56332014-01-08 15:43:38 +0100954 offset = 0;
Jeff King7c2b3022009-04-07 03:14:20 -0400955 for (i = 0; i < nr_rules; i++) {
Michael Haggerty43466632014-01-08 15:43:39 +0100956 assert(offset < total_len);
Michael Haggerty84d56332014-01-08 15:43:38 +0100957 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
Michael Haggerty43466632014-01-08 15:43:39 +0100958 offset += snprintf(scanf_fmts[i], total_len - offset,
959 ref_rev_parse_rules[i], 2, "%s") + 1;
Jeff King7c2b3022009-04-07 03:14:20 -0400960 }
961 }
962
963 /* bail out if there are no rules */
964 if (!nr_rules)
Michael Haggertydfefa932011-12-12 06:38:09 +0100965 return xstrdup(refname);
Jeff King7c2b3022009-04-07 03:14:20 -0400966
Michael Haggertydfefa932011-12-12 06:38:09 +0100967 /* buffer for scanf result, at most refname must fit */
968 short_name = xstrdup(refname);
Jeff King7c2b3022009-04-07 03:14:20 -0400969
970 /* skip first rule, it will always match */
971 for (i = nr_rules - 1; i > 0 ; --i) {
972 int j;
Bert Wesarg6e7b3302009-04-13 12:25:46 +0200973 int rules_to_fail = i;
Jeff King7c2b3022009-04-07 03:14:20 -0400974 int short_name_len;
975
Michael Haggertydfefa932011-12-12 06:38:09 +0100976 if (1 != sscanf(refname, scanf_fmts[i], short_name))
Jeff King7c2b3022009-04-07 03:14:20 -0400977 continue;
978
979 short_name_len = strlen(short_name);
980
981 /*
Bert Wesarg6e7b3302009-04-13 12:25:46 +0200982 * in strict mode, all (except the matched one) rules
983 * must fail to resolve to a valid non-ambiguous ref
984 */
985 if (strict)
986 rules_to_fail = nr_rules;
987
988 /*
Jeff King7c2b3022009-04-07 03:14:20 -0400989 * check if the short name resolves to a valid ref,
990 * but use only rules prior to the matched one
991 */
Bert Wesarg6e7b3302009-04-13 12:25:46 +0200992 for (j = 0; j < rules_to_fail; j++) {
Jeff King7c2b3022009-04-07 03:14:20 -0400993 const char *rule = ref_rev_parse_rules[j];
Jeff King7c2b3022009-04-07 03:14:20 -0400994 char refname[PATH_MAX];
995
Bert Wesarg6e7b3302009-04-13 12:25:46 +0200996 /* skip matched rule */
997 if (i == j)
998 continue;
999
Jeff King7c2b3022009-04-07 03:14:20 -04001000 /*
1001 * the short name is ambiguous, if it resolves
1002 * (with this previous rule) to a valid ref
1003 * read_ref() returns 0 on success
1004 */
1005 mksnpath(refname, sizeof(refname),
1006 rule, short_name_len, short_name);
Nguyễn Thái Ngọc Duyc6893322011-11-13 17:22:14 +07001007 if (ref_exists(refname))
Jeff King7c2b3022009-04-07 03:14:20 -04001008 break;
1009 }
1010
1011 /*
1012 * short name is non-ambiguous if all previous rules
1013 * haven't resolved to a valid ref
1014 */
Bert Wesarg6e7b3302009-04-13 12:25:46 +02001015 if (j == rules_to_fail)
Jeff King7c2b3022009-04-07 03:14:20 -04001016 return short_name;
1017 }
1018
1019 free(short_name);
Michael Haggertydfefa932011-12-12 06:38:09 +01001020 return xstrdup(refname);
Jeff King7c2b3022009-04-07 03:14:20 -04001021}
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001022
1023static struct string_list *hide_refs;
1024
1025int parse_hide_refs_config(const char *var, const char *value, const char *section)
1026{
1027 if (!strcmp("transfer.hiderefs", var) ||
1028 /* NEEDSWORK: use parse_config_key() once both are merged */
Christian Couder59556542013-11-30 21:55:40 +01001029 (starts_with(var, section) && var[strlen(section)] == '.' &&
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001030 !strcmp(var + strlen(section), ".hiderefs"))) {
1031 char *ref;
1032 int len;
1033
1034 if (!value)
1035 return config_error_nonbool(var);
1036 ref = xstrdup(value);
1037 len = strlen(ref);
1038 while (len && ref[len - 1] == '/')
1039 ref[--len] = '\0';
1040 if (!hide_refs) {
1041 hide_refs = xcalloc(1, sizeof(*hide_refs));
1042 hide_refs->strdup_strings = 1;
1043 }
1044 string_list_append(hide_refs, ref);
1045 }
1046 return 0;
1047}
1048
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001049int ref_is_hidden(const char *refname, const char *refname_full)
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001050{
Jeff King2bc31d12015-07-28 16:23:26 -04001051 int i;
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001052
1053 if (!hide_refs)
1054 return 0;
Jeff King2bc31d12015-07-28 16:23:26 -04001055 for (i = hide_refs->nr - 1; i >= 0; i--) {
1056 const char *match = hide_refs->items[i].string;
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001057 const char *subject;
Jeff King2bc31d12015-07-28 16:23:26 -04001058 int neg = 0;
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001059 int len;
Jeff King2bc31d12015-07-28 16:23:26 -04001060
1061 if (*match == '!') {
1062 neg = 1;
1063 match++;
1064 }
1065
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001066 if (*match == '^') {
1067 subject = refname_full;
1068 match++;
1069 } else {
1070 subject = refname;
1071 }
1072
1073 /* refname can be NULL when namespaces are used. */
1074 if (!subject || !starts_with(subject, match))
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001075 continue;
Jeff King2bc31d12015-07-28 16:23:26 -04001076 len = strlen(match);
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001077 if (!subject[len] || subject[len] == '/')
Jeff King2bc31d12015-07-28 16:23:26 -04001078 return !neg;
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001079 }
1080 return 0;
1081}
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001082
David Turner08451222015-11-10 12:42:40 +01001083const char *find_descendant_ref(const char *dirname,
1084 const struct string_list *extras,
1085 const struct string_list *skip)
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001086{
David Turner08451222015-11-10 12:42:40 +01001087 int pos;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001088
David Turner08451222015-11-10 12:42:40 +01001089 if (!extras)
1090 return NULL;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001091
1092 /*
David Turner08451222015-11-10 12:42:40 +01001093 * Look at the place where dirname would be inserted into
1094 * extras. If there is an entry at that position that starts
1095 * with dirname (remember, dirname includes the trailing
1096 * slash) and is not in skip, then we have a conflict.
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001097 */
David Turner08451222015-11-10 12:42:40 +01001098 for (pos = string_list_find_insert_index(extras, dirname, 0);
1099 pos < extras->nr; pos++) {
1100 const char *extra_refname = extras->items[pos].string;
1101
1102 if (!starts_with(extra_refname, dirname))
1103 break;
1104
1105 if (!skip || !string_list_has_string(skip, extra_refname))
1106 return extra_refname;
Michael Haggerty4a32b2e2015-05-11 17:25:15 +02001107 }
David Turner08451222015-11-10 12:42:40 +01001108 return NULL;
1109}
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001110
David Turnerff3a2992016-09-04 18:08:08 +02001111int rename_ref_available(const char *old_refname, const char *new_refname)
David Turner08451222015-11-10 12:42:40 +01001112{
1113 struct string_list skip = STRING_LIST_INIT_NODUP;
1114 struct strbuf err = STRBUF_INIT;
David Turnerff3a2992016-09-04 18:08:08 +02001115 int ok;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001116
David Turnerff3a2992016-09-04 18:08:08 +02001117 string_list_insert(&skip, old_refname);
1118 ok = !verify_refname_available(new_refname, NULL, &skip, &err);
1119 if (!ok)
David Turner08451222015-11-10 12:42:40 +01001120 error("%s", err.buf);
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001121
David Turner08451222015-11-10 12:42:40 +01001122 string_list_clear(&skip, 0);
1123 strbuf_release(&err);
David Turnerff3a2992016-09-04 18:08:08 +02001124 return ok;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001125}
David Turner2bf68ed2016-04-07 15:02:48 -04001126
1127int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1128{
1129 struct object_id oid;
1130 int flag;
1131
1132 if (submodule) {
1133 if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
1134 return fn("HEAD", &oid, 0, cb_data);
1135
1136 return 0;
1137 }
1138
1139 if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
1140 return fn("HEAD", &oid, flag, cb_data);
1141
1142 return 0;
1143}
1144
1145int head_ref(each_ref_fn fn, void *cb_data)
1146{
1147 return head_ref_submodule(NULL, fn, cb_data);
1148}
David Turner93770592016-04-07 15:02:49 -04001149
Michael Haggerty4c4de892016-06-18 06:15:16 +02001150/*
1151 * Call fn for each reference in the specified submodule for which the
1152 * refname begins with prefix. If trim is non-zero, then trim that
1153 * many characters off the beginning of each refname before passing
1154 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1155 * include broken references in the iteration. If fn ever returns a
1156 * non-zero value, stop the iteration and return that value;
1157 * otherwise, return 0.
1158 */
1159static int do_for_each_ref(const char *submodule, const char *prefix,
1160 each_ref_fn fn, int trim, int flags, void *cb_data)
1161{
Michael Haggerty00eebe32016-09-04 18:08:11 +02001162 struct ref_store *refs = get_ref_store(submodule);
Michael Haggerty4c4de892016-06-18 06:15:16 +02001163 struct ref_iterator *iter;
1164
Michael Haggerty00eebe32016-09-04 18:08:11 +02001165 if (!refs)
1166 return 0;
1167
Michael Haggerty1a769002016-09-04 18:08:37 +02001168 iter = refs->be->iterator_begin(refs, prefix, flags);
Michael Haggerty4c4de892016-06-18 06:15:16 +02001169 iter = prefix_ref_iterator_begin(iter, prefix, trim);
1170
1171 return do_for_each_ref_iterator(iter, fn, cb_data);
1172}
1173
David Turner93770592016-04-07 15:02:49 -04001174int for_each_ref(each_ref_fn fn, void *cb_data)
1175{
1176 return do_for_each_ref(NULL, "", fn, 0, 0, cb_data);
1177}
1178
1179int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1180{
1181 return do_for_each_ref(submodule, "", fn, 0, 0, cb_data);
1182}
1183
1184int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1185{
1186 return do_for_each_ref(NULL, prefix, fn, strlen(prefix), 0, cb_data);
1187}
1188
1189int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1190{
1191 unsigned int flag = 0;
1192
1193 if (broken)
1194 flag = DO_FOR_EACH_INCLUDE_BROKEN;
1195 return do_for_each_ref(NULL, prefix, fn, 0, flag, cb_data);
1196}
1197
1198int for_each_ref_in_submodule(const char *submodule, const char *prefix,
1199 each_ref_fn fn, void *cb_data)
1200{
1201 return do_for_each_ref(submodule, prefix, fn, strlen(prefix), 0, cb_data);
1202}
1203
1204int for_each_replace_ref(each_ref_fn fn, void *cb_data)
1205{
1206 return do_for_each_ref(NULL, git_replace_ref_base, fn,
1207 strlen(git_replace_ref_base), 0, cb_data);
1208}
1209
1210int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1211{
1212 struct strbuf buf = STRBUF_INIT;
1213 int ret;
1214 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1215 ret = do_for_each_ref(NULL, buf.buf, fn, 0, 0, cb_data);
1216 strbuf_release(&buf);
1217 return ret;
1218}
1219
1220int for_each_rawref(each_ref_fn fn, void *cb_data)
1221{
1222 return do_for_each_ref(NULL, "", fn, 0,
1223 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1224}
David Turner2d0663b2016-04-07 15:03:10 -04001225
1226/* This function needs to return a meaningful errno on failure */
Michael Haggertybd40dcd2016-09-04 18:08:21 +02001227static const char *resolve_ref_recursively(struct ref_store *refs,
1228 const char *refname,
1229 int resolve_flags,
1230 unsigned char *sha1, int *flags)
David Turner2d0663b2016-04-07 15:03:10 -04001231{
1232 static struct strbuf sb_refname = STRBUF_INIT;
1233 int unused_flags;
1234 int symref_count;
1235
1236 if (!flags)
1237 flags = &unused_flags;
1238
1239 *flags = 0;
1240
1241 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1242 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1243 !refname_is_safe(refname)) {
1244 errno = EINVAL;
1245 return NULL;
1246 }
1247
1248 /*
1249 * dwim_ref() uses REF_ISBROKEN to distinguish between
1250 * missing refs and refs that were present but invalid,
1251 * to complain about the latter to stderr.
1252 *
1253 * We don't know whether the ref exists, so don't set
1254 * REF_ISBROKEN yet.
1255 */
1256 *flags |= REF_BAD_NAME;
1257 }
1258
1259 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1260 unsigned int read_flags = 0;
1261
Michael Haggertye1e33b72016-09-04 18:08:25 +02001262 if (refs->be->read_raw_ref(refs, refname,
1263 sha1, &sb_refname, &read_flags)) {
David Turner2d0663b2016-04-07 15:03:10 -04001264 *flags |= read_flags;
1265 if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
1266 return NULL;
1267 hashclr(sha1);
1268 if (*flags & REF_BAD_NAME)
1269 *flags |= REF_ISBROKEN;
1270 return refname;
1271 }
1272
1273 *flags |= read_flags;
1274
1275 if (!(read_flags & REF_ISSYMREF)) {
1276 if (*flags & REF_BAD_NAME) {
1277 hashclr(sha1);
1278 *flags |= REF_ISBROKEN;
1279 }
1280 return refname;
1281 }
1282
1283 refname = sb_refname.buf;
1284 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1285 hashclr(sha1);
1286 return refname;
1287 }
1288 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1289 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1290 !refname_is_safe(refname)) {
1291 errno = EINVAL;
1292 return NULL;
1293 }
1294
1295 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1296 }
1297 }
1298
1299 errno = ELOOP;
1300 return NULL;
1301}
Michael Haggerty00eebe32016-09-04 18:08:11 +02001302
David Turner6fb5acf2016-09-04 18:08:41 +02001303/* backend functions */
1304int refs_init_db(struct strbuf *err)
1305{
1306 struct ref_store *refs = get_ref_store(NULL);
1307
1308 return refs->be->init_db(refs, err);
1309}
1310
Michael Haggertybd40dcd2016-09-04 18:08:21 +02001311const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1312 unsigned char *sha1, int *flags)
1313{
1314 return resolve_ref_recursively(get_ref_store(NULL), refname,
1315 resolve_flags, sha1, flags);
1316}
1317
Michael Haggertya8355bb2016-09-04 18:08:24 +02001318int resolve_gitlink_ref(const char *submodule, const char *refname,
1319 unsigned char *sha1)
Michael Haggerty424dcc72016-09-04 18:08:22 +02001320{
Michael Haggertya8355bb2016-09-04 18:08:24 +02001321 size_t len = strlen(submodule);
Michael Haggerty424dcc72016-09-04 18:08:22 +02001322 struct ref_store *refs;
1323 int flags;
1324
Michael Haggertya8355bb2016-09-04 18:08:24 +02001325 while (len && submodule[len - 1] == '/')
Michael Haggerty424dcc72016-09-04 18:08:22 +02001326 len--;
Michael Haggerty48a84752016-09-04 18:08:23 +02001327
Michael Haggerty424dcc72016-09-04 18:08:22 +02001328 if (!len)
1329 return -1;
1330
Michael Haggertya8355bb2016-09-04 18:08:24 +02001331 if (submodule[len]) {
Michael Haggerty48a84752016-09-04 18:08:23 +02001332 /* We need to strip off one or more trailing slashes */
Michael Haggertya8355bb2016-09-04 18:08:24 +02001333 char *stripped = xmemdupz(submodule, len);
Michael Haggerty48a84752016-09-04 18:08:23 +02001334
1335 refs = get_ref_store(stripped);
1336 free(stripped);
1337 } else {
Michael Haggertya8355bb2016-09-04 18:08:24 +02001338 refs = get_ref_store(submodule);
Michael Haggerty48a84752016-09-04 18:08:23 +02001339 }
1340
Michael Haggerty424dcc72016-09-04 18:08:22 +02001341 if (!refs)
1342 return -1;
1343
1344 if (!resolve_ref_recursively(refs, refname, 0, sha1, &flags) ||
1345 is_null_sha1(sha1))
1346 return -1;
1347 return 0;
1348}
1349
Michael Haggerty00eebe32016-09-04 18:08:11 +02001350/* A pointer to the ref_store for the main repository: */
1351static struct ref_store *main_ref_store;
1352
1353/* A linked list of ref_stores for submodules: */
1354static struct ref_store *submodule_ref_stores;
1355
1356void base_ref_store_init(struct ref_store *refs,
1357 const struct ref_storage_be *be,
1358 const char *submodule)
1359{
1360 refs->be = be;
1361 if (!submodule) {
1362 if (main_ref_store)
1363 die("BUG: main_ref_store initialized twice");
1364
1365 refs->submodule = "";
1366 refs->next = NULL;
1367 main_ref_store = refs;
1368 } else {
1369 if (lookup_ref_store(submodule))
1370 die("BUG: ref_store for submodule '%s' initialized twice",
1371 submodule);
1372
1373 refs->submodule = xstrdup(submodule);
1374 refs->next = submodule_ref_stores;
1375 submodule_ref_stores = refs;
1376 }
1377}
1378
1379struct ref_store *ref_store_init(const char *submodule)
1380{
1381 const char *be_name = "files";
1382 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1383
1384 if (!be)
1385 die("BUG: reference backend %s is unknown", be_name);
1386
1387 if (!submodule || !*submodule)
1388 return be->init(NULL);
1389 else
1390 return be->init(submodule);
1391}
1392
1393struct ref_store *lookup_ref_store(const char *submodule)
1394{
1395 struct ref_store *refs;
1396
1397 if (!submodule || !*submodule)
1398 return main_ref_store;
1399
1400 for (refs = submodule_ref_stores; refs; refs = refs->next) {
1401 if (!strcmp(submodule, refs->submodule))
1402 return refs;
1403 }
1404
1405 return NULL;
1406}
1407
1408struct ref_store *get_ref_store(const char *submodule)
1409{
1410 struct ref_store *refs;
1411
1412 if (!submodule || !*submodule) {
1413 refs = lookup_ref_store(NULL);
1414
1415 if (!refs)
1416 refs = ref_store_init(NULL);
1417 } else {
1418 refs = lookup_ref_store(submodule);
1419
1420 if (!refs) {
1421 struct strbuf submodule_sb = STRBUF_INIT;
1422
1423 strbuf_addstr(&submodule_sb, submodule);
1424 if (is_nonbare_repository_dir(&submodule_sb))
1425 refs = ref_store_init(submodule);
1426 strbuf_release(&submodule_sb);
1427 }
1428 }
1429
1430 return refs;
1431}
1432
1433void assert_main_repository(struct ref_store *refs, const char *caller)
1434{
1435 if (*refs->submodule)
1436 die("BUG: %s called for a submodule", caller);
1437}
Ronnie Sahlberg127b42a2016-09-04 18:08:16 +02001438
1439/* backend functions */
Michael Haggerty82315272016-09-04 18:08:27 +02001440int pack_refs(unsigned int flags)
1441{
1442 struct ref_store *refs = get_ref_store(NULL);
1443
1444 return refs->be->pack_refs(refs, flags);
1445}
1446
Michael Haggertybd427cf2016-09-04 18:08:29 +02001447int peel_ref(const char *refname, unsigned char *sha1)
1448{
1449 struct ref_store *refs = get_ref_store(NULL);
1450
1451 return refs->be->peel_ref(refs, refname, sha1);
1452}
1453
Michael Haggerty284689b2016-09-04 18:08:28 +02001454int create_symref(const char *ref_target, const char *refs_heads_master,
1455 const char *logmsg)
1456{
1457 struct ref_store *refs = get_ref_store(NULL);
1458
1459 return refs->be->create_symref(refs, ref_target, refs_heads_master,
1460 logmsg);
1461}
1462
Ronnie Sahlberg127b42a2016-09-04 18:08:16 +02001463int ref_transaction_commit(struct ref_transaction *transaction,
1464 struct strbuf *err)
1465{
1466 struct ref_store *refs = get_ref_store(NULL);
1467
1468 return refs->be->transaction_commit(refs, transaction, err);
1469}
Michael Haggerty62665822016-09-04 18:08:26 +02001470
1471int verify_refname_available(const char *refname,
1472 const struct string_list *extra,
1473 const struct string_list *skip,
1474 struct strbuf *err)
1475{
1476 struct ref_store *refs = get_ref_store(NULL);
1477
1478 return refs->be->verify_refname_available(refs, refname, extra, skip, err);
1479}
David Turnere3688bd2016-09-04 18:08:38 +02001480
1481int for_each_reflog(each_ref_fn fn, void *cb_data)
1482{
1483 struct ref_store *refs = get_ref_store(NULL);
1484 struct ref_iterator *iter;
1485
1486 iter = refs->be->reflog_iterator_begin(refs);
1487
1488 return do_for_each_ref_iterator(iter, fn, cb_data);
1489}
1490
1491int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
1492 void *cb_data)
1493{
1494 struct ref_store *refs = get_ref_store(NULL);
1495
1496 return refs->be->for_each_reflog_ent_reverse(refs, refname,
1497 fn, cb_data);
1498}
1499
1500int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
1501 void *cb_data)
1502{
1503 struct ref_store *refs = get_ref_store(NULL);
1504
1505 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
1506}
1507
1508int reflog_exists(const char *refname)
1509{
1510 struct ref_store *refs = get_ref_store(NULL);
1511
1512 return refs->be->reflog_exists(refs, refname);
1513}
1514
1515int safe_create_reflog(const char *refname, int force_create,
1516 struct strbuf *err)
1517{
1518 struct ref_store *refs = get_ref_store(NULL);
1519
1520 return refs->be->create_reflog(refs, refname, force_create, err);
1521}
1522
1523int delete_reflog(const char *refname)
1524{
1525 struct ref_store *refs = get_ref_store(NULL);
1526
1527 return refs->be->delete_reflog(refs, refname);
1528}
1529
1530int reflog_expire(const char *refname, const unsigned char *sha1,
1531 unsigned int flags,
1532 reflog_expiry_prepare_fn prepare_fn,
1533 reflog_expiry_should_prune_fn should_prune_fn,
1534 reflog_expiry_cleanup_fn cleanup_fn,
1535 void *policy_cb_data)
1536{
1537 struct ref_store *refs = get_ref_store(NULL);
1538
1539 return refs->be->reflog_expire(refs, refname, sha1, flags,
1540 prepare_fn, should_prune_fn,
1541 cleanup_fn, policy_cb_data);
1542}
David Turnerfc681462016-09-04 18:08:39 +02001543
1544int initial_ref_transaction_commit(struct ref_transaction *transaction,
1545 struct strbuf *err)
1546{
1547 struct ref_store *refs = get_ref_store(NULL);
1548
1549 return refs->be->initial_transaction_commit(refs, transaction, err);
1550}
David Turnera27dcf82016-09-04 18:08:40 +02001551
1552int delete_refs(struct string_list *refnames, unsigned int flags)
1553{
1554 struct ref_store *refs = get_ref_store(NULL);
1555
1556 return refs->be->delete_refs(refs, refnames, flags);
1557}
David Turner9b6b40d2016-09-04 18:08:42 +02001558
1559int rename_ref(const char *oldref, const char *newref, const char *logmsg)
1560{
1561 struct ref_store *refs = get_ref_store(NULL);
1562
1563 return refs->be->rename_ref(refs, oldref, newref, logmsg);
1564}