mirror of
https://github.com/git/git.git
synced 2024-11-24 10:26:17 +08:00
builtin-name-rev.c: split deeply nested part from the main function
The main function of this command implementation tries to do too many things. Split out a handling of single input line into a separate function to reduce nesting level and clutter. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e124554796
commit
e8b55fab62
@ -176,6 +176,45 @@ 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;
|
||||
|
||||
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 +273,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