зеркало из https://github.com/microsoft/git.git
fast-import: add feature command
This allows the fronted to require a specific feature to be supported by the backend, or abort. Also add support for four initial feature, date-format=, force=, import-marks=, export-marks=. Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
07cd9328b6
Коммит
f963bd5d71
|
@ -303,6 +303,10 @@ and control the current import process. More detailed discussion
|
|||
standard output. This command is optional and is not needed
|
||||
to perform an import.
|
||||
|
||||
`feature`::
|
||||
Require that fast-import supports the specified feature, or
|
||||
abort if it does not.
|
||||
|
||||
`commit`
|
||||
~~~~~~~~
|
||||
Create or update a branch with a new commit, recording one logical
|
||||
|
@ -846,6 +850,27 @@ 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.
|
||||
|
||||
`feature`
|
||||
~~~~~~~~~
|
||||
Require that fast-import supports the specified feature, or abort if
|
||||
it does not.
|
||||
|
||||
....
|
||||
'feature' SP <feature> LF
|
||||
....
|
||||
|
||||
The <feature> part of the command may be any string matching
|
||||
^[a-zA-Z][a-zA-Z-]*$ and should be understood by fast-import.
|
||||
|
||||
Feature work identical as their option counterparts.
|
||||
|
||||
The following features are currently supported:
|
||||
|
||||
* date-format
|
||||
* import-marks
|
||||
* export-marks
|
||||
* force
|
||||
|
||||
Crash Reports
|
||||
-------------
|
||||
If fast-import is supplied invalid input it will terminate with a
|
||||
|
|
|
@ -353,6 +353,7 @@ 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_data_command;
|
||||
|
||||
static void write_branch_report(FILE *rpt, struct branch *b)
|
||||
{
|
||||
|
@ -1704,6 +1705,11 @@ static int read_next_command(void)
|
|||
if (stdin_eof)
|
||||
return EOF;
|
||||
|
||||
if (!seen_data_command
|
||||
&& prefixcmp(command_buf.buf, "feature ")) {
|
||||
seen_data_command = 1;
|
||||
}
|
||||
|
||||
rc = rc_free;
|
||||
if (rc)
|
||||
rc_free = rc->next;
|
||||
|
@ -2533,6 +2539,36 @@ static void parse_one_option(const char *option)
|
|||
}
|
||||
}
|
||||
|
||||
static int parse_one_feature(const char *feature)
|
||||
{
|
||||
if (!prefixcmp(feature, "date-format=")) {
|
||||
option_date_format(feature + 12);
|
||||
} else if (!prefixcmp(feature, "import-marks=")) {
|
||||
option_import_marks(feature + 13);
|
||||
} else if (!prefixcmp(feature, "export-marks=")) {
|
||||
option_export_marks(feature + 13);
|
||||
} else if (!prefixcmp(feature, "force")) {
|
||||
force_update = 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void parse_feature(void)
|
||||
{
|
||||
char *feature = command_buf.buf + 8;
|
||||
|
||||
if (seen_data_command)
|
||||
die("Got feature command '%s' after data command", feature);
|
||||
|
||||
if (parse_one_feature(feature))
|
||||
return;
|
||||
|
||||
die("This version of fast-import does not support feature %s.", feature);
|
||||
}
|
||||
|
||||
static int git_pack_config(const char *k, const char *v, void *cb)
|
||||
{
|
||||
if (!strcmp(k, "pack.depth")) {
|
||||
|
@ -2612,6 +2648,8 @@ int main(int argc, const char **argv)
|
|||
parse_checkpoint();
|
||||
else if (!prefixcmp(command_buf.buf, "progress "))
|
||||
parse_progress();
|
||||
else if (!prefixcmp(command_buf.buf, "feature "))
|
||||
parse_feature();
|
||||
else
|
||||
die("Unsupported command: %s", command_buf.buf);
|
||||
}
|
||||
|
|
|
@ -1254,4 +1254,74 @@ test_expect_success \
|
|||
'Q: verify note for third commit' \
|
||||
'git cat-file blob refs/notes/foobar:$commit3 >actual && test_cmp expect actual'
|
||||
|
||||
###
|
||||
### series R (feature)
|
||||
###
|
||||
|
||||
cat >input <<EOF
|
||||
feature no-such-feature-exists
|
||||
EOF
|
||||
|
||||
test_expect_success 'R: abort on unsupported feature' '
|
||||
test_must_fail git fast-import <input
|
||||
'
|
||||
|
||||
cat >input <<EOF
|
||||
feature date-format=now
|
||||
EOF
|
||||
|
||||
test_expect_success 'R: supported feature is accepted' '
|
||||
git fast-import <input
|
||||
'
|
||||
|
||||
cat >input << EOF
|
||||
blob
|
||||
data 3
|
||||
hi
|
||||
feature date-format=now
|
||||
EOF
|
||||
|
||||
test_expect_success 'R: abort on receiving feature after data command' '
|
||||
test_must_fail git fast-import <input
|
||||
'
|
||||
|
||||
cat >input << EOF
|
||||
feature export-marks=git.marks
|
||||
blob
|
||||
mark :1
|
||||
data 3
|
||||
hi
|
||||
|
||||
EOF
|
||||
|
||||
test_expect_success \
|
||||
'R: export-marks feature results in a marks file being created' \
|
||||
'cat input | git fast-import &&
|
||||
grep :1 git.marks'
|
||||
|
||||
test_expect_success \
|
||||
'R: 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
|
||||
feature import-marks=marks.out
|
||||
feature export-marks=marks.new
|
||||
EOF
|
||||
|
||||
test_expect_success \
|
||||
'R: import to output marks works without any content' \
|
||||
'cat input | git fast-import &&
|
||||
test_cmp marks.out marks.new'
|
||||
|
||||
cat >input <<EOF
|
||||
feature import-marks=nonexistant.marks
|
||||
feature export-marks=marks.new
|
||||
EOF
|
||||
|
||||
test_expect_success \
|
||||
'R: import marks prefers commandline marks file over the stream' \
|
||||
'cat input | git fast-import --import-marks=marks.out &&
|
||||
test_cmp marks.out marks.new'
|
||||
|
||||
test_done
|
||||
|
|
Загрузка…
Ссылка в новой задаче