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:
Junio C Hamano 2022-01-10 11:52:50 -08:00
commit 98ab07ace5
2 changed files with 36 additions and 36 deletions

View file

@ -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);

View file

@ -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