diff options
author | Josh Micich <josh.micich@gmail.com> | 2009-05-14 12:51:15 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-05-16 10:28:59 -0700 |
commit | f1cf2d8b1467b5973f249703b31e709eaede97ad (patch) | |
tree | dd7ea63492ebacded988b6cdb2c1cd6800852029 /builtin-mktree.c | |
parent | e01662bb5da721d65226f4b173858ea3bf0bde30 (diff) | |
download | git-f1cf2d8b1467b5973f249703b31e709eaede97ad.tar.gz |
mktree --batch: build more than one tree object
This option works in a similar way to the '--batch' option of 'git cat-file'.
It enables creation of many tree objects with a single process.
The change was motivated by performance considerations in applications that
need to create many tree objects. A non-rigorous test showed tree creation
times improved from (roughly) 200ms to 50ms.
Signed-off-by: Josh Micich <josh.micich@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin-mktree.c')
-rw-r--r-- | builtin-mktree.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/builtin-mktree.c b/builtin-mktree.c index 5ff04753b7..73b0abbd8d 100644 --- a/builtin-mktree.c +++ b/builtin-mktree.c @@ -63,7 +63,7 @@ static void write_tree(unsigned char *sha1) } static const char *mktree_usage[] = { - "git mktree [-z] [--missing]", + "git mktree [-z] [--missing] [--batch]", NULL }; @@ -122,20 +122,46 @@ int cmd_mktree(int ac, const char **av, const char *prefix) unsigned char sha1[20]; int line_termination = '\n'; int allow_missing = 0; + int is_batch_mode = 0; + int got_eof = 0; + const struct option option[] = { OPT_SET_INT('z', NULL, &line_termination, "input is NUL terminated", '\0'), OPT_SET_INT( 0 , "missing", &allow_missing, "allow missing objects", 1), + OPT_SET_INT( 0 , "batch", &is_batch_mode, "allow creation of more than one tree", 1), OPT_END() }; ac = parse_options(ac, av, option, mktree_usage, 0); - while (strbuf_getline(&sb, stdin, line_termination) != EOF) - mktree_line(sb.buf, sb.len, line_termination, allow_missing); - + while (!got_eof) { + while (1) { + if (strbuf_getline(&sb, stdin, line_termination) == EOF) { + got_eof = 1; + break; + } + if (sb.buf[0] == '\0') { + /* empty lines denote tree boundaries in batch mode */ + if (is_batch_mode) + break; + die("input format error: (blank line only valid in batch mode)"); + } + mktree_line(sb.buf, sb.len, line_termination, allow_missing); + } + if (is_batch_mode && got_eof && used < 1) { + /* + * Execution gets here if the last tree entry is terminated with a + * new-line. The final new-line has been made optional to be + * consistent with the original non-batch behaviour of mktree. + */ + ; /* skip creating an empty tree */ + } else { + write_tree(sha1); + puts(sha1_to_hex(sha1)); + fflush(stdout); + } + used=0; /* reset tree entry buffer for re-use in batch mode */ + } strbuf_release(&sb); - - write_tree(sha1); - puts(sha1_to_hex(sha1)); exit(0); } |