Browse Source

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 18 years ago
parent
commit
e8438420bb
  1. 13
      Documentation/git-fast-import.txt
  2. 36
      fast-import.c
  3. 8
      t/t9300-fast-import.sh

13
Documentation/git-fast-import.txt

@ -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

36
fast-import.c

@ -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=")) {

8
t/t9300-fast-import.sh

@ -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
### ###

Loading…
Cancel
Save