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

[PATCH 3/4] subtree: use commits before rejoins for splits

From
Strain, Roger L <roger.strain@swri.org>
Date
Sep 28, 2018, 18:35 UTC
Message-ID
<20180928183540.48968-4-roger.strain@swri.org>
In-Reply-To
<20180928183540.48968-1-roger.strain@swri.org>

Adds recursive evaluation of parent commits which were not part of the initial commit list when performing a split.

Split expects all relevant commits to be reachable from the target commit but not reachable from any previous rejoins. However, a branch could be based on a commit prior to a rejoin, then later merged back into the current code. In this case, a parent to the commit will not be present in the initial list of commits, trigging an "incorrect order" warning.

Previous behavior was to consider that commit to have no parent, creating an original commit containing all subtree content. This commit is not present in an existing subtree commit graph, changing commit hashes and making pushing to a subtree repo impossible.

New behavior will recursively check these unexpected parent commits to track them back to either an earlier rejoin, or a true original commit. The generated synthetic commits will properly match previously-generated commits, allowing successful pushing to a prior subtree repo.

Signed-off-by: Strain, Roger L <roger.strain@swri.org>
---
 contrib/subtree/git-subtree.sh | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index d8861f306..23dd04cbe 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -231,12 +231,14 @@ cache_miss () {
 }
 
 check_parents () {
-	missed=$(cache_miss "$@")
+	missed=$(cache_miss "$1")
+	local indent=$(($2 + 1))
 	for miss in $missed
 	do
 		if ! test -r "$cachedir/notree/$miss"
 		then
 			debug "  incorrect order: $miss"
+			process_split_commit "$miss" "" "$indent"
 		fi
 	done
 }
@@ -606,8 +608,20 @@ ensure_valid_ref_format () {
 process_split_commit () {
 	local rev="$1"
 	local parents="$2"
-	revcount=$(($revcount + 1))
-	progress "$revcount/$revmax ($createcount)"
+	local indent=$3
+
+	if test $indent -eq 0
+	then
+		revcount=$(($revcount + 1))
+	else
+		# processing commit without normal parent information;
+		# fetch from repo
+		parents=$(git show -s --pretty=%P "$rev")
+		extracount=$(($extracount + 1))
+	fi
+
+	progress "$revcount/$revmax ($createcount) [$extracount]"
+
 	debug "Processing commit: $rev"
 	exists=$(cache_get "$rev")
 	if test -n "$exists"
@@ -617,14 +631,13 @@ process_split_commit () {
 	fi
 	createcount=$(($createcount + 1))
 	debug "  parents: $parents"
+	check_parents "$parents" "$indent"
 	newparents=$(cache_get $parents)
 	debug "  newparents: $newparents"
 
 	tree=$(subtree_for_commit "$rev" "$dir")
 	debug "  tree is: $tree"
 
-	check_parents $parents
-
 	# ugly.  is there no better way to tell if this is a subtree
 	# vs. a mainline commit?  Does it matter?
 	if test -z "$tree"
@@ -744,10 +757,11 @@ cmd_split () {
 	revmax=$(eval "$grl" | wc -l)
 	revcount=0
 	createcount=0
+	extracount=0
 	eval "$grl" |
 	while read rev parents
 	do
-		process_split_commit "$rev" "$parents"
+		process_split_commit "$rev" "$parents" 0
 	done || exit $?
 
 	latest_new=$(cache_get latest_new)
-- 
2.19.0.windows.1
Previous: Strain, Roger LNext: Strain, Roger L
Message 2 of 11 in “Multiple subtree split fixes regarding complex repos”
  1. 0/4 Multiple subtree split fixes regarding complex reposStrain, Roger L, Sep 28, 2018
  2. 3/4 subtree: use commits before rejoins for splitsStrain, Roger L, Sep 28, 2018
  3. 2/4 subtree: make --ignore-joins pay attention to addsStrain, Roger L, Sep 28, 2018
  4. 1/4 subtree: refactor split of a commit into standalone methodStrain, Roger L, Sep 28, 2018
  5. 4/4 subtree: improve decision on merges kept in splitStrain, Roger L, Sep 28, 2018
  6. 4/4 subtree: improve decision on merges kept in splitRoger Strain, Oct 11, 2018
  7. 0/4 Multiple subtree split fixes regarding complex reposRoger Strain, Oct 11, 2018
  8. Junio C HamanoOct 12, 2018
  9. 3/4 subtree: use commits before rejoins for splitsRoger Strain, Oct 11, 2018
  10. 2/4 subtree: make --ignore-joins pay attention to addsRoger Strain, Oct 11, 2018
  11. 1/4 subtree: refactor split of a commit into standalone methodRoger Strain, Oct 11, 2018

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.