Allow fast-import frontends to reload the marks table

I'm giving fast-import a lesson on how to reload the marks table
using the same format it outputs with --export-marks.  This way
a frontend can reload the marks table from a prior import, making
incremental imports less painful.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
maint
Shawn O. Pearce 2007-03-07 18:07:26 -05:00
parent 60b9004cdb
commit e8438420bb
3 changed files with 56 additions and 1 deletions

View File

@ -62,7 +62,18 @@ OPTIONS
Dumps the internal marks table to <file> when complete. Dumps the internal marks table to <file> when complete.
Marks are written one per line as `:markid SHA-1`. Marks are written one per line as `:markid SHA-1`.
Frontends can use this file to validate imports after they Frontends can use this file to validate imports after they
have been completed. have been completed, or to save the marks table across
incremental runs. As <file> is only opened and truncated
at checkpoint (or completion) the same path can also be
safely given to \--import-marks.

--import-marks=<file>::
Before processing any input, load the marks specified in
<file>. The input file must exist, must be readable, and
must use the same format as produced by \--export-marks.
Multiple options may be supplied to import more than one
set of marks. If a mark is defined to different values,
the last file wins.


--export-pack-edges=<file>:: --export-pack-edges=<file>::
After creating a packfile, print a line of data to After creating a packfile, print a line of data to

View File

@ -1997,6 +1997,40 @@ static void cmd_checkpoint(void)
read_next_command(); read_next_command();
} }


static void import_marks(const char *input_file)
{
char line[512];
FILE *f = fopen(input_file, "r");
if (!f)
die("cannot read %s: %s", input_file, strerror(errno));
while (fgets(line, sizeof(line), f)) {
uintmax_t mark;
char *end;
unsigned char sha1[20];
struct object_entry *e;

end = strchr(line, '\n');
if (line[0] != ':' || !end)
die("corrupt mark line: %s", line);
*end = 0;
mark = strtoumax(line + 1, &end, 10);
if (!mark || end == line + 1
|| *end != ' ' || get_sha1(end + 1, sha1))
die("corrupt mark line: %s", line);
e = find_object(sha1);
if (!e) {
enum object_type type = sha1_object_info(sha1, NULL);
if (type < 0)
die("object not found: %s", sha1_to_hex(sha1));
e = insert_object(sha1);
e->type = type;
e->pack_id = MAX_PACK_ID;
}
insert_mark(mark, e);
}
fclose(f);
}

static const char fast_import_usage[] = static const char fast_import_usage[] =
"git-fast-import [--date-format=f] [--max-pack-size=n] [--depth=n] [--active-branches=n] [--export-marks=marks.file]"; "git-fast-import [--date-format=f] [--max-pack-size=n] [--depth=n] [--active-branches=n] [--export-marks=marks.file]";


@ -2034,6 +2068,8 @@ int main(int argc, const char **argv)
max_depth = strtoul(a + 8, NULL, 0); max_depth = strtoul(a + 8, NULL, 0);
else if (!prefixcmp(a, "--active-branches=")) else if (!prefixcmp(a, "--active-branches="))
max_active_branches = strtoul(a + 18, NULL, 0); max_active_branches = strtoul(a + 18, NULL, 0);
else if (!prefixcmp(a, "--import-marks="))
import_marks(a + 15);
else if (!prefixcmp(a, "--export-marks=")) else if (!prefixcmp(a, "--export-marks="))
mark_file = a + 15; mark_file = a + 15;
else if (!prefixcmp(a, "--export-pack-edges=")) { else if (!prefixcmp(a, "--export-pack-edges=")) {

View File

@ -111,6 +111,14 @@ test_expect_success \
'A: verify marks output' \ 'A: verify marks output' \
'diff -u expect marks.out' 'diff -u expect marks.out'


test_expect_success \
'A: verify marks import' \
'git-fast-import \
--import-marks=marks.out \
--export-marks=marks.new \
</dev/null &&
diff -u expect marks.new'

### ###
### series B ### series B
### ###