]>
Commit | Line | Data |
---|---|---|
baffc0e7 | 1 | #include "builtin.h" |
2e0afafe | 2 | #include "cache.h" |
30415d50 | 3 | #include "bundle.h" |
2e0afafe JS |
4 | |
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 | |
34baebce | 9 | * bundle supporting "fetch", "pull", and "ls-remote". |
2e0afafe JS |
10 | */ |
11 | ||
1f986c4a TF |
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...]"; | |
2e0afafe | 17 | |
2e0afafe JS |
18 | int cmd_bundle(int argc, const char **argv, const char *prefix) |
19 | { | |
20 | struct bundle_header header; | |
af05d679 | 21 | int nongit; |
2e0afafe JS |
22 | const char *cmd, *bundle_file; |
23 | int bundle_fd = -1; | |
24 | char buffer[PATH_MAX]; | |
25 | ||
26 | if (argc < 3) | |
1f986c4a | 27 | usage(builtin_bundle_usage); |
2e0afafe JS |
28 | |
29 | cmd = argv[1]; | |
30 | bundle_file = argv[2]; | |
31 | argc -= 2; | |
32 | argv += 2; | |
33 | ||
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 | } | |
39 | ||
40 | memset(&header, 0, sizeof(header)); | |
30415d50 JS |
41 | if (strcmp(cmd, "create") && (bundle_fd = |
42 | read_bundle_header(bundle_file, &header)) < 0) | |
2e0afafe JS |
43 | return 1; |
44 | ||
45 | if (!strcmp(cmd, "verify")) { | |
46 | close(bundle_fd); | |
80e25cee | 47 | if (verify_bundle(&header, 1)) |
2e0afafe JS |
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); | |
30415d50 | 54 | return !!list_bundle_refs(&header, argc, argv); |
2e0afafe JS |
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."); | |
30415d50 JS |
63 | return !!unbundle(&header, bundle_fd) || |
64 | list_bundle_refs(&header, argc, argv); | |
2e0afafe | 65 | } else |
1f986c4a | 66 | usage(builtin_bundle_usage); |
2e0afafe | 67 | } |