* [PATCH v4 0/4] fast-import: add a new option command
@ 2009-08-24 20:52 Sverre Rabbelier
2009-08-24 20:52 ` [PATCH v4 1/4] fast-import: put option parsing code in seperate functions Sverre Rabbelier
0 siblings, 1 reply; 5+ messages in thread
From: Sverre Rabbelier @ 2009-08-24 20:52 UTC (permalink / raw)
To: Junio C Hamano, Shawn O. Pearce, Johannes Schindelin, Git List
The only difference with v3 is that the --import-marks refactoring is
done in a seperate patch.
Meant as replacement for sr/gfi-options in pu.
Sverre Rabbelier (4):
fast-import: put option parsing code in seperate functions
fast-import: put marks reading in it's own function
fast-import: add option command
fast-import: test the new option command
Documentation/git-fast-import.txt | 23 ++++
fast-import.c | 235 +++++++++++++++++++++++++------------
t/t9300-fast-import.sh | 58 +++++++++
3 files changed, 239 insertions(+), 77 deletions(-)
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v4 1/4] fast-import: put option parsing code in seperate functions 2009-08-24 20:52 [PATCH v4 0/4] fast-import: add a new option command Sverre Rabbelier @ 2009-08-24 20:52 ` Sverre Rabbelier 2009-08-24 20:52 ` [PATCH v4 2/4] fast-import: put marks reading in it's own function Sverre Rabbelier 0 siblings, 1 reply; 5+ messages in thread From: Sverre Rabbelier @ 2009-08-24 20:52 UTC (permalink / raw) To: Junio C Hamano, Shawn O. Pearce, Johannes Schindelin, Git List Cc: Sverre Rabbelier Putting the options in their own functions increases readability of the option parsing block and makes it easier to reuse the option parsing code later on. Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com> --- Unchanged from v3. fast-import.c | 115 +++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 75 insertions(+), 40 deletions(-) diff --git a/fast-import.c b/fast-import.c index 7ef9865..b904f20 100644 --- a/fast-import.c +++ b/fast-import.c @@ -291,6 +291,7 @@ static unsigned long branch_count; static unsigned long branch_load_count; static int failure; static FILE *pack_edges; +static unsigned int show_stats = 1; /* Memory pools */ static size_t mem_pool_alloc = 2*1024*1024 - sizeof(struct mem_pool); @@ -2337,7 +2338,7 @@ static void parse_progress(void) skip_optional_lf(); } -static void import_marks(const char *input_file) +static void option_import_marks(const char *input_file) { char line[512]; FILE *f = fopen(input_file, "r"); @@ -2372,6 +2373,76 @@ static void import_marks(const char *input_file) fclose(f); } +static void option_date_format(const char *fmt) +{ + if (!strcmp(fmt, "raw")) + whenspec = WHENSPEC_RAW; + else if (!strcmp(fmt, "rfc2822")) + whenspec = WHENSPEC_RFC2822; + else if (!strcmp(fmt, "now")) + whenspec = WHENSPEC_NOW; + else + die("unknown --date-format argument %s", fmt); +} + +static void option_max_pack_size(const char *packsize) +{ + max_packsize = strtoumax(packsize, NULL, 0) * 1024 * 1024; +} + +static void option_depth(const char *depth) +{ + max_depth = strtoul(depth, NULL, 0); + if (max_depth > MAX_DEPTH) + die("--depth cannot exceed %u", MAX_DEPTH); +} + +static void option_active_branches(const char *branches) +{ + max_active_branches = strtoul(branches, NULL, 0); +} + +static void option_export_marks(const char *marks) +{ + mark_file = xstrdup(marks); +} + +static void option_export_pack_edges(const char *edges) +{ + if (pack_edges) + fclose(pack_edges); + pack_edges = fopen(edges, "a"); + if (!pack_edges) + die_errno("Cannot open '%s'", edges); +} + +static void parse_one_option(const char *option) +{ + if (!prefixcmp(option, "date-format=")) { + option_date_format(option + 12); + } else if (!prefixcmp(option, "max-pack-size=")) { + option_max_pack_size(option + 14); + } else if (!prefixcmp(option, "depth=")) { + option_depth(option + 6); + } else if (!prefixcmp(option, "active-branches=")) { + option_active_branches(option + 16); + } else if (!prefixcmp(option, "import-marks=")) { + option_import_marks(option + 13); + } else if (!prefixcmp(option, "export-marks=")) { + option_export_marks(option + 13); + } else if (!prefixcmp(option, "export-pack-edges=")) { + option_export_pack_edges(option + 18); + } else if (!prefixcmp(option, "force")) { + force_update = 1; + } else if (!prefixcmp(option, "quiet")) { + show_stats = 0; + } else if (!prefixcmp(option, "stats")) { + show_stats = 1; + } else { + die("Unsupported option: %s", option); + } +} + static int git_pack_config(const char *k, const char *v, void *cb) { if (!strcmp(k, "pack.depth")) { @@ -2398,7 +2469,7 @@ static const char fast_import_usage[] = int main(int argc, const char **argv) { - unsigned int i, show_stats = 1; + unsigned int i; git_extract_argv0_path(argv[0]); @@ -2419,44 +2490,8 @@ int main(int argc, const char **argv) if (*a != '-' || !strcmp(a, "--")) break; - else if (!prefixcmp(a, "--date-format=")) { - const char *fmt = a + 14; - if (!strcmp(fmt, "raw")) - whenspec = WHENSPEC_RAW; - else if (!strcmp(fmt, "rfc2822")) - whenspec = WHENSPEC_RFC2822; - else if (!strcmp(fmt, "now")) - whenspec = WHENSPEC_NOW; - else - die("unknown --date-format argument %s", fmt); - } - else if (!prefixcmp(a, "--max-pack-size=")) - max_packsize = strtoumax(a + 16, NULL, 0) * 1024 * 1024; - else if (!prefixcmp(a, "--depth=")) { - max_depth = strtoul(a + 8, NULL, 0); - if (max_depth > MAX_DEPTH) - die("--depth cannot exceed %u", MAX_DEPTH); - } - else if (!prefixcmp(a, "--active-branches=")) - max_active_branches = strtoul(a + 18, NULL, 0); - else if (!prefixcmp(a, "--import-marks=")) - import_marks(a + 15); - else if (!prefixcmp(a, "--export-marks=")) - mark_file = a + 15; - else if (!prefixcmp(a, "--export-pack-edges=")) { - if (pack_edges) - fclose(pack_edges); - pack_edges = fopen(a + 20, "a"); - if (!pack_edges) - die_errno("Cannot open '%s'", a + 20); - } else if (!strcmp(a, "--force")) - force_update = 1; - else if (!strcmp(a, "--quiet")) - show_stats = 0; - else if (!strcmp(a, "--stats")) - show_stats = 1; - else - die("unknown option %s", a); + + parse_one_option(a + 2); } if (i != argc) usage(fast_import_usage); -- 1.6.4.16.g72c66.dirty ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v4 2/4] fast-import: put marks reading in it's own function 2009-08-24 20:52 ` [PATCH v4 1/4] fast-import: put option parsing code in seperate functions Sverre Rabbelier @ 2009-08-24 20:52 ` Sverre Rabbelier 2009-08-24 20:52 ` [PATCH v4 3/4] fast-import: add option command Sverre Rabbelier 0 siblings, 1 reply; 5+ messages in thread From: Sverre Rabbelier @ 2009-08-24 20:52 UTC (permalink / raw) To: Junio C Hamano, Shawn O. Pearce, Johannes Schindelin, Git List Cc: Sverre Rabbelier All options do nothing but set settings, with the exception of the --input-marks option. Delay the reading of the marks file till after all options have been parsed. Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com> --- New in the series, as requested by Shawn for easier review. fast-import.c | 73 ++++++++++++++++++++++++++++++++------------------------- 1 files changed, 41 insertions(+), 32 deletions(-) diff --git a/fast-import.c b/fast-import.c index b904f20..812fcf0 100644 --- a/fast-import.c +++ b/fast-import.c @@ -315,6 +315,7 @@ static struct object_entry_pool *blocks; static struct object_entry *object_table[1 << 16]; static struct mark_set *marks; static const char *mark_file; +static const char *input_file; /* Our last blob */ static struct last_object last_blob = { STRBUF_INIT, 0, 0, 0 }; @@ -1643,6 +1644,42 @@ static void dump_marks(void) } } +static void read_marks(void) +{ + char line[512]; + FILE *f = fopen(input_file, "r"); + if (!f) + die_errno("cannot read '%s'", input_file); + 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; + e->offset = 1; /* just not zero! */ + } + insert_mark(mark, e); + } + fclose(f); +} + + static int read_next_command(void) { static int stdin_eof = 0; @@ -2338,39 +2375,9 @@ static void parse_progress(void) skip_optional_lf(); } -static void option_import_marks(const char *input_file) +static void option_import_marks(const char *marks) { - char line[512]; - FILE *f = fopen(input_file, "r"); - if (!f) - die_errno("cannot read '%s'", input_file); - 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; - e->offset = 1; /* just not zero! */ - } - insert_mark(mark, e); - } - fclose(f); + input_file = xstrdup(marks); } static void option_date_format(const char *fmt) @@ -2495,6 +2502,8 @@ int main(int argc, const char **argv) } if (i != argc) usage(fast_import_usage); + if (input_file) + read_marks(); rc_free = pool_alloc(cmd_save * sizeof(*rc_free)); for (i = 0; i < (cmd_save - 1); i++) -- 1.6.4.16.g72c66.dirty ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v4 3/4] fast-import: add option command 2009-08-24 20:52 ` [PATCH v4 2/4] fast-import: put marks reading in it's own function Sverre Rabbelier @ 2009-08-24 20:52 ` Sverre Rabbelier 2009-08-24 20:52 ` [PATCH v4 4/4] fast-import: test the new " Sverre Rabbelier 0 siblings, 1 reply; 5+ messages in thread From: Sverre Rabbelier @ 2009-08-24 20:52 UTC (permalink / raw) To: Junio C Hamano, Shawn O. Pearce, Johannes Schindelin, Git List Cc: Sverre Rabbelier This allows the frontend to specify any of the supported options as long as no non-option command has been given. This way the user does not have to include any frontend-specific options, but instead she can rely on the frontend to tell fast-import what it needs. Also factor out parsing of argv and have it execute when we reach the first non-option command, or after all commands have been read and no non-option command has been encountered. Lastly do not read the marks file till after all options have been parsed, instead of when receiving the option. Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com> --- Same as v3 but with the --import-marks change already done in 2/4 Documentation/git-fast-import.txt | 23 ++++++++++++++ fast-import.c | 61 +++++++++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index c2f483a..ed8bd0d 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -303,6 +303,11 @@ and control the current import process. More detailed discussion standard output. This command is optional and is not needed to perform an import. +`option`:: + Specify any of the options listed under OPTIONS to change + fast-import's behavior to suit the frontend's needs. This command + is optional and is not needed to perform an import. + `commit` ~~~~~~~~ Create or update a branch with a new commit, recording one logical @@ -813,6 +818,24 @@ Placing a `progress` command immediately after a `checkpoint` will inform the reader when the `checkpoint` has been completed and it can safely access the refs that fast-import updated. +`option` +~~~~~~~~ +Processes the specified option so that git fast-import behaves in a +way that suits the frontend's needs. +Note that options specified by the frontend are overridden by any +options the user may specify to git fast-import itself. + +.... + 'option' SP <option> LF +.... + +The `<option>` part of the command may contain any of the options +listed in the OPTIONS section, without the leading '--' and is +treated in the same way. + +Option commands must be the first commands on the input, to give an +option command after any non-option command is an error. + Crash Reports ------------- If fast-import is supplied invalid input it will terminate with a diff --git a/fast-import.c b/fast-import.c index 812fcf0..dff2937 100644 --- a/fast-import.c +++ b/fast-import.c @@ -292,6 +292,8 @@ static unsigned long branch_load_count; static int failure; static FILE *pack_edges; static unsigned int show_stats = 1; +static int global_argc; +static const char **global_argv; /* Memory pools */ static size_t mem_pool_alloc = 2*1024*1024 - sizeof(struct mem_pool); @@ -349,6 +351,9 @@ static struct recent_command *rc_free; static unsigned int cmd_save = 100; static uintmax_t next_mark; static struct strbuf new_data = STRBUF_INIT; +static int seen_non_option_command; + +static void parse_argv(void); static void write_branch_report(FILE *rpt, struct branch *b) { @@ -1700,6 +1705,11 @@ static int read_next_command(void) if (stdin_eof) return EOF; + if (!seen_non_option_command + && prefixcmp(command_buf.buf, "option ")) { + parse_argv(); + } + rc = rc_free; if (rc) rc_free = rc->next; @@ -2450,6 +2460,16 @@ static void parse_one_option(const char *option) } } +static void parse_option(void) +{ + char* option = command_buf.buf + 7; + + if (seen_non_option_command) + die("Got option command '%s' after non-option command", option); + + parse_one_option(option); +} + static int git_pack_config(const char *k, const char *v, void *cb) { if (!strcmp(k, "pack.depth")) { @@ -2474,6 +2494,26 @@ static int git_pack_config(const char *k, const char *v, void *cb) 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]"; +static void parse_argv(void) +{ + unsigned int i; + + for (i = 1; i < global_argc; i++) { + const char *a = global_argv[i]; + + if (*a != '-' || !strcmp(a, "--")) + break; + + parse_one_option(a + 2); + } + if (i != global_argc) + usage(fast_import_usage); + + seen_non_option_command = 1; + if (input_file) + read_marks(); +} + int main(int argc, const char **argv) { unsigned int i; @@ -2492,18 +2532,8 @@ int main(int argc, const char **argv) avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*)); marks = pool_calloc(1, sizeof(struct mark_set)); - for (i = 1; i < argc; i++) { - const char *a = argv[i]; - - if (*a != '-' || !strcmp(a, "--")) - break; - - parse_one_option(a + 2); - } - if (i != argc) - usage(fast_import_usage); - if (input_file) - read_marks(); + global_argc = argc; + global_argv = argv; rc_free = pool_alloc(cmd_save * sizeof(*rc_free)); for (i = 0; i < (cmd_save - 1); i++) @@ -2526,9 +2556,16 @@ int main(int argc, const char **argv) parse_checkpoint(); else if (!prefixcmp(command_buf.buf, "progress ")) parse_progress(); + else if (!prefixcmp(command_buf.buf, "option ")) + parse_option(); else die("Unsupported command: %s", command_buf.buf); } + + // argv hasn't been parsed yet, do so + if (!seen_non_option_command) + parse_argv(); + end_packfile(); dump_branches(); -- 1.6.4.16.g72c66.dirty ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v4 4/4] fast-import: test the new option command 2009-08-24 20:52 ` [PATCH v4 3/4] fast-import: add option command Sverre Rabbelier @ 2009-08-24 20:52 ` Sverre Rabbelier 0 siblings, 0 replies; 5+ messages in thread From: Sverre Rabbelier @ 2009-08-24 20:52 UTC (permalink / raw) To: Junio C Hamano, Shawn O. Pearce, Johannes Schindelin, Git List Cc: Sverre Rabbelier Test three options (quiet and import/export-marks) and verify that the commandline options override these. Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com> --- Unchanged from v3. t/t9300-fast-import.sh | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 58 insertions(+), 0 deletions(-) diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 821be7c..62369e5 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -1088,4 +1088,62 @@ INPUT_END test_expect_success 'P: fail on blob mark in gitlink' ' test_must_fail git fast-import <input' +### +### series Q (options) +### + +cat >input << EOF +option quiet +blob +data 3 +hi + +EOF + +touch empty + +test_expect_success 'Q: quiet option results in no stats being output' ' + cat input | git fast-import 2> output && + test_cmp empty output +' + +cat >input << EOF +option export-marks=git.marks +blob +mark :1 +data 3 +hi + +EOF + +test_expect_success \ + 'Q: export-marks option results in a marks file being created' \ + 'cat input | git fast-import && + grep :1 git.marks' + +test_expect_success \ + 'Q: export-marks options can be overriden by commandline options' \ + 'cat input | git fast-import --export-marks=other.marks && + grep :1 other.marks' + +cat >input << EOF +option import-marks=marks.out +option export-marks=marks.new +EOF + +test_expect_success \ + 'Q: import to output marks works without any content' \ + 'cat input | git fast-import && + test_cmp marks.out marks.new' + +cat >input <<EOF +option import-marks=nonexistant.marks +option export-marks=marks.new +EOF + +test_expect_success \ + 'Q: import marks uses the commandline marks file when the stream specifies one' \ + 'cat input | git fast-import --import-marks=marks.out && + test_cmp marks.out marks.new' + test_done -- 1.6.4.16.g72c66.dirty ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-08-24 20:53 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-08-24 20:52 [PATCH v4 0/4] fast-import: add a new option command Sverre Rabbelier 2009-08-24 20:52 ` [PATCH v4 1/4] fast-import: put option parsing code in seperate functions Sverre Rabbelier 2009-08-24 20:52 ` [PATCH v4 2/4] fast-import: put marks reading in it's own function Sverre Rabbelier 2009-08-24 20:52 ` [PATCH v4 3/4] fast-import: add option command Sverre Rabbelier 2009-08-24 20:52 ` [PATCH v4 4/4] fast-import: test the new " Sverre Rabbelier
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).