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; |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 23 | |
| 24 | if (argc < 3) |
Thiago Farina | 1f986c4 | 2009-09-17 13:20:53 -0400 | [diff] [blame] | 25 | usage(builtin_bundle_usage); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 26 | |
| 27 | cmd = argv[1]; |
Jeff King | 3b754ee | 2017-03-20 21:31:27 -0400 | [diff] [blame] | 28 | bundle_file = prefix_filename(prefix, argv[2]); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 29 | argc -= 2; |
| 30 | argv += 2; |
| 31 | |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 32 | memset(&header, 0, sizeof(header)); |
Johannes Schindelin | 30415d5 | 2007-09-10 23:03:15 -0400 | [diff] [blame] | 33 | if (strcmp(cmd, "create") && (bundle_fd = |
| 34 | read_bundle_header(bundle_file, &header)) < 0) |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 35 | return 1; |
| 36 | |
| 37 | if (!strcmp(cmd, "verify")) { |
| 38 | close(bundle_fd); |
Patrick Steinhardt | 7886cfa | 2015-05-08 10:02:00 +0200 | [diff] [blame] | 39 | if (argc != 1) { |
| 40 | usage(builtin_bundle_usage); |
| 41 | return 1; |
| 42 | } |
Junio C Hamano | 80e25ce | 2007-03-05 16:17:27 -0800 | [diff] [blame] | 43 | if (verify_bundle(&header, 1)) |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 44 | return 1; |
Ævar Arnfjörð Bjarmason | c7c4efa | 2011-02-22 23:42:20 +0000 | [diff] [blame] | 45 | fprintf(stderr, _("%s is okay\n"), bundle_file); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 46 | return 0; |
| 47 | } |
| 48 | if (!strcmp(cmd, "list-heads")) { |
| 49 | close(bundle_fd); |
Johannes Schindelin | 30415d5 | 2007-09-10 23:03:15 -0400 | [diff] [blame] | 50 | return !!list_bundle_refs(&header, argc, argv); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 51 | } |
| 52 | if (!strcmp(cmd, "create")) { |
Patrick Steinhardt | 7886cfa | 2015-05-08 10:02:00 +0200 | [diff] [blame] | 53 | if (argc < 2) { |
| 54 | usage(builtin_bundle_usage); |
| 55 | return 1; |
| 56 | } |
Nguyễn Thái Ngọc Duy | 2cb6009 | 2010-08-05 22:12:46 -0500 | [diff] [blame] | 57 | if (!startup_info->have_repository) |
Ævar Arnfjörð Bjarmason | c7c4efa | 2011-02-22 23:42:20 +0000 | [diff] [blame] | 58 | die(_("Need a repository to create a bundle.")); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 59 | return !!create_bundle(&header, bundle_file, argc, argv); |
| 60 | } else if (!strcmp(cmd, "unbundle")) { |
Nguyễn Thái Ngọc Duy | 2cb6009 | 2010-08-05 22:12:46 -0500 | [diff] [blame] | 61 | if (!startup_info->have_repository) |
Ævar Arnfjörð Bjarmason | c7c4efa | 2011-02-22 23:42:20 +0000 | [diff] [blame] | 62 | die(_("Need a repository to unbundle.")); |
Junio C Hamano | be042af | 2011-09-18 16:52:32 -0700 | [diff] [blame] | 63 | return !!unbundle(&header, bundle_fd, 0) || |
Johannes Schindelin | 30415d5 | 2007-09-10 23:03:15 -0400 | [diff] [blame] | 64 | list_bundle_refs(&header, argc, argv); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 65 | } else |
Thiago Farina | 1f986c4 | 2009-09-17 13:20:53 -0400 | [diff] [blame] | 66 | usage(builtin_bundle_usage); |
Johannes Schindelin | 2e0afaf | 2007-02-22 01:59:14 +0100 | [diff] [blame] | 67 | } |