diff mbox series

[RFC,4/4] submodule: cache superproject gitdir during 'update'

Message ID 20210611225428.1208973-5-emilyshaffer@google.com (mailing list archive)
State Superseded
Headers show
Series cache parent project's gitdir in submodules | expand

Commit Message

Emily Shaffer June 11, 2021, 10:54 p.m. UTC
A cached path to the superproject's gitdir might be added during 'git
submodule add', but in some cases - like submodules which were created
before 'git submodule add' learned to cache that info - it might be
useful to update the cache. Let's do it during 'git submodule update',
when we already have a handle to the superproject while calling
operations on the submodules.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
---
 git-submodule.sh            |  9 +++++++++
 t/t7406-submodule-update.sh | 10 ++++++++++
 2 files changed, 19 insertions(+)

Comments

Junio C Hamano June 14, 2021, 6:22 a.m. UTC | #1
Emily Shaffer <emilyshaffer@google.com> writes:

> A cached path to the superproject's gitdir might be added during 'git
> submodule add', but in some cases - like submodules which were created
> before 'git submodule add' learned to cache that info - it might be
> useful to update the cache. Let's do it during 'git submodule update',
> when we already have a handle to the superproject while calling
> operations on the submodules.
>
> Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> ---
>  git-submodule.sh            |  9 +++++++++
>  t/t7406-submodule-update.sh | 10 ++++++++++
>  2 files changed, 19 insertions(+)
>
> diff --git a/git-submodule.sh b/git-submodule.sh
> index eb90f18229..ddda751cfa 100755
> --- a/git-submodule.sh
> +++ b/git-submodule.sh
> @@ -648,6 +648,15 @@ cmd_update()
>  			fi
>  		fi
>  
> +		# Cache a pointer to the superproject's gitdir. This may have
> +		# changed, so rewrite it unconditionally. Writes it to worktree
> +		# if applicable, otherwise to local.
> +
> +		sp_gitdir="$(git rev-parse --absolute-git-dir)"
> +		relative_gitdir="$(realpath --relative-to "$sm_path" "$sp_gitdir")"

realpath may not exist on the target system.  Discussions on the
patch [*1*] may be of interest.

It might be a good idea to push to your github repository to trigger
CI on macOS (I am guessing that you do not test locally on macs from
the two issues we saw in this series).

Thanks.


[Reference]

*1*
https://lore.kernel.org/git/20201206225349.3392790-3-sandals@crustytoothpaste.net/
Emily Shaffer June 15, 2021, 9:27 p.m. UTC | #2
On Mon, Jun 14, 2021 at 03:22:29PM +0900, Junio C Hamano wrote:
> 
> Emily Shaffer <emilyshaffer@google.com> writes:
> 
> > A cached path to the superproject's gitdir might be added during 'git
> > submodule add', but in some cases - like submodules which were created
> > before 'git submodule add' learned to cache that info - it might be
> > useful to update the cache. Let's do it during 'git submodule update',
> > when we already have a handle to the superproject while calling
> > operations on the submodules.
> >
> > Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> > ---
> >  git-submodule.sh            |  9 +++++++++
> >  t/t7406-submodule-update.sh | 10 ++++++++++
> >  2 files changed, 19 insertions(+)
> >
> > diff --git a/git-submodule.sh b/git-submodule.sh
> > index eb90f18229..ddda751cfa 100755
> > --- a/git-submodule.sh
> > +++ b/git-submodule.sh
> > @@ -648,6 +648,15 @@ cmd_update()
> >  			fi
> >  		fi
> >  
> > +		# Cache a pointer to the superproject's gitdir. This may have
> > +		# changed, so rewrite it unconditionally. Writes it to worktree
> > +		# if applicable, otherwise to local.
> > +
> > +		sp_gitdir="$(git rev-parse --absolute-git-dir)"
> > +		relative_gitdir="$(realpath --relative-to "$sm_path" "$sp_gitdir")"
> 
> realpath may not exist on the target system.  Discussions on the
> patch [*1*] may be of interest.
> 
> It might be a good idea to push to your github repository to trigger
> CI on macOS (I am guessing that you do not test locally on macs from
> the two issues we saw in this series).

I typically do, sorry for forgetting to do so this time.

> 
> Thanks.
> 
> 
> [Reference]
> 
> *1*
> https://lore.kernel.org/git/20201206225349.3392790-3-sandals@crustytoothpaste.net/
diff mbox series

Patch

diff --git a/git-submodule.sh b/git-submodule.sh
index eb90f18229..ddda751cfa 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -648,6 +648,15 @@  cmd_update()
 			fi
 		fi
 
+		# Cache a pointer to the superproject's gitdir. This may have
+		# changed, so rewrite it unconditionally. Writes it to worktree
+		# if applicable, otherwise to local.
+
+		sp_gitdir="$(git rev-parse --absolute-git-dir)"
+		relative_gitdir="$(realpath --relative-to "$sm_path" "$sp_gitdir")"
+		git -C "$sm_path" config --worktree \
+			submodule.superprojectgitdir "$relative_gitdir"
+
 		if test -n "$recursive"
 		then
 			(
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index ff3ba5422e..96023cbb6a 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -1037,4 +1037,14 @@  test_expect_success 'submodule update --quiet passes quietness to merge/rebase'
 	)
 '
 
+test_expect_success 'submodule update adds superproject gitdir to older repos' '
+	(cd super &&
+	 git -C submodule config --unset submodule.superprojectGitdir &&
+	 git submodule update &&
+	 echo "../.git" >expect &&
+	 git -C submodule config submodule.superprojectGitdir >actual &&
+	 test_cmp expect actual
+	)
+'
+
 test_done