67 lines
1.2 KiB
Bash
Executable File
67 lines
1.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Describe submodules in repository, optionally per commit
|
|
#
|
|
# Usage:
|
|
# submodule-describe <path-to-repo> [<commit>]
|
|
#
|
|
# Output:
|
|
# <hash> <path> <url>
|
|
# <hash> <path> <url>
|
|
#
|
|
# everything separated with tabs
|
|
|
|
# Safe mode
|
|
set -euo pipefail
|
|
IFS=$'\n\t'
|
|
|
|
# get config file for specific commit
|
|
function getConfigFile() {
|
|
git --no-pager show $commit:.gitmodules
|
|
}
|
|
|
|
# parse submodule file from file
|
|
function parseSectionNames(){
|
|
git config -f $1 --list --name-only | grep '^submodule.' | cut -d. -f2 | sort | uniq
|
|
}
|
|
|
|
# generate line for single submodule
|
|
function generateDescription(){
|
|
cfgFile=$1
|
|
section=$2
|
|
|
|
path=$(git config -f $cfgFile --get submodule.$section.path)
|
|
url=$(git config -f $cfgFile --get submodule.$section.url)
|
|
hash=$(git ls-tree -l $commit -- $path | cut -d' ' -f3)
|
|
|
|
printf "%s\t%s\t%s\n" $hash $path $url
|
|
}
|
|
|
|
|
|
|
|
|
|
# Grab varriables
|
|
repodir=$1
|
|
commit=${2:-HEAD}
|
|
|
|
# Go to repo directory
|
|
oldPwd=$(pwd)
|
|
cd $repodir
|
|
|
|
# Are there any submodules registered?
|
|
test 0 -eq `git ls-tree $commit -- .gitmodules | wc -l` && exit 0
|
|
|
|
tmpfile=$(mktemp)
|
|
|
|
getConfigFile $repodir $commit > $tmpfile
|
|
for section in $(parseSectionNames $tmpfile)
|
|
do
|
|
generateDescription $tmpfile $section
|
|
done
|
|
|
|
|
|
# Cleanup
|
|
rm $tmpfile
|
|
# Go back home
|
|
cd $oldPwd
|