now -r and -o flags work...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2024-10-03 13:55:42 +03:00
parent 7f90305705
commit e72a99e6c8

View File

@ -1,5 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
shopt -s globstar
while true ; do while true ; do
case $1 in case $1 in
-h|--help) -h|--help)
@ -9,22 +11,44 @@ while true ; do
echo echo
echo "Options:" echo "Options:"
echo " -h --help - print this message and exit" echo " -h --help - print this message and exit"
echo " -o - print repos and exit"
echo " -r - print repos recursively and exit"
echo echo
echo "Repository list can be constructed from an existing set of" echo "Repository list can be constructed from an existing set of"
echo "repositories via:" echo "repositories via:"
echo " $ git listall -o > reposiotry.lst" echo " $ git listall -o > reposiotry.lst"
echo "or recursively:" echo "or recursively:"
echo " $ git listall -o -r > reposiotry.lst" echo " $ git listall -r > reposiotry.lst"
echo "If a repository list already exists it can be expanded via:"
echo " $ git listall -r reposiotry.lst >> reposiotry.lst"
echo echo
echo "The repository list is a text file with each line consisting" echo "The repository list is a text file with each line consisting"
echo "of a \"=\"-separated path and a remote url (as supported by" echo "of a \"=\"-separated path and a remote url (as supported by"
echo "git clone)." echo "git clone)."
echo "Lines starting with \"-\" will not get cloned"
echo "The list file can also contain empty lines and supports shell" echo "The list file can also contain empty lines and supports shell"
echo "comments (lines starting with \"#\")" echo "comments (lines starting with \"#\")"
echo "Example:"
echo " # comment..."
echo " ./path/to/repo=git@example.com:user/repo.git"
echo " # disabled repo..."
echo " -./path/to/repo=git@example.com:user/repo.git"
echo echo
exit exit
;; ;;
# list...
-o)
LIST_REPOS=1
shift
continue
;;
-r)
RECURSIVE=1
shift
continue
;;
-*|--*) -*|--*)
echo "Error: unknown option: \"$1\"" >&2 echo "Error: unknown option: \"$1\"" >&2
exit exit
@ -37,6 +61,49 @@ while true ; do
esac esac
done done
# list...
#
if ! [ -z $LIST_REPOS ] || ! [ -z $RECURSIVE ] ; then
if ! [ -z $RECURSIVE ] ; then
REPOS=(./**/.git/config)
else
REPOS=(./*/.git/config)
fi
# format and print unique lines...
lines=()
{
for p in "${REPOS[@]}" ; do
path=${p/.git\/config/}
remote=$(cat "$p" \
| sed -n '/\[remote "origin"\]/,/^\s*url/p' \
| grep 'url = ' \
| sed \
-e 's/\s*url\s*=\s*//')
[ -z $remote ] \
&& continue
line="$path=$remote"
lines+=($line)
echo $line
done
if [ -e "$LIST" ] ; then
cat "$LIST" \
| grep -ve '\(^\s*#\|^\s*$\)' \
| sed -e 's/^-//'
fi
} \
| sort \
| uniq -u
exit
fi
# clone...
#
TARGET_PATH=${TARGET_PATH:=.} TARGET_PATH=${TARGET_PATH:=.}
cd "$TARGET_PATH" cd "$TARGET_PATH"
@ -56,6 +123,11 @@ for repo in ${LIST[@]} ; do
continue continue
fi fi
# skip lines startig with "-"...
if [[ "${repo:0:1}" == "-" ]] ; then
continue
fi
IFS=$'=' \ IFS=$'=' \
repo=($repo) repo=($repo)