You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
983 B
63 lines
983 B
#!/bin/sh |
|
|
|
set -eu |
|
|
|
: ${GO:=go} |
|
|
|
MODULES=$(find * -name go.mod -exec dirname '{}' \;) |
|
GROUPS="pkg cmd" |
|
BASE="$PWD" |
|
|
|
mod() { |
|
local d="${1:-.}" |
|
grep ^module "$d/go.mod" | cut -d' ' -f2 |
|
} |
|
|
|
namedir() { |
|
local d="$1" g= n= |
|
|
|
if [ "." = "$d" ]; then |
|
echo "root" |
|
return |
|
fi |
|
|
|
for g in $GROUPS; do |
|
n="${d#$g/}" |
|
if [ "x$n" != "x$d" ]; then |
|
echo "$n" | tr '/' '-' |
|
return |
|
fi |
|
done |
|
|
|
echo "$d" | tr '/' '-' |
|
} |
|
|
|
mod_replace() { |
|
local d="$1" |
|
grep "=>" "$d/go.mod" | sed -n -e "s;^.*\($ROOT_MODULE.*\)[ \t]\+=>.*;\1;p" |
|
} |
|
|
|
gen_index() { |
|
local d= n= |
|
|
|
for d; do |
|
n=$(namedir "$d") |
|
m=$(mod "$d") |
|
echo "$n:$d:$m" |
|
done |
|
} |
|
|
|
ROOT_MODULE=$(mod) |
|
INDEX=$(gen_index $MODULES) |
|
|
|
echo "$INDEX" | while IFS=: read name dir mod; do |
|
deps= |
|
for dep in $(mod_replace "$dir"); do |
|
depname=$(echo "$INDEX" | grep ":$dep$" | cut -d: -f1 | tr '\n' ',' | sed -e 's|,\+$||g') |
|
if [ -n "$depname" ]; then |
|
deps="${deps:+$deps,}$depname" |
|
fi |
|
done |
|
|
|
echo "$name:$dir:$mod:$deps" |
|
done | sort -V
|
|
|