Peter Hagervall | baffc0e | 2007-07-15 01:14:45 +0200 | [diff] [blame] | 1 | #include "builtin.h" |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 2 | #include "cache.h" |
Johannes Schindelin | 30415d5 | 2007-09-10 23:03:15 -0400 | [diff] [blame] | 3 | #include "bundle.h" |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 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 |
Heikki Orsila | 34baebc | 2008-08-30 14:12:53 +0300 | [diff] [blame] | 9 | * bundle supporting "fetch", "pull", and "ls-remote". |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 10 | */ |
| 11 | |
Thiago Farina | 1f986c4 | 2009-09-17 13:20:53 -0400 | [diff] [blame] | 12 | static const char builtin_bundle_usage[] = |
| 13 | "git bundle create <file> <git-rev-list args>\n" |
| 14 | " or: git bundle verify <file>\n" |
Štěpán Němec | 62b4698 | 2010-10-08 19:31:15 +0200 | [diff] [blame] | 15 | " or: git bundle list-heads <file> [<refname>...]\n" |
| 16 | " or: git bundle unbundle <file> [<refname>...]"; |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 17 | |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 18 | int cmd_bundle(int argc, const char **argv, const char *prefix) |
| 19 | { |
| 20 | struct bundle_header header; |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 21 | const char *cmd, *bundle_file; |
| 22 | int bundle_fd = -1; |
| 23 | char buffer[PATH_MAX]; |
| 24 | |
| 25 | if (argc < 3) |
Thiago Farina | 1f986c4 | 2009-09-17 13:20:53 -0400 | [diff] [blame] | 26 | usage(builtin_bundle_usage); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 27 | |
| 28 | cmd = argv[1]; |
| 29 | bundle_file = argv[2]; |
| 30 | argc -= 2; |
| 31 | argv += 2; |
| 32 | |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 33 | if (prefix && bundle_file[0] != '/') { |
| 34 | snprintf(buffer, sizeof(buffer), "%s/%s", prefix, bundle_file); |
| 35 | bundle_file = buffer; |
| 36 | } |
| 37 | |
| 38 | memset(&header, 0, sizeof(header)); |
Johannes Schindelin | 30415d5 | 2007-09-10 23:03:15 -0400 | [diff] [blame] | 39 | if (strcmp(cmd, "create") && (bundle_fd = |
| 40 | read_bundle_header(bundle_file, &header)) < 0) |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 41 | return 1; |
| 42 | |
| 43 | if (!strcmp(cmd, "verify")) { |
| 44 | close(bundle_fd); |
Junio C Hamano | 80e25ce | 2007-03-05 16:17:27 -0800 | [diff] [blame] | 45 | if (verify_bundle(&header, 1)) |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 46 | return 1; |
Ævar Arnfjörð Bjarmason | c7c4efa | 2011-02-22 23:42:20 +0000 | [diff] [blame] | 47 | fprintf(stderr, _("%s is okay\n"), bundle_file); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 48 | return 0; |
| 49 | } |
| 50 | if (!strcmp(cmd, "list-heads")) { |
| 51 | close(bundle_fd); |
Johannes Schindelin | 30415d5 | 2007-09-10 23:03:15 -0400 | [diff] [blame] | 52 | return !!list_bundle_refs(&header, argc, argv); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 53 | } |
| 54 | if (!strcmp(cmd, "create")) { |
Nguyễn Thái Ngọc Duy | 2cb6009 | 2010-08-05 22:12:46 -0500 | [diff] [blame] | 55 | if (!startup_info->have_repository) |
Ævar Arnfjörð Bjarmason | c7c4efa | 2011-02-22 23:42:20 +0000 | [diff] [blame] | 56 | die(_("Need a repository to create a bundle.")); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 57 | return !!create_bundle(&header, bundle_file, argc, argv); |
| 58 | } else if (!strcmp(cmd, "unbundle")) { |
Nguyễn Thái Ngọc Duy | 2cb6009 | 2010-08-05 22:12:46 -0500 | [diff] [blame] | 59 | if (!startup_info->have_repository) |
Ævar Arnfjörð Bjarmason | c7c4efa | 2011-02-22 23:42:20 +0000 | [diff] [blame] | 60 | die(_("Need a repository to unbundle.")); |
Junio C Hamano | be042af | 2011-09-18 16:52:32 -0700 | [diff] [blame] | 61 | return !!unbundle(&header, bundle_fd, 0) || |
Johannes Schindelin | 30415d5 | 2007-09-10 23:03:15 -0400 | [diff] [blame] | 62 | list_bundle_refs(&header, argc, argv); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 63 | } else |
Thiago Farina | 1f986c4 | 2009-09-17 13:20:53 -0400 | [diff] [blame] | 64 | usage(builtin_bundle_usage); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 65 | } |