blob: 7aae78cb551fd2743982d7f9fc60e6de45df9a11 [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"
Brandon Williamsb2141fc2017-06-14 11:07:36 -07006#include "config.h"
Michael Haggerty7d4558c2017-02-10 12:16:15 +01007#include "hashmap.h"
Michael Haggerty697cc8e2014-10-01 12:28:42 +02008#include "lockfile.h"
Michael Haggertyb05855b2017-04-16 08:41:26 +02009#include "iterator.h"
Junio C Hamano85023572006-12-19 14:34:12 -080010#include "refs.h"
Michael Haggerty4cb77002015-11-10 12:42:36 +010011#include "refs/refs-internal.h"
Junio C Hamanocf0adba2006-11-19 13:22:44 -080012#include "object.h"
13#include "tag.h"
Nguyễn Thái Ngọc Duy5d0bc902017-03-26 09:42:31 +070014#include "submodule.h"
Nguyễn Thái Ngọc Duy17eff962017-04-24 17:01:22 +070015#include "worktree.h"
Stefan Beller3581d792014-12-12 09:57:02 +010016
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020017/*
Ronnie Sahlberg3dce4442016-09-04 18:08:10 +020018 * List of all available backends
19 */
20static struct ref_storage_be *refs_backends = &refs_be_files;
21
22static struct ref_storage_be *find_ref_storage_backend(const char *name)
23{
24 struct ref_storage_be *be;
25 for (be = refs_backends; be; be = be->next)
26 if (!strcmp(be->name, name))
27 return be;
28 return NULL;
29}
30
31int ref_storage_backend_exists(const char *name)
32{
33 return find_ref_storage_backend(name) != NULL;
34}
35
36/*
David Turnerdde8a902014-06-03 23:38:10 -040037 * How to handle various characters in refnames:
38 * 0: An acceptable character for refs
Junio C Hamano5e650222014-07-28 10:41:53 -070039 * 1: End-of-component
40 * 2: ., look for a preceding . to reject .. in refs
41 * 3: {, look for a preceding @ to reject @{ in refs
Jacob Keller53a85552015-07-22 14:05:32 -070042 * 4: A bad character: ASCII control characters, and
Jacob Kellercd377f42015-07-22 14:05:33 -070043 * ":", "?", "[", "\", "^", "~", SP, or TAB
44 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
David Turnerdde8a902014-06-03 23:38:10 -040045 */
46static unsigned char refname_disposition[256] = {
Junio C Hamano5e650222014-07-28 10:41:53 -070047 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
48 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
Jacob Kellercd377f42015-07-22 14:05:33 -070049 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
Junio C Hamano5e650222014-07-28 10:41:53 -070050 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
David Turnerdde8a902014-06-03 23:38:10 -040051 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Junio C Hamano5e650222014-07-28 10:41:53 -070052 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
David Turnerdde8a902014-06-03 23:38:10 -040055};
56
57/*
58 * Try to read one refname component from the front of refname.
59 * Return the length of the component found, or -1 if the component is
60 * not legal. It is legal if it is something reasonable to have under
61 * ".git/refs/"; We do not like it if:
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020062 *
63 * - any path component of it begins with ".", or
64 * - it has double dots "..", or
Jacob Keller53a85552015-07-22 14:05:32 -070065 * - it has ASCII control characters, or
Jacob Kellercd377f42015-07-22 14:05:33 -070066 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
67 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
Jacob Keller53a85552015-07-22 14:05:32 -070068 * - it ends with a "/", or
69 * - it ends with ".lock", or
70 * - it contains a "@{" portion
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020071 */
Jacob Kellercd377f42015-07-22 14:05:33 -070072static int check_refname_component(const char *refname, int *flags)
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020073{
74 const char *cp;
75 char last = '\0';
76
77 for (cp = refname; ; cp++) {
David Turnerdde8a902014-06-03 23:38:10 -040078 int ch = *cp & 255;
79 unsigned char disp = refname_disposition[ch];
80 switch (disp) {
Junio C Hamano5e650222014-07-28 10:41:53 -070081 case 1:
David Turnerdde8a902014-06-03 23:38:10 -040082 goto out;
Junio C Hamano5e650222014-07-28 10:41:53 -070083 case 2:
David Turnerdde8a902014-06-03 23:38:10 -040084 if (last == '.')
85 return -1; /* Refname contains "..". */
Michael Haggertybc5fd6d2012-04-10 07:30:13 +020086 break;
Junio C Hamano5e650222014-07-28 10:41:53 -070087 case 3:
David Turnerdde8a902014-06-03 23:38:10 -040088 if (last == '@')
89 return -1; /* Refname contains "@{". */
90 break;
Junio C Hamano5e650222014-07-28 10:41:53 -070091 case 4:
David Turnerdde8a902014-06-03 23:38:10 -040092 return -1;
Jacob Kellercd377f42015-07-22 14:05:33 -070093 case 5:
94 if (!(*flags & REFNAME_REFSPEC_PATTERN))
95 return -1; /* refspec can't be a pattern */
96
97 /*
98 * Unset the pattern flag so that we only accept
99 * a single asterisk for one side of refspec.
100 */
101 *flags &= ~ REFNAME_REFSPEC_PATTERN;
102 break;
David Turnerdde8a902014-06-03 23:38:10 -0400103 }
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200104 last = ch;
105 }
David Turnerdde8a902014-06-03 23:38:10 -0400106out:
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200107 if (cp == refname)
Michael Haggertydac529e2012-04-10 07:30:22 +0200108 return 0; /* Component has zero length. */
Jonathan Niederf3cc52d2014-09-26 12:22:22 -0700109 if (refname[0] == '.')
110 return -1; /* Component starts with '.'. */
Michael Haggerty7108ad22014-10-01 12:28:15 +0200111 if (cp - refname >= LOCK_SUFFIX_LEN &&
112 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200113 return -1; /* Refname ends with ".lock". */
114 return cp - refname;
115}
116
Junio C Hamano5e650222014-07-28 10:41:53 -0700117int check_refname_format(const char *refname, int flags)
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200118{
119 int component_len, component_count = 0;
120
Felipe Contreras9ba89f42013-09-02 01:34:30 -0500121 if (!strcmp(refname, "@"))
122 /* Refname is a single character '@'. */
123 return -1;
124
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200125 while (1) {
126 /* We are at the start of a path component. */
Jacob Kellercd377f42015-07-22 14:05:33 -0700127 component_len = check_refname_component(refname, &flags);
128 if (component_len <= 0)
129 return -1;
130
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200131 component_count++;
132 if (refname[component_len] == '\0')
133 break;
134 /* Skip to next component. */
135 refname += component_len + 1;
136 }
137
138 if (refname[component_len - 1] == '.')
139 return -1; /* Refname ends with '.'. */
140 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
141 return -1; /* Refname has only one component. */
142 return 0;
143}
144
Michael Haggerty4cb77002015-11-10 12:42:36 +0100145int refname_is_safe(const char *refname)
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700146{
Michael Haggerty39950fe2016-04-27 12:39:11 +0200147 const char *rest;
148
149 if (skip_prefix(refname, "refs/", &rest)) {
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700150 char *buf;
151 int result;
Michael Haggertye40f3552016-04-27 12:40:39 +0200152 size_t restlen = strlen(rest);
153
154 /* rest must not be empty, or start or end with "/" */
155 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
156 return 0;
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700157
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700158 /*
159 * Does the refname try to escape refs/?
160 * For example: refs/foo/../bar is safe but refs/foo/../../bar
161 * is not.
162 */
Michael Haggertye40f3552016-04-27 12:40:39 +0200163 buf = xmallocz(restlen);
164 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700165 free(buf);
166 return result;
167 }
Michael Haggerty35db25c2016-04-27 12:42:27 +0200168
169 do {
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700170 if (!isupper(*refname) && *refname != '_')
171 return 0;
172 refname++;
Michael Haggerty35db25c2016-04-27 12:42:27 +0200173 } while (*refname);
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700174 return 1;
175}
176
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700177char *refs_resolve_refdup(struct ref_store *refs,
178 const char *refname, int resolve_flags,
179 unsigned char *sha1, int *flags)
180{
181 const char *result;
182
183 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
184 sha1, flags);
185 return xstrdup_or_null(result);
186}
187
Michael Haggertyfb58c8d2015-06-22 16:03:05 +0200188char *resolve_refdup(const char *refname, int resolve_flags,
189 unsigned char *sha1, int *flags)
Nguyễn Thái Ngọc Duy96ec7b12011-12-13 21:17:48 +0700190{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700191 return refs_resolve_refdup(get_main_ref_store(),
192 refname, resolve_flags,
193 sha1, flags);
Nguyễn Thái Ngọc Duy96ec7b12011-12-13 21:17:48 +0700194}
195
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200196/* The argument to filter_refs */
197struct ref_filter {
198 const char *pattern;
199 each_ref_fn *fn;
200 void *cb_data;
201};
202
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700203int refs_read_ref_full(struct ref_store *refs, const char *refname,
204 int resolve_flags, unsigned char *sha1, int *flags)
Linus Torvalds8a65ff72005-07-02 20:23:36 -0700205{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700206 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags))
Junio C Hamanoa876ed82005-09-30 14:08:25 -0700207 return 0;
208 return -1;
Linus Torvalds8a65ff72005-07-02 20:23:36 -0700209}
210
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700211int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
212{
213 return refs_read_ref_full(get_main_ref_store(), refname,
214 resolve_flags, sha1, flags);
215}
216
Michael Haggertydfefa932011-12-12 06:38:09 +0100217int read_ref(const char *refname, unsigned char *sha1)
Nguyễn Thái Ngọc Duyc6893322011-11-13 17:22:14 +0700218{
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700219 return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
Nguyễn Thái Ngọc Duyc6893322011-11-13 17:22:14 +0700220}
221
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200222int ref_exists(const char *refname)
Junio C Hamanoef06b912006-11-18 22:13:33 -0800223{
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200224 unsigned char sha1[20];
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700225 return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
Junio C Hamanoef06b912006-11-18 22:13:33 -0800226}
227
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000228static int filter_refs(const char *refname, const struct object_id *oid,
Michael Haggerty4e675d12015-05-25 18:39:21 +0000229 int flags, void *data)
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200230{
231 struct ref_filter *filter = (struct ref_filter *)data;
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000232
Ævar Arnfjörð Bjarmason55d34262017-06-22 21:38:08 +0000233 if (wildmatch(filter->pattern, refname, 0))
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200234 return 0;
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000235 return filter->fn(refname, oid, flags, filter->cb_data);
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200236}
237
Michael Haggerty4cb77002015-11-10 12:42:36 +0100238enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200239{
240 struct object *o = lookup_unknown_object(name);
241
242 if (o->type == OBJ_NONE) {
243 int type = sha1_object_info(name, NULL);
Jeff King8ff226a2014-07-13 02:42:03 -0400244 if (type < 0 || !object_as_type(o, type, 0))
Michael Haggerty68cf8702013-04-22 21:52:20 +0200245 return PEEL_INVALID;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200246 }
247
248 if (o->type != OBJ_TAG)
Michael Haggerty68cf8702013-04-22 21:52:20 +0200249 return PEEL_NON_TAG;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200250
251 o = deref_tag_noverify(o);
252 if (!o)
Michael Haggerty68cf8702013-04-22 21:52:20 +0200253 return PEEL_INVALID;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200254
brian m. carlsoned1c9972015-11-10 02:22:29 +0000255 hashcpy(sha1, o->oid.hash);
Michael Haggerty68cf8702013-04-22 21:52:20 +0200256 return PEEL_PEELED;
Michael Haggertycb2ae1c2013-04-22 21:52:19 +0200257}
258
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200259struct warn_if_dangling_data {
260 FILE *fp;
261 const char *refname;
Jens Lindströme6bea662014-05-23 12:30:25 +0200262 const struct string_list *refnames;
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200263 const char *msg_fmt;
264};
265
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000266static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200267 int flags, void *cb_data)
268{
269 struct warn_if_dangling_data *d = cb_data;
270 const char *resolves_to;
Michael Haggerty4e675d12015-05-25 18:39:21 +0000271 struct object_id junk;
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200272
273 if (!(flags & REF_ISSYMREF))
274 return 0;
275
Michael Haggerty4e675d12015-05-25 18:39:21 +0000276 resolves_to = resolve_ref_unsafe(refname, 0, junk.hash, NULL);
Jens Lindströme6bea662014-05-23 12:30:25 +0200277 if (!resolves_to
278 || (d->refname
279 ? strcmp(resolves_to, d->refname)
280 : !string_list_has_string(d->refnames, resolves_to))) {
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200281 return 0;
Jens Lindströme6bea662014-05-23 12:30:25 +0200282 }
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200283
284 fprintf(d->fp, d->msg_fmt, refname);
Junio C Hamano1be65ed2012-05-02 13:51:35 -0700285 fputc('\n', d->fp);
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200286 return 0;
287}
288
289void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
290{
291 struct warn_if_dangling_data data;
292
293 data.fp = fp;
294 data.refname = refname;
Jens Lindströme6bea662014-05-23 12:30:25 +0200295 data.refnames = NULL;
296 data.msg_fmt = msg_fmt;
297 for_each_rawref(warn_if_dangling_symref, &data);
298}
299
300void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
301{
302 struct warn_if_dangling_data data;
303
304 data.fp = fp;
305 data.refname = NULL;
306 data.refnames = refnames;
Michael Haggertybc5fd6d2012-04-10 07:30:13 +0200307 data.msg_fmt = msg_fmt;
308 for_each_rawref(warn_if_dangling_symref, &data);
309}
310
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700311int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
312{
313 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
314}
315
Junio C Hamanocb5d7092006-09-20 21:47:42 -0700316int for_each_tag_ref(each_ref_fn fn, void *cb_data)
Seana62be772006-05-13 21:43:00 -0400317{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700318 return refs_for_each_tag_ref(get_main_ref_store(), fn, cb_data);
Seana62be772006-05-13 21:43:00 -0400319}
320
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200321int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
322{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700323 return refs_for_each_tag_ref(get_submodule_ref_store(submodule),
324 fn, cb_data);
325}
326
327int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
328{
329 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200330}
331
Junio C Hamanocb5d7092006-09-20 21:47:42 -0700332int for_each_branch_ref(each_ref_fn fn, void *cb_data)
Seana62be772006-05-13 21:43:00 -0400333{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700334 return refs_for_each_branch_ref(get_main_ref_store(), fn, cb_data);
Seana62be772006-05-13 21:43:00 -0400335}
336
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200337int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
338{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700339 return refs_for_each_branch_ref(get_submodule_ref_store(submodule),
340 fn, cb_data);
341}
342
343int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
344{
345 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200346}
347
Junio C Hamanocb5d7092006-09-20 21:47:42 -0700348int for_each_remote_ref(each_ref_fn fn, void *cb_data)
Seana62be772006-05-13 21:43:00 -0400349{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700350 return refs_for_each_remote_ref(get_main_ref_store(), fn, cb_data);
Junio C Hamanof8948e22009-02-08 23:27:10 -0800351}
352
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200353int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
354{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700355 return refs_for_each_remote_ref(get_submodule_ref_store(submodule),
356 fn, cb_data);
Heiko Voigt9ef6aeb2010-07-07 15:39:12 +0200357}
358
Josh Tripletta1bea2c2011-07-05 10:54:44 -0700359int head_ref_namespaced(each_ref_fn fn, void *cb_data)
360{
361 struct strbuf buf = STRBUF_INIT;
362 int ret = 0;
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000363 struct object_id oid;
Josh Tripletta1bea2c2011-07-05 10:54:44 -0700364 int flag;
365
366 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
Michael Haggerty2b2a5be2015-05-25 18:38:28 +0000367 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, oid.hash, &flag))
368 ret = fn(buf.buf, &oid, flag, cb_data);
Josh Tripletta1bea2c2011-07-05 10:54:44 -0700369 strbuf_release(&buf);
370
371 return ret;
372}
373
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200374int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
375 const char *prefix, void *cb_data)
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200376{
377 struct strbuf real_pattern = STRBUF_INIT;
378 struct ref_filter filter;
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200379 int ret;
380
Christian Couder59556542013-11-30 21:55:40 +0100381 if (!prefix && !starts_with(pattern, "refs/"))
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200382 strbuf_addstr(&real_pattern, "refs/");
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200383 else if (prefix)
384 strbuf_addstr(&real_pattern, prefix);
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200385 strbuf_addstr(&real_pattern, pattern);
386
Thomas Rast894a9d32010-03-12 18:04:26 +0100387 if (!has_glob_specials(pattern)) {
Junio C Hamano9517e6b2010-02-03 21:23:18 -0800388 /* Append implied '/' '*' if not present. */
Jeff King00b6c172015-09-24 17:08:35 -0400389 strbuf_complete(&real_pattern, '/');
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200390 /* No need to check for '*', there is none. */
391 strbuf_addch(&real_pattern, '*');
392 }
393
394 filter.pattern = real_pattern.buf;
395 filter.fn = fn;
396 filter.cb_data = cb_data;
397 ret = for_each_ref(filter_refs, &filter);
398
399 strbuf_release(&real_pattern);
400 return ret;
401}
402
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200403int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
404{
405 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
406}
407
Felipe Contreras4577e482009-05-14 00:22:04 +0300408const char *prettify_refname(const char *name)
Daniel Barkalowa9c37a72009-03-08 21:06:05 -0400409{
SZEDER Gábor3e5b36c2017-03-23 16:50:12 +0100410 if (skip_prefix(name, "refs/heads/", &name) ||
411 skip_prefix(name, "refs/tags/", &name) ||
412 skip_prefix(name, "refs/remotes/", &name))
413 ; /* nothing */
414 return name;
Daniel Barkalowa9c37a72009-03-08 21:06:05 -0400415}
416
Michael Haggerty54457fe2014-01-14 04:16:07 +0100417static const char *ref_rev_parse_rules[] = {
Steffen Prohaska79803322007-11-11 15:01:46 +0100418 "%.*s",
419 "refs/%.*s",
420 "refs/tags/%.*s",
421 "refs/heads/%.*s",
422 "refs/remotes/%.*s",
423 "refs/remotes/%.*s/HEAD",
424 NULL
425};
426
Michael Haggerty54457fe2014-01-14 04:16:07 +0100427int refname_match(const char *abbrev_name, const char *full_name)
Steffen Prohaska79803322007-11-11 15:01:46 +0100428{
429 const char **p;
430 const int abbrev_name_len = strlen(abbrev_name);
431
Michael Haggerty54457fe2014-01-14 04:16:07 +0100432 for (p = ref_rev_parse_rules; *p; p++) {
Steffen Prohaska79803322007-11-11 15:01:46 +0100433 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
434 return 1;
435 }
436 }
437
438 return 0;
439}
440
Michael Haggerty19b68b12011-12-12 06:38:12 +0100441/*
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700442 * *string and *len will only be substituted, and *string returned (for
443 * later free()ing) if the string passed in is a magic short-hand form
444 * to name a branch.
445 */
446static char *substitute_branch_name(const char **string, int *len)
447{
448 struct strbuf buf = STRBUF_INIT;
Jeff King0e9f62d2017-03-02 03:23:01 -0500449 int ret = interpret_branch_name(*string, *len, &buf, 0);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700450
451 if (ret == *len) {
452 size_t size;
453 *string = strbuf_detach(&buf, &size);
454 *len = size;
455 return (char *)*string;
456 }
457
458 return NULL;
459}
460
461int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
462{
463 char *last_branch = substitute_branch_name(&str, &len);
Nguyễn Thái Ngọc Duy41da7112016-06-12 17:54:02 +0700464 int refs_found = expand_ref(str, len, sha1, ref);
465 free(last_branch);
466 return refs_found;
467}
468
469int expand_ref(const char *str, int len, unsigned char *sha1, char **ref)
470{
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700471 const char **p, *r;
472 int refs_found = 0;
Jeff King6cd4a892017-03-28 15:46:33 -0400473 struct strbuf fullref = STRBUF_INIT;
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700474
475 *ref = NULL;
476 for (p = ref_rev_parse_rules; *p; p++) {
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700477 unsigned char sha1_from_ref[20];
478 unsigned char *this_result;
479 int flag;
480
481 this_result = refs_found ? sha1_from_ref : sha1;
Jeff King6cd4a892017-03-28 15:46:33 -0400482 strbuf_reset(&fullref);
483 strbuf_addf(&fullref, *p, len, str);
484 r = resolve_ref_unsafe(fullref.buf, RESOLVE_REF_READING,
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700485 this_result, &flag);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700486 if (r) {
487 if (!refs_found++)
488 *ref = xstrdup(r);
489 if (!warn_ambiguous_refs)
490 break;
Jeff King6cd4a892017-03-28 15:46:33 -0400491 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
492 warning("ignoring dangling symref %s.", fullref.buf);
493 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
494 warning("ignoring broken ref %s.", fullref.buf);
Junio C Hamano55956352011-10-19 13:55:49 -0700495 }
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700496 }
Jeff King6cd4a892017-03-28 15:46:33 -0400497 strbuf_release(&fullref);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700498 return refs_found;
499}
500
501int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
502{
503 char *last_branch = substitute_branch_name(&str, &len);
504 const char **p;
505 int logs_found = 0;
Jeff King6cd4a892017-03-28 15:46:33 -0400506 struct strbuf path = STRBUF_INIT;
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700507
508 *log = NULL;
509 for (p = ref_rev_parse_rules; *p; p++) {
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700510 unsigned char hash[20];
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700511 const char *ref, *it;
512
Jeff King6cd4a892017-03-28 15:46:33 -0400513 strbuf_reset(&path);
514 strbuf_addf(&path, *p, len, str);
515 ref = resolve_ref_unsafe(path.buf, RESOLVE_REF_READING,
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700516 hash, NULL);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700517 if (!ref)
518 continue;
Jeff King6cd4a892017-03-28 15:46:33 -0400519 if (reflog_exists(path.buf))
520 it = path.buf;
521 else if (strcmp(ref, path.buf) && reflog_exists(ref))
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700522 it = ref;
523 else
524 continue;
525 if (!logs_found++) {
526 *log = xstrdup(it);
527 hashcpy(sha1, hash);
528 }
529 if (!warn_ambiguous_refs)
530 break;
531 }
Jeff King6cd4a892017-03-28 15:46:33 -0400532 strbuf_release(&path);
Junio C Hamanoff74f7f2011-10-12 10:35:38 -0700533 free(last_branch);
534 return logs_found;
535}
536
David Turner266b1822015-07-31 02:06:18 -0400537static int is_per_worktree_ref(const char *refname)
538{
David Turnerce414b32015-08-31 22:13:11 -0400539 return !strcmp(refname, "HEAD") ||
540 starts_with(refname, "refs/bisect/");
David Turner266b1822015-07-31 02:06:18 -0400541}
542
543static int is_pseudoref_syntax(const char *refname)
544{
545 const char *c;
546
547 for (c = refname; *c; c++) {
548 if (!isupper(*c) && *c != '-' && *c != '_')
549 return 0;
550 }
551
552 return 1;
553}
554
555enum ref_type ref_type(const char *refname)
556{
557 if (is_per_worktree_ref(refname))
558 return REF_TYPE_PER_WORKTREE;
559 if (is_pseudoref_syntax(refname))
560 return REF_TYPE_PSEUDOREF;
561 return REF_TYPE_NORMAL;
562}
563
David Turner74ec19d2015-07-31 02:06:19 -0400564static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
565 const unsigned char *old_sha1, struct strbuf *err)
566{
567 const char *filename;
568 int fd;
569 static struct lock_file lock;
570 struct strbuf buf = STRBUF_INIT;
571 int ret = -1;
572
573 strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
574
575 filename = git_path("%s", pseudoref);
576 fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
577 if (fd < 0) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200578 strbuf_addf(err, "could not open '%s' for writing: %s",
David Turner74ec19d2015-07-31 02:06:19 -0400579 filename, strerror(errno));
580 return -1;
581 }
582
583 if (old_sha1) {
584 unsigned char actual_old_sha1[20];
David Turner2c3aed12015-07-15 18:05:28 -0400585
586 if (read_ref(pseudoref, actual_old_sha1))
587 die("could not read ref '%s'", pseudoref);
David Turner74ec19d2015-07-31 02:06:19 -0400588 if (hashcmp(actual_old_sha1, old_sha1)) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200589 strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
David Turner74ec19d2015-07-31 02:06:19 -0400590 rollback_lock_file(&lock);
591 goto done;
592 }
593 }
594
595 if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200596 strbuf_addf(err, "could not write to '%s'", filename);
David Turner74ec19d2015-07-31 02:06:19 -0400597 rollback_lock_file(&lock);
598 goto done;
599 }
600
601 commit_lock_file(&lock);
602 ret = 0;
603done:
604 strbuf_release(&buf);
605 return ret;
606}
607
608static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1)
609{
610 static struct lock_file lock;
611 const char *filename;
612
613 filename = git_path("%s", pseudoref);
614
615 if (old_sha1 && !is_null_sha1(old_sha1)) {
616 int fd;
617 unsigned char actual_old_sha1[20];
618
619 fd = hold_lock_file_for_update(&lock, filename,
620 LOCK_DIE_ON_ERROR);
621 if (fd < 0)
622 die_errno(_("Could not open '%s' for writing"), filename);
David Turner2c3aed12015-07-15 18:05:28 -0400623 if (read_ref(pseudoref, actual_old_sha1))
624 die("could not read ref '%s'", pseudoref);
David Turner74ec19d2015-07-31 02:06:19 -0400625 if (hashcmp(actual_old_sha1, old_sha1)) {
626 warning("Unexpected sha1 when deleting %s", pseudoref);
627 rollback_lock_file(&lock);
628 return -1;
629 }
630
631 unlink(filename);
632 rollback_lock_file(&lock);
633 } else {
634 unlink(filename);
635 }
636
637 return 0;
638}
639
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700640int refs_delete_ref(struct ref_store *refs, const char *msg,
641 const char *refname,
642 const unsigned char *old_sha1,
643 unsigned int flags)
Junio C Hamanoc0277d12006-09-30 15:02:00 -0700644{
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700645 struct ref_transaction *transaction;
646 struct strbuf err = STRBUF_INIT;
Junio C Hamanoc0277d12006-09-30 15:02:00 -0700647
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700648 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
649 assert(refs == get_main_ref_store());
Junio C Hamano080cc642015-08-25 14:57:08 -0700650 return delete_pseudoref(refname, old_sha1);
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700651 }
David Turner74ec19d2015-07-31 02:06:19 -0400652
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700653 transaction = ref_store_transaction_begin(refs, &err);
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700654 if (!transaction ||
Michael Haggertyfc67a082015-06-22 16:02:54 +0200655 ref_transaction_delete(transaction, refname, old_sha1,
Kyle Meyer755b49a2017-02-20 20:10:32 -0500656 flags, msg, &err) ||
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700657 ref_transaction_commit(transaction, &err)) {
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700658 error("%s", err.buf);
659 ref_transaction_free(transaction);
660 strbuf_release(&err);
Junio C Hamanoc0277d12006-09-30 15:02:00 -0700661 return 1;
Ronnie Sahlberg7521cc42014-04-30 09:22:45 -0700662 }
663 ref_transaction_free(transaction);
664 strbuf_release(&err);
665 return 0;
Shawn Pearce4bd18c42006-05-17 05:55:02 -0400666}
667
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700668int delete_ref(const char *msg, const char *refname,
669 const unsigned char *old_sha1, unsigned int flags)
670{
671 return refs_delete_ref(get_main_ref_store(), msg, refname,
672 old_sha1, flags);
673}
674
Michael Haggerty4cb77002015-11-10 12:42:36 +0100675int copy_reflog_msg(char *buf, const char *msg)
Junio C Hamano0ec29a42007-07-28 17:17:17 -0700676{
677 char *cp = buf;
678 char c;
679 int wasspace = 1;
680
681 *cp++ = '\t';
682 while ((c = *msg++)) {
683 if (wasspace && isspace(c))
684 continue;
685 wasspace = isspace(c);
686 if (wasspace)
687 c = ' ';
688 *cp++ = c;
689 }
690 while (buf < cp && isspace(cp[-1]))
691 cp--;
692 *cp++ = '\n';
693 return cp - buf;
694}
695
Michael Haggerty4cb77002015-11-10 12:42:36 +0100696int should_autocreate_reflog(const char *refname)
David Turner4e2bef52015-07-21 17:04:51 -0400697{
Cornelius Weig341fb282017-01-27 11:09:47 +0100698 switch (log_all_ref_updates) {
699 case LOG_REFS_ALWAYS:
700 return 1;
701 case LOG_REFS_NORMAL:
702 return starts_with(refname, "refs/heads/") ||
703 starts_with(refname, "refs/remotes/") ||
704 starts_with(refname, "refs/notes/") ||
705 !strcmp(refname, "HEAD");
706 default:
David Turner4e2bef52015-07-21 17:04:51 -0400707 return 0;
Cornelius Weig341fb282017-01-27 11:09:47 +0100708 }
David Turner4e2bef52015-07-21 17:04:51 -0400709}
710
Ronnie Sahlberge7e0f262014-07-15 16:02:38 -0700711int is_branch(const char *refname)
Linus Torvaldsc3b0dec2008-01-15 15:50:17 -0800712{
Christian Couder59556542013-11-30 21:55:40 +0100713 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
Linus Torvaldsc3b0dec2008-01-15 15:50:17 -0800714}
715
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700716struct read_ref_at_cb {
717 const char *refname;
Johannes Schindelindddbad72017-04-26 21:29:31 +0200718 timestamp_t at_time;
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700719 int cnt;
720 int reccnt;
721 unsigned char *sha1;
722 int found_it;
723
724 unsigned char osha1[20];
725 unsigned char nsha1[20];
726 int tz;
Johannes Schindelindddbad72017-04-26 21:29:31 +0200727 timestamp_t date;
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700728 char **msg;
Johannes Schindelindddbad72017-04-26 21:29:31 +0200729 timestamp_t *cutoff_time;
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700730 int *cutoff_tz;
731 int *cutoff_cnt;
732};
733
brian m. carlson9461d272017-02-21 23:47:32 +0000734static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
Johannes Schindelindddbad72017-04-26 21:29:31 +0200735 const char *email, timestamp_t timestamp, int tz,
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700736 const char *message, void *cb_data)
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800737{
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700738 struct read_ref_at_cb *cb = cb_data;
739
740 cb->reccnt++;
741 cb->tz = tz;
742 cb->date = timestamp;
743
744 if (timestamp <= cb->at_time || cb->cnt == 0) {
745 if (cb->msg)
746 *cb->msg = xstrdup(message);
747 if (cb->cutoff_time)
748 *cb->cutoff_time = timestamp;
749 if (cb->cutoff_tz)
750 *cb->cutoff_tz = tz;
751 if (cb->cutoff_cnt)
752 *cb->cutoff_cnt = cb->reccnt - 1;
753 /*
754 * we have not yet updated cb->[n|o]sha1 so they still
755 * hold the values for the previous record.
756 */
757 if (!is_null_sha1(cb->osha1)) {
brian m. carlson9461d272017-02-21 23:47:32 +0000758 hashcpy(cb->sha1, noid->hash);
759 if (hashcmp(cb->osha1, noid->hash))
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700760 warning("Log for ref %s has gap after %s.",
Jeff Kinga5481a62015-06-25 12:55:02 -0400761 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700762 }
763 else if (cb->date == cb->at_time)
brian m. carlson9461d272017-02-21 23:47:32 +0000764 hashcpy(cb->sha1, noid->hash);
765 else if (hashcmp(noid->hash, cb->sha1))
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700766 warning("Log for ref %s unexpectedly ended on %s.",
767 cb->refname, show_date(cb->date, cb->tz,
Jeff Kinga5481a62015-06-25 12:55:02 -0400768 DATE_MODE(RFC2822)));
brian m. carlson9461d272017-02-21 23:47:32 +0000769 hashcpy(cb->osha1, ooid->hash);
770 hashcpy(cb->nsha1, noid->hash);
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700771 cb->found_it = 1;
772 return 1;
773 }
brian m. carlson9461d272017-02-21 23:47:32 +0000774 hashcpy(cb->osha1, ooid->hash);
775 hashcpy(cb->nsha1, noid->hash);
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700776 if (cb->cnt > 0)
777 cb->cnt--;
778 return 0;
779}
780
brian m. carlson9461d272017-02-21 23:47:32 +0000781static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
Johannes Schindelindddbad72017-04-26 21:29:31 +0200782 const char *email, timestamp_t timestamp,
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700783 int tz, const char *message, void *cb_data)
784{
785 struct read_ref_at_cb *cb = cb_data;
786
787 if (cb->msg)
788 *cb->msg = xstrdup(message);
789 if (cb->cutoff_time)
790 *cb->cutoff_time = timestamp;
791 if (cb->cutoff_tz)
792 *cb->cutoff_tz = tz;
793 if (cb->cutoff_cnt)
794 *cb->cutoff_cnt = cb->reccnt;
brian m. carlson9461d272017-02-21 23:47:32 +0000795 hashcpy(cb->sha1, ooid->hash);
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700796 if (is_null_sha1(cb->sha1))
brian m. carlson9461d272017-02-21 23:47:32 +0000797 hashcpy(cb->sha1, noid->hash);
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700798 /* We just want the first entry */
799 return 1;
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800800}
801
Johannes Schindelindddbad72017-04-26 21:29:31 +0200802int read_ref_at(const char *refname, unsigned int flags, timestamp_t at_time, int cnt,
Michael Haggertydfefa932011-12-12 06:38:09 +0100803 unsigned char *sha1, char **msg,
Johannes Schindelindddbad72017-04-26 21:29:31 +0200804 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
Shawn Pearced556fae2006-05-17 05:56:09 -0400805{
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700806 struct read_ref_at_cb cb;
Shawn Pearced556fae2006-05-17 05:56:09 -0400807
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700808 memset(&cb, 0, sizeof(cb));
809 cb.refname = refname;
810 cb.at_time = at_time;
811 cb.cnt = cnt;
812 cb.msg = msg;
813 cb.cutoff_time = cutoff_time;
814 cb.cutoff_tz = cutoff_tz;
815 cb.cutoff_cnt = cutoff_cnt;
816 cb.sha1 = sha1;
Shawn Pearced556fae2006-05-17 05:56:09 -0400817
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700818 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
Shawn Pearced556fae2006-05-17 05:56:09 -0400819
David Aguilarc41a87d2014-09-18 20:45:37 -0700820 if (!cb.reccnt) {
821 if (flags & GET_SHA1_QUIETLY)
822 exit(128);
823 else
824 die("Log for %s is empty.", refname);
825 }
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700826 if (cb.found_it)
827 return 0;
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800828
Ronnie Sahlberg4207ed22014-06-03 09:09:59 -0700829 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
830
Junio C Hamano16d7cc92007-01-19 01:19:05 -0800831 return 1;
Shawn Pearced556fae2006-05-17 05:56:09 -0400832}
Junio C Hamano2ff81662006-12-18 01:18:16 -0800833
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700834struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
835 struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200836{
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700837 struct ref_transaction *tr;
Jonathan Nieder5a603b02014-08-28 16:42:37 -0700838 assert(err);
839
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700840 tr = xcalloc(1, sizeof(struct ref_transaction));
841 tr->ref_store = refs;
842 return tr;
843}
844
845struct ref_transaction *ref_transaction_begin(struct strbuf *err)
846{
847 return ref_store_transaction_begin(get_main_ref_store(), err);
Michael Haggertycaa40462014-04-07 15:48:10 +0200848}
849
Ronnie Sahlberg026bd1d2014-06-20 07:42:42 -0700850void ref_transaction_free(struct ref_transaction *transaction)
Michael Haggertycaa40462014-04-07 15:48:10 +0200851{
Michael Haggerty43a2dfd2017-05-22 16:17:37 +0200852 size_t i;
Michael Haggertycaa40462014-04-07 15:48:10 +0200853
Ronnie Sahlberg1b072552014-06-20 07:42:45 -0700854 if (!transaction)
855 return;
856
Michael Haggerty30173b82017-05-22 16:17:44 +0200857 switch (transaction->state) {
858 case REF_TRANSACTION_OPEN:
859 case REF_TRANSACTION_CLOSED:
860 /* OK */
861 break;
862 case REF_TRANSACTION_PREPARED:
863 die("BUG: free called on a prepared reference transaction");
864 break;
865 default:
866 die("BUG: unexpected reference transaction state");
867 break;
868 }
869
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700870 for (i = 0; i < transaction->nr; i++) {
871 free(transaction->updates[i]->msg);
Michael Haggerty88615912014-04-07 15:48:14 +0200872 free(transaction->updates[i]);
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700873 }
Michael Haggertycaa40462014-04-07 15:48:10 +0200874 free(transaction->updates);
875 free(transaction);
876}
877
Michael Haggerty71564512016-04-25 11:39:54 +0200878struct ref_update *ref_transaction_add_update(
879 struct ref_transaction *transaction,
880 const char *refname, unsigned int flags,
881 const unsigned char *new_sha1,
882 const unsigned char *old_sha1,
883 const char *msg)
Michael Haggertycaa40462014-04-07 15:48:10 +0200884{
Jeff King96ffc062016-02-22 17:44:32 -0500885 struct ref_update *update;
Michael Haggerty71564512016-04-25 11:39:54 +0200886
887 if (transaction->state != REF_TRANSACTION_OPEN)
888 die("BUG: update called for transaction that is not open");
889
890 if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
891 die("BUG: REF_ISPRUNING set without REF_NODEREF");
892
Jeff King96ffc062016-02-22 17:44:32 -0500893 FLEX_ALLOC_STR(update, refname, refname);
Michael Haggertycaa40462014-04-07 15:48:10 +0200894 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
895 transaction->updates[transaction->nr++] = update;
Michael Haggerty71564512016-04-25 11:39:54 +0200896
897 update->flags = flags;
898
899 if (flags & REF_HAVE_NEW)
brian m. carlson98491292017-05-06 22:10:23 +0000900 hashcpy(update->new_oid.hash, new_sha1);
Michael Haggerty71564512016-04-25 11:39:54 +0200901 if (flags & REF_HAVE_OLD)
brian m. carlson98491292017-05-06 22:10:23 +0000902 hashcpy(update->old_oid.hash, old_sha1);
Junio C Hamano13092a92016-10-12 11:20:23 -0700903 update->msg = xstrdup_or_null(msg);
Michael Haggertycaa40462014-04-07 15:48:10 +0200904 return update;
905}
906
Ronnie Sahlberg8e348002014-06-20 07:43:00 -0700907int ref_transaction_update(struct ref_transaction *transaction,
908 const char *refname,
909 const unsigned char *new_sha1,
910 const unsigned char *old_sha1,
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100911 unsigned int flags, const char *msg,
Ronnie Sahlberg8e348002014-06-20 07:43:00 -0700912 struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200913{
Jonathan Nieder5a603b02014-08-28 16:42:37 -0700914 assert(err);
915
Michael Haggerty8a679de2016-04-27 15:54:45 +0200916 if ((new_sha1 && !is_null_sha1(new_sha1)) ?
917 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
918 !refname_is_safe(refname)) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +0200919 strbuf_addf(err, "refusing to update ref with bad name '%s'",
Ronnie Sahlbergd0f810f2014-09-03 11:45:43 -0700920 refname);
921 return -1;
922 }
923
Michael Haggerty71564512016-04-25 11:39:54 +0200924 flags |= (new_sha1 ? REF_HAVE_NEW : 0) | (old_sha1 ? REF_HAVE_OLD : 0);
925
926 ref_transaction_add_update(transaction, refname, flags,
927 new_sha1, old_sha1, msg);
Ronnie Sahlberg8e348002014-06-20 07:43:00 -0700928 return 0;
Michael Haggertycaa40462014-04-07 15:48:10 +0200929}
930
Ronnie Sahlbergb416af52014-04-16 15:26:44 -0700931int ref_transaction_create(struct ref_transaction *transaction,
932 const char *refname,
933 const unsigned char *new_sha1,
Michael Haggertyfec14ec2015-02-17 18:00:13 +0100934 unsigned int flags, const char *msg,
Ronnie Sahlbergb416af52014-04-16 15:26:44 -0700935 struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200936{
Michael Haggertyf04c5b52015-02-17 18:00:19 +0100937 if (!new_sha1 || is_null_sha1(new_sha1))
938 die("BUG: create called without valid new_sha1");
Ronnie Sahlbergbc9f2922014-12-05 00:08:13 +0100939 return ref_transaction_update(transaction, refname, new_sha1,
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100940 null_sha1, flags, msg, err);
Michael Haggertycaa40462014-04-07 15:48:10 +0200941}
942
Ronnie Sahlberg8c8bdc02014-04-16 15:27:45 -0700943int ref_transaction_delete(struct ref_transaction *transaction,
944 const char *refname,
945 const unsigned char *old_sha1,
Michael Haggertyfb5a6bb2015-02-17 18:00:16 +0100946 unsigned int flags, const char *msg,
Ronnie Sahlberg8c8bdc02014-04-16 15:27:45 -0700947 struct strbuf *err)
Michael Haggertycaa40462014-04-07 15:48:10 +0200948{
Michael Haggerty60294592015-02-17 18:00:20 +0100949 if (old_sha1 && is_null_sha1(old_sha1))
950 die("BUG: delete called with old_sha1 set to zeros");
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100951 return ref_transaction_update(transaction, refname,
Michael Haggertyfb5a6bb2015-02-17 18:00:16 +0100952 null_sha1, old_sha1,
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100953 flags, msg, err);
Michael Haggertycaa40462014-04-07 15:48:10 +0200954}
955
Michael Haggerty16180332015-02-17 18:00:21 +0100956int ref_transaction_verify(struct ref_transaction *transaction,
957 const char *refname,
958 const unsigned char *old_sha1,
959 unsigned int flags,
960 struct strbuf *err)
961{
962 if (!old_sha1)
963 die("BUG: verify called with old_sha1 set to NULL");
964 return ref_transaction_update(transaction, refname,
965 NULL, old_sha1,
966 flags, NULL, err);
967}
968
brian m. carlson8f6dc7e2016-09-05 20:08:08 +0000969int update_ref_oid(const char *msg, const char *refname,
970 const struct object_id *new_oid, const struct object_id *old_oid,
971 unsigned int flags, enum action_on_err onerr)
972{
973 return update_ref(msg, refname, new_oid ? new_oid->hash : NULL,
974 old_oid ? old_oid->hash : NULL, flags, onerr);
975}
976
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700977int refs_update_ref(struct ref_store *refs, const char *msg,
978 const char *refname, const unsigned char *new_sha1,
979 const unsigned char *old_sha1, unsigned int flags,
980 enum action_on_err onerr)
Brad King4738a332013-09-04 11:22:40 -0400981{
David Turner74ec19d2015-07-31 02:06:19 -0400982 struct ref_transaction *t = NULL;
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700983 struct strbuf err = STRBUF_INIT;
David Turner74ec19d2015-07-31 02:06:19 -0400984 int ret = 0;
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -0700985
David Turner74ec19d2015-07-31 02:06:19 -0400986 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700987 assert(refs == get_main_ref_store());
David Turner74ec19d2015-07-31 02:06:19 -0400988 ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
989 } else {
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +0700990 t = ref_store_transaction_begin(refs, &err);
David Turner74ec19d2015-07-31 02:06:19 -0400991 if (!t ||
992 ref_transaction_update(t, refname, new_sha1, old_sha1,
993 flags, msg, &err) ||
994 ref_transaction_commit(t, &err)) {
995 ret = 1;
996 ref_transaction_free(t);
997 }
998 }
999 if (ret) {
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -07001000 const char *str = "update_ref failed for ref '%s': %s";
1001
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -07001002 switch (onerr) {
1003 case UPDATE_REFS_MSG_ON_ERR:
1004 error(str, refname, err.buf);
1005 break;
1006 case UPDATE_REFS_DIE_ON_ERR:
1007 die(str, refname, err.buf);
1008 break;
1009 case UPDATE_REFS_QUIET_ON_ERR:
1010 break;
1011 }
1012 strbuf_release(&err);
Brad King4738a332013-09-04 11:22:40 -04001013 return 1;
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -07001014 }
1015 strbuf_release(&err);
David Turner74ec19d2015-07-31 02:06:19 -04001016 if (t)
1017 ref_transaction_free(t);
Ronnie Sahlbergb4d75ac2014-04-24 16:36:55 -07001018 return 0;
Brad King4738a332013-09-04 11:22:40 -04001019}
1020
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +07001021int update_ref(const char *msg, const char *refname,
1022 const unsigned char *new_sha1,
1023 const unsigned char *old_sha1,
1024 unsigned int flags, enum action_on_err onerr)
1025{
1026 return refs_update_ref(get_main_ref_store(), msg, refname, new_sha1,
1027 old_sha1, flags, onerr);
1028}
1029
Michael Haggertydfefa932011-12-12 06:38:09 +01001030char *shorten_unambiguous_ref(const char *refname, int strict)
Jeff King7c2b3022009-04-07 03:14:20 -04001031{
1032 int i;
1033 static char **scanf_fmts;
1034 static int nr_rules;
1035 char *short_name;
Jeff King6cd4a892017-03-28 15:46:33 -04001036 struct strbuf resolved_buf = STRBUF_INIT;
Jeff King7c2b3022009-04-07 03:14:20 -04001037
Jeff King7c2b3022009-04-07 03:14:20 -04001038 if (!nr_rules) {
Michael Haggerty43466632014-01-08 15:43:39 +01001039 /*
1040 * Pre-generate scanf formats from ref_rev_parse_rules[].
1041 * Generate a format suitable for scanf from a
1042 * ref_rev_parse_rules rule by interpolating "%s" at the
1043 * location of the "%.*s".
1044 */
Jeff King7c2b3022009-04-07 03:14:20 -04001045 size_t total_len = 0;
Michael Haggerty84d56332014-01-08 15:43:38 +01001046 size_t offset = 0;
Jeff King7c2b3022009-04-07 03:14:20 -04001047
1048 /* the rule list is NULL terminated, count them first */
Jeff Kinga4165852013-10-24 04:45:13 -04001049 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
Michael Haggerty7902fe02014-01-08 15:43:40 +01001050 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1051 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
Jeff King7c2b3022009-04-07 03:14:20 -04001052
René Scharfe50492f72016-07-30 20:18:31 +02001053 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
Jeff King7c2b3022009-04-07 03:14:20 -04001054
Michael Haggerty84d56332014-01-08 15:43:38 +01001055 offset = 0;
Jeff King7c2b3022009-04-07 03:14:20 -04001056 for (i = 0; i < nr_rules; i++) {
Michael Haggerty43466632014-01-08 15:43:39 +01001057 assert(offset < total_len);
Michael Haggerty84d56332014-01-08 15:43:38 +01001058 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
Michael Haggerty43466632014-01-08 15:43:39 +01001059 offset += snprintf(scanf_fmts[i], total_len - offset,
1060 ref_rev_parse_rules[i], 2, "%s") + 1;
Jeff King7c2b3022009-04-07 03:14:20 -04001061 }
1062 }
1063
1064 /* bail out if there are no rules */
1065 if (!nr_rules)
Michael Haggertydfefa932011-12-12 06:38:09 +01001066 return xstrdup(refname);
Jeff King7c2b3022009-04-07 03:14:20 -04001067
Michael Haggertydfefa932011-12-12 06:38:09 +01001068 /* buffer for scanf result, at most refname must fit */
1069 short_name = xstrdup(refname);
Jeff King7c2b3022009-04-07 03:14:20 -04001070
1071 /* skip first rule, it will always match */
1072 for (i = nr_rules - 1; i > 0 ; --i) {
1073 int j;
Bert Wesarg6e7b3302009-04-13 12:25:46 +02001074 int rules_to_fail = i;
Jeff King7c2b3022009-04-07 03:14:20 -04001075 int short_name_len;
1076
Michael Haggertydfefa932011-12-12 06:38:09 +01001077 if (1 != sscanf(refname, scanf_fmts[i], short_name))
Jeff King7c2b3022009-04-07 03:14:20 -04001078 continue;
1079
1080 short_name_len = strlen(short_name);
1081
1082 /*
Bert Wesarg6e7b3302009-04-13 12:25:46 +02001083 * in strict mode, all (except the matched one) rules
1084 * must fail to resolve to a valid non-ambiguous ref
1085 */
1086 if (strict)
1087 rules_to_fail = nr_rules;
1088
1089 /*
Jeff King7c2b3022009-04-07 03:14:20 -04001090 * check if the short name resolves to a valid ref,
1091 * but use only rules prior to the matched one
1092 */
Bert Wesarg6e7b3302009-04-13 12:25:46 +02001093 for (j = 0; j < rules_to_fail; j++) {
Jeff King7c2b3022009-04-07 03:14:20 -04001094 const char *rule = ref_rev_parse_rules[j];
Jeff King7c2b3022009-04-07 03:14:20 -04001095
Bert Wesarg6e7b3302009-04-13 12:25:46 +02001096 /* skip matched rule */
1097 if (i == j)
1098 continue;
1099
Jeff King7c2b3022009-04-07 03:14:20 -04001100 /*
1101 * the short name is ambiguous, if it resolves
1102 * (with this previous rule) to a valid ref
1103 * read_ref() returns 0 on success
1104 */
Jeff King6cd4a892017-03-28 15:46:33 -04001105 strbuf_reset(&resolved_buf);
1106 strbuf_addf(&resolved_buf, rule,
1107 short_name_len, short_name);
1108 if (ref_exists(resolved_buf.buf))
Jeff King7c2b3022009-04-07 03:14:20 -04001109 break;
1110 }
1111
1112 /*
1113 * short name is non-ambiguous if all previous rules
1114 * haven't resolved to a valid ref
1115 */
Jeff King6cd4a892017-03-28 15:46:33 -04001116 if (j == rules_to_fail) {
1117 strbuf_release(&resolved_buf);
Jeff King7c2b3022009-04-07 03:14:20 -04001118 return short_name;
Jeff King6cd4a892017-03-28 15:46:33 -04001119 }
Jeff King7c2b3022009-04-07 03:14:20 -04001120 }
1121
Jeff King6cd4a892017-03-28 15:46:33 -04001122 strbuf_release(&resolved_buf);
Jeff King7c2b3022009-04-07 03:14:20 -04001123 free(short_name);
Michael Haggertydfefa932011-12-12 06:38:09 +01001124 return xstrdup(refname);
Jeff King7c2b3022009-04-07 03:14:20 -04001125}
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001126
1127static struct string_list *hide_refs;
1128
1129int parse_hide_refs_config(const char *var, const char *value, const char *section)
1130{
Jeff Kingad8c7cd2017-02-24 16:08:16 -05001131 const char *key;
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001132 if (!strcmp("transfer.hiderefs", var) ||
Jeff Kingad8c7cd2017-02-24 16:08:16 -05001133 (!parse_config_key(var, section, NULL, NULL, &key) &&
1134 !strcmp(key, "hiderefs"))) {
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001135 char *ref;
1136 int len;
1137
1138 if (!value)
1139 return config_error_nonbool(var);
1140 ref = xstrdup(value);
1141 len = strlen(ref);
1142 while (len && ref[len - 1] == '/')
1143 ref[--len] = '\0';
1144 if (!hide_refs) {
1145 hide_refs = xcalloc(1, sizeof(*hide_refs));
1146 hide_refs->strdup_strings = 1;
1147 }
1148 string_list_append(hide_refs, ref);
1149 }
1150 return 0;
1151}
1152
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001153int ref_is_hidden(const char *refname, const char *refname_full)
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001154{
Jeff King2bc31d12015-07-28 16:23:26 -04001155 int i;
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001156
1157 if (!hide_refs)
1158 return 0;
Jeff King2bc31d12015-07-28 16:23:26 -04001159 for (i = hide_refs->nr - 1; i >= 0; i--) {
1160 const char *match = hide_refs->items[i].string;
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001161 const char *subject;
Jeff King2bc31d12015-07-28 16:23:26 -04001162 int neg = 0;
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001163 int len;
Jeff King2bc31d12015-07-28 16:23:26 -04001164
1165 if (*match == '!') {
1166 neg = 1;
1167 match++;
1168 }
1169
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001170 if (*match == '^') {
1171 subject = refname_full;
1172 match++;
1173 } else {
1174 subject = refname;
1175 }
1176
1177 /* refname can be NULL when namespaces are used. */
1178 if (!subject || !starts_with(subject, match))
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001179 continue;
Jeff King2bc31d12015-07-28 16:23:26 -04001180 len = strlen(match);
Lukas Fleischer78a766a2015-11-03 08:58:16 +01001181 if (!subject[len] || subject[len] == '/')
Jeff King2bc31d12015-07-28 16:23:26 -04001182 return !neg;
Junio C Hamanodaebaa72013-01-18 16:08:30 -08001183 }
1184 return 0;
1185}
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001186
David Turner08451222015-11-10 12:42:40 +01001187const char *find_descendant_ref(const char *dirname,
1188 const struct string_list *extras,
1189 const struct string_list *skip)
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001190{
David Turner08451222015-11-10 12:42:40 +01001191 int pos;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001192
David Turner08451222015-11-10 12:42:40 +01001193 if (!extras)
1194 return NULL;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001195
1196 /*
David Turner08451222015-11-10 12:42:40 +01001197 * Look at the place where dirname would be inserted into
1198 * extras. If there is an entry at that position that starts
1199 * with dirname (remember, dirname includes the trailing
1200 * slash) and is not in skip, then we have a conflict.
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001201 */
David Turner08451222015-11-10 12:42:40 +01001202 for (pos = string_list_find_insert_index(extras, dirname, 0);
1203 pos < extras->nr; pos++) {
1204 const char *extra_refname = extras->items[pos].string;
1205
1206 if (!starts_with(extra_refname, dirname))
1207 break;
1208
1209 if (!skip || !string_list_has_string(skip, extra_refname))
1210 return extra_refname;
Michael Haggerty4a32b2e2015-05-11 17:25:15 +02001211 }
David Turner08451222015-11-10 12:42:40 +01001212 return NULL;
1213}
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001214
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001215int refs_rename_ref_available(struct ref_store *refs,
1216 const char *old_refname,
1217 const char *new_refname)
David Turner08451222015-11-10 12:42:40 +01001218{
1219 struct string_list skip = STRING_LIST_INIT_NODUP;
1220 struct strbuf err = STRBUF_INIT;
David Turnerff3a2992016-09-04 18:08:08 +02001221 int ok;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001222
David Turnerff3a2992016-09-04 18:08:08 +02001223 string_list_insert(&skip, old_refname);
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001224 ok = !refs_verify_refname_available(refs, new_refname,
1225 NULL, &skip, &err);
David Turnerff3a2992016-09-04 18:08:08 +02001226 if (!ok)
David Turner08451222015-11-10 12:42:40 +01001227 error("%s", err.buf);
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001228
David Turner08451222015-11-10 12:42:40 +01001229 string_list_clear(&skip, 0);
1230 strbuf_release(&err);
David Turnerff3a2992016-09-04 18:08:08 +02001231 return ok;
Michael Haggertyfa5b1832014-12-12 09:56:59 +01001232}
David Turner2bf68ed2016-04-07 15:02:48 -04001233
1234int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1235{
1236 struct object_id oid;
1237 int flag;
1238
1239 if (submodule) {
1240 if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
1241 return fn("HEAD", &oid, 0, cb_data);
1242
1243 return 0;
1244 }
1245
1246 if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
1247 return fn("HEAD", &oid, flag, cb_data);
1248
1249 return 0;
1250}
1251
1252int head_ref(each_ref_fn fn, void *cb_data)
1253{
1254 return head_ref_submodule(NULL, fn, cb_data);
1255}
David Turner93770592016-04-07 15:02:49 -04001256
Michael Haggertye121b9c2017-03-20 17:33:08 +01001257struct ref_iterator *refs_ref_iterator_begin(
1258 struct ref_store *refs,
1259 const char *prefix, int trim, int flags)
1260{
1261 struct ref_iterator *iter;
1262
Michael Haggerty0a0865b2017-05-22 16:17:52 +02001263 if (ref_paranoia < 0)
1264 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
1265 if (ref_paranoia)
1266 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1267
Michael Haggertye121b9c2017-03-20 17:33:08 +01001268 iter = refs->be->iterator_begin(refs, prefix, flags);
Michael Haggertyc7599712017-05-22 16:17:36 +02001269
1270 /*
1271 * `iterator_begin()` already takes care of prefix, but we
1272 * might need to do some trimming:
1273 */
1274 if (trim)
1275 iter = prefix_ref_iterator_begin(iter, "", trim);
Michael Haggertye121b9c2017-03-20 17:33:08 +01001276
1277 return iter;
1278}
1279
Michael Haggerty4c4de892016-06-18 06:15:16 +02001280/*
1281 * Call fn for each reference in the specified submodule for which the
1282 * refname begins with prefix. If trim is non-zero, then trim that
1283 * many characters off the beginning of each refname before passing
1284 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1285 * include broken references in the iteration. If fn ever returns a
1286 * non-zero value, stop the iteration and return that value;
1287 * otherwise, return 0.
1288 */
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001289static int do_for_each_ref(struct ref_store *refs, const char *prefix,
Michael Haggerty4c4de892016-06-18 06:15:16 +02001290 each_ref_fn fn, int trim, int flags, void *cb_data)
1291{
1292 struct ref_iterator *iter;
1293
Michael Haggerty00eebe32016-09-04 18:08:11 +02001294 if (!refs)
1295 return 0;
1296
Michael Haggertye121b9c2017-03-20 17:33:08 +01001297 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
Michael Haggerty4c4de892016-06-18 06:15:16 +02001298
1299 return do_for_each_ref_iterator(iter, fn, cb_data);
1300}
1301
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001302int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1303{
1304 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1305}
1306
David Turner93770592016-04-07 15:02:49 -04001307int for_each_ref(each_ref_fn fn, void *cb_data)
1308{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001309 return refs_for_each_ref(get_main_ref_store(), fn, cb_data);
David Turner93770592016-04-07 15:02:49 -04001310}
1311
1312int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1313{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001314 return refs_for_each_ref(get_submodule_ref_store(submodule), fn, cb_data);
1315}
1316
1317int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1318 each_ref_fn fn, void *cb_data)
1319{
1320 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
David Turner93770592016-04-07 15:02:49 -04001321}
1322
1323int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1324{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001325 return refs_for_each_ref_in(get_main_ref_store(), prefix, fn, cb_data);
David Turner93770592016-04-07 15:02:49 -04001326}
1327
1328int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1329{
1330 unsigned int flag = 0;
1331
1332 if (broken)
1333 flag = DO_FOR_EACH_INCLUDE_BROKEN;
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001334 return do_for_each_ref(get_main_ref_store(),
1335 prefix, fn, 0, flag, cb_data);
David Turner93770592016-04-07 15:02:49 -04001336}
1337
1338int for_each_ref_in_submodule(const char *submodule, const char *prefix,
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001339 each_ref_fn fn, void *cb_data)
David Turner93770592016-04-07 15:02:49 -04001340{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001341 return refs_for_each_ref_in(get_submodule_ref_store(submodule),
1342 prefix, fn, cb_data);
David Turner93770592016-04-07 15:02:49 -04001343}
1344
Michael Haggerty03df5672017-06-18 15:39:41 +02001345int for_each_fullref_in_submodule(const char *submodule, const char *prefix,
1346 each_ref_fn fn, void *cb_data,
1347 unsigned int broken)
1348{
1349 unsigned int flag = 0;
1350
1351 if (broken)
1352 flag = DO_FOR_EACH_INCLUDE_BROKEN;
1353 return do_for_each_ref(get_submodule_ref_store(submodule),
1354 prefix, fn, 0, flag, cb_data);
1355}
1356
David Turner93770592016-04-07 15:02:49 -04001357int for_each_replace_ref(each_ref_fn fn, void *cb_data)
1358{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001359 return do_for_each_ref(get_main_ref_store(),
1360 git_replace_ref_base, fn,
1361 strlen(git_replace_ref_base),
1362 0, cb_data);
David Turner93770592016-04-07 15:02:49 -04001363}
1364
1365int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1366{
1367 struct strbuf buf = STRBUF_INIT;
1368 int ret;
1369 strbuf_addf(&buf, "%srefs/", get_git_namespace());
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001370 ret = do_for_each_ref(get_main_ref_store(),
1371 buf.buf, fn, 0, 0, cb_data);
David Turner93770592016-04-07 15:02:49 -04001372 strbuf_release(&buf);
1373 return ret;
1374}
1375
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001376int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
David Turner93770592016-04-07 15:02:49 -04001377{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001378 return do_for_each_ref(refs, "", fn, 0,
David Turner93770592016-04-07 15:02:49 -04001379 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1380}
David Turner2d0663b2016-04-07 15:03:10 -04001381
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001382int for_each_rawref(each_ref_fn fn, void *cb_data)
1383{
1384 return refs_for_each_rawref(get_main_ref_store(), fn, cb_data);
1385}
1386
Michael Haggerty470be512017-03-20 17:33:07 +01001387int refs_read_raw_ref(struct ref_store *ref_store,
1388 const char *refname, unsigned char *sha1,
1389 struct strbuf *referent, unsigned int *type)
1390{
1391 return ref_store->be->read_raw_ref(ref_store, refname, sha1, referent, type);
1392}
1393
David Turner2d0663b2016-04-07 15:03:10 -04001394/* This function needs to return a meaningful errno on failure */
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001395const char *refs_resolve_ref_unsafe(struct ref_store *refs,
Michael Haggerty3c0cb0c2017-02-09 21:53:52 +01001396 const char *refname,
1397 int resolve_flags,
1398 unsigned char *sha1, int *flags)
David Turner2d0663b2016-04-07 15:03:10 -04001399{
1400 static struct strbuf sb_refname = STRBUF_INIT;
1401 int unused_flags;
1402 int symref_count;
1403
1404 if (!flags)
1405 flags = &unused_flags;
1406
1407 *flags = 0;
1408
1409 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1410 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1411 !refname_is_safe(refname)) {
1412 errno = EINVAL;
1413 return NULL;
1414 }
1415
1416 /*
1417 * dwim_ref() uses REF_ISBROKEN to distinguish between
1418 * missing refs and refs that were present but invalid,
1419 * to complain about the latter to stderr.
1420 *
1421 * We don't know whether the ref exists, so don't set
1422 * REF_ISBROKEN yet.
1423 */
1424 *flags |= REF_BAD_NAME;
1425 }
1426
1427 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1428 unsigned int read_flags = 0;
1429
Michael Haggerty470be512017-03-20 17:33:07 +01001430 if (refs_read_raw_ref(refs, refname,
1431 sha1, &sb_refname, &read_flags)) {
David Turner2d0663b2016-04-07 15:03:10 -04001432 *flags |= read_flags;
1433 if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
1434 return NULL;
1435 hashclr(sha1);
1436 if (*flags & REF_BAD_NAME)
1437 *flags |= REF_ISBROKEN;
1438 return refname;
1439 }
1440
1441 *flags |= read_flags;
1442
1443 if (!(read_flags & REF_ISSYMREF)) {
1444 if (*flags & REF_BAD_NAME) {
1445 hashclr(sha1);
1446 *flags |= REF_ISBROKEN;
1447 }
1448 return refname;
1449 }
1450
1451 refname = sb_refname.buf;
1452 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1453 hashclr(sha1);
1454 return refname;
1455 }
1456 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1457 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1458 !refname_is_safe(refname)) {
1459 errno = EINVAL;
1460 return NULL;
1461 }
1462
1463 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1464 }
1465 }
1466
1467 errno = ELOOP;
1468 return NULL;
1469}
Michael Haggerty00eebe32016-09-04 18:08:11 +02001470
David Turner6fb5acf2016-09-04 18:08:41 +02001471/* backend functions */
1472int refs_init_db(struct strbuf *err)
1473{
Nguyễn Thái Ngọc Duy077be782017-03-26 09:42:29 +07001474 struct ref_store *refs = get_main_ref_store();
David Turner6fb5acf2016-09-04 18:08:41 +02001475
1476 return refs->be->init_db(refs, err);
1477}
1478
Michael Haggertybd40dcd2016-09-04 18:08:21 +02001479const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1480 unsigned char *sha1, int *flags)
1481{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001482 return refs_resolve_ref_unsafe(get_main_ref_store(), refname,
Michael Haggertybd40dcd2016-09-04 18:08:21 +02001483 resolve_flags, sha1, flags);
1484}
1485
Michael Haggertya8355bb2016-09-04 18:08:24 +02001486int resolve_gitlink_ref(const char *submodule, const char *refname,
1487 unsigned char *sha1)
Michael Haggerty424dcc72016-09-04 18:08:22 +02001488{
Michael Haggertya8355bb2016-09-04 18:08:24 +02001489 size_t len = strlen(submodule);
Michael Haggerty424dcc72016-09-04 18:08:22 +02001490 struct ref_store *refs;
1491 int flags;
1492
Michael Haggertya8355bb2016-09-04 18:08:24 +02001493 while (len && submodule[len - 1] == '/')
Michael Haggerty424dcc72016-09-04 18:08:22 +02001494 len--;
Michael Haggerty48a84752016-09-04 18:08:23 +02001495
Michael Haggerty424dcc72016-09-04 18:08:22 +02001496 if (!len)
1497 return -1;
1498
Michael Haggertya8355bb2016-09-04 18:08:24 +02001499 if (submodule[len]) {
Michael Haggerty48a84752016-09-04 18:08:23 +02001500 /* We need to strip off one or more trailing slashes */
Michael Haggertya8355bb2016-09-04 18:08:24 +02001501 char *stripped = xmemdupz(submodule, len);
Michael Haggerty48a84752016-09-04 18:08:23 +02001502
Nguyễn Thái Ngọc Duy18d00022017-03-26 09:42:33 +07001503 refs = get_submodule_ref_store(stripped);
Michael Haggerty48a84752016-09-04 18:08:23 +02001504 free(stripped);
1505 } else {
Nguyễn Thái Ngọc Duy18d00022017-03-26 09:42:33 +07001506 refs = get_submodule_ref_store(submodule);
Michael Haggerty48a84752016-09-04 18:08:23 +02001507 }
1508
Michael Haggerty424dcc72016-09-04 18:08:22 +02001509 if (!refs)
1510 return -1;
1511
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001512 if (!refs_resolve_ref_unsafe(refs, refname, 0, sha1, &flags) ||
Michael Haggerty424dcc72016-09-04 18:08:22 +02001513 is_null_sha1(sha1))
1514 return -1;
1515 return 0;
1516}
1517
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001518struct ref_store_hash_entry
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001519{
1520 struct hashmap_entry ent; /* must be the first member! */
1521
1522 struct ref_store *refs;
1523
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001524 /* NUL-terminated identifier of the ref store: */
1525 char name[FLEX_ARRAY];
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001526};
1527
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001528static int ref_store_hash_cmp(const void *entry, const void *entry_or_key,
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001529 const void *keydata)
1530{
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001531 const struct ref_store_hash_entry *e1 = entry, *e2 = entry_or_key;
1532 const char *name = keydata ? keydata : e2->name;
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001533
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001534 return strcmp(e1->name, name);
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001535}
1536
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001537static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1538 const char *name, struct ref_store *refs)
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001539{
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001540 struct ref_store_hash_entry *entry;
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001541
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001542 FLEX_ALLOC_STR(entry, name, name);
1543 hashmap_entry_init(entry, strhash(name));
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001544 entry->refs = refs;
1545 return entry;
1546}
1547
Michael Haggerty00eebe32016-09-04 18:08:11 +02001548/* A pointer to the ref_store for the main repository: */
1549static struct ref_store *main_ref_store;
1550
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001551/* A hashmap of ref_stores, stored by submodule name: */
1552static struct hashmap submodule_ref_stores;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001553
Nguyễn Thái Ngọc Duy17eff962017-04-24 17:01:22 +07001554/* A hashmap of ref_stores, stored by worktree id: */
1555static struct hashmap worktree_ref_stores;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001556
Michael Haggerty00eebe32016-09-04 18:08:11 +02001557/*
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001558 * Look up a ref store by name. If that ref_store hasn't been
1559 * registered yet, return NULL.
Michael Haggerty00eebe32016-09-04 18:08:11 +02001560 */
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001561static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1562 const char *name)
Michael Haggerty00eebe32016-09-04 18:08:11 +02001563{
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001564 struct ref_store_hash_entry *entry;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001565
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001566 if (!map->tablesize)
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001567 /* It's initialized on demand in register_ref_store(). */
1568 return NULL;
Michael Haggerty620a66b2017-02-10 12:16:11 +01001569
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001570 entry = hashmap_get_from_hash(map, strhash(name), name);
Michael Haggerty7d4558c2017-02-10 12:16:15 +01001571 return entry ? entry->refs : NULL;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001572}
1573
Michael Haggertyc468da42017-02-10 12:16:12 +01001574/*
1575 * Create, record, and return a ref_store instance for the specified
Nguyễn Thái Ngọc Duy5d0bc902017-03-26 09:42:31 +07001576 * gitdir.
Michael Haggertyc468da42017-02-10 12:16:12 +01001577 */
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001578static struct ref_store *ref_store_init(const char *gitdir,
1579 unsigned int flags)
Michael Haggerty00eebe32016-09-04 18:08:11 +02001580{
1581 const char *be_name = "files";
1582 struct ref_storage_be *be = find_ref_storage_backend(be_name);
Michael Haggertyba88add2017-02-10 12:16:14 +01001583 struct ref_store *refs;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001584
1585 if (!be)
1586 die("BUG: reference backend %s is unknown", be_name);
1587
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001588 refs = be->init(gitdir, flags);
Michael Haggertyba88add2017-02-10 12:16:14 +01001589 return refs;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001590}
1591
Nguyễn Thái Ngọc Duy077be782017-03-26 09:42:29 +07001592struct ref_store *get_main_ref_store(void)
Michael Haggerty00eebe32016-09-04 18:08:11 +02001593{
Nguyễn Thái Ngọc Duy24c84072017-03-26 09:42:25 +07001594 if (main_ref_store)
1595 return main_ref_store;
1596
Nguyễn Thái Ngọc Duy0d8a8142017-04-24 17:01:21 +07001597 main_ref_store = ref_store_init(get_git_dir(), REF_STORE_ALL_CAPS);
Nguyễn Thái Ngọc Duy378dc912017-03-26 09:42:28 +07001598 return main_ref_store;
1599}
1600
1601/*
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001602 * Associate a ref store with a name. It is a fatal error to call this
1603 * function twice for the same name.
Nguyễn Thái Ngọc Duy378dc912017-03-26 09:42:28 +07001604 */
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001605static void register_ref_store_map(struct hashmap *map,
1606 const char *type,
1607 struct ref_store *refs,
1608 const char *name)
Nguyễn Thái Ngọc Duy378dc912017-03-26 09:42:28 +07001609{
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001610 if (!map->tablesize)
1611 hashmap_init(map, ref_store_hash_cmp, 0);
Nguyễn Thái Ngọc Duy378dc912017-03-26 09:42:28 +07001612
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001613 if (hashmap_put(map, alloc_ref_store_hash_entry(name, refs)))
1614 die("BUG: %s ref_store '%s' initialized twice", type, name);
Nguyễn Thái Ngọc Duy24c84072017-03-26 09:42:25 +07001615}
1616
Nguyễn Thái Ngọc Duy18d00022017-03-26 09:42:33 +07001617struct ref_store *get_submodule_ref_store(const char *submodule)
Michael Haggerty00eebe32016-09-04 18:08:11 +02001618{
Nguyễn Thái Ngọc Duy126c9e02017-03-26 09:42:27 +07001619 struct strbuf submodule_sb = STRBUF_INIT;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001620 struct ref_store *refs;
Nguyễn Thái Ngọc Duy126c9e02017-03-26 09:42:27 +07001621 int ret;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001622
1623 if (!submodule || !*submodule) {
Nguyễn Thái Ngọc Duy18d00022017-03-26 09:42:33 +07001624 /*
1625 * FIXME: This case is ideally not allowed. But that
1626 * can't happen until we clean up all the callers.
1627 */
Nguyễn Thái Ngọc Duy24c84072017-03-26 09:42:25 +07001628 return get_main_ref_store();
Michael Haggerty00eebe32016-09-04 18:08:11 +02001629 }
1630
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001631 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
Nguyễn Thái Ngọc Duy126c9e02017-03-26 09:42:27 +07001632 if (refs)
1633 return refs;
1634
1635 strbuf_addstr(&submodule_sb, submodule);
1636 ret = is_nonbare_repository_dir(&submodule_sb);
1637 strbuf_release(&submodule_sb);
1638 if (!ret)
1639 return NULL;
1640
Nguyễn Thái Ngọc Duy5d0bc902017-03-26 09:42:31 +07001641 ret = submodule_to_gitdir(&submodule_sb, submodule);
1642 if (ret) {
1643 strbuf_release(&submodule_sb);
1644 return NULL;
1645 }
1646
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001647 /* assume that add_submodule_odb() has been called */
1648 refs = ref_store_init(submodule_sb.buf,
1649 REF_STORE_READ | REF_STORE_ODB);
Nguyễn Thái Ngọc Duy0c064d92017-04-04 17:21:20 +07001650 register_ref_store_map(&submodule_ref_stores, "submodule",
1651 refs, submodule);
Nguyễn Thái Ngọc Duy5d0bc902017-03-26 09:42:31 +07001652
1653 strbuf_release(&submodule_sb);
Michael Haggerty00eebe32016-09-04 18:08:11 +02001654 return refs;
1655}
1656
Nguyễn Thái Ngọc Duy17eff962017-04-24 17:01:22 +07001657struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1658{
1659 struct ref_store *refs;
1660 const char *id;
1661
1662 if (wt->is_current)
1663 return get_main_ref_store();
1664
1665 id = wt->id ? wt->id : "/";
1666 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1667 if (refs)
1668 return refs;
1669
1670 if (wt->id)
1671 refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
1672 REF_STORE_ALL_CAPS);
1673 else
1674 refs = ref_store_init(get_git_common_dir(),
1675 REF_STORE_ALL_CAPS);
1676
1677 if (refs)
1678 register_ref_store_map(&worktree_ref_stores, "worktree",
1679 refs, id);
1680 return refs;
1681}
1682
Michael Haggerty620a66b2017-02-10 12:16:11 +01001683void base_ref_store_init(struct ref_store *refs,
Michael Haggertyfbfd0a22017-02-10 12:16:17 +01001684 const struct ref_storage_be *be)
Michael Haggerty00eebe32016-09-04 18:08:11 +02001685{
Michael Haggerty620a66b2017-02-10 12:16:11 +01001686 refs->be = be;
Michael Haggerty00eebe32016-09-04 18:08:11 +02001687}
Ronnie Sahlberg127b42a2016-09-04 18:08:16 +02001688
1689/* backend functions */
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001690int refs_pack_refs(struct ref_store *refs, unsigned int flags)
Michael Haggerty82315272016-09-04 18:08:27 +02001691{
Michael Haggerty82315272016-09-04 18:08:27 +02001692 return refs->be->pack_refs(refs, flags);
1693}
1694
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001695int refs_peel_ref(struct ref_store *refs, const char *refname,
1696 unsigned char *sha1)
1697{
1698 return refs->be->peel_ref(refs, refname, sha1);
Ronnie Sahlberg127b42a2016-09-04 18:08:16 +02001699}
1700
Michael Haggertybd427cf2016-09-04 18:08:29 +02001701int peel_ref(const char *refname, unsigned char *sha1)
1702{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001703 return refs_peel_ref(get_main_ref_store(), refname, sha1);
1704}
Michael Haggertybd427cf2016-09-04 18:08:29 +02001705
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001706int refs_create_symref(struct ref_store *refs,
1707 const char *ref_target,
1708 const char *refs_heads_master,
1709 const char *logmsg)
1710{
1711 return refs->be->create_symref(refs, ref_target,
1712 refs_heads_master,
1713 logmsg);
Michael Haggertybd427cf2016-09-04 18:08:29 +02001714}
1715
Michael Haggerty284689b2016-09-04 18:08:28 +02001716int create_symref(const char *ref_target, const char *refs_heads_master,
1717 const char *logmsg)
1718{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001719 return refs_create_symref(get_main_ref_store(), ref_target,
1720 refs_heads_master, logmsg);
Michael Haggerty284689b2016-09-04 18:08:28 +02001721}
1722
Michael Haggerty2ced1052017-05-22 16:17:45 +02001723int ref_update_reject_duplicates(struct string_list *refnames,
1724 struct strbuf *err)
1725{
Michael Haggertya552e502017-05-22 16:17:46 +02001726 size_t i, n = refnames->nr;
Michael Haggerty2ced1052017-05-22 16:17:45 +02001727
1728 assert(err);
1729
Michael Haggerty8556f8d2017-05-22 16:17:47 +02001730 for (i = 1; i < n; i++) {
1731 int cmp = strcmp(refnames->items[i - 1].string,
1732 refnames->items[i].string);
1733
1734 if (!cmp) {
Michael Haggerty2ced1052017-05-22 16:17:45 +02001735 strbuf_addf(err,
1736 "multiple updates for ref '%s' not allowed.",
1737 refnames->items[i].string);
1738 return 1;
Michael Haggerty8556f8d2017-05-22 16:17:47 +02001739 } else if (cmp > 0) {
1740 die("BUG: ref_update_reject_duplicates() received unsorted list");
Michael Haggerty2ced1052017-05-22 16:17:45 +02001741 }
Michael Haggerty8556f8d2017-05-22 16:17:47 +02001742 }
Michael Haggerty2ced1052017-05-22 16:17:45 +02001743 return 0;
1744}
1745
Michael Haggerty30173b82017-05-22 16:17:44 +02001746int ref_transaction_prepare(struct ref_transaction *transaction,
1747 struct strbuf *err)
Daniel Barkalow95fc7512005-06-06 16:31:29 -04001748{
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +07001749 struct ref_store *refs = transaction->ref_store;
Daniel Barkalow95fc7512005-06-06 16:31:29 -04001750
Michael Haggerty8d4240d2017-05-22 16:17:43 +02001751 switch (transaction->state) {
1752 case REF_TRANSACTION_OPEN:
1753 /* Good. */
1754 break;
Michael Haggerty30173b82017-05-22 16:17:44 +02001755 case REF_TRANSACTION_PREPARED:
1756 die("BUG: prepare called twice on reference transaction");
1757 break;
Michael Haggerty8d4240d2017-05-22 16:17:43 +02001758 case REF_TRANSACTION_CLOSED:
1759 die("BUG: prepare called on a closed reference transaction");
1760 break;
1761 default:
1762 die("BUG: unexpected reference transaction state");
1763 break;
1764 }
1765
Jeff Kingd8f44812017-04-10 18:14:12 -04001766 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
1767 strbuf_addstr(err,
1768 _("ref updates forbidden inside quarantine environment"));
1769 return -1;
1770 }
1771
Michael Haggerty30173b82017-05-22 16:17:44 +02001772 return refs->be->transaction_prepare(refs, transaction, err);
1773}
1774
1775int ref_transaction_abort(struct ref_transaction *transaction,
1776 struct strbuf *err)
1777{
1778 struct ref_store *refs = transaction->ref_store;
1779 int ret = 0;
1780
1781 switch (transaction->state) {
1782 case REF_TRANSACTION_OPEN:
1783 /* No need to abort explicitly. */
1784 break;
1785 case REF_TRANSACTION_PREPARED:
1786 ret = refs->be->transaction_abort(refs, transaction, err);
1787 break;
1788 case REF_TRANSACTION_CLOSED:
1789 die("BUG: abort called on a closed reference transaction");
1790 break;
1791 default:
1792 die("BUG: unexpected reference transaction state");
1793 break;
1794 }
1795
1796 ref_transaction_free(transaction);
1797 return ret;
1798}
1799
1800int ref_transaction_commit(struct ref_transaction *transaction,
1801 struct strbuf *err)
1802{
1803 struct ref_store *refs = transaction->ref_store;
1804 int ret;
1805
1806 switch (transaction->state) {
1807 case REF_TRANSACTION_OPEN:
1808 /* Need to prepare first. */
1809 ret = ref_transaction_prepare(transaction, err);
1810 if (ret)
1811 return ret;
1812 break;
1813 case REF_TRANSACTION_PREPARED:
1814 /* Fall through to finish. */
1815 break;
1816 case REF_TRANSACTION_CLOSED:
1817 die("BUG: commit called on a closed reference transaction");
1818 break;
1819 default:
1820 die("BUG: unexpected reference transaction state");
1821 break;
1822 }
1823
1824 return refs->be->transaction_finish(refs, transaction, err);
Daniel Barkalow95fc7512005-06-06 16:31:29 -04001825}
Michael Haggerty62665822016-09-04 18:08:26 +02001826
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001827int refs_verify_refname_available(struct ref_store *refs,
1828 const char *refname,
Michael Haggertyb05855b2017-04-16 08:41:26 +02001829 const struct string_list *extras,
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001830 const struct string_list *skip,
1831 struct strbuf *err)
Michael Haggerty62665822016-09-04 18:08:26 +02001832{
Michael Haggertyb05855b2017-04-16 08:41:26 +02001833 const char *slash;
1834 const char *extra_refname;
1835 struct strbuf dirname = STRBUF_INIT;
1836 struct strbuf referent = STRBUF_INIT;
1837 struct object_id oid;
1838 unsigned int type;
1839 struct ref_iterator *iter;
1840 int ok;
1841 int ret = -1;
1842
1843 /*
1844 * For the sake of comments in this function, suppose that
1845 * refname is "refs/foo/bar".
1846 */
1847
1848 assert(err);
1849
1850 strbuf_grow(&dirname, strlen(refname) + 1);
1851 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
1852 /* Expand dirname to the new prefix, not including the trailing slash: */
1853 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
1854
1855 /*
1856 * We are still at a leading dir of the refname (e.g.,
1857 * "refs/foo"; if there is a reference with that name,
1858 * it is a conflict, *unless* it is in skip.
1859 */
1860 if (skip && string_list_has_string(skip, dirname.buf))
1861 continue;
1862
1863 if (!refs_read_raw_ref(refs, dirname.buf, oid.hash, &referent, &type)) {
1864 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1865 dirname.buf, refname);
1866 goto cleanup;
1867 }
1868
1869 if (extras && string_list_has_string(extras, dirname.buf)) {
1870 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1871 refname, dirname.buf);
1872 goto cleanup;
1873 }
1874 }
1875
1876 /*
1877 * We are at the leaf of our refname (e.g., "refs/foo/bar").
1878 * There is no point in searching for a reference with that
1879 * name, because a refname isn't considered to conflict with
1880 * itself. But we still need to check for references whose
1881 * names are in the "refs/foo/bar/" namespace, because they
1882 * *do* conflict.
1883 */
1884 strbuf_addstr(&dirname, refname + dirname.len);
1885 strbuf_addch(&dirname, '/');
1886
1887 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
1888 DO_FOR_EACH_INCLUDE_BROKEN);
1889 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
1890 if (skip &&
1891 string_list_has_string(skip, iter->refname))
1892 continue;
1893
1894 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1895 iter->refname, refname);
1896 ref_iterator_abort(iter);
1897 goto cleanup;
1898 }
1899
1900 if (ok != ITER_DONE)
1901 die("BUG: error while iterating over references");
1902
1903 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
1904 if (extra_refname)
1905 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1906 refname, extra_refname);
1907 else
1908 ret = 0;
1909
1910cleanup:
1911 strbuf_release(&referent);
1912 strbuf_release(&dirname);
1913 return ret;
Michael Haggerty62665822016-09-04 18:08:26 +02001914}
David Turnere3688bd2016-09-04 18:08:38 +02001915
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001916int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
David Turnere3688bd2016-09-04 18:08:38 +02001917{
David Turnere3688bd2016-09-04 18:08:38 +02001918 struct ref_iterator *iter;
1919
1920 iter = refs->be->reflog_iterator_begin(refs);
1921
1922 return do_for_each_ref_iterator(iter, fn, cb_data);
1923}
1924
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001925int for_each_reflog(each_ref_fn fn, void *cb_data)
1926{
1927 return refs_for_each_reflog(get_main_ref_store(), fn, cb_data);
1928}
1929
1930int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
1931 const char *refname,
1932 each_reflog_ent_fn fn,
1933 void *cb_data)
1934{
1935 return refs->be->for_each_reflog_ent_reverse(refs, refname,
1936 fn, cb_data);
1937}
1938
David Turnere3688bd2016-09-04 18:08:38 +02001939int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
1940 void *cb_data)
1941{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001942 return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
1943 refname, fn, cb_data);
1944}
David Turnere3688bd2016-09-04 18:08:38 +02001945
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001946int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
1947 each_reflog_ent_fn fn, void *cb_data)
1948{
1949 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
David Turnere3688bd2016-09-04 18:08:38 +02001950}
1951
1952int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
1953 void *cb_data)
1954{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001955 return refs_for_each_reflog_ent(get_main_ref_store(), refname,
1956 fn, cb_data);
1957}
David Turnere3688bd2016-09-04 18:08:38 +02001958
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001959int refs_reflog_exists(struct ref_store *refs, const char *refname)
1960{
1961 return refs->be->reflog_exists(refs, refname);
David Turnere3688bd2016-09-04 18:08:38 +02001962}
1963
1964int reflog_exists(const char *refname)
1965{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001966 return refs_reflog_exists(get_main_ref_store(), refname);
1967}
David Turnere3688bd2016-09-04 18:08:38 +02001968
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001969int refs_create_reflog(struct ref_store *refs, const char *refname,
1970 int force_create, struct strbuf *err)
1971{
1972 return refs->be->create_reflog(refs, refname, force_create, err);
David Turnere3688bd2016-09-04 18:08:38 +02001973}
1974
1975int safe_create_reflog(const char *refname, int force_create,
1976 struct strbuf *err)
1977{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001978 return refs_create_reflog(get_main_ref_store(), refname,
1979 force_create, err);
1980}
David Turnere3688bd2016-09-04 18:08:38 +02001981
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001982int refs_delete_reflog(struct ref_store *refs, const char *refname)
1983{
1984 return refs->be->delete_reflog(refs, refname);
David Turnere3688bd2016-09-04 18:08:38 +02001985}
1986
1987int delete_reflog(const char *refname)
1988{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001989 return refs_delete_reflog(get_main_ref_store(), refname);
1990}
David Turnere3688bd2016-09-04 18:08:38 +02001991
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001992int refs_reflog_expire(struct ref_store *refs,
1993 const char *refname, const unsigned char *sha1,
1994 unsigned int flags,
1995 reflog_expiry_prepare_fn prepare_fn,
1996 reflog_expiry_should_prune_fn should_prune_fn,
1997 reflog_expiry_cleanup_fn cleanup_fn,
1998 void *policy_cb_data)
1999{
2000 return refs->be->reflog_expire(refs, refname, sha1, flags,
2001 prepare_fn, should_prune_fn,
2002 cleanup_fn, policy_cb_data);
David Turnere3688bd2016-09-04 18:08:38 +02002003}
2004
2005int reflog_expire(const char *refname, const unsigned char *sha1,
2006 unsigned int flags,
2007 reflog_expiry_prepare_fn prepare_fn,
2008 reflog_expiry_should_prune_fn should_prune_fn,
2009 reflog_expiry_cleanup_fn cleanup_fn,
2010 void *policy_cb_data)
2011{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07002012 return refs_reflog_expire(get_main_ref_store(),
2013 refname, sha1, flags,
2014 prepare_fn, should_prune_fn,
2015 cleanup_fn, policy_cb_data);
David Turnere3688bd2016-09-04 18:08:38 +02002016}
David Turnerfc681462016-09-04 18:08:39 +02002017
2018int initial_ref_transaction_commit(struct ref_transaction *transaction,
2019 struct strbuf *err)
2020{
Nguyễn Thái Ngọc Duyc0fe4e82017-03-26 09:42:35 +07002021 struct ref_store *refs = transaction->ref_store;
David Turnerfc681462016-09-04 18:08:39 +02002022
2023 return refs->be->initial_transaction_commit(refs, transaction, err);
2024}
David Turnera27dcf82016-09-04 18:08:40 +02002025
Michael Haggerty64da4192017-05-22 16:17:38 +02002026int refs_delete_refs(struct ref_store *refs, const char *msg,
2027 struct string_list *refnames, unsigned int flags)
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07002028{
Michael Haggerty64da4192017-05-22 16:17:38 +02002029 return refs->be->delete_refs(refs, msg, refnames, flags);
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07002030}
2031
Michael Haggerty64da4192017-05-22 16:17:38 +02002032int delete_refs(const char *msg, struct string_list *refnames,
2033 unsigned int flags)
David Turnera27dcf82016-09-04 18:08:40 +02002034{
Michael Haggerty64da4192017-05-22 16:17:38 +02002035 return refs_delete_refs(get_main_ref_store(), msg, refnames, flags);
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07002036}
David Turnera27dcf82016-09-04 18:08:40 +02002037
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07002038int refs_rename_ref(struct ref_store *refs, const char *oldref,
2039 const char *newref, const char *logmsg)
2040{
2041 return refs->be->rename_ref(refs, oldref, newref, logmsg);
David Turnera27dcf82016-09-04 18:08:40 +02002042}
David Turner9b6b40d2016-09-04 18:08:42 +02002043
2044int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2045{
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07002046 return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
David Turner9b6b40d2016-09-04 18:08:42 +02002047}