From: Sam Vilain <sam.vilain@catalyst.net.nz>
To: git@vger.kernel.org
Subject: [PATCH] templates: make example pre-commit hook verify submodule commits exist
Date: Mon, 4 May 2009 15:32:29 +1200 [thread overview]
Message-ID: <E1M0oxK-0002uG-RT@mail1.catalyst.net.nz> (raw)
With submodules it can be quite easy to end up with a situation where the
version in the supermodule doesn't exist in the submodule. Add to the
example pre-commit hook a script which checks before every commit whether
the submodule commit is likely to exist at the URL defined in the
.gitmodules file.
Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
---
This should be useful for those using submodules. Perhaps it should also
have an equivalent in the 'git submodule' command.
templates/hooks--pre-commit.sample | 56 +++++++++++++++++++++++++++++++++++-
1 files changed, 55 insertions(+), 1 deletions(-)
diff --git a/templates/hooks--pre-commit.sample b/templates/hooks--pre-commit.sample
index 0e49279..26e7cf2 100755
--- a/templates/hooks--pre-commit.sample
+++ b/templates/hooks--pre-commit.sample
@@ -7,7 +7,61 @@
#
# To enable this hook, rename this file to "pre-commit".
-if git-rev-parse --verify HEAD 2>/dev/null
+# first, check that all submodule commits are available by a remote
+# which has the same URL as the one they are listed in.
+if [ -n "$GIT_WORK_TREE" ]
+then
+ cd "$GIT_WORK_TREE"
+fi
+
+git ls-tree $(git write-tree) | grep commit |
+while read mode type sha1 submodule
+do
+ module=$(GIT_CONFIG=.gitmodules git config --list |
+ grep '\.path='"$submodule"\$ |
+ sed 's/submodule\.\([^\.]*\)\..*/\1/')
+ if [ -z "$module" ]
+ then
+ echo "path $submodule is a submodule, but is not" \
+ "listed in .gitmodules" >&2
+ exit 1
+ fi
+ submodule_url=$(GIT_CONFIG=.gitmodules git config \
+ submodule.$submodule.url)
+
+ remotes=$(GIT_DIR=$submodule/.git git config --list |
+ grep '^remote\..*\.url='"$submodule_url" |
+ sed 's/remote\.\([^\.]*\)\..*/\1/')
+
+ found=
+ for remote in $remotes
+ do
+ found=$(GIT_DIR=$submodule/.git git name-rev \
+ --refs=refs/remotes/$remote/* $sha1 2>/dev/null |
+ grep -vw undefined)
+ [ -n "$found" ] && break
+ done
+
+ if [ -z "$found" ]
+ then
+ echo "submodule commit does not appear under tracked remote refs" >&2
+ echo " submodule = $submodule"
+ echo ".gitmodules = $module"
+ echo " url = $submodule_url"
+ echo " commit = $sha1"
+ echo " tried remotes:" $remotes
+ exit 2
+ fi
+done
+
+# this is the return code of the | while sub-shell above
+rc=$?
+if [ $rc -ne 0 ]
+then
+ exit $rc
+fi
+
+if git-rev-parse --verify HEAD >/dev/null 2>&1
then
against=HEAD
else
--
1.6.0
next reply other threads:[~2009-05-04 3:35 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-04 3:32 Sam Vilain [this message]
2009-05-04 5:27 ` [PATCH] templates: make example pre-commit hook verify submodule commits exist Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1M0oxK-0002uG-RT@mail1.catalyst.net.nz \
--to=sam.vilain@catalyst.net.nz \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox