mirror of
https://github.com/git-for-windows/git.git
synced 2026-05-03 02:27:35 -05:00
Merge branch 'ws/fast-export-with-revision-options'
Use of certain "git rev-list" options with "git fast-export" created nonsense results (the worst two of which being "--reverse" and "--invert-grep --grep=<foo>"). The use of "--first-parent" is made to behave a bit more sensible than before. * ws/fast-export-with-revision-options: fast-export: fix surprising behavior with --first-parent
This commit is contained in:
@@ -107,18 +107,6 @@ static int parse_opt_reencode_mode(const struct option *opt,
|
||||
|
||||
static struct decoration idnums;
|
||||
static uint32_t last_idnum;
|
||||
|
||||
static int has_unshown_parent(struct commit *commit)
|
||||
{
|
||||
struct commit_list *parent;
|
||||
|
||||
for (parent = commit->parents; parent; parent = parent->next)
|
||||
if (!(parent->item->object.flags & SHOWN) &&
|
||||
!(parent->item->object.flags & UNINTERESTING))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct anonymized_entry {
|
||||
struct hashmap_entry hash;
|
||||
const char *anon;
|
||||
@@ -752,20 +740,6 @@ static char *anonymize_tag(void *data)
|
||||
return strbuf_detach(&out, NULL);
|
||||
}
|
||||
|
||||
static void handle_tail(struct object_array *commits, struct rev_info *revs,
|
||||
struct string_list *paths_of_changed_objects)
|
||||
{
|
||||
struct commit *commit;
|
||||
while (commits->nr) {
|
||||
commit = (struct commit *)object_array_pop(commits);
|
||||
if (has_unshown_parent(commit)) {
|
||||
/* Queue again, to be handled later */
|
||||
add_object_array(&commit->object, NULL, commits);
|
||||
return;
|
||||
}
|
||||
handle_commit(commit, revs, paths_of_changed_objects);
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_tag(const char *name, struct tag *tag)
|
||||
{
|
||||
@@ -1185,7 +1159,6 @@ static int parse_opt_anonymize_map(const struct option *opt,
|
||||
int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct rev_info revs;
|
||||
struct object_array commits = OBJECT_ARRAY_INIT;
|
||||
struct commit *commit;
|
||||
char *export_filename = NULL,
|
||||
*import_filename = NULL,
|
||||
@@ -1283,18 +1256,13 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
||||
|
||||
if (prepare_revision_walk(&revs))
|
||||
die("revision walk setup failed");
|
||||
|
||||
revs.reverse = 1;
|
||||
revs.diffopt.format_callback = show_filemodify;
|
||||
revs.diffopt.format_callback_data = &paths_of_changed_objects;
|
||||
revs.diffopt.flags.recursive = 1;
|
||||
while ((commit = get_revision(&revs))) {
|
||||
if (has_unshown_parent(commit)) {
|
||||
add_object_array(&commit->object, NULL, &commits);
|
||||
}
|
||||
else {
|
||||
handle_commit(commit, &revs, &paths_of_changed_objects);
|
||||
handle_tail(&commits, &revs, &paths_of_changed_objects);
|
||||
}
|
||||
}
|
||||
while ((commit = get_revision(&revs)))
|
||||
handle_commit(commit, &revs, &paths_of_changed_objects);
|
||||
|
||||
handle_tags_and_duplicates(&extra_refs);
|
||||
handle_tags_and_duplicates(&tag_refs);
|
||||
|
||||
@@ -750,4 +750,36 @@ test_expect_success 'merge commit gets exported with --import-marks' '
|
||||
)
|
||||
'
|
||||
|
||||
|
||||
test_expect_success 'fast-export --first-parent outputs all revisions output by revision walk' '
|
||||
git init first-parent &&
|
||||
(
|
||||
cd first-parent &&
|
||||
test_commit A &&
|
||||
git checkout -b topic1 &&
|
||||
test_commit B &&
|
||||
git checkout main &&
|
||||
git merge --no-ff topic1 &&
|
||||
|
||||
git checkout -b topic2 &&
|
||||
test_commit C &&
|
||||
git checkout main &&
|
||||
git merge --no-ff topic2 &&
|
||||
|
||||
test_commit D &&
|
||||
|
||||
git fast-export main -- --first-parent >first-parent-export &&
|
||||
git fast-export main -- --first-parent --reverse >first-parent-reverse-export &&
|
||||
test_cmp first-parent-export first-parent-reverse-export &&
|
||||
|
||||
git init import &&
|
||||
git -C import fast-import <first-parent-export &&
|
||||
|
||||
git log --format="%ad %s" --first-parent main >expected &&
|
||||
git -C import log --format="%ad %s" --all >actual &&
|
||||
test_cmp expected actual &&
|
||||
test_line_count = 4 actual
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
Reference in New Issue
Block a user