diff options
-rw-r--r-- | Documentation/git-fast-import.txt | 10 | ||||
-rw-r--r-- | fast-import.c | 13 | ||||
-rwxr-xr-x | t/t9300-fast-import.sh | 21 |
3 files changed, 39 insertions, 5 deletions
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index a92ae6d1a3..eb0c8c48ee 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -708,13 +708,18 @@ Exact byte count format:: + .... 'data' SP <count> LF - <raw> LF + <raw> LF? .... + where `<count>` is the exact number of bytes appearing within `<raw>`. The value of `<count>` is expressed as an ASCII decimal integer. The `LF` on either side of `<raw>` is not included in `<count>` and will not be included in the imported data. ++ +The `LF` after `<raw>` is optional (it used to be required) but +recommended. Always including it makes debugging a fast-import +stream easier as the next command always starts in column 0 +of the next line, even if `<raw>` did not end with an `LF`. Delimited format:: A delimiter string is used to mark the end of the data. @@ -726,6 +731,7 @@ Delimited format:: 'data' SP '<<' <delim> LF <raw> LF <delim> LF + LF? .... + where `<delim>` is the chosen delimiter string. The string `<delim>` @@ -734,6 +740,8 @@ fast-import will think the data ends earlier than it really does. The `LF` immediately trailing `<raw>` is part of `<raw>`. This is one of the limitations of the delimited format, it is impossible to supply a data chunk which does not have an LF as its last byte. ++ +The `LF` after `<delim> LF` is optional (it used to be required). `checkpoint` ~~~~~~~~~~~~ diff --git a/fast-import.c b/fast-import.c index 98ebe4770d..f950cff5ef 100644 --- a/fast-import.c +++ b/fast-import.c @@ -61,7 +61,7 @@ Format of STDIN stream: # mark ::= 'mark' sp idnum lf; data ::= (delimited_data | exact_data) - lf; + lf?; # note: delim may be any string but must not contain lf. # data_line may contain any data but must not be exactly @@ -1470,6 +1470,13 @@ static void read_next_command(void) } while (!command_buf.eof && command_buf.buf[0] == '#'); } +static void skip_optional_lf() +{ + int term_char = fgetc(stdin); + if (term_char != '\n' && term_char != EOF) + ungetc(term_char, stdin); +} + static void cmd_mark(void) { if (!prefixcmp(command_buf.buf, "mark :")) { @@ -1522,9 +1529,7 @@ static void *cmd_data (size_t *size) } } - if (fgetc(stdin) != '\n') - die("An lf did not trail the binary data as expected."); - + skip_optional_lf(); *size = length; return buffer; } diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 1f6426a49e..5be6f196bd 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -818,4 +818,25 @@ test_expect_success \ 'git-fast-import <input && test `git-rev-parse N3` = `git-rev-parse O1`' +cat >input <<INPUT_END +commit refs/heads/O2 +committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE +data <<COMMIT +dirty directory copy +COMMIT +from refs/heads/branch^0 +M 644 inline file2/file5 +data <<EOF +$file5_data +EOF +C file2 file3 +D file2/file5 + +INPUT_END + +test_expect_success \ + 'O: blank lines not necessary after data commands' \ + 'git-fast-import <input && + test `git-rev-parse N3` = `git-rev-parse O2`' + test_done |