git-name-rev: add a --(no-)undefined option.
Rework get_rev_name to return NULL rather than "undefined" when a reference is undefined. If --undefined is passed (default), git-name-rev prints "undefined" for the name, else it die()s. Make git-describe use --no-undefined when calling git-name-rev so that --contains behavior matches the standard git-describe one. Signed-off-by: Pierre Habouzit <madcoder@debian.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Pierre Habouzit committed
Dec 24, 2007 at 12:18 UTC
a2cf9f445e9074df1a45f5179cef0d4bb8647dd8
2 files changed
+26
-11
builtin-describe.c
+2
-1
@@ -271,10 +271,11 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
271
save_commit_buffer = 0;
272
273
if (contains) {
274
- const char **args = xmalloc((5 + argc) * sizeof(char*));
274
+ const char **args = xmalloc((6 + argc) * sizeof(char*));
275
int i = 0;
276
args[i++] = "name-rev";
277
args[i++] = "--name-only";
278
+ args[i++] = "--no-undefined";
279
if (!all) {
280
args[i++] = "--tags";
281
if (pattern) {
builtin-name-rev.c
+24
-10
@@ -125,18 +125,18 @@ static int name_ref(const char *path, const unsigned char *sha1, int flags, void
125
}
126
127
/* returns a static buffer */
128
-static const char* get_rev_name(struct object *o)
128
+static const char *get_rev_name(struct object *o)
129
{
130
static char buffer[1024];
131
struct rev_name *n;
132
struct commit *c;
133
134
if (o->type != OBJ_COMMIT)
135
- return "undefined";
135
+ return NULL;
136
c = (struct commit *) o;
137
n = c->util;
138
if (!n)
139
- return "undefined";
139
+ return NULL;
140
141
if (!n->generation)
142
return n->tip_name;
@@ -159,7 +159,7 @@ static char const * const name_rev_usage[] = {
159
int cmd_name_rev(int argc, const char **argv, const char *prefix)
160
{
161
struct object_array revs = { 0, 0, NULL };
162
- int all = 0, transform_stdin = 0;
162
+ int all = 0, transform_stdin = 0, allow_undefined = 1;
163
struct name_ref_data data = { 0, 0, NULL };
164
struct option opts[] = {
165
OPT_BOOLEAN(0, "name-only", &data.name_only, "print only names (no SHA-1)"),
@@ -169,6 +169,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
169
OPT_GROUP(""),
170
OPT_BOOLEAN(0, "all", &all, "list all commits reachable from all refs"),
171
OPT_BOOLEAN(0, "stdin", &transform_stdin, "read from stdin"),
172
+ OPT_BOOLEAN(0, "undefined", &allow_undefined, "allow to print `undefined` names"),
173
OPT_END(),
174
};
175
@@ -226,7 +227,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
227
else if (++forty == 40 &&
228
!ishex(*(p+1))) {
229
unsigned char sha1[40];
229
- const char *name = "undefined";
230
+ const char *name = NULL;
231
char c = *(p+1);
232
233
forty = 0;
@@ -240,11 +241,10 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
241
}
242
*(p+1) = c;
243
243
- if (!strcmp(name, "undefined"))
244
+ if (!name)
245
continue;
246
246
- fwrite(p_start, p - p_start + 1, 1,
247
- stdout);
247
+ fwrite(p_start, p - p_start + 1, 1, stdout);
248
printf(" (%s)", name);
249
p_start = p + 1;
250
}
@@ -260,18 +260,32 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
260
max = get_max_object_index();
261
for (i = 0; i < max; i++) {
262
struct object * obj = get_indexed_object(i);
263
+ const char *name;
264
if (!obj)
265
continue;
266
if (!data.name_only)
267
printf("%s ", sha1_to_hex(obj->sha1));
267
- printf("%s\n", get_rev_name(obj));
268
+ name = get_rev_name(obj);
269
+ if (name)
270
+ printf("%s\n", name);
271
+ else if (allow_undefined)
272
+ printf("undefined\n");
273
+ else
274
+ die("cannot describe '%s'", sha1_to_hex(obj->sha1));
275
}
276
} else {
277
int i;
278
for (i = 0; i < revs.nr; i++) {
279
+ const char *name;
280
if (!data.name_only)
281
printf("%s ", revs.objects[i].name);
274
- printf("%s\n", get_rev_name(revs.objects[i].item));
282
+ name = get_rev_name(revs.objects[i].item);
283
+ if (name)
284
+ printf("%s\n", name);
285
+ else if (allow_undefined)
286
+ printf("undefined\n");
287
+ else
288
+ die("cannot describe '%s'", sha1_to_hex(revs.objects[i].item->sha1));
289
}
290
}
291