Git development
 help / color / mirror / Atom feed
* [PATCH] templates: make example pre-commit hook verify submodule commits exist
@ 2009-05-04  3:32 Sam Vilain
  2009-05-04  5:27 ` Junio C Hamano
  0 siblings, 1 reply; 2+ messages in thread
From: Sam Vilain @ 2009-05-04  3:32 UTC (permalink / raw)
  To: git

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

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-05-04  5:45 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-04  3:32 [PATCH] templates: make example pre-commit hook verify submodule commits exist Sam Vilain
2009-05-04  5:27 ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox