|  | /* | 
|  | * GIT - The information manager from hell | 
|  | */ | 
|  |  | 
|  | #include "cache.h" | 
|  | #include "refs.h" | 
|  | #include "builtin.h" | 
|  | #include "strbuf.h" | 
|  |  | 
|  | static const char builtin_check_ref_format_usage[] = | 
|  | "git check-ref-format [--normalize] [options] <refname>\n" | 
|  | "   or: git check-ref-format --branch <branchname-shorthand>"; | 
|  |  | 
|  | /* | 
|  | * Return a copy of refname but with leading slashes removed and runs | 
|  | * of adjacent slashes replaced with single slashes. | 
|  | * | 
|  | * This function is similar to normalize_path_copy(), but stripped down | 
|  | * to meet check_ref_format's simpler needs. | 
|  | */ | 
|  | static char *collapse_slashes(const char *refname) | 
|  | { | 
|  | char *ret = xmalloc(strlen(refname) + 1); | 
|  | char ch; | 
|  | char prev = '/'; | 
|  | char *cp = ret; | 
|  |  | 
|  | while ((ch = *refname++) != '\0') { | 
|  | if (prev == '/' && ch == prev) | 
|  | continue; | 
|  |  | 
|  | *cp++ = ch; | 
|  | prev = ch; | 
|  | } | 
|  | *cp = '\0'; | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | static int check_ref_format_branch(const char *arg) | 
|  | { | 
|  | struct strbuf sb = STRBUF_INIT; | 
|  | int nongit; | 
|  |  | 
|  | setup_git_directory_gently(&nongit); | 
|  | if (strbuf_check_branch_ref(&sb, arg)) | 
|  | die("'%s' is not a valid branch name", arg); | 
|  | printf("%s\n", sb.buf + 11); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int cmd_check_ref_format(int argc, const char **argv, const char *prefix) | 
|  | { | 
|  | int i; | 
|  | int normalize = 0; | 
|  | int flags = 0; | 
|  | const char *refname; | 
|  |  | 
|  | if (argc == 2 && !strcmp(argv[1], "-h")) | 
|  | usage(builtin_check_ref_format_usage); | 
|  |  | 
|  | if (argc == 3 && !strcmp(argv[1], "--branch")) | 
|  | return check_ref_format_branch(argv[2]); | 
|  |  | 
|  | for (i = 1; i < argc && argv[i][0] == '-'; i++) { | 
|  | if (!strcmp(argv[i], "--normalize") || !strcmp(argv[i], "--print")) | 
|  | normalize = 1; | 
|  | else if (!strcmp(argv[i], "--allow-onelevel")) | 
|  | flags |= REFNAME_ALLOW_ONELEVEL; | 
|  | else if (!strcmp(argv[i], "--no-allow-onelevel")) | 
|  | flags &= ~REFNAME_ALLOW_ONELEVEL; | 
|  | else if (!strcmp(argv[i], "--refspec-pattern")) | 
|  | flags |= REFNAME_REFSPEC_PATTERN; | 
|  | else | 
|  | usage(builtin_check_ref_format_usage); | 
|  | } | 
|  | if (! (i == argc - 1)) | 
|  | usage(builtin_check_ref_format_usage); | 
|  |  | 
|  | refname = argv[i]; | 
|  | if (normalize) | 
|  | refname = collapse_slashes(refname); | 
|  | if (check_refname_format(refname, flags)) | 
|  | return 1; | 
|  | if (normalize) | 
|  | printf("%s\n", refname); | 
|  |  | 
|  | return 0; | 
|  | } |