summaryrefslogtreecommitdiff
path: root/builtin-describe.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-11-10 20:30:43 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-11-10 20:30:43 (GMT)
commit48cbf915a4738097f291de06e23d293f79ff3f9e (patch)
treeca9b4a0f606900e8536e704508fd318d7514d2f0 /builtin-describe.c
parent25dfd1b925f51a88b00cf0c84c690d448395c30f (diff)
parent9f67d2e8279e1885ef2b4681c19cef8534259783 (diff)
downloadgit-48cbf915a4738097f291de06e23d293f79ff3f9e.zip
git-48cbf915a4738097f291de06e23d293f79ff3f9e.tar.gz
git-48cbf915a4738097f291de06e23d293f79ff3f9e.tar.bz2
Merge branch 'jp/dirty-describe'
* jp/dirty-describe: Teach "git describe" --dirty option
Diffstat (limited to 'builtin-describe.c')
-rw-r--r--builtin-describe.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/builtin-describe.c b/builtin-describe.c
index eaa8a9d..390c14e 100644
--- a/builtin-describe.c
+++ b/builtin-describe.c
@@ -5,12 +5,14 @@
#include "builtin.h"
#include "exec_cmd.h"
#include "parse-options.h"
+#include "diff.h"
#define SEEN (1u<<0)
#define MAX_TAGS (FLAG_BITS - 1)
static const char * const describe_usage[] = {
"git describe [options] <committish>*",
+ "git describe [options] --dirty",
NULL
};
@@ -23,6 +25,13 @@ static int max_candidates = 10;
static int found_names;
static const char *pattern;
static int always;
+static const char *dirty;
+
+/* diff-index command arguments to check if working tree is dirty. */
+static const char *diff_index_args[] = {
+ "diff-index", "--quiet", "HEAD", "--", NULL
+};
+
struct commit_name {
struct tag *tag;
@@ -199,6 +208,8 @@ static void describe(const char *arg, int last_one)
display_name(n);
if (longformat)
show_suffix(0, n->tag ? n->tag->tagged->sha1 : sha1);
+ if (dirty)
+ printf("%s", dirty);
printf("\n");
return;
}
@@ -256,7 +267,10 @@ static void describe(const char *arg, int last_one)
if (!match_cnt) {
const unsigned char *sha1 = cmit->object.sha1;
if (always) {
- printf("%s\n", find_unique_abbrev(sha1, abbrev));
+ printf("%s", find_unique_abbrev(sha1, abbrev));
+ if (dirty)
+ printf("%s", dirty);
+ printf("\n");
return;
}
die("cannot describe '%s'", sha1_to_hex(sha1));
@@ -291,6 +305,8 @@ static void describe(const char *arg, int last_one)
display_name(all_matches[0].name);
if (abbrev)
show_suffix(all_matches[0].depth, cmit->object.sha1);
+ if (dirty)
+ printf("%s", dirty);
printf("\n");
if (!last_one)
@@ -315,6 +331,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
"only consider tags matching <pattern>"),
OPT_BOOLEAN(0, "always", &always,
"show abbreviated commit object as fallback"),
+ {OPTION_STRING, 0, "dirty", &dirty, "mark",
+ "append <mark> on dirty working tree (default: \"-dirty\")",
+ PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"},
OPT_END(),
};
@@ -355,7 +374,11 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
die("No names found, cannot describe anything.");
if (argc == 0) {
+ if (dirty && !cmd_diff_index(ARRAY_SIZE(diff_index_args) - 1, diff_index_args, prefix))
+ dirty = NULL;
describe("HEAD", 1);
+ } else if (dirty) {
+ die("--dirty is incompatible with committishes");
} else {
while (argc-- > 0) {
describe(*argv++, argc == 0);