Browse Source

Merge branch 'jp/dirty-describe'

* jp/dirty-describe:
  Teach "git describe" --dirty option
maint
Junio C Hamano 15 years ago
parent
commit
48cbf915a4
  1. 6
      Documentation/git-describe.txt
  2. 25
      builtin-describe.c
  3. 14
      t/t6120-describe.sh

6
Documentation/git-describe.txt

@ -9,6 +9,7 @@ git-describe - Show the most recent tag that is reachable from a commit
SYNOPSIS SYNOPSIS
-------- --------
'git describe' [--all] [--tags] [--contains] [--abbrev=<n>] <committish>... 'git describe' [--all] [--tags] [--contains] [--abbrev=<n>] <committish>...
'git describe' [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]


DESCRIPTION DESCRIPTION
----------- -----------
@ -27,6 +28,11 @@ OPTIONS
<committish>...:: <committish>...::
Committish object names to describe. Committish object names to describe.


--dirty[=<mark>]::
Describe the working tree.
It means describe HEAD and appends <mark> (`-dirty` by
default) if the working tree is dirty.

--all:: --all::
Instead of using only the annotated tags, use any ref Instead of using only the annotated tags, use any ref
found in `.git/refs/`. This option enables matching found in `.git/refs/`. This option enables matching

25
builtin-describe.c

@ -5,12 +5,14 @@
#include "builtin.h" #include "builtin.h"
#include "exec_cmd.h" #include "exec_cmd.h"
#include "parse-options.h" #include "parse-options.h"
#include "diff.h"


#define SEEN (1u<<0) #define SEEN (1u<<0)
#define MAX_TAGS (FLAG_BITS - 1) #define MAX_TAGS (FLAG_BITS - 1)


static const char * const describe_usage[] = { static const char * const describe_usage[] = {
"git describe [options] <committish>*", "git describe [options] <committish>*",
"git describe [options] --dirty",
NULL NULL
}; };


@ -23,6 +25,13 @@ static int max_candidates = 10;
static int found_names; static int found_names;
static const char *pattern; static const char *pattern;
static int always; 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 commit_name {
struct tag *tag; struct tag *tag;
@ -199,6 +208,8 @@ static void describe(const char *arg, int last_one)
display_name(n); display_name(n);
if (longformat) if (longformat)
show_suffix(0, n->tag ? n->tag->tagged->sha1 : sha1); show_suffix(0, n->tag ? n->tag->tagged->sha1 : sha1);
if (dirty)
printf("%s", dirty);
printf("\n"); printf("\n");
return; return;
} }
@ -256,7 +267,10 @@ static void describe(const char *arg, int last_one)
if (!match_cnt) { if (!match_cnt) {
const unsigned char *sha1 = cmit->object.sha1; const unsigned char *sha1 = cmit->object.sha1;
if (always) { 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; return;
} }
die("cannot describe '%s'", sha1_to_hex(sha1)); 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); display_name(all_matches[0].name);
if (abbrev) if (abbrev)
show_suffix(all_matches[0].depth, cmit->object.sha1); show_suffix(all_matches[0].depth, cmit->object.sha1);
if (dirty)
printf("%s", dirty);
printf("\n"); printf("\n");


if (!last_one) if (!last_one)
@ -315,6 +331,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
"only consider tags matching <pattern>"), "only consider tags matching <pattern>"),
OPT_BOOLEAN(0, "always", &always, OPT_BOOLEAN(0, "always", &always,
"show abbreviated commit object as fallback"), "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(), OPT_END(),
}; };


@ -355,7 +374,11 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
die("No names found, cannot describe anything."); die("No names found, cannot describe anything.");


if (argc == 0) { if (argc == 0) {
if (dirty && !cmd_diff_index(ARRAY_SIZE(diff_index_args) - 1, diff_index_args, prefix))
dirty = NULL;
describe("HEAD", 1); describe("HEAD", 1);
} else if (dirty) {
die("--dirty is incompatible with committishes");
} else { } else {
while (argc-- > 0) { while (argc-- > 0) {
describe(*argv++, argc == 0); describe(*argv++, argc == 0);

14
t/t6120-describe.sh

@ -125,6 +125,20 @@ test_expect_success 'rename tag Q back to A' '
test_expect_success 'pack tag refs' 'git pack-refs' test_expect_success 'pack tag refs' 'git pack-refs'
check_describe A-* HEAD check_describe A-* HEAD


check_describe "A-*[0-9a-f]" --dirty

test_expect_success 'set-up dirty work tree' '
echo >>file
'

check_describe "A-*[0-9a-f]-dirty" --dirty

check_describe "A-*[0-9a-f].mod" --dirty=.mod

test_expect_success 'describe --dirty HEAD' '
test_must_fail git describe --dirty HEAD
'

test_expect_success 'set-up matching pattern tests' ' test_expect_success 'set-up matching pattern tests' '
git tag -a -m test-annotated test-annotated && git tag -a -m test-annotated test-annotated &&
echo >>file && echo >>file &&

Loading…
Cancel
Save