Cloud Foundry uses git submodules in cloudfoundry/cf-release to track dependencies from other repositories such as cloudfoundry/gorouter.

It’s quite straightforward to find out what version of gorouter is included in a given version of cf-release:

➜ cf-release git:(master) ✗ git ls-tree v230 -- src/github.com/cloudfoundry/gorouter
160000 commit 37445fabe4b3a79c5e22f6c1a4e9a950858490cb src/github.com/cloudfoundry/gorouter
➜ cf-release git:(master) ✗ git ls-tree v231 -- src/github.com/cloudfoundry/gorouter
160000 commit 9a19ec5d3577799d07bab7d058d3614bfcf9ec4c src/github.com/cloudfoundry/gorouter
➜ cf-release git:(master) ✗ git ls-tree v232 -- src/github.com/cloudfoundry/gorouter
160000 commit 15e5d4a2173a978f87c0903cdda1eea374afdfbf src/github.com/cloudfoundry/gorouter

But how do you find out the opposite; what are the versions of cf-release that include a specific commit from gorouter?

Not very easily, it seems. If it were a single repo then you could use git tag --contains, but that doesn’t work across submodules. I had a Google around and couldn’t find any suggestions. So based on some suggestions from my colleagues @thekeymon and @timmow I hacked together something that would brute force the information out:

git-submodule-contains
#!/bin/bash
set -euo pipefail
path=$1
commit=$2
good_commits=$(git -C "${path}" rev-list "${commit}"^..HEAD)
if [ -z "${good_commits}" ]; then
exit 1
fi
for parent_commit in $(git rev-list --reverse HEAD -- "${path}"); do
sub_commit=$(git ls-tree -d "${parent_commit}" -- "${path}" | awk '{print $3}')
if [ -z "${sub_commit}" ]; then
continue
fi
if echo "${good_commits}" | grep -qw "${sub_commit}"; then
echo "${parent_commit}"
exit 0
fi
done
exit 1

If you put the script in your PATH then you can use it as follows to find out which versions of cf-release included the commit cloudfoundry/gorouter@d5c6aea:

➜ cf-release git:(master) git tag --contains \
> $(git submodule-contains src/github.com/cloudfoundry/gorouter d5c6aea)
v231
v232
v233

PS: I remain, as ever, not a fan of submodules.