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

[PATCH 3/3] remote: don't prune when detecting overlapping refspecs

From
Dennis Kaarsemaker <dennis@kaarsemaker.net>
Date
Jun 21, 2013, 10:04 UTC
Message-ID
<1371809051-29988-4-git-send-email-dennis@kaarsemaker.net>
In-Reply-To
<1371809051-29988-1-git-send-email-dennis@kaarsemaker.net>

When cloning a repo with --mirror, and adding more remotes later, get_stale_heads for origin would mark all refs from other repos as stale. There's no "good" way to solve, this so the best thing we can do is refusing to prune if we detect this and warning the user.

Signed-off-by: Dennis Kaarsemaker <dennis@kaarsemaker.net>
---
 remote.c          | 23 +++++++++++++++++++++++
 t/t5505-remote.sh |  2 +-
 2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/remote.c b/remote.c
index e71f66d..39a9405 100644
--- a/remote.c
+++ b/remote.c
@@ -1912,11 +1912,34 @@ static int get_stale_heads_cb(const char *refname,
 	return 0;
 }
 
+static int check_overlapping_remotes(struct remote *first, void *priv) {
+	struct remote *second = priv;
+	int i, j;
+	if(!second)
+		return for_each_remote(check_overlapping_remotes, first);
+	if(first == second)
+		return 0;
+	for (i = 0; i < first->fetch_refspec_nr; i++) {
+		for (j = 0; j < second->fetch_refspec_nr; j++) {
+			if(strcmp(first->fetch[i].dst, second->fetch[j].dst) &&
+			   (!fnmatch(first->fetch[i].dst, second->fetch[j].dst, 0) ||
+			    !fnmatch(second->fetch[j].dst, first->fetch[i].dst, 0))) {
+				warning(_("Overlapping refspecs detected: '%s' and '%s', not pruning."),
+					first->fetch[i].dst, second->fetch[j].dst);
+				return 1;
+			}
+		}
+	}
+	return 0;
+}
+
 struct ref *get_stale_heads(struct refspec *refs, int ref_count, struct ref *fetch_map)
 {
 	struct ref *ref, *stale_refs = NULL;
 	struct string_list ref_names = STRING_LIST_INIT_NODUP;
 	struct stale_heads_info info;
+	if(for_each_remote(check_overlapping_remotes, NULL))
+		return NULL;
 	info.ref_names = &ref_names;
 	info.stale_refs_tail = &stale_refs;
 	info.refs = refs;
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 439e996..d4ac6ce 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -428,7 +428,7 @@ test_expect_success 'add alt && prune' '
 	 git rev-parse --verify refs/remotes/origin/side2)
 '
 
-test_expect_failure 'prune and overlapping refspecs' '
+test_expect_success 'prune and overlapping refspecs' '
 	(git clone --mirror one prunetst &&
 	 cd prunetst &&
 	 git remote add two ../two &&
-- 
1.8.3.1-619-gbec0aa7
Previous: Dennis KaarsemakerNext: Junio C Hamano
Message 22 of 23 in “[BUG?] remote prune origin interacts badly with clone --mirror and multiple remotes”
  1. Dennis KaarsemakerJun 20, 2013
  2. remote: make prune work for mixed mirror/non-mirror reposDennis Kaarsemaker, Jun 20, 2013
  3. Junio C HamanoJun 20, 2013
  4. Dennis KaarsemakerJun 20, 2013
  5. Junio C HamanoJun 20, 2013
  6. Dennis KaarsemakerJun 20, 2013
  7. Junio C HamanoJun 20, 2013
  8. Jeff KingJun 20, 2013
  9. Dennis KaarsemakerJun 20, 2013
  10. Junio C HamanoJun 20, 2013
  11. remote: make prune work for mixed mirror/non-mirror reposDennis Kaarsemaker, Jun 20, 2013
  12. 0/3 Handling overlapping refspecs slightly smarterDennis Kaarsemaker, Jun 21, 2013
  13. 1/3 remote: Add warnings about mixin --mirror and other remotesDennis Kaarsemaker, Jun 21, 2013
  14. Junio C HamanoJun 21, 2013
  15. Dennis KaarsemakerJun 23, 2013
  16. Junio C HamanoJun 23, 2013
  17. Dennis KaarsemakerJun 23, 2013
  18. Junio C HamanoJun 23, 2013
  19. Dennis KaarsemakerJun 26, 2013
  20. Junio C HamanoJun 26, 2013
  21. 2/3 remote: Add test for prune and mixed --mirror and normal remotesDennis Kaarsemaker, Jun 21, 2013
  22. 3/3 remote: don't prune when detecting overlapping refspecsDennis Kaarsemaker, Jun 21, 2013
  23. Junio C HamanoJun 21, 2013

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.