Compare commits

..

No commits in common. "de8c0781b9b3e703997a803b02513fecd11b08ea" and "e72a99e6c89fb8c35a7fe69dd59ba41df4dc26a2" have entirely different histories.

3 changed files with 107 additions and 66 deletions

View File

@ -15,7 +15,6 @@ Provided commands:
These enable setting up and maintaining mutiple development machines with These enable setting up and maintaining mutiple development machines with
a number of git repositories. a number of git repositories.
## Workflow ## Workflow
In a tree with multiple git repositories: In a tree with multiple git repositories:
@ -25,21 +24,12 @@ In a tree with multiple git repositories:
``` ```
- to create the same env on a different computer: - to create the same env on a different computer:
```shell ```shell
$ git listall -r > repos.lst $ git listall -o -r > repos.lst
``` ```
move the `repos.lst` to the target machine and: move the `repos.lst` to the target machine and:
```shell ```shell
$ git cloneall repos.lst $ git cloneall repos.lst
``` ```
- to update the repository list with new repos:
```shell
$ git listall -r repos.lst >> repos.lst
```
## Tips
- It is convenient to manage `repos.lst` as symlinks to a unified directory and
syncronize it between machines via someting like [syncthing](https://syncthing.net/)
## License ## License

View File

@ -5,44 +5,105 @@ shopt -s globstar
while true ; do while true ; do
case $1 in case $1 in
-h|--help) -h|--help)
echo "Usage: $(basename "$0") [OPTIONS] FILE" echo "Usage: $(basename "$0") [OPTIONS] FILE [PATH]"
echo echo
echo "Clone all repositories from lst (FILE)." echo "Clone all repositories from lst (FILE)."
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 "The repository list is a text file containing:" echo "Repository list can be constructed from an existing set of"
echo " - Repository definition lines -- a \"=\"-separated path and a remote url" echo "repositories via:"
echo " Repository definitions starting with \"-\" will not get cloned" echo " $ git listall -o > reposiotry.lst"
echo " - Lines starting with \"#\" and empty lines are ignored" 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 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 "Example:"
echo " # comment..." echo " # comment..."
echo " ./path/to/repo=git@example.com:user/repo.git" echo " ./path/to/repo=git@example.com:user/repo.git"
echo
echo " # disabled repo..." echo " # disabled repo..."
echo " -./path/to/other-repo=git@example.com:user/other-repo.git" echo " -./path/to/repo=git@example.com:user/repo.git"
echo
echo "For info on constructing and updating repository lists see:"
echo " $ git-listall --help"
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
;; ;;
*) *)
LIST=$1 LIST=$1
#TARGET_PATH=$2 TARGET_PATH=$2
break break
;; ;;
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"

View File

@ -1,29 +1,16 @@
#!/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)
echo "Usage: $(basename "$0") [OPTIONS] [LIST]" echo "Usage: $(basename "$0") [OPTIONS] [PATH]"
echo echo
echo "List all repositories in current directory." echo "List all repositories in PATH."
echo echo
echo "Options:" echo "Options:"
echo " -h --help - print this message and exit" echo " -h --help - print this message and exit"
echo " -r --recursive - list directories recursively" echo " -r --recursive - list directories recursively"
echo echo " -o --origin - also print origin url"
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 echo
exit exit
;; ;;
@ -33,53 +20,56 @@ while true ; do
shift shift
continue continue
;; ;;
-o|--origin)
ORIGIN=1
shift
continue
;;
-*|--*) -*|--*)
echo "Error: unknown option: \"$1\"" >&2 echo "Error: unknown option: \"$1\"" >&2
exit exit
;; ;;
*) *)
LIST=$1 TARGET_PATH=$1
#TARGET_PATH=$2
break break
;; ;;
esac esac
done done
TARGET_PATH=${TARGET_PATH:=.} TARGET_PATH=${TARGET_PATH:=.}
cd "$TARGET_PATH" cd "$TARGET_PATH"
if ! [ -z $RECURSIVE ] ; then if [ $RECURSIVE ] ; then
REPOS=(./**/.git/config) IFS=$'\n' \
DIRS=($(find . -name .git | sort))
else else
REPOS=(./*/.git/config) IFS=$'\n' \
DIRS=(./*/.git)
fi fi
# format and print unique lines... # XXX handle local repos...
lines=() getOrigin(){
{ if ! [ -z $ORIGIN ] ; then
for p in "${REPOS[@]}" ; do cd "$1"
path=${p/.git\/config/} echo "=`git ls-remote --get-url origin`"
remote=$(cat "$p" \ cd "$wd"
| 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 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 : # vim:set sw=4 ts=4 :