blob: 7d39d9bcd178a65686d6757f8a89065d25f55b23 [file] [log] [blame]
Rene Scharfe2e3ed672006-08-10 17:02:38 +02001#include "builtin.h"
Junio C Hamanof9253392005-06-29 02:51:27 -07002#include "cache.h"
3#include "pack.h"
4
Rene Scharfeae9c86f2006-08-10 17:02:32 +02005static int verify_one_pack(const char *path, int verbose)
Junio C Hamanof9253392005-06-29 02:51:27 -07006{
Rene Scharfeae9c86f2006-08-10 17:02:32 +02007 char arg[PATH_MAX];
8 int len;
Rene Scharfed0d619c2006-08-10 17:02:35 +02009 struct packed_git *pack;
10 int err;
Rene Scharfeae9c86f2006-08-10 17:02:32 +020011
12 len = strlcpy(arg, path, PATH_MAX);
13 if (len >= PATH_MAX)
14 return error("name too long: %s", path);
15
Rene Scharfefc5fc502006-08-10 17:02:34 +020016 /*
17 * In addition to "foo.idx" we accept "foo.pack" and "foo";
18 * normalize these forms to "foo.idx" for add_packed_git().
19 */
Rene Scharfe5bb1cda2006-08-11 14:01:45 +020020 if (has_extension(arg, ".pack")) {
Rene Scharfefc5fc502006-08-10 17:02:34 +020021 strcpy(arg + len - 5, ".idx");
22 len--;
Rene Scharfe5bb1cda2006-08-11 14:01:45 +020023 } else if (!has_extension(arg, ".idx")) {
Rene Scharfefc5fc502006-08-10 17:02:34 +020024 if (len + 4 >= PATH_MAX)
25 return error("name too long: %s.idx", arg);
26 strcpy(arg + len, ".idx");
27 len += 4;
Junio C Hamanof3bf9222005-06-30 17:15:39 -070028 }
Rene Scharfefc5fc502006-08-10 17:02:34 +020029
Rene Scharfef711ab52006-08-10 17:02:36 +020030 /*
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
Rene Scharfed0d619c2006-08-10 17:02:35 +020039 pack = add_packed_git(arg, len, 1);
40 if (!pack)
Rene Scharfefc5fc502006-08-10 17:02:34 +020041 return error("packfile %s not found.", arg);
42
Rene Scharfed0d619c2006-08-10 17:02:35 +020043 err = verify_pack(pack, verbose);
44 free(pack);
45
46 return err;
Junio C Hamanof9253392005-06-29 02:51:27 -070047}
48
Petr Baudis4d1f1192005-07-29 11:01:26 +020049static const char verify_pack_usage[] = "git-verify-pack [-v] <pack>...";
Junio C Hamanof3bf9222005-06-30 17:15:39 -070050
Rene Scharfe2e3ed672006-08-10 17:02:38 +020051int cmd_verify_pack(int argc, const char **argv, const char *prefix)
Junio C Hamanof9253392005-06-29 02:51:27 -070052{
Rene Scharfe0eaf22f2006-08-10 17:02:37 +020053 int err = 0;
Junio C Hamanof3bf9222005-06-30 17:15:39 -070054 int verbose = 0;
55 int no_more_options = 0;
Rene Scharfe6f05b572006-08-10 17:02:31 +020056 int nothing_done = 1;
Junio C Hamanof9253392005-06-29 02:51:27 -070057
Rene Scharfe2e3ed672006-08-10 17:02:38 +020058 while (1 < argc) {
59 if (!no_more_options && argv[1][0] == '-') {
60 if (!strcmp("-v", argv[1]))
Junio C Hamanof3bf9222005-06-30 17:15:39 -070061 verbose = 1;
Rene Scharfe2e3ed672006-08-10 17:02:38 +020062 else if (!strcmp("--", argv[1]))
Junio C Hamanof3bf9222005-06-30 17:15:39 -070063 no_more_options = 1;
64 else
65 usage(verify_pack_usage);
66 }
67 else {
Rene Scharfe2e3ed672006-08-10 17:02:38 +020068 if (verify_one_pack(argv[1], verbose))
Rene Scharfe0eaf22f2006-08-10 17:02:37 +020069 err = 1;
Rene Scharfe6f05b572006-08-10 17:02:31 +020070 nothing_done = 0;
Junio C Hamanof3bf9222005-06-30 17:15:39 -070071 }
Rene Scharfe2e3ed672006-08-10 17:02:38 +020072 argc--; argv++;
Junio C Hamanof9253392005-06-29 02:51:27 -070073 }
Rene Scharfe6f05b572006-08-10 17:02:31 +020074
75 if (nothing_done)
76 usage(verify_pack_usage);
77
Rene Scharfe0eaf22f2006-08-10 17:02:37 +020078 return err;
Junio C Hamanof9253392005-06-29 02:51:27 -070079}