diff options
-rw-r--r-- | Documentation/git-fast-import.txt | 9 | ||||
-rw-r--r-- | fast-import.c | 35 | ||||
-rwxr-xr-x | t/t9300-fast-import.sh | 26 |
3 files changed, 59 insertions, 11 deletions
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index 2a5052072a..843faf79c6 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -64,6 +64,15 @@ OPTIONS Frontends can use this file to validate imports after they have been completed. +--export-pack-edges=<file>:: + After creating a packfile, print a line of data to + <file> listing the filename of the packfile and the last + commit on each branch that was written to that packfile. + This information may be useful after importing projects + whose total object set exceeds the 4 GiB packfile limit, + as these commits can be used as edge points during calls + to gitlink:git-pack-objects[1]. + --quiet:: Disable all non-fatal output, making fast-import silent when it is successful. This option disables the output shown by diff --git a/fast-import.c b/fast-import.c index 3f4e73f821..f9cfc72637 100644 --- a/fast-import.c +++ b/fast-import.c @@ -261,6 +261,7 @@ static unsigned long object_count; static unsigned long branch_count; static unsigned long branch_load_count; static int failure; +static FILE *pack_edges; /* Memory pools */ static size_t mem_pool_alloc = 2*1024*1024 - sizeof(struct mem_pool); @@ -811,18 +812,21 @@ static void end_packfile(void) install_packed_git(new_p); /* Print the boundary */ - fprintf(stdout, "%s:", new_p->pack_name); - for (i = 0; i < branch_table_sz; i++) { - for (b = branch_table[i]; b; b = b->table_next_branch) { - if (b->pack_id == pack_id) - fprintf(stdout, " %s", sha1_to_hex(b->sha1)); + if (pack_edges) { + fprintf(pack_edges, "%s:", new_p->pack_name); + for (i = 0; i < branch_table_sz; i++) { + for (b = branch_table[i]; b; b = b->table_next_branch) { + if (b->pack_id == pack_id) + fprintf(pack_edges, " %s", sha1_to_hex(b->sha1)); + } } + for (t = first_tag; t; t = t->next_tag) { + if (t->pack_id == pack_id) + fprintf(pack_edges, " %s", sha1_to_hex(t->sha1)); + } + fputc('\n', pack_edges); + fflush(pack_edges); } - for (t = first_tag; t; t = t->next_tag) { - if (t->pack_id == pack_id) - fprintf(stdout, " %s", sha1_to_hex(t->sha1)); - } - fputc('\n', stdout); pack_id++; } @@ -1988,7 +1992,13 @@ int main(int argc, const char **argv) max_active_branches = strtoul(a + 18, NULL, 0); else if (!strncmp(a, "--export-marks=", 15)) mark_file = a + 15; - else if (!strcmp(a, "--force")) + else if (!strncmp(a, "--export-pack-edges=", 20)) { + if (pack_edges) + fclose(pack_edges); + pack_edges = fopen(a + 20, "a"); + if (!pack_edges) + die("Cannot open %s: %s", a + 20, strerror(errno)); + } else if (!strcmp(a, "--force")) force_update = 1; else if (!strcmp(a, "--quiet")) show_stats = 0; @@ -2033,6 +2043,9 @@ int main(int argc, const char **argv) unkeep_all_packs(); dump_marks(); + if (pack_edges) + fclose(pack_edges); + if (show_stats) { uintmax_t total_count = 0, duplicate_count = 0; for (i = 0; i < ARRAY_SIZE(object_count_by_type); i++) diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 357a8724dd..8d28211294 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -407,4 +407,30 @@ test_expect_success \ 'git-cat-file blob H:h/e/l/lo >actual && diff -u expect actual' +### +### series I +### + +cat >input <<INPUT_END +commit refs/heads/export-boundary +committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE +data <<COMMIT +we have a border. its only 40 characters wide. +COMMIT + +from refs/heads/branch + +INPUT_END +test_expect_success \ + 'I: export-pack-edges' \ + 'git-fast-import --export-pack-edges=edges.list <input' + +cat >expect <<EOF +.git/objects/pack/pack-.pack: `git-rev-parse --verify export-boundary` +EOF +test_expect_success \ + 'I: verify edge list' \ + 'sed -e s/pack-.*pack/pack-.pack/ edges.list >actual && + diff -u expect actual' + test_done |