git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v6 p2 2/9] fast-export: don't handle uninteresting refs

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Nov 24, 2012, 03:25 UTC
Message-ID
<1353727520-26039-3-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1353727520-26039-1-git-send-email-felipe.contreras@gmail.com>
They have been marked as UNINTERESTING for a reason, lets respect that.
Currently the first ref is handled properly, but not the rest:
  % git fast-export master ^uninteresting ^foo ^bar
  reset refs/heads/bar
  from :0
  reset refs/heads/foo
  from :0
  reset refs/heads/uninteresting
  from :0
  % git fast-export ^uninteresting ^foo ^bar master
  reset refs/heads/master
  from :0
  reset refs/heads/bar
  from :0
  reset refs/heads/foo
  from :0
Clearly this is wrong; the negative refs should be ignored.
After this patch:
  % git fast-export ^uninteresting ^foo ^bar master
  # nothing
  % git fast-export master ^uninteresting ^foo ^bar
  # nothing

And even more, it would only happen if the ref is pointing to exactly the same commit, but not otherwise:

 % git fast-export ^next next
 reset refs/heads/next
 from :0
 % git fast-export ^next next^{commit}
 # nothing
 % git fast-export ^next next~0
 # nothing
 % git fast-export ^next next~1
 # nothing
 % git fast-export ^next next~2
 # nothing

The reason this happens is that before traversing the commits, fast-export checks if any of the refs point to the same object, and any duplicated ref gets added to a list in order to issue 'reset' commands after the traversing. Unfortunately, it's not even checking if the commit is flagged as UNINTERESTING. The fix of course, is to do precisely that.

However, in order to do it properly we need to get the UNINTERESTING flag from the command line ref, not from the commit object. Fortunately we can simply use revs.pending, which contains all the information we need for get_tags_and_duplicates(), plus the ref flag. This way the rest of the positive refs will remain untouched; it's only the negative ones that change in behavior.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---

The difference with the previous version is that now '^uninteresting ^bad master new' would handle 'master' and 'new', while the previous one would not do anything. The current behavior would handle 'bad', 'master', and 'new'.

 builtin/fast-export.c     | 11 +++++++----
 t/t5801-remote-helpers.sh |  8 ++++++++
 t/t9350-fast-export.sh    | 30 ++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 31bfbee..77dffd1 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -474,18 +474,21 @@ static void handle_tag(const char *name, struct tag *tag)
 	       (int)message_size, (int)message_size, message ? message : "");
 }
 
-static void get_tags_and_duplicates(struct object_array *pending,
+static void get_tags_and_duplicates(struct rev_cmdline_info *info,
 				    struct string_list *extra_refs)
 {
 	struct tag *tag;
 	int i;
 
-	for (i = 0; i < pending->nr; i++) {
-		struct object_array_entry *e = pending->objects + i;
+	for (i = 0; i < info->nr; i++) {
+		struct rev_cmdline_entry *e = info->rev + i;
 		unsigned char sha1[20];
 		struct commit *commit;
 		char *full_name;
 
+		if (e->flags & UNINTERESTING)
+			continue;
+
 		if (dwim_ref(e->name, strlen(e->name), sha1, &full_name) != 1)
 			continue;
 
@@ -685,7 +688,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
 	if (import_filename && revs.prune_data.nr)
 		full_tree = 1;
 
-	get_tags_and_duplicates(&revs.pending, &extra_refs);
+	get_tags_and_duplicates(&revs.cmdline, &extra_refs);
 
 	if (prepare_revision_walk(&revs))
 		die("revision walk setup failed");
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index b2782a2..2e027c8 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -158,4 +158,12 @@ test_expect_success 'push ref with existing object' '
 	compare_refs local dup server dup
 '
 
+test_expect_success 'push all with existing object' '
+	(cd local &&
+	git branch dup2 master &&
+	git push origin --all
+	) &&
+	compare_refs local dup2 server dup2
+'
+
 test_done
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 237d2e5..2e7187e 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -469,4 +469,34 @@ test_expect_success 'refs are updated even if no commits need to be exported' '
 	test_cmp expected actual
 '
 
+cat > expected << EOF
+blob
+mark :13
+data 5
+bump
+
+commit refs/heads/master
+mark :14
+author A U Thor <author@example.com> 1112912773 -0700
+committer C O Mitter <committer@example.com> 1112912773 -0700
+data 5
+bump
+from :12
+M 100644 :13 file
+
+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 tag v1.0 &&
+	git branch uninteresting &&
+	echo bump > file &&
+	git commit -a -m bump &&
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks ^uninteresting ^v1.0 master > actual &&
+	test_cmp expected actual
+'
+
 test_done
-- 
1.8.0
Previous: Felipe ContrerasNext: Felipe Contreras
Message 4 of 16 in “transport-helper and fast-export fixes”
  1. 0/9 transport-helper and fast-export fixesFelipe Contreras, Nov 24, 2012
  2. 1/9 transport-helper: update remote helper namespaceFelipe Contreras, Nov 24, 2012
  3. Felipe ContrerasNov 24, 2012
  4. 2/9 fast-export: don't handle uninteresting refsFelipe Contreras, Nov 24, 2012
  5. Felipe ContrerasNov 24, 2012
  6. 3/9 transport-helper: trivial code shuffleFelipe Contreras, Nov 24, 2012
  7. Junio C HamanoNov 27, 2012
  8. Felipe ContrerasNov 28, 2012
  9. Junio C HamanoNov 28, 2012
  10. Felipe ContrerasNov 28, 2012
  11. 4/9 transport-helper: fix push without refspecFelipe Contreras, Nov 24, 2012
  12. 5/9 transport-helper: fix pushing with straight refspecFelipe Contreras, Nov 24, 2012
  13. 6/9 transport-helper: fix push without marksFelipe Contreras, Nov 24, 2012
  14. 7/9 fast-export: make extra_refs globalFelipe Contreras, Nov 24, 2012
  15. 8/9 fast-export: refactor get_tags_and_duplicates()Felipe Contreras, Nov 24, 2012
  16. 9/9 fast-export: trivial cleanupsFelipe Contreras, Nov 24, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.