X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-show-ref.c;h=9463ff0e69b15fc0e544259e64960bc942a98368;hb=164b19893ab5bc66b531a26480149a0dff082969;hp=23e0ff8fbfea1ca29e4beb18c95475dd8bdae05b;hpb=9057695012daec51980eed19947a848f93f91503;p=git.git diff --git a/builtin-show-ref.c b/builtin-show-ref.c index 23e0ff8fb..9463ff0e6 100644 --- a/builtin-show-ref.c +++ b/builtin-show-ref.c @@ -4,12 +4,21 @@ #include "tag.h" #include "path-list.h" -static const char show_ref_usage[] = "git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash[=]] [--abbrev[=]] [--tags] [--heads] [--] [pattern*] | --filter-invalid < ref-list"; +static const char show_ref_usage[] = "git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash[=]] [--abbrev[=]] [--tags] [--heads] [--] [pattern*] < ref-list"; static int deref_tags = 0, show_head = 0, tags_only = 0, heads_only = 0, found_match = 0, verify = 0, quiet = 0, hash_only = 0, abbrev = 0; static const char **pattern; +static void show_one(const char *refname, const unsigned char *sha1) +{ + const char *hex = find_unique_abbrev(sha1, abbrev); + if (hash_only) + printf("%s\n", hex); + else + printf("%s %s\n", hex, refname); +} + static int show_ref(const char *refname, const unsigned char *sha1, int flag, void *cbdata) { struct object *obj; @@ -19,8 +28,8 @@ static int show_ref(const char *refname, const unsigned char *sha1, int flag, vo if (tags_only || heads_only) { int match; - match = heads_only && !strncmp(refname, "refs/heads/", 11); - match |= tags_only && !strncmp(refname, "refs/tags/", 10); + match = heads_only && !prefixcmp(refname, "refs/heads/"); + match |= tags_only && !prefixcmp(refname, "refs/tags/"); if (!match) return 0; } @@ -58,11 +67,7 @@ match: if (quiet) return 0; - hex = find_unique_abbrev(sha1, abbrev); - if (hash_only) - printf("%s\n", hex); - else - printf("%s %s\n", hex, refname); + show_one(refname, sha1); if (!deref_tags) return 0; @@ -111,11 +116,12 @@ static int exclude_existing(const char *match) for_each_ref(add_existing, &existing_refs); while (fgets(buf, sizeof(buf), stdin)) { - int len = strlen(buf); char *ref; + int len = strlen(buf); + if (len > 0 && buf[len - 1] == '\n') buf[--len] = '\0'; - if (!strcmp(buf + len - 3, "^{}")) { + if (3 <= len && !strcmp(buf + len - 3, "^{}")) { len -= 3; buf[len] = '\0'; } @@ -172,16 +178,16 @@ int cmd_show_ref(int argc, const char **argv, const char *prefix) hash_only = 1; continue; } - if (!strncmp(arg, "--hash=", 7) || - (!strncmp(arg, "--abbrev", 8) && + if (!prefixcmp(arg, "--hash=") || + (!prefixcmp(arg, "--abbrev") && (arg[8] == '=' || arg[8] == '\0'))) { - if (arg[3] != 'h' && !arg[8]) + if (arg[2] != 'h' && !arg[8]) /* --abbrev only */ abbrev = DEFAULT_ABBREV; else { /* --hash= or --abbrev= */ char *end; - if (arg[3] == 'h') { + if (arg[2] == 'h') { hash_only = 1; arg += 7; } @@ -209,18 +215,22 @@ int cmd_show_ref(int argc, const char **argv, const char *prefix) } if (!strcmp(arg, "--exclude-existing")) return exclude_existing(NULL); - if (!strncmp(arg, "--exclude-existing=", 19)) + if (!prefixcmp(arg, "--exclude-existing=")) return exclude_existing(arg + 19); usage(show_ref_usage); } if (verify) { - unsigned char sha1[20]; - + if (!pattern) + die("--verify requires a reference"); while (*pattern) { - if (resolve_ref(*pattern, sha1, 1, NULL)) - printf("%s %s\n", sha1_to_hex(sha1), - *pattern); + unsigned char sha1[20]; + + if (!prefixcmp(*pattern, "refs/") && + resolve_ref(*pattern, sha1, 1, NULL)) { + if (!quiet) + show_one(*pattern, sha1); + } else if (!quiet) die("'%s' - not a valid ref", *pattern); else