@matheusbsbs / matheus-bagliano / commits / a2cf9f445e
Fork 0

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