builtin / verify-pack.con commit name-rev: add support to exclude refs by pattern match (96415b4)
   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 = CHILD_PROCESS_INIT;
  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 (strbuf_strip_suffix(&arg, ".idx") ||
  31            !ends_with(arg.buf, ".pack"))
  32                strbuf_addstr(&arg, ".pack");
  33        argv[2] = arg.buf;
  34
  35        index_pack.argv = argv;
  36        index_pack.git_cmd = 1;
  37
  38        err = run_command(&index_pack);
  39
  40        if (verbose || stat_only) {
  41                if (err)
  42                        printf("%s: bad\n", arg.buf);
  43                else {
  44                        if (!stat_only)
  45                                printf("%s: ok\n", arg.buf);
  46                }
  47        }
  48        strbuf_release(&arg);
  49
  50        return err;
  51}
  52
  53static const char * const verify_pack_usage[] = {
  54        N_("git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."),
  55        NULL
  56};
  57
  58int cmd_verify_pack(int argc, const char **argv, const char *prefix)
  59{
  60        int err = 0;
  61        unsigned int flags = 0;
  62        int i;
  63        const struct option verify_pack_options[] = {
  64                OPT_BIT('v', "verbose", &flags, N_("verbose"),
  65                        VERIFY_PACK_VERBOSE),
  66                OPT_BIT('s', "stat-only", &flags, N_("show statistics only"),
  67                        VERIFY_PACK_STAT_ONLY),
  68                OPT_END()
  69        };
  70
  71        git_config(git_default_config, NULL);
  72        argc = parse_options(argc, argv, prefix, verify_pack_options,
  73                             verify_pack_usage, 0);
  74        if (argc < 1)
  75                usage_with_options(verify_pack_usage, verify_pack_options);
  76        for (i = 0; i < argc; i++) {
  77                if (verify_one_pack(argv[i], flags))
  78                        err = 1;
  79        }
  80
  81        return err;
  82}