Merge branch 'maint'
* maint: git-name-rev: allow --name-only in combination with --stdin builtin-name-rev.c: split deeply nested part from the main function Conflicts: Documentation/git-name-rev.txt
This commit is contained in:
commit
372c767610
@ -38,8 +38,7 @@ OPTIONS
|
||||
Instead of printing both the SHA-1 and the name, print only
|
||||
the name. If given with --tags the usual tag prefix of
|
||||
"tags/" is also omitted from the name, matching the output
|
||||
of 'git-describe' more closely. This option
|
||||
cannot be combined with --stdin.
|
||||
of `git-describe` more closely.
|
||||
|
||||
--no-undefined::
|
||||
Die with error code != 0 when a reference is undefined,
|
||||
|
@ -176,6 +176,50 @@ static char const * const name_rev_usage[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static void name_rev_line(char *p, struct name_ref_data *data)
|
||||
{
|
||||
int forty = 0;
|
||||
char *p_start;
|
||||
for (p_start = p; *p; p++) {
|
||||
#define ishex(x) (isdigit((x)) || ((x) >= 'a' && (x) <= 'f'))
|
||||
if (!ishex(*p))
|
||||
forty = 0;
|
||||
else if (++forty == 40 &&
|
||||
!ishex(*(p+1))) {
|
||||
unsigned char sha1[40];
|
||||
const char *name = NULL;
|
||||
char c = *(p+1);
|
||||
|
||||
forty = 0;
|
||||
|
||||
*(p+1) = 0;
|
||||
if (!get_sha1(p - 39, sha1)) {
|
||||
struct object *o =
|
||||
lookup_object(sha1);
|
||||
if (o)
|
||||
name = get_rev_name(o);
|
||||
}
|
||||
*(p+1) = c;
|
||||
|
||||
if (!name)
|
||||
continue;
|
||||
|
||||
if (data->name_only) {
|
||||
fwrite(p_start, p - p_start + 1 - 40, 1, stdout);
|
||||
printf(name);
|
||||
} else {
|
||||
fwrite(p_start, p - p_start + 1, 1, stdout);
|
||||
printf(" (%s)", name);
|
||||
}
|
||||
p_start = p + 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* flush */
|
||||
if (p_start != p)
|
||||
fwrite(p_start, p - p_start, 1, stdout);
|
||||
}
|
||||
|
||||
int cmd_name_rev(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct object_array revs = { 0, 0, NULL };
|
||||
@ -234,47 +278,12 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
|
||||
|
||||
if (transform_stdin) {
|
||||
char buffer[2048];
|
||||
char *p, *p_start;
|
||||
|
||||
while (!feof(stdin)) {
|
||||
int forty = 0;
|
||||
p = fgets(buffer, sizeof(buffer), stdin);
|
||||
char *p = fgets(buffer, sizeof(buffer), stdin);
|
||||
if (!p)
|
||||
break;
|
||||
|
||||
for (p_start = p; *p; p++) {
|
||||
#define ishex(x) (isdigit((x)) || ((x) >= 'a' && (x) <= 'f'))
|
||||
if (!ishex(*p))
|
||||
forty = 0;
|
||||
else if (++forty == 40 &&
|
||||
!ishex(*(p+1))) {
|
||||
unsigned char sha1[40];
|
||||
const char *name = NULL;
|
||||
char c = *(p+1);
|
||||
|
||||
forty = 0;
|
||||
|
||||
*(p+1) = 0;
|
||||
if (!get_sha1(p - 39, sha1)) {
|
||||
struct object *o =
|
||||
lookup_object(sha1);
|
||||
if (o)
|
||||
name = get_rev_name(o);
|
||||
}
|
||||
*(p+1) = c;
|
||||
|
||||
if (!name)
|
||||
continue;
|
||||
|
||||
fwrite(p_start, p - p_start + 1, 1, stdout);
|
||||
printf(" (%s)", name);
|
||||
p_start = p + 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* flush */
|
||||
if (p_start != p)
|
||||
fwrite(p_start, p - p_start, 1, stdout);
|
||||
name_rev_line(p, &data);
|
||||
}
|
||||
} else if (all) {
|
||||
int i, max;
|
||||
|
Loading…
Reference in New Issue
Block a user