blob: c961b74c5aaae41153b89f4e877437ba7f0d70c7 [file] [log] [blame]
Linus Torvalds178cb242005-06-13 10:06:50 -07001/*
2 * rev-parse.c
3 *
4 * Copyright (C) Linus Torvalds, 2005
5 */
6#include "cache.h"
Linus Torvaldsa8be83f2005-06-20 20:28:09 -07007#include "commit.h"
Linus Torvalds960bba02005-07-03 13:07:52 -07008#include "refs.h"
Linus Torvaldsc1babb12005-09-20 14:13:24 -07009#include "quote.h"
Christian Couder895f10c2006-06-03 18:45:43 +020010#include "builtin.h"
Pierre Habouzit21d47832007-11-04 11:30:53 +010011#include "parse-options.h"
Junio C Hamano9dc01bf2013-11-01 12:13:01 -070012#include "diff.h"
13#include "revision.h"
Nguyễn Thái Ngọc Duya76295d2014-06-13 19:19:46 +070014#include "split-index.h"
Linus Torvaldsa8be83f2005-06-20 20:28:09 -070015
Junio C Hamano4866ccf2005-08-24 14:30:04 -070016#define DO_REVS 1
17#define DO_NOREV 2
18#define DO_FLAGS 4
19#define DO_NONFLAGS 8
20static int filter = ~0;
21
David Rientjes96f1e582006-08-15 10:23:48 -070022static const char *def;
Linus Torvalds023d66e2005-06-24 10:12:55 -070023
Linus Torvalds042a4ed2005-06-26 11:34:30 -070024#define NORMAL 0
25#define REVERSED 1
26static int show_type = NORMAL;
Junio C Hamanoa6d97d42008-01-05 12:09:55 -080027
28#define SHOW_SYMBOLIC_ASIS 1
29#define SHOW_SYMBOLIC_FULL 2
David Rientjes96f1e582006-08-15 10:23:48 -070030static int symbolic;
31static int abbrev;
Bert Wesarga45d3462009-04-13 13:20:26 +020032static int abbrev_ref;
33static int abbrev_ref_strict;
David Rientjes96f1e582006-08-15 10:23:48 -070034static int output_sq;
Junio C Hamano4866ccf2005-08-24 14:30:04 -070035
Nicolas Vigierf8c87212013-10-31 12:08:29 +010036static int stuck_long;
Junio C Hamano9dc01bf2013-11-01 12:13:01 -070037static struct string_list *ref_excludes;
Nicolas Vigierf8c87212013-10-31 12:08:29 +010038
Linus Torvalds921d8652005-06-13 11:14:20 -070039/*
40 * Some arguments are relevant "revision" arguments,
41 * others are about output format or other details.
42 * This sorts it all out.
43 */
44static int is_rev_argument(const char *arg)
45{
46 static const char *rev_args[] = {
Junio C Hamanoe091eb92005-10-05 14:49:54 -070047 "--all",
Junio C Hamano5ccfb752005-08-08 19:31:37 -070048 "--bisect",
Junio C Hamano5a83f3b2005-10-30 01:08:35 -080049 "--dense",
Ilari Liusvaarab09fe972010-01-20 11:48:26 +020050 "--branches=",
Seana62be772006-05-13 21:43:00 -040051 "--branches",
Junio C Hamano4866ccf2005-08-24 14:30:04 -070052 "--header",
Junio C Hamanocc243c32011-05-18 18:08:09 -070053 "--ignore-missing",
Junio C Hamano4866ccf2005-08-24 14:30:04 -070054 "--max-age=",
55 "--max-count=",
Junio C Hamano4866ccf2005-08-24 14:30:04 -070056 "--min-age=",
Junio C Hamano5ccfb752005-08-08 19:31:37 -070057 "--no-merges",
Michael J Gruberad5aeed2011-03-21 11:14:06 +010058 "--min-parents=",
59 "--no-min-parents",
60 "--max-parents=",
61 "--no-max-parents",
Junio C Hamano4866ccf2005-08-24 14:30:04 -070062 "--objects",
Junio C Hamanoc6496572006-02-19 03:32:31 -080063 "--objects-edge",
Junio C Hamano4866ccf2005-08-24 14:30:04 -070064 "--parents",
65 "--pretty",
Ilari Liusvaarab09fe972010-01-20 11:48:26 +020066 "--remotes=",
Seana62be772006-05-13 21:43:00 -040067 "--remotes",
Ilari Liusvaarad08bae72010-01-20 11:48:25 +020068 "--glob=",
Junio C Hamano5a83f3b2005-10-30 01:08:35 -080069 "--sparse",
Ilari Liusvaarab09fe972010-01-20 11:48:26 +020070 "--tags=",
Seana62be772006-05-13 21:43:00 -040071 "--tags",
Junio C Hamano4866ccf2005-08-24 14:30:04 -070072 "--topo-order",
Junio C Hamano4c8725f2006-02-15 22:05:33 -080073 "--date-order",
Junio C Hamano4866ccf2005-08-24 14:30:04 -070074 "--unpacked",
Linus Torvalds921d8652005-06-13 11:14:20 -070075 NULL
76 };
77 const char **p = rev_args;
78
Eric Wong82333402006-01-29 16:28:02 -080079 /* accept -<digit>, like traditional "head" */
80 if ((*arg == '-') && isdigit(arg[1]))
81 return 1;
82
Linus Torvalds921d8652005-06-13 11:14:20 -070083 for (;;) {
84 const char *str = *p++;
85 int len;
86 if (!str)
87 return 0;
88 len = strlen(str);
Junio C Hamano4866ccf2005-08-24 14:30:04 -070089 if (!strcmp(arg, str) ||
90 (str[len-1] == '=' && !strncmp(arg, str, len)))
Linus Torvalds921d8652005-06-13 11:14:20 -070091 return 1;
92 }
93}
94
Junio C Hamano4866ccf2005-08-24 14:30:04 -070095/* Output argument as a string, either SQ or normal */
Junio C Hamano5bb2c652005-07-22 19:08:32 -070096static void show(const char *arg)
97{
98 if (output_sq) {
99 int sq = '\'', ch;
100
101 putchar(sq);
102 while ((ch = *arg++)) {
103 if (ch == sq)
104 fputs("'\\'", stdout);
105 putchar(ch);
106 }
107 putchar(sq);
108 putchar(' ');
109 }
110 else
111 puts(arg);
112}
113
Johannes Sixte00f3792008-05-23 16:13:05 +0200114/* Like show(), but with a negation prefix according to type */
115static void show_with_type(int type, const char *arg)
116{
117 if (type != show_type)
118 putchar('^');
119 show(arg);
120}
121
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700122/* Output a revision, only if filter allows it */
Junio C Hamano30b96fc2005-08-16 12:36:46 -0700123static void show_rev(int type, const unsigned char *sha1, const char *name)
Linus Torvalds023d66e2005-06-24 10:12:55 -0700124{
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700125 if (!(filter & DO_REVS))
Linus Torvalds023d66e2005-06-24 10:12:55 -0700126 return;
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700127 def = NULL;
Junio C Hamano5bb2c652005-07-22 19:08:32 -0700128
Bert Wesarga45d3462009-04-13 13:20:26 +0200129 if ((symbolic || abbrev_ref) && name) {
130 if (symbolic == SHOW_SYMBOLIC_FULL || abbrev_ref) {
Junio C Hamanoa6d97d42008-01-05 12:09:55 -0800131 unsigned char discard[20];
132 char *full;
133
134 switch (dwim_ref(name, strlen(name), discard, &full)) {
135 case 0:
136 /*
137 * Not found -- not a ref. We could
138 * emit "name" here, but symbolic-full
139 * users are interested in finding the
140 * refs spelled in full, and they would
141 * need to filter non-refs if we did so.
142 */
143 break;
144 case 1: /* happy */
Bert Wesarga45d3462009-04-13 13:20:26 +0200145 if (abbrev_ref)
146 full = shorten_unambiguous_ref(full,
147 abbrev_ref_strict);
Johannes Sixte00f3792008-05-23 16:13:05 +0200148 show_with_type(type, full);
Junio C Hamanoa6d97d42008-01-05 12:09:55 -0800149 break;
150 default: /* ambiguous */
151 error("refname '%s' is ambiguous", name);
152 break;
153 }
Jeff King28b35632014-07-24 00:41:11 -0400154 free(full);
Junio C Hamanoa6d97d42008-01-05 12:09:55 -0800155 } else {
Johannes Sixte00f3792008-05-23 16:13:05 +0200156 show_with_type(type, name);
Junio C Hamanoa6d97d42008-01-05 12:09:55 -0800157 }
158 }
Junio C Hamanod5012502006-01-25 01:35:38 -0800159 else if (abbrev)
Johannes Sixte00f3792008-05-23 16:13:05 +0200160 show_with_type(type, find_unique_abbrev(sha1, abbrev));
Junio C Hamano30b96fc2005-08-16 12:36:46 -0700161 else
Johannes Sixte00f3792008-05-23 16:13:05 +0200162 show_with_type(type, sha1_to_hex(sha1));
Linus Torvalds023d66e2005-06-24 10:12:55 -0700163}
164
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700165/* Output a flag, only if filter allows it. */
Junio C Hamano16cee382006-06-05 22:36:21 -0700166static int show_flag(const char *arg)
Linus Torvalds023d66e2005-06-24 10:12:55 -0700167{
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700168 if (!(filter & DO_FLAGS))
Linus Torvalds9523a4c2006-02-05 11:58:34 -0800169 return 0;
170 if (filter & (is_rev_argument(arg) ? DO_REVS : DO_NOREV)) {
Linus Torvalds0360e992005-08-23 10:47:54 -0700171 show(arg);
Linus Torvalds9523a4c2006-02-05 11:58:34 -0800172 return 1;
173 }
174 return 0;
Linus Torvalds023d66e2005-06-24 10:12:55 -0700175}
176
Christian Couderdfd1b742008-05-11 18:28:25 +0200177static int show_default(void)
Linus Torvalds023d66e2005-06-24 10:12:55 -0700178{
Junio C Hamano16cee382006-06-05 22:36:21 -0700179 const char *s = def;
Linus Torvalds023d66e2005-06-24 10:12:55 -0700180
181 if (s) {
182 unsigned char sha1[20];
183
184 def = NULL;
Junio C Hamano9938af62005-08-03 22:15:49 -0700185 if (!get_sha1(s, sha1)) {
Junio C Hamano30b96fc2005-08-16 12:36:46 -0700186 show_rev(NORMAL, sha1, s);
Christian Couderdfd1b742008-05-11 18:28:25 +0200187 return 1;
Linus Torvalds023d66e2005-06-24 10:12:55 -0700188 }
Linus Torvalds023d66e2005-06-24 10:12:55 -0700189 }
Christian Couderdfd1b742008-05-11 18:28:25 +0200190 return 0;
Linus Torvalds023d66e2005-06-24 10:12:55 -0700191}
192
Michael Haggertye23b0362015-05-25 18:38:29 +0000193static int show_reference(const char *refname, const struct object_id *oid, int flag, void *cb_data)
Linus Torvalds960bba02005-07-03 13:07:52 -0700194{
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700195 if (ref_excluded(ref_excludes, refname))
196 return 0;
Michael Haggertye23b0362015-05-25 18:38:29 +0000197 show_rev(NORMAL, oid->hash, refname);
Linus Torvalds960bba02005-07-03 13:07:52 -0700198 return 0;
199}
200
Michael Haggertye23b0362015-05-25 18:38:29 +0000201static int anti_reference(const char *refname, const struct object_id *oid, int flag, void *cb_data)
Linus Torvaldsad3f9a72009-10-27 11:28:07 -0700202{
Michael Haggertye23b0362015-05-25 18:38:29 +0000203 show_rev(REVERSED, oid->hash, refname);
Linus Torvaldsad3f9a72009-10-27 11:28:07 -0700204 return 0;
205}
206
Junio C Hamano957d7402012-07-03 14:21:59 -0700207static int show_abbrev(const unsigned char *sha1, void *cb_data)
208{
209 show_rev(NORMAL, sha1, NULL);
210 return 0;
211}
212
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700213static void show_datestring(const char *flag, const char *datestr)
214{
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700215 static char buffer[100];
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700216
217 /* date handling requires both flags and revs */
218 if ((filter & (DO_FLAGS | DO_REVS)) != (DO_FLAGS | DO_REVS))
219 return;
Linus Torvalds3c07b1d2005-11-14 19:29:06 -0800220 snprintf(buffer, sizeof(buffer), "%s%lu", flag, approxidate(datestr));
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700221 show(buffer);
222}
223
John Keeping12b9d322013-06-16 15:18:17 +0100224static int show_file(const char *arg, int output_prefix)
Linus Torvalds7a3dd472005-10-18 00:16:45 -0700225{
Linus Torvalds7b34c2f2005-10-25 15:24:55 -0700226 show_default();
Linus Torvalds9ad0a932006-02-05 21:41:47 -0800227 if ((filter & (DO_NONFLAGS|DO_NOREV)) == (DO_NONFLAGS|DO_NOREV)) {
John Keeping12b9d322013-06-16 15:18:17 +0100228 if (output_prefix) {
229 const char *prefix = startup_info->prefix;
230 show(prefix_filename(prefix,
231 prefix ? strlen(prefix) : 0,
232 arg));
233 } else
234 show(arg);
Linus Torvalds9ad0a932006-02-05 21:41:47 -0800235 return 1;
236 }
237 return 0;
Linus Torvalds7a3dd472005-10-18 00:16:45 -0700238}
239
Junio C Hamanob7d936b2006-07-06 00:16:35 -0700240static int try_difference(const char *arg)
Santi Béjar3dd4e732006-07-04 11:02:22 +0200241{
242 char *dotdot;
243 unsigned char sha1[20];
244 unsigned char end[20];
245 const char *next;
246 const char *this;
247 int symmetric;
Junio C Hamano003c84f2011-05-02 13:39:16 -0700248 static const char head_by_default[] = "HEAD";
Santi Béjar3dd4e732006-07-04 11:02:22 +0200249
250 if (!(dotdot = strstr(arg, "..")))
251 return 0;
252 next = dotdot + 2;
253 this = arg;
254 symmetric = (*next == '.');
255
256 *dotdot = 0;
257 next += symmetric;
258
259 if (!*next)
Junio C Hamano003c84f2011-05-02 13:39:16 -0700260 next = head_by_default;
Santi Béjar3dd4e732006-07-04 11:02:22 +0200261 if (dotdot == arg)
Junio C Hamano003c84f2011-05-02 13:39:16 -0700262 this = head_by_default;
263
264 if (this == head_by_default && next == head_by_default &&
265 !symmetric) {
266 /*
267 * Just ".."? That is not a range but the
268 * pathspec for the parent directory.
269 */
270 *dotdot = '.';
271 return 0;
272 }
273
Junio C Hamanoc036c4c2012-07-03 13:45:12 -0700274 if (!get_sha1_committish(this, sha1) && !get_sha1_committish(next, end)) {
Santi Béjar3dd4e732006-07-04 11:02:22 +0200275 show_rev(NORMAL, end, next);
276 show_rev(symmetric ? NORMAL : REVERSED, sha1, this);
277 if (symmetric) {
278 struct commit_list *exclude;
279 struct commit *a, *b;
280 a = lookup_commit_reference(sha1);
281 b = lookup_commit_reference(end);
Junio C Hamano2ce406c2014-10-30 12:20:44 -0700282 exclude = get_merge_bases(a, b);
Santi Béjar3dd4e732006-07-04 11:02:22 +0200283 while (exclude) {
René Scharfee510ab82015-10-24 18:21:31 +0200284 struct commit *commit = pop_commit(&exclude);
brian m. carlsoned1c9972015-11-10 02:22:29 +0000285 show_rev(REVERSED, commit->object.oid.hash, NULL);
Santi Béjar3dd4e732006-07-04 11:02:22 +0200286 }
287 }
Jeff King62f162f2013-12-06 17:07:52 -0500288 *dotdot = '.';
Santi Béjar3dd4e732006-07-04 11:02:22 +0200289 return 1;
290 }
291 *dotdot = '.';
292 return 0;
293}
294
Björn Steinbrink2122f8b2008-07-26 18:37:56 +0200295static int try_parent_shorthands(const char *arg)
296{
297 char *dotdot;
298 unsigned char sha1[20];
299 struct commit *commit;
300 struct commit_list *parents;
301 int parents_only;
302
303 if ((dotdot = strstr(arg, "^!")))
304 parents_only = 0;
305 else if ((dotdot = strstr(arg, "^@")))
306 parents_only = 1;
307
308 if (!dotdot || dotdot[2])
309 return 0;
310
311 *dotdot = 0;
Jeff King62f162f2013-12-06 17:07:52 -0500312 if (get_sha1_committish(arg, sha1)) {
313 *dotdot = '^';
Björn Steinbrink2122f8b2008-07-26 18:37:56 +0200314 return 0;
Jeff King62f162f2013-12-06 17:07:52 -0500315 }
Björn Steinbrink2122f8b2008-07-26 18:37:56 +0200316
317 if (!parents_only)
318 show_rev(NORMAL, sha1, arg);
319 commit = lookup_commit_reference(sha1);
320 for (parents = commit->parents; parents; parents = parents->next)
321 show_rev(parents_only ? NORMAL : REVERSED,
brian m. carlsoned1c9972015-11-10 02:22:29 +0000322 parents->item->object.oid.hash, arg);
Björn Steinbrink2122f8b2008-07-26 18:37:56 +0200323
Jeff King62f162f2013-12-06 17:07:52 -0500324 *dotdot = '^';
Björn Steinbrink2122f8b2008-07-26 18:37:56 +0200325 return 1;
326}
327
Pierre Habouzit21d47832007-11-04 11:30:53 +0100328static int parseopt_dump(const struct option *o, const char *arg, int unset)
329{
330 struct strbuf *parsed = o->value;
331 if (unset)
332 strbuf_addf(parsed, " --no-%s", o->long_name);
Nicolas Vigierf8c87212013-10-31 12:08:29 +0100333 else if (o->short_name && (o->long_name == NULL || !stuck_long))
Pierre Habouzit21d47832007-11-04 11:30:53 +0100334 strbuf_addf(parsed, " -%c", o->short_name);
335 else
336 strbuf_addf(parsed, " --%s", o->long_name);
337 if (arg) {
Nicolas Vigierf8c87212013-10-31 12:08:29 +0100338 if (!stuck_long)
339 strbuf_addch(parsed, ' ');
340 else if (o->long_name)
341 strbuf_addch(parsed, '=');
Pierre Habouzit21d47832007-11-04 11:30:53 +0100342 sq_quote_buf(parsed, arg);
343 }
344 return 0;
345}
346
347static const char *skipspaces(const char *s)
348{
349 while (isspace(*s))
350 s++;
351 return s;
352}
353
354static int cmd_parseopt(int argc, const char **argv, const char *prefix)
355{
Uwe Kleine-König6e0800e2009-06-14 01:58:43 +0200356 static int keep_dashdash = 0, stop_at_non_option = 0;
Pierre Habouzit21d47832007-11-04 11:30:53 +0100357 static char const * const parseopt_usage[] = {
Alex Henrie9c9b4f22015-01-13 00:44:47 -0700358 N_("git rev-parse --parseopt [<options>] -- [<args>...]"),
Pierre Habouzit21d47832007-11-04 11:30:53 +0100359 NULL
360 };
361 static struct option parseopt_opts[] = {
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200362 OPT_BOOL(0, "keep-dashdash", &keep_dashdash,
Nguyễn Thái Ngọc Duy2c7c1842012-08-20 19:32:40 +0700363 N_("keep the `--` passed as an arg")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +0200364 OPT_BOOL(0, "stop-at-non-option", &stop_at_non_option,
Nguyễn Thái Ngọc Duy2c7c1842012-08-20 19:32:40 +0700365 N_("stop parsing after the "
366 "first non-option argument")),
Nicolas Vigierf8c87212013-10-31 12:08:29 +0100367 OPT_BOOL(0, "stuck-long", &stuck_long,
368 N_("output in stuck long form")),
Pierre Habouzit21d47832007-11-04 11:30:53 +0100369 OPT_END(),
370 };
Ilya Bobyr2d893df2015-07-14 01:17:44 -0700371 static const char * const flag_chars = "*=?!";
Pierre Habouzit21d47832007-11-04 11:30:53 +0100372
Brandon Caseyf285a2d2008-10-09 14:12:12 -0500373 struct strbuf sb = STRBUF_INIT, parsed = STRBUF_INIT;
Pierre Habouzit21d47832007-11-04 11:30:53 +0100374 const char **usage = NULL;
375 struct option *opts = NULL;
376 int onb = 0, osz = 0, unb = 0, usz = 0;
377
Pierre Habouzit21d47832007-11-04 11:30:53 +0100378 strbuf_addstr(&parsed, "set --");
Stephen Boyd37782922009-05-23 11:53:12 -0700379 argc = parse_options(argc, argv, prefix, parseopt_opts, parseopt_usage,
Pierre Habouzit21d47832007-11-04 11:30:53 +0100380 PARSE_OPT_KEEP_DASHDASH);
381 if (argc < 1 || strcmp(argv[0], "--"))
382 usage_with_options(parseopt_usage, parseopt_opts);
383
Pierre Habouzit21d47832007-11-04 11:30:53 +0100384 /* get the usage up to the first line with a -- on it */
385 for (;;) {
Junio C Hamano72e37b62015-10-28 13:59:44 -0700386 if (strbuf_getline(&sb, stdin) == EOF)
Pierre Habouzit21d47832007-11-04 11:30:53 +0100387 die("premature end of input");
388 ALLOC_GROW(usage, unb + 1, usz);
389 if (!strcmp("--", sb.buf)) {
390 if (unb < 1)
391 die("no usage string given before the `--' separator");
392 usage[unb] = NULL;
393 break;
394 }
395 usage[unb++] = strbuf_detach(&sb, NULL);
396 }
397
Ilya Bobyr9bab5b62014-03-22 02:47:34 -0700398 /* parse: (<short>|<short>,<long>|<long>)[*=?!]*<arghint>? SP+ <help> */
Junio C Hamano72e37b62015-10-28 13:59:44 -0700399 while (strbuf_getline(&sb, stdin) != EOF) {
Pierre Habouzit21d47832007-11-04 11:30:53 +0100400 const char *s;
Ilya Bobyr2d893df2015-07-14 01:17:44 -0700401 const char *help;
Pierre Habouzit21d47832007-11-04 11:30:53 +0100402 struct option *o;
403
404 if (!sb.len)
405 continue;
406
407 ALLOC_GROW(opts, onb + 1, osz);
408 memset(opts + onb, 0, sizeof(opts[onb]));
409
410 o = &opts[onb++];
Ilya Bobyr2d893df2015-07-14 01:17:44 -0700411 help = strchr(sb.buf, ' ');
412 if (!help || *sb.buf == ' ') {
Pierre Habouzit21d47832007-11-04 11:30:53 +0100413 o->type = OPTION_GROUP;
Jay Soffiane1033432008-02-25 23:07:39 -0500414 o->help = xstrdup(skipspaces(sb.buf));
Pierre Habouzit21d47832007-11-04 11:30:53 +0100415 continue;
416 }
417
418 o->type = OPTION_CALLBACK;
Ilya Bobyr2d893df2015-07-14 01:17:44 -0700419 o->help = xstrdup(skipspaces(help));
Pierre Habouzit21d47832007-11-04 11:30:53 +0100420 o->value = &parsed;
Pierre Habouzitff962a32008-03-02 09:21:38 +0100421 o->flags = PARSE_OPT_NOARG;
Pierre Habouzit21d47832007-11-04 11:30:53 +0100422 o->callback = &parseopt_dump;
Ilya Bobyr9bab5b62014-03-22 02:47:34 -0700423
Ilya Bobyr2d893df2015-07-14 01:17:44 -0700424 /* name(s) */
425 s = strpbrk(sb.buf, flag_chars);
426 if (s == NULL)
427 s = help;
Pierre Habouzit21d47832007-11-04 11:30:53 +0100428
429 if (s - sb.buf == 1) /* short option only */
430 o->short_name = *sb.buf;
431 else if (sb.buf[1] != ',') /* long option only */
432 o->long_name = xmemdupz(sb.buf, s - sb.buf);
433 else {
434 o->short_name = *sb.buf;
435 o->long_name = xmemdupz(sb.buf + 2, s - sb.buf - 2);
436 }
Ilya Bobyr2d893df2015-07-14 01:17:44 -0700437
438 /* flags */
439 while (s < help) {
440 switch (*s++) {
441 case '=':
442 o->flags &= ~PARSE_OPT_NOARG;
443 continue;
444 case '?':
445 o->flags &= ~PARSE_OPT_NOARG;
446 o->flags |= PARSE_OPT_OPTARG;
447 continue;
448 case '!':
449 o->flags |= PARSE_OPT_NONEG;
450 continue;
451 case '*':
452 o->flags |= PARSE_OPT_HIDDEN;
453 continue;
454 }
455 s--;
456 break;
457 }
458
459 if (s < help)
460 o->argh = xmemdupz(s, help - s);
Pierre Habouzit21d47832007-11-04 11:30:53 +0100461 }
462 strbuf_release(&sb);
463
464 /* put an OPT_END() */
465 ALLOC_GROW(opts, onb + 1, osz);
466 memset(opts + onb, 0, sizeof(opts[onb]));
Stephen Boyd37782922009-05-23 11:53:12 -0700467 argc = parse_options(argc, argv, prefix, opts, usage,
Uwe Kleine-König29981382010-07-06 16:46:05 +0200468 (keep_dashdash ? PARSE_OPT_KEEP_DASHDASH : 0) |
Junio C Hamanofcd91f82010-07-07 11:18:26 -0700469 (stop_at_non_option ? PARSE_OPT_STOP_AT_NON_OPTION : 0) |
Thomas Rast47e9cd22010-06-12 14:57:39 +0200470 PARSE_OPT_SHELL_EVAL);
Pierre Habouzit21d47832007-11-04 11:30:53 +0100471
472 strbuf_addf(&parsed, " --");
Christian Couderb319ce42007-12-03 05:51:50 +0100473 sq_quote_argv(&parsed, argv, 0);
Pierre Habouzit21d47832007-11-04 11:30:53 +0100474 puts(parsed.buf);
475 return 0;
476}
477
Christian Couder50325372009-04-25 06:55:26 +0200478static int cmd_sq_quote(int argc, const char **argv)
479{
480 struct strbuf buf = STRBUF_INIT;
481
482 if (argc)
483 sq_quote_argv(&buf, argv, 0);
484 printf("%s\n", buf.buf);
485 strbuf_release(&buf);
486
487 return 0;
488}
489
Christian Couderb1b35962008-04-26 13:57:23 +0200490static void die_no_single_rev(int quiet)
491{
492 if (quiet)
493 exit(1);
494 else
495 die("Needed a single revision");
496}
497
Jonathan Nieder7006b5b2009-11-09 09:04:54 -0600498static const char builtin_rev_parse_usage[] =
Alex Henrie9c9b4f22015-01-13 00:44:47 -0700499N_("git rev-parse --parseopt [<options>] -- [<args>...]\n"
Nguyễn Thái Ngọc Duy2c7c1842012-08-20 19:32:40 +0700500 " or: git rev-parse --sq-quote [<arg>...]\n"
Alex Henrie9c9b4f22015-01-13 00:44:47 -0700501 " or: git rev-parse [<options>] [<arg>...]\n"
Nguyễn Thái Ngọc Duy2c7c1842012-08-20 19:32:40 +0700502 "\n"
503 "Run \"git rev-parse --parseopt -h\" for more information on the first usage.");
Jonathan Nieder7006b5b2009-11-09 09:04:54 -0600504
Linus Torvaldsa633fca2006-07-28 22:44:25 -0700505int cmd_rev_parse(int argc, const char **argv, const char *prefix)
Linus Torvalds178cb242005-06-13 10:06:50 -0700506{
Christian Couderdfd1b742008-05-11 18:28:25 +0200507 int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0;
Jeff Kingfc7d47f2016-02-29 06:01:56 -0500508 int did_repo_setup = 0;
Jeff King14185672013-12-06 17:05:48 -0500509 int has_dashdash = 0;
John Keeping12b9d322013-06-16 15:18:17 +0100510 int output_prefix = 0;
Linus Torvalds178cb242005-06-13 10:06:50 -0700511 unsigned char sha1[20];
David Aguilarc41a87d2014-09-18 20:45:37 -0700512 unsigned int flags = 0;
Christian Couderdfd1b742008-05-11 18:28:25 +0200513 const char *name = NULL;
David Aguilarc41a87d2014-09-18 20:45:37 -0700514 struct object_context unused;
Seana62be772006-05-13 21:43:00 -0400515
Pierre Habouzit21d47832007-11-04 11:30:53 +0100516 if (argc > 1 && !strcmp("--parseopt", argv[1]))
517 return cmd_parseopt(argc - 1, argv + 1, prefix);
518
Christian Couder50325372009-04-25 06:55:26 +0200519 if (argc > 1 && !strcmp("--sq-quote", argv[1]))
520 return cmd_sq_quote(argc - 2, argv + 2);
521
Jonathan Nieder7006b5b2009-11-09 09:04:54 -0600522 if (argc > 1 && !strcmp("-h", argv[1]))
523 usage(builtin_rev_parse_usage);
524
Jeff King14185672013-12-06 17:05:48 -0500525 for (i = 1; i < argc; i++) {
526 if (!strcmp(argv[i], "--")) {
527 has_dashdash = 1;
528 break;
529 }
530 }
531
Jeff Kingfc7d47f2016-02-29 06:01:56 -0500532 /* No options; just report on whether we're in a git repo or not. */
533 if (argc == 1) {
534 setup_git_directory();
535 git_config(git_default_config, NULL);
536 return 0;
537 }
538
Linus Torvalds178cb242005-06-13 10:06:50 -0700539 for (i = 1; i < argc; i++) {
Junio C Hamano16cee382006-06-05 22:36:21 -0700540 const char *arg = argv[i];
Linus Torvaldsfb18a2e2006-03-26 16:28:20 -0800541
Jeff Kingfc7d47f2016-02-29 06:01:56 -0500542 if (!strcmp(arg, "--local-env-vars")) {
543 int i;
544 for (i = 0; local_repo_env[i]; i++)
545 printf("%s\n", local_repo_env[i]);
546 continue;
547 }
548 if (!strcmp(arg, "--resolve-git-dir")) {
549 const char *gitdir = argv[++i];
550 if (!gitdir)
551 die("--resolve-git-dir requires an argument");
552 gitdir = resolve_gitdir(gitdir);
553 if (!gitdir)
554 die("not a gitdir '%s'", argv[i]);
555 puts(gitdir);
556 continue;
557 }
558
559 /* The rest of the options require a git repository. */
560 if (!did_repo_setup) {
561 prefix = setup_git_directory();
562 git_config(git_default_config, NULL);
563 did_repo_setup = 1;
564 }
565
Nguyễn Thái Ngọc Duy557bd832014-11-30 15:24:31 +0700566 if (!strcmp(arg, "--git-path")) {
567 if (!argv[i + 1])
568 die("--git-path requires an argument");
569 puts(git_path("%s", argv[i + 1]));
570 i++;
571 continue;
572 }
Linus Torvalds178cb242005-06-13 10:06:50 -0700573 if (as_is) {
John Keeping12b9d322013-06-16 15:18:17 +0100574 if (show_file(arg, output_prefix) && as_is < 2)
Matthieu Moy023e37c2012-06-18 20:18:21 +0200575 verify_filename(prefix, arg, 0);
Linus Torvalds178cb242005-06-13 10:06:50 -0700576 continue;
577 }
Eric Wong3af06982006-01-29 16:26:40 -0800578 if (!strcmp(arg,"-n")) {
579 if (++i >= argc)
580 die("-n requires an argument");
581 if ((filter & DO_FLAGS) && (filter & DO_REVS)) {
582 show(arg);
583 show(argv[i]);
584 }
585 continue;
586 }
Christian Couder59556542013-11-30 21:55:40 +0100587 if (starts_with(arg, "-n")) {
Eric Wong3af06982006-01-29 16:26:40 -0800588 if ((filter & DO_FLAGS) && (filter & DO_REVS))
589 show(arg);
590 continue;
591 }
592
Linus Torvalds178cb242005-06-13 10:06:50 -0700593 if (*arg == '-') {
594 if (!strcmp(arg, "--")) {
Linus Torvaldsfb18a2e2006-03-26 16:28:20 -0800595 as_is = 2;
Linus Torvaldsa08b6502005-10-20 17:16:30 -0700596 /* Pass on the "--" if we show anything but files.. */
597 if (filter & (DO_FLAGS | DO_REVS))
John Keeping12b9d322013-06-16 15:18:17 +0100598 show_file(arg, 0);
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700599 continue;
Linus Torvalds178cb242005-06-13 10:06:50 -0700600 }
601 if (!strcmp(arg, "--default")) {
David Sharpa43219f2014-01-28 13:21:00 -0800602 def = argv[++i];
603 if (!def)
604 die("--default requires an argument");
Linus Torvalds178cb242005-06-13 10:06:50 -0700605 continue;
606 }
John Keeping12b9d322013-06-16 15:18:17 +0100607 if (!strcmp(arg, "--prefix")) {
David Sharpa43219f2014-01-28 13:21:00 -0800608 prefix = argv[++i];
609 if (!prefix)
610 die("--prefix requires an argument");
John Keeping12b9d322013-06-16 15:18:17 +0100611 startup_info->prefix = prefix;
612 output_prefix = 1;
John Keeping12b9d322013-06-16 15:18:17 +0100613 continue;
614 }
Linus Torvalds8ebb0182005-06-13 10:21:11 -0700615 if (!strcmp(arg, "--revs-only")) {
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700616 filter &= ~DO_NOREV;
Linus Torvalds8ebb0182005-06-13 10:21:11 -0700617 continue;
618 }
619 if (!strcmp(arg, "--no-revs")) {
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700620 filter &= ~DO_REVS;
Linus Torvalds8ebb0182005-06-13 10:21:11 -0700621 continue;
622 }
Linus Torvaldsf79b65a2005-07-06 10:08:08 -0700623 if (!strcmp(arg, "--flags")) {
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700624 filter &= ~DO_NONFLAGS;
Linus Torvaldsf79b65a2005-07-06 10:08:08 -0700625 continue;
626 }
627 if (!strcmp(arg, "--no-flags")) {
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700628 filter &= ~DO_FLAGS;
Linus Torvaldsf79b65a2005-07-06 10:08:08 -0700629 continue;
630 }
Linus Torvalds023d66e2005-06-24 10:12:55 -0700631 if (!strcmp(arg, "--verify")) {
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700632 filter &= ~(DO_FLAGS|DO_NOREV);
633 verify = 1;
Linus Torvalds023d66e2005-06-24 10:12:55 -0700634 continue;
Linus Torvalds921d8652005-06-13 11:14:20 -0700635 }
Christian Couderb1b35962008-04-26 13:57:23 +0200636 if (!strcmp(arg, "--quiet") || !strcmp(arg, "-q")) {
637 quiet = 1;
David Aguilarc41a87d2014-09-18 20:45:37 -0700638 flags |= GET_SHA1_QUIETLY;
Christian Couderb1b35962008-04-26 13:57:23 +0200639 continue;
640 }
Junio C Hamano62a604b2006-01-26 17:02:07 -0800641 if (!strcmp(arg, "--short") ||
Christian Couder59556542013-11-30 21:55:40 +0100642 starts_with(arg, "--short=")) {
Junio C Hamanod5012502006-01-25 01:35:38 -0800643 filter &= ~(DO_FLAGS|DO_NOREV);
644 verify = 1;
645 abbrev = DEFAULT_ABBREV;
Jonas Fonseca44de0da2006-02-18 02:10:53 +0100646 if (arg[7] == '=')
647 abbrev = strtoul(arg + 8, NULL, 10);
Junio C Hamano1dc4fb82006-01-26 00:48:19 -0800648 if (abbrev < MINIMUM_ABBREV)
649 abbrev = MINIMUM_ABBREV;
650 else if (40 <= abbrev)
651 abbrev = 40;
Junio C Hamanod5012502006-01-25 01:35:38 -0800652 continue;
653 }
Junio C Hamano5bb2c652005-07-22 19:08:32 -0700654 if (!strcmp(arg, "--sq")) {
655 output_sq = 1;
656 continue;
657 }
Linus Torvalds042a4ed2005-06-26 11:34:30 -0700658 if (!strcmp(arg, "--not")) {
659 show_type ^= REVERSED;
660 continue;
661 }
Junio C Hamano30b96fc2005-08-16 12:36:46 -0700662 if (!strcmp(arg, "--symbolic")) {
Junio C Hamanoa6d97d42008-01-05 12:09:55 -0800663 symbolic = SHOW_SYMBOLIC_ASIS;
664 continue;
665 }
666 if (!strcmp(arg, "--symbolic-full-name")) {
667 symbolic = SHOW_SYMBOLIC_FULL;
Junio C Hamano30b96fc2005-08-16 12:36:46 -0700668 continue;
669 }
Christian Couder59556542013-11-30 21:55:40 +0100670 if (starts_with(arg, "--abbrev-ref") &&
Bert Wesarga45d3462009-04-13 13:20:26 +0200671 (!arg[12] || arg[12] == '=')) {
672 abbrev_ref = 1;
673 abbrev_ref_strict = warn_ambiguous_refs;
674 if (arg[12] == '=') {
675 if (!strcmp(arg + 13, "strict"))
676 abbrev_ref_strict = 1;
677 else if (!strcmp(arg + 13, "loose"))
678 abbrev_ref_strict = 0;
679 else
680 die("unknown mode for %s", arg);
681 }
682 continue;
683 }
Linus Torvalds960bba02005-07-03 13:07:52 -0700684 if (!strcmp(arg, "--all")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000685 for_each_ref(show_reference, NULL);
Linus Torvalds960bba02005-07-03 13:07:52 -0700686 continue;
687 }
Christian Couder59556542013-11-30 21:55:40 +0100688 if (starts_with(arg, "--disambiguate=")) {
Junio C Hamano957d7402012-07-03 14:21:59 -0700689 for_each_abbrev(arg + 15, show_abbrev, NULL);
690 continue;
691 }
Linus Torvaldsad3f9a72009-10-27 11:28:07 -0700692 if (!strcmp(arg, "--bisect")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000693 for_each_ref_in("refs/bisect/bad", show_reference, NULL);
694 for_each_ref_in("refs/bisect/good", anti_reference, NULL);
Linus Torvaldsad3f9a72009-10-27 11:28:07 -0700695 continue;
696 }
Christian Couder59556542013-11-30 21:55:40 +0100697 if (starts_with(arg, "--branches=")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000698 for_each_glob_ref_in(show_reference, arg + 11,
699 "refs/heads/", NULL);
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700700 clear_ref_exclusion(&ref_excludes);
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200701 continue;
702 }
Seana62be772006-05-13 21:43:00 -0400703 if (!strcmp(arg, "--branches")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000704 for_each_branch_ref(show_reference, NULL);
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700705 clear_ref_exclusion(&ref_excludes);
Seana62be772006-05-13 21:43:00 -0400706 continue;
707 }
Christian Couder59556542013-11-30 21:55:40 +0100708 if (starts_with(arg, "--tags=")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000709 for_each_glob_ref_in(show_reference, arg + 7,
710 "refs/tags/", NULL);
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700711 clear_ref_exclusion(&ref_excludes);
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200712 continue;
713 }
Seana62be772006-05-13 21:43:00 -0400714 if (!strcmp(arg, "--tags")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000715 for_each_tag_ref(show_reference, NULL);
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700716 clear_ref_exclusion(&ref_excludes);
Seana62be772006-05-13 21:43:00 -0400717 continue;
718 }
Christian Couder59556542013-11-30 21:55:40 +0100719 if (starts_with(arg, "--glob=")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000720 for_each_glob_ref(show_reference, arg + 7, NULL);
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700721 clear_ref_exclusion(&ref_excludes);
Ilari Liusvaarad08bae72010-01-20 11:48:25 +0200722 continue;
723 }
Christian Couder59556542013-11-30 21:55:40 +0100724 if (starts_with(arg, "--remotes=")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000725 for_each_glob_ref_in(show_reference, arg + 10,
726 "refs/remotes/", NULL);
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700727 clear_ref_exclusion(&ref_excludes);
Ilari Liusvaarab09fe972010-01-20 11:48:26 +0200728 continue;
729 }
Seana62be772006-05-13 21:43:00 -0400730 if (!strcmp(arg, "--remotes")) {
Michael Haggertye23b0362015-05-25 18:38:29 +0000731 for_each_remote_ref(show_reference, NULL);
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700732 clear_ref_exclusion(&ref_excludes);
733 continue;
734 }
Junio C Hamanoad704482013-12-17 11:47:35 -0800735 if (starts_with(arg, "--exclude=")) {
Junio C Hamano9dc01bf2013-11-01 12:13:01 -0700736 add_ref_exclusion(&ref_excludes, arg + 10);
Seana62be772006-05-13 21:43:00 -0400737 continue;
738 }
Steven Drake7cceca52010-01-12 11:33:48 +1300739 if (!strcmp(arg, "--show-toplevel")) {
740 const char *work_tree = get_git_work_tree();
741 if (work_tree)
742 puts(work_tree);
743 continue;
744 }
Linus Torvaldsd288a702005-08-16 18:06:34 -0700745 if (!strcmp(arg, "--show-prefix")) {
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700746 if (prefix)
747 puts(prefix);
Ross Lagerwall658219f2012-04-09 15:27:56 +0200748 else
749 putchar('\n');
Linus Torvaldsd288a702005-08-16 18:06:34 -0700750 continue;
751 }
Junio C Hamano5f94c732005-12-22 22:35:38 -0800752 if (!strcmp(arg, "--show-cdup")) {
753 const char *pfx = prefix;
Johannes Schindeline90fdc32007-08-01 01:30:14 +0100754 if (!is_inside_work_tree()) {
755 const char *work_tree =
756 get_git_work_tree();
757 if (work_tree)
758 printf("%s\n", work_tree);
759 continue;
760 }
Junio C Hamano5f94c732005-12-22 22:35:38 -0800761 while (pfx) {
762 pfx = strchr(pfx, '/');
763 if (pfx) {
764 pfx++;
765 printf("../");
766 }
767 }
768 putchar('\n');
769 continue;
770 }
Linus Torvaldsa8783ee2005-09-18 11:18:30 -0700771 if (!strcmp(arg, "--git-dir")) {
772 const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
René Scharfe56b9f6e2014-07-28 20:30:39 +0200773 char *cwd;
Nguyễn Thái Ngọc Duyd06f15d2010-02-14 22:44:42 +0700774 int len;
Linus Torvaldsa8783ee2005-09-18 11:18:30 -0700775 if (gitdir) {
776 puts(gitdir);
777 continue;
778 }
779 if (!prefix) {
780 puts(".git");
781 continue;
782 }
René Scharfe56b9f6e2014-07-28 20:30:39 +0200783 cwd = xgetcwd();
Nguyễn Thái Ngọc Duyd06f15d2010-02-14 22:44:42 +0700784 len = strlen(cwd);
785 printf("%s%s.git\n", cwd, len && cwd[len-1] != '/' ? "/" : "");
René Scharfe56b9f6e2014-07-28 20:30:39 +0200786 free(cwd);
Linus Torvaldsa8783ee2005-09-18 11:18:30 -0700787 continue;
788 }
Nguyễn Thái Ngọc Duy31e26eb2014-11-30 15:24:44 +0700789 if (!strcmp(arg, "--git-common-dir")) {
Nguyễn Thái Ngọc Duy17f13652016-02-12 11:31:45 +0700790 const char *pfx = prefix ? prefix : "";
791 puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir()));
Nguyễn Thái Ngọc Duy31e26eb2014-11-30 15:24:44 +0700792 continue;
793 }
Johannes Schindelin6d9ba672007-01-23 13:30:20 +0100794 if (!strcmp(arg, "--is-inside-git-dir")) {
795 printf("%s\n", is_inside_git_dir() ? "true"
796 : "false");
797 continue;
798 }
Matthias Lederhofer892c41b2007-06-06 09:10:42 +0200799 if (!strcmp(arg, "--is-inside-work-tree")) {
800 printf("%s\n", is_inside_work_tree() ? "true"
801 : "false");
802 continue;
803 }
Matthias Lederhofer493c7742007-06-03 16:46:36 +0200804 if (!strcmp(arg, "--is-bare-repository")) {
805 printf("%s\n", is_bare_repository() ? "true"
806 : "false");
807 continue;
808 }
Nguyễn Thái Ngọc Duya76295d2014-06-13 19:19:46 +0700809 if (!strcmp(arg, "--shared-index-path")) {
810 if (read_cache() < 0)
811 die(_("Could not read the index"));
812 if (the_index.split_index) {
813 const unsigned char *sha1 = the_index.split_index->base_sha1;
814 puts(git_path("sharedindex.%s", sha1_to_hex(sha1)));
815 }
816 continue;
817 }
Christian Couder59556542013-11-30 21:55:40 +0100818 if (starts_with(arg, "--since=")) {
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700819 show_datestring("--max-age=", arg+8);
820 continue;
821 }
Christian Couder59556542013-11-30 21:55:40 +0100822 if (starts_with(arg, "--after=")) {
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700823 show_datestring("--max-age=", arg+8);
824 continue;
825 }
Christian Couder59556542013-11-30 21:55:40 +0100826 if (starts_with(arg, "--before=")) {
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700827 show_datestring("--min-age=", arg+9);
828 continue;
829 }
Christian Couder59556542013-11-30 21:55:40 +0100830 if (starts_with(arg, "--until=")) {
Linus Torvaldsc1babb12005-09-20 14:13:24 -0700831 show_datestring("--min-age=", arg+8);
832 continue;
833 }
Linus Torvalds9523a4c2006-02-05 11:58:34 -0800834 if (show_flag(arg) && verify)
Christian Couderb1b35962008-04-26 13:57:23 +0200835 die_no_single_rev(quiet);
Linus Torvalds178cb242005-06-13 10:06:50 -0700836 continue;
837 }
Junio C Hamano4866ccf2005-08-24 14:30:04 -0700838
839 /* Not a flag argument */
Santi Béjar3dd4e732006-07-04 11:02:22 +0200840 if (try_difference(arg))
841 continue;
Björn Steinbrink2122f8b2008-07-26 18:37:56 +0200842 if (try_parent_shorthands(arg))
843 continue;
Christian Couderdfd1b742008-05-11 18:28:25 +0200844 name = arg;
845 type = NORMAL;
846 if (*arg == '^') {
847 name++;
848 type = REVERSED;
Linus Torvalds800644c2005-06-20 08:29:13 -0700849 }
David Aguilarc41a87d2014-09-18 20:45:37 -0700850 if (!get_sha1_with_context(name, flags, sha1, &unused)) {
Christian Couderdfd1b742008-05-11 18:28:25 +0200851 if (verify)
852 revs_count++;
853 else
854 show_rev(type, sha1, name);
Linus Torvalds800644c2005-06-20 08:29:13 -0700855 continue;
856 }
Christian Couder75ecfce2008-04-26 15:19:29 +0200857 if (verify)
858 die_no_single_rev(quiet);
Jeff King14185672013-12-06 17:05:48 -0500859 if (has_dashdash)
860 die("bad revision '%s'", arg);
Linus Torvalds9ad0a932006-02-05 21:41:47 -0800861 as_is = 1;
John Keeping12b9d322013-06-16 15:18:17 +0100862 if (!show_file(arg, output_prefix))
Linus Torvalds9ad0a932006-02-05 21:41:47 -0800863 continue;
Matthieu Moy023e37c2012-06-18 20:18:21 +0200864 verify_filename(prefix, arg, 1);
Linus Torvalds178cb242005-06-13 10:06:50 -0700865 }
Christian Couderdfd1b742008-05-11 18:28:25 +0200866 if (verify) {
867 if (revs_count == 1) {
868 show_rev(type, sha1, name);
869 return 0;
870 } else if (revs_count == 0 && show_default())
871 return 0;
Christian Couderb1b35962008-04-26 13:57:23 +0200872 die_no_single_rev(quiet);
Christian Couderdfd1b742008-05-11 18:28:25 +0200873 } else
874 show_default();
Linus Torvalds178cb242005-06-13 10:06:50 -0700875 return 0;
876}