fast-export: make sure updated refs get updated

When an object has already been exported (and thus is in the marks) it's
flagged as SHOWN, so it will not be exported again, even if in a later
time it's exported through a different ref.

We don't need the object to be exported again, but we want the ref
updated, which doesn't happen.

Since we can't know if a ref was exported or not, let's just assume that
if the commit was marked (flags & SHOWN), the user still wants the ref
updated.

IOW: If it's specified in the command line, it will get updated,
regardless of whether or not the object was marked.

So:

 % git branch test master
 % git fast-export $mark_flags master
 % git fast-export $mark_flags test

Would export 'test' properly.

Additionally, this fixes issues with remote helpers; now they can push
refs whose objects have already been exported, and a few other issues as
well. Update the tests accordingly.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Felipe Contreras 2012-11-28 23:24:00 +01:00 committed by Junio C Hamano
parent 49266e8a11
commit f28e7c904a
3 changed files with 30 additions and 15 deletions

View File

@ -526,10 +526,14 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info,
typename(e->item->type)); typename(e->item->type));
continue; continue;
} }
if (commit->util)
/* more than one name for the same object */ /*
* This ref will not be updated through a commit, lets make
* sure it gets properly updated eventually.
*/
if (commit->util || commit->object.flags & SHOWN)
string_list_append(extra_refs, full_name)->util = commit; string_list_append(extra_refs, full_name)->util = commit;
else if (!commit->util)
commit->util = full_name; commit->util = full_name;
} }
} }

View File

@ -63,18 +63,6 @@ test_expect_success 'fetch new branch' '
compare_refs server HEAD local FETCH_HEAD compare_refs server HEAD local FETCH_HEAD
' '
#
# This is only needed because of a bug not detected by this script. It will be
# fixed shortly, but for now lets not cause regressions.
#
test_expect_success 'bump commit in server' '
(cd server &&
git checkout master &&
echo content >>file &&
git commit -a -m four) &&
compare_refs server HEAD server HEAD
'
test_expect_success 'fetch multiple branches' ' test_expect_success 'fetch multiple branches' '
(cd local && (cd local &&
git fetch git fetch
@ -170,4 +158,12 @@ test_expect_success 'push all with existing object' '
compare_refs local dup2 server dup2 compare_refs local dup2 server dup2
' '
test_expect_success 'push ref with existing object' '
(cd local &&
git branch dup master &&
git push origin dup
) &&
compare_refs local dup server dup
'
test_done test_done

View File

@ -484,4 +484,19 @@ test_expect_success 'avoid uninteresting refs' '
test_cmp expected actual test_cmp expected actual
' '
cat > expected << EOF
reset refs/heads/master
from :14
EOF
test_expect_success 'refs are updated even if no commits need to be exported' '
> tmp-marks &&
git fast-export --import-marks=tmp-marks \
--export-marks=tmp-marks master > /dev/null &&
git fast-export --import-marks=tmp-marks \
--export-marks=tmp-marks master > actual &&
test_cmp expected actual
'
test_done test_done