Thread-safe xmalloc and xrealloc needs a recursive mutex
[git/dscho.git] / builtin-bundle.c
blob2006cc5cd5cc4d381189f5cf7bdd09fcdd66b9ca
1 #include "builtin.h"
2 #include "cache.h"
3 #include "bundle.h"
5 /*
6  * Basic handler for bundle files to connect repositories via sneakernet.
7  * Invocation must include action.
8  * This function can create a bundle or provide information on an existing
9  * bundle supporting "fetch", "pull", and "ls-remote".
10  */
12 static const char builtin_bundle_usage[] =
13   "git bundle create <file> <git-rev-list args>\n"
14   "   or: git bundle verify <file>\n"
15   "   or: git bundle list-heads <file> [refname...]\n"
16   "   or: git bundle unbundle <file> [refname...]";
18 int cmd_bundle(int argc, const char **argv, const char *prefix)
20         struct bundle_header header;
21         int nongit;
22         const char *cmd, *bundle_file;
23         int bundle_fd = -1;
24         char buffer[PATH_MAX];
26         if (argc < 3)
27                 usage(builtin_bundle_usage);
29         cmd = argv[1];
30         bundle_file = argv[2];
31         argc -= 2;
32         argv += 2;
34         prefix = setup_git_directory_gently(&nongit);
35         if (prefix && bundle_file[0] != '/') {
36                 snprintf(buffer, sizeof(buffer), "%s/%s", prefix, bundle_file);
37                 bundle_file = buffer;
38         }
40         memset(&header, 0, sizeof(header));
41         if (strcmp(cmd, "create") && (bundle_fd =
42                                 read_bundle_header(bundle_file, &header)) < 0)
43                 return 1;
45         if (!strcmp(cmd, "verify")) {
46                 close(bundle_fd);
47                 if (verify_bundle(&header, 1))
48                         return 1;
49                 fprintf(stderr, "%s is okay\n", bundle_file);
50                 return 0;
51         }
52         if (!strcmp(cmd, "list-heads")) {
53                 close(bundle_fd);
54                 return !!list_bundle_refs(&header, argc, argv);
55         }
56         if (!strcmp(cmd, "create")) {
57                 if (nongit)
58                         die("Need a repository to create a bundle.");
59                 return !!create_bundle(&header, bundle_file, argc, argv);
60         } else if (!strcmp(cmd, "unbundle")) {
61                 if (nongit)
62                         die("Need a repository to unbundle.");
63                 return !!unbundle(&header, bundle_fd) ||
64                         list_bundle_refs(&header, argc, argv);
65         } else
66                 usage(builtin_bundle_usage);