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

Re: [PATCH 2/7] git-submodule: Extract absolute_url & move absolute url logic to module_clone

From
Ping Yin <pkufranky@gmail.com>
Date
Apr 22, 2008, 14:38 UTC
Message-ID
<46dff0320804220738u760a05f7q4ec9cbf144d78480@mail.gmail.com>
In-Reply-To
<46dff0320804220209n590a0684x876270c7b1c0c2d@mail.gmail.com>
Show 6 quoted lines
>  >  Please have that kind of justification in the proposed commit log message.
>  >  When these changes are made into history, people cannot ask you questions
>  >  like I did and expect the history to produce such answer on demand ;-)
>  >
>
>  OK, i'll resend this patch tonight.
See attached patch
-- 
Ping Yin


From f89b08edaa44f89a534dcb4fc17344ea49c5dadb Mon Sep 17 00:00:00 2001
From: Ping Yin <pkufranky@gmail.com>
Date: Thu, 13 Mar 2008 00:09:57 +0800
Subject: [PATCH 2/7] git-submodule: Fix inconsistent handling of relative urls with './' prefix

There is a little inconsistence in current handling of relative url
with "./"

- "git submodule add ./foo" will clone the submodule with url
  "${remote.origin.url}/foo" and init an entry 'submodule.foo.url=./foo"
  in .gitmodules

- "git submodule init" will init an entry in $GIT_DIR/config as
  "submodule.foo.url=${remote.origin.url}/foo"

- However, if there is an entry "submodule.foo.url=./foo" in
  $GIT_DIR/config, "git submodule update" will not expand
  "./foo" with remote.origin.url

This patch unifies the behaviour of handling relative urls with './'
prefix. Now "git submodule init" copies urls from .gitmodules to
$GIT_DIR/config as is without expanding. And the url expanding happens
only at runtime, say when "git submodule add" or "git submodule update".

absolute_url is extracted to remove code redundance and fix inconsistence
in cmd_init and cmd_add when resolving relative url/path to absolute one.

Also move resolving absolute url logic from cmd_add to module_clone which
results in the expected behaviour change: cmd_update will resolve url
'./foo' in $GIT_DIR/config as "${remote.origin.url}/foo" instead of
"$(pwd)/foo".

This behaviour change breaks t7400 which uses relative url './.subrepo'.
However, this test originally doesn't mean to test relative url with './'
prefix, so fix the url as '.subrepo'.

Signed-off-by: Ping Yin <pkufranky@gmail.com>
---
 git-submodule.sh           |   41 ++++++++++++++++++-----------------------
 t/t7400-submodule-basic.sh |    2 +-
 2 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/git-submodule.sh b/git-submodule.sh
index e71e1f0..198ea44 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -65,6 +65,21 @@ resolve_relative_url ()
 	echo "$remoteurl/$url"
 }
 
+# Resolve relative url/path to absolute one
+absolute_url () {
+	case "$1" in
+	./*|../*)
+		# dereference source url relative to parent's url
+		url="$(resolve_relative_url $1)" ;;
+	*)
+		# Turn the source into an absolute path if it is local
+		url=$(get_repo_base "$1") ||
+		url=$1
+		;;
+	esac
+	echo "$url"
+}
+
 #
 # Map submodule path to submodule name
 #
@@ -112,7 +127,7 @@ module_info() {
 module_clone()
 {
 	path=$1
-	url=$2
+	url=$(absolute_url "$2")
 
 	# If there already is a directory at the submodule path,
 	# expect it to be empty (since that is the default checkout
@@ -195,21 +210,7 @@ cmd_add()
 			die "'$path' already exists and is not a valid git repo"
 		fi
 	else
-		case "$repo" in
-		./*|../*)
-			# dereference source url relative to parent's url
-			realrepo="$(resolve_relative_url $repo)" ;;
-		*)
-			# Turn the source into an absolute path if
-			# it is local
-			if base=$(get_repo_base "$repo"); then
-				repo="$base"
-			fi
-			realrepo=$repo
-			;;
-		esac
-
-		module_clone "$path" "$realrepo" || exit
+		module_clone "$path" "$repo" || exit
 		(unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) ||
 		die "Unable to checkout submodule '$path'"
 	fi
@@ -262,13 +263,7 @@ cmd_init()
 		test -z "$url" &&
 		die "No url found for submodule path '$path' in .gitmodules"
 
-		# Possibly a url relative to parent
-		case "$url" in
-		./*|../*)
-			url="$(resolve_relative_url "$url")"
-			;;
-		esac
-
+		url=$(absolute_url "$url")
 		git config submodule."$name".url "$url" ||
 		die "Failed to register url for submodule path '$path'"
 
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index 2ef85a8..e5d59b8 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -75,7 +75,7 @@ test_expect_success 'init should register submodule url in .git/config' '
 	then
 		echo "[OOPS] init succeeded but submodule url is wrong"
 		false
-	elif ! git config submodule.example.url ./.subrepo
+	elif ! git config submodule.example.url .subrepo
 	then
 		echo "[OOPS] init succeeded but update of url failed"
 		false
-- 
1.5.5.70.gd68a
Previous: Ping YinNext: Ping Yin
Message 13 of 18 in “submodule: fallback to .gitmodules and multiple level module definition”
  1. 0/7 submodule: fallback to .gitmodules and multiple level module definitionPing Yin, Apr 16, 2008
  2. 1/7 git-submodule: Extract functions module_info and module_urlPing Yin, Apr 16, 2008
  3. 2/7 git-submodule: Extract absolute_url & move absolute url logic to module_clonePing Yin, Apr 16, 2008
  4. 3/7 git-submodule: Fall back on .gitmodules if info not found in $GIT_DIR/configPing Yin, Apr 16, 2008
  5. 4/7 git-submodule: Extract module_add from cmd_addPing Yin, Apr 16, 2008
  6. 5/7 git-submodule: multi-level module definitionPing Yin, Apr 16, 2008
  7. 6/7 git-submodule: "update --force" to enforce cloning non-submodulePing Yin, Apr 16, 2008
  8. 7/7 git-submodule: Don't die when command fails for one submodulePing Yin, Apr 16, 2008
  9. Junio C HamanoApr 22, 2008
  10. Ping YinApr 22, 2008
  11. Junio C HamanoApr 22, 2008
  12. Ping YinApr 22, 2008
  13. Ping YinApr 22, 2008
  14. Ping YinApr 22, 2008
  15. Ping YinApr 22, 2008
  16. Ping YinApr 22, 2008
  17. Jakub NarebskiApr 22, 2008
  18. Ping YinApr 22, 2008

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.