Am 18.05.2012 14:13, schrieb Jon Seymour: > Prior to this change, operations such as git submodule sync produces > the wrong result when the origin URL of the super module > is itself a relative URL. > > The issue arises because in this case, the origin URL of the supermodule > needs to be prepended with a prefix that navigates from the submodule to > the supermodule. > > This change adds that prefix. Thanks, sounds sane. Please see my comments below. > Signed-off-by: Jon Seymour <jon.seymour@xxxxxxxxx> > --- > git-submodule.sh | 39 +++++++++++++++++++++++---------------- > 1 file changed, 23 insertions(+), 16 deletions(-) > > If people are ok with the fix, I'll roll this as a patch together > with some tests. Yeah, tests would be great (and while at it please drop the trailing '.' from the subject ;-). This version of the patch does break some existing tests, but your follow up suggests you already found that out yourself ;-) > diff --git a/git-submodule.sh b/git-submodule.sh > index 64a70d6..5008867 100755 > --- a/git-submodule.sh > +++ b/git-submodule.sh > @@ -37,7 +37,8 @@ resolve_relative_url () > remoteurl=$(git config "remote.$remote.url") || > remoteurl=$(pwd) # the repository is its own authoritative upstream > url="$1" > - remoteurl=${remoteurl%/} > + up_path="$(echo "$2" | sed "s/[^/]*/../g")" Me thinks up_path should be set in the case below, which is the only place where it is used. > + remoteurl=${remoteurl%/*} As you mentioned in your follow up this change is not correct. > sep=/ > while test -n "$url" > do > @@ -45,6 +46,9 @@ resolve_relative_url () > ../*) > url="${url#../}" > case "$remoteurl" in > + .*/*) up_path should be set here. > + remoteurl="${up_path%/}/${remoteurl%/*}" > + ;; > */*) > remoteurl="${remoteurl%/*}" > ;; > @@ -235,11 +239,24 @@ cmd_add() > usage > fi > > + # normalize path: > + # multiple //; leading ./; /./; /../; trailing / > + sm_path=$(printf '%s/\n' "$sm_path" | > + sed -e ' > + s|//*|/|g > + s|^\(\./\)*|| > + s|/\./|/|g > + :start > + s|\([^/]*\)/\.\./|| > + tstart > + s|/*$|| > + ') > + > # assure repo is absolute or relative to parent > case "$repo" in > ./*|../*) > # dereference source url relative to parent's url > - realrepo=$(resolve_relative_url "$repo") || exit > + realrepo=$(resolve_relative_url "$repo" "$sm_path") || exit > ;; > *:*|/*) > # absolute url > @@ -250,18 +267,6 @@ cmd_add() > ;; > esac > > - # normalize path: > - # multiple //; leading ./; /./; /../; trailing / > - sm_path=$(printf '%s/\n' "$sm_path" | > - sed -e ' > - s|//*|/|g > - s|^\(\./\)*|| > - s|/\./|/|g > - :start > - s|\([^/]*\)/\.\./|| > - tstart > - s|/*$|| > - ') > git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 && > die "$(eval_gettext "'\$sm_path' already exists in the index")" > > @@ -401,13 +406,14 @@ cmd_init() > if test -z "$(git config "submodule.$name.url")" > then > url=$(git config -f .gitmodules submodule."$name".url) > + sm_path=$(git config -f .gitmodules submodule."$name".path) Isn't sm_path already set correctly here? I think this line should be dropped. > test -z "$url" && > die "$(eval_gettext "No url found for submodule path '\$sm_path' in .gitmodules")" > > # Possibly a url relative to parent > case "$url" in > ./*|../*) > - url=$(resolve_relative_url "$url") || exit > + url=$(resolve_relative_url "$url" "$sm_path") || exit > ;; > esac > git config submodule."$name".url "$url" || > @@ -960,11 +966,12 @@ cmd_sync() > do > name=$(module_name "$sm_path") > url=$(git config -f .gitmodules --get submodule."$name".url) > + sm_path=$(git config -f .gitmodules --get submodule."$name".path) Same here. > > # Possibly a url relative to parent > case "$url" in > ./*|../*) > - url=$(resolve_relative_url "$url") || exit > + url=$(resolve_relative_url "$url" "$sm_path") || exit > ;; > esac > Other than that the patch looks fine. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html