diff --git a/bin/git-cloneall b/bin/git-cloneall index 46b6e32..771d191 100755 --- a/bin/git-cloneall +++ b/bin/git-cloneall @@ -5,105 +5,44 @@ shopt -s globstar while true ; do case $1 in -h|--help) - echo "Usage: $(basename "$0") [OPTIONS] FILE [PATH]" + echo "Usage: $(basename "$0") [OPTIONS] FILE" echo echo "Clone all repositories from lst (FILE)." echo echo "Options:" echo " -h --help - print this message and exit" - echo " -o - print repos and exit" - echo " -r - print repos recursively and exit" echo - echo "Repository list can be constructed from an existing set of" - echo "repositories via:" - echo " $ git listall -o > reposiotry.lst" - echo "or recursively:" - 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 "The repository list is a text file containing:" + echo " - Repository definition lines -- a \"=\"-separated path and a remote url" + echo " Repository definitions starting with \"-\" will not get cloned" + echo " - Lines starting with \"#\" and empty lines are ignored" echo - 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 "git clone)." - echo "Lines starting with \"-\" will not get cloned" - echo "The list file can also contain empty lines and supports shell" - echo "comments (lines starting with \"#\")" echo "Example:" echo " # comment..." echo " ./path/to/repo=git@example.com:user/repo.git" + echo echo " # disabled repo..." - echo " -./path/to/repo=git@example.com:user/repo.git" + echo " -./path/to/other-repo=git@example.com:user/other-repo.git" + echo + echo "For info on constructing and updating repository lists see:" + echo " $ git-listall --help" echo exit ;; - # list... - -o) - LIST_REPOS=1 - shift - continue - ;; - -r) - RECURSIVE=1 - shift - continue - ;; - -*|--*) echo "Error: unknown option: \"$1\"" >&2 exit ;; *) LIST=$1 - TARGET_PATH=$2 + #TARGET_PATH=$2 break ;; esac 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:=.} cd "$TARGET_PATH" diff --git a/bin/git-listall b/bin/git-listall index 950bc26..6b105eb 100755 --- a/bin/git-listall +++ b/bin/git-listall @@ -1,16 +1,29 @@ #!/usr/bin/env bash +shopt -s globstar + while true ; do case $1 in -h|--help) - echo "Usage: $(basename "$0") [OPTIONS] [PATH]" + echo "Usage: $(basename "$0") [OPTIONS] [LIST]" echo - echo "List all repositories in PATH." + echo "List all repositories in current directory." echo echo "Options:" echo " -h --help - print this message and exit" echo " -r --recursive - list directories recursively" - echo " -o --origin - also print origin url" + echo + echo "Repository list can be constructed from an existing set of repositories via:" + echo " $ git listall > reposiotry.lst" + echo + echo "or recursively:" + echo " $ git listall -r > reposiotry.lst" + echo + echo "If a repository list already exists it can be expanded via:" + echo " $ git listall -r reposiotry.lst >> reposiotry.lst" + echo + echo "For info on list file format see:" + echo " $ git-cloneall --help" echo exit ;; @@ -20,56 +33,53 @@ while true ; do shift continue ;; - -o|--origin) - ORIGIN=1 - shift - continue - ;; -*|--*) echo "Error: unknown option: \"$1\"" >&2 exit ;; *) - TARGET_PATH=$1 + LIST=$1 + #TARGET_PATH=$2 break ;; esac done - TARGET_PATH=${TARGET_PATH:=.} cd "$TARGET_PATH" -if [ $RECURSIVE ] ; then - IFS=$'\n' \ - DIRS=($(find . -name .git | sort)) +if ! [ -z $RECURSIVE ] ; then + REPOS=(./**/.git/config) else - IFS=$'\n' \ - DIRS=(./*/.git) + REPOS=(./*/.git/config) fi -# XXX handle local repos... -getOrigin(){ - if ! [ -z $ORIGIN ] ; then - cd "$1" - echo "=`git ls-remote --get-url origin`" - cd "$wd" +# 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 -# inside a repo... -if [ -d ./.git ] ; then - echo ".`getOrigin .`" - exit 0 -fi - -# do the update... -wd=$(pwd) -for dir in ${DIRS[@]} ; do - dir=${dir%.git} - echo "$dir`getOrigin "$dir"`" -done # vim:set sw=4 ts=4 :