Skip to content

Commit 98ab07a

Browse files
committed
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
2 parents b6f538f + 726a228 commit 98ab07a

File tree

2 files changed

+36
-36
lines changed

2 files changed

+36
-36
lines changed

builtin/fast-export.c

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -107,18 +107,6 @@ static int parse_opt_reencode_mode(const struct option *opt,
107107

108108
static struct decoration idnums;
109109
static uint32_t last_idnum;
110-
111-
static int has_unshown_parent(struct commit *commit)
112-
{
113-
struct commit_list *parent;
114-
115-
for (parent = commit->parents; parent; parent = parent->next)
116-
if (!(parent->item->object.flags & SHOWN) &&
117-
!(parent->item->object.flags & UNINTERESTING))
118-
return 1;
119-
return 0;
120-
}
121-
122110
struct anonymized_entry {
123111
struct hashmap_entry hash;
124112
const char *anon;
@@ -752,20 +740,6 @@ static char *anonymize_tag(void *data)
752740
return strbuf_detach(&out, NULL);
753741
}
754742

755-
static void handle_tail(struct object_array *commits, struct rev_info *revs,
756-
struct string_list *paths_of_changed_objects)
757-
{
758-
struct commit *commit;
759-
while (commits->nr) {
760-
commit = (struct commit *)object_array_pop(commits);
761-
if (has_unshown_parent(commit)) {
762-
/* Queue again, to be handled later */
763-
add_object_array(&commit->object, NULL, commits);
764-
return;
765-
}
766-
handle_commit(commit, revs, paths_of_changed_objects);
767-
}
768-
}
769743

770744
static void handle_tag(const char *name, struct tag *tag)
771745
{
@@ -1185,7 +1159,6 @@ static int parse_opt_anonymize_map(const struct option *opt,
11851159
int cmd_fast_export(int argc, const char **argv, const char *prefix)
11861160
{
11871161
struct rev_info revs;
1188-
struct object_array commits = OBJECT_ARRAY_INIT;
11891162
struct commit *commit;
11901163
char *export_filename = NULL,
11911164
*import_filename = NULL,
@@ -1283,18 +1256,13 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
12831256

12841257
if (prepare_revision_walk(&revs))
12851258
die("revision walk setup failed");
1259+
1260+
revs.reverse = 1;
12861261
revs.diffopt.format_callback = show_filemodify;
12871262
revs.diffopt.format_callback_data = &paths_of_changed_objects;
12881263
revs.diffopt.flags.recursive = 1;
1289-
while ((commit = get_revision(&revs))) {
1290-
if (has_unshown_parent(commit)) {
1291-
add_object_array(&commit->object, NULL, &commits);
1292-
}
1293-
else {
1294-
handle_commit(commit, &revs, &paths_of_changed_objects);
1295-
handle_tail(&commits, &revs, &paths_of_changed_objects);
1296-
}
1297-
}
1264+
while ((commit = get_revision(&revs)))
1265+
handle_commit(commit, &revs, &paths_of_changed_objects);
12981266

12991267
handle_tags_and_duplicates(&extra_refs);
13001268
handle_tags_and_duplicates(&tag_refs);

t/t9350-fast-export.sh

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,4 +750,36 @@ test_expect_success 'merge commit gets exported with --import-marks' '
750750
)
751751
'
752752

753+
754+
test_expect_success 'fast-export --first-parent outputs all revisions output by revision walk' '
755+
git init first-parent &&
756+
(
757+
cd first-parent &&
758+
test_commit A &&
759+
git checkout -b topic1 &&
760+
test_commit B &&
761+
git checkout main &&
762+
git merge --no-ff topic1 &&
763+
764+
git checkout -b topic2 &&
765+
test_commit C &&
766+
git checkout main &&
767+
git merge --no-ff topic2 &&
768+
769+
test_commit D &&
770+
771+
git fast-export main -- --first-parent >first-parent-export &&
772+
git fast-export main -- --first-parent --reverse >first-parent-reverse-export &&
773+
test_cmp first-parent-export first-parent-reverse-export &&
774+
775+
git init import &&
776+
git -C import fast-import <first-parent-export &&
777+
778+
git log --format="%ad %s" --first-parent main >expected &&
779+
git -C import log --format="%ad %s" --all >actual &&
780+
test_cmp expected actual &&
781+
test_line_count = 4 actual
782+
)
783+
'
784+
753785
test_done

0 commit comments

Comments
 (0)