builtin / verify-pack.con commit Merge branch 'jc/maint-blame-minimal' (9d76db4)
   1#include "builtin.h"
   2#include "cache.h"
   3#include "run-command.h"
   4#include "parse-options.h"
   5
   6#define VERIFY_PACK_VERBOSE 01
   7#define VERIFY_PACK_STAT_ONLY 02
   8
   9static int verify_one_pack(const char *path, unsigned int flags)
  10{
  11        struct child_process index_pack;
  12        const char *argv[] = {"index-pack", NULL, NULL, NULL };
  13        struct strbuf arg = STRBUF_INIT;
  14        int verbose = flags & VERIFY_PACK_VERBOSE;
  15        int stat_only = flags & VERIFY_PACK_STAT_ONLY;
  16        int err;
  17
  18        if (stat_only)
  19                argv[1] = "--verify-stat-only";
  20        else if (verbose)
  21                argv[1] = "--verify-stat";
  22        else
  23                argv[1] = "--verify";
  24
  25        /*
  26         * In addition to "foo.pack" we accept "foo.idx" and "foo";
  27         * normalize these forms to "foo.pack" for "index-pack --verify".
  28         */
  29        strbuf_addstr(&arg, path);
  30        if (has_extension(arg.buf, ".idx"))
  31                strbuf_splice(&arg, arg.len - 3, 3, "pack", 4);
  32        else if (!has_extension(arg.buf, ".pack"))
  33                strbuf_add(&arg, ".pack", 5);
  34        argv[2] = arg.buf;
  35
  36        memset(&index_pack, 0, sizeof(index_pack));
  37        index_pack.argv = argv;
  38        index_pack.git_cmd = 1;
  39
  40        err = run_command(&index_pack);
  41
  42        if (verbose || stat_only) {
  43                if (err)
  44                        printf("%s: bad\n", arg.buf);
  45                else {
  46                        if (!stat_only)
  47                                printf("%s: ok\n", arg.buf);
  48                }
  49        }
  50        strbuf_release(&arg);
  51
  52        return err;
  53}
  54
  55static const char * const verify_pack_usage[] = {
  56        "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>...",
  57        NULL
  58};
  59
  60int cmd_verify_pack(int argc, const char **argv, const char *prefix)
  61{
  62        int err = 0;
  63        unsigned int flags = 0;
  64        int i;
  65        const struct option verify_pack_options[] = {
  66                OPT_BIT('v', "verbose", &flags, "verbose",
  67                        VERIFY_PACK_VERBOSE),
  68                OPT_BIT('s', "stat-only", &flags, "show statistics only",
  69                        VERIFY_PACK_STAT_ONLY),
  70                OPT_END()
  71        };
  72
  73        git_config(git_default_config, NULL);
  74        argc = parse_options(argc, argv, prefix, verify_pack_options,
  75                             verify_pack_usage, 0);
  76        if (argc < 1)
  77                usage_with_options(verify_pack_usage, verify_pack_options);
  78        for (i = 0; i < argc; i++) {
  79                if (verify_one_pack(argv[i], flags))
  80                        err = 1;
  81        }
  82
  83        return err;
  84}