builtin-verify-pack.con commit Add test cases for git-am (d3a7b8f)
   1#include "builtin.h"
   2#include "cache.h"
   3#include "pack.h"
   4
   5static int verify_one_pack(const char *path, int verbose)
   6{
   7        char arg[PATH_MAX];
   8        int len;
   9        struct packed_git *pack;
  10        int err;
  11
  12        len = strlcpy(arg, path, PATH_MAX);
  13        if (len >= PATH_MAX)
  14                return error("name too long: %s", path);
  15
  16        /*
  17         * In addition to "foo.idx" we accept "foo.pack" and "foo";
  18         * normalize these forms to "foo.idx" for add_packed_git().
  19         */
  20        if (has_extension(arg, ".pack")) {
  21                strcpy(arg + len - 5, ".idx");
  22                len--;
  23        } else if (!has_extension(arg, ".idx")) {
  24                if (len + 4 >= PATH_MAX)
  25                        return error("name too long: %s.idx", arg);
  26                strcpy(arg + len, ".idx");
  27                len += 4;
  28        }
  29
  30        /*
  31         * add_packed_git() uses our buffer (containing "foo.idx") to
  32         * build the pack filename ("foo.pack").  Make sure it fits.
  33         */
  34        if (len + 1 >= PATH_MAX) {
  35                arg[len - 4] = '\0';
  36                return error("name too long: %s.pack", arg);
  37        }
  38
  39        pack = add_packed_git(arg, len, 1);
  40        if (!pack)
  41                return error("packfile %s not found.", arg);
  42
  43        install_packed_git(pack);
  44        err = verify_pack(pack, verbose);
  45
  46        return err;
  47}
  48
  49static const char verify_pack_usage[] = "git-verify-pack [-v] <pack>...";
  50
  51int cmd_verify_pack(int argc, const char **argv, const char *prefix)
  52{
  53        int err = 0;
  54        int verbose = 0;
  55        int no_more_options = 0;
  56        int nothing_done = 1;
  57
  58        git_config(git_default_config, NULL);
  59        while (1 < argc) {
  60                if (!no_more_options && argv[1][0] == '-') {
  61                        if (!strcmp("-v", argv[1]))
  62                                verbose = 1;
  63                        else if (!strcmp("--", argv[1]))
  64                                no_more_options = 1;
  65                        else
  66                                usage(verify_pack_usage);
  67                }
  68                else {
  69                        if (verify_one_pack(argv[1], verbose))
  70                                err = 1;
  71                        nothing_done = 0;
  72                }
  73                argc--; argv++;
  74        }
  75
  76        if (nothing_done)
  77                usage(verify_pack_usage);
  78
  79        return err;
  80}