From: Richard Hartmann Date: Tue, 22 Dec 2015 20:47:53 +0000 (+0100) Subject: Merge branch 'fix/support_old_git' X-Git-Url: https://git.madduck.net/code/vcsh.git/commitdiff_plain/6e5118a290be0dc24b919e8dc249aa9d763cd8b6?hp=2c13ac4b6501fac484aef891a92a7e736401ebe9 Merge branch 'fix/support_old_git' --- diff --git a/.travis.yml b/.travis.yml index cedf4fa..be5a1d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ before_install: - cpanm Test::Most - apt-get moo install: + - sudo apt-get update - sudo apt-get install cowsay git ruby-ronn script: - make test diff --git a/_vcsh b/_vcsh index 53eaada..3022c61 100644 --- a/_vcsh +++ b/_vcsh @@ -23,6 +23,10 @@ function _vcsh-enter () { (( CURRENT == 2 )) && __vcsh_repositories } +function _vcsh-foreach () { + _dispatch git git +} + function _vcsh-help () { _nothing } @@ -36,10 +40,6 @@ function _vcsh-list () { } function _vcsh-list-tracked () { - _nothing -} - -function _vcsh-list-tracked-by () { (( CURRENT == 2 )) && __vcsh_repositories } @@ -100,11 +100,11 @@ function _vcsh () { "commit:commit in all repositories" "delete:delete an existing repository" "enter:enter repository; spawn new <\$SHELL>" + "foreach:execute for all repos" "help:display help" "init:initialize an empty repository" "list:list all local vcsh repositories" "list-tracked:list all files tracked by vcsh" - "list-tracked-by:list files tracked by a repository" "list-untracked:list all files not tracked by vcsh" "pull:pull from all vcsh remotes" "push:push to vcsh remotes" diff --git a/doc/vcsh.1.ronn b/doc/vcsh.1.ronn index 19daed5..d5ee0dc 100644 --- a/doc/vcsh.1.ronn +++ b/doc/vcsh.1.ronn @@ -11,6 +11,8 @@ vcsh(1) - Version Control System for $HOME - multiple Git repositories in $HOME `vcsh` enter +`vcsh` foreach [-g] + `vcsh` help `vcsh` init @@ -19,7 +21,7 @@ vcsh(1) - Version Control System for $HOME - multiple Git repositories in $HOME `vcsh` list-tracked [] -`vcsh` list-untracked [<-r>] [] +`vcsh` list-untracked [<-a>] [<-r>] [] `vcsh` pull @@ -98,6 +100,11 @@ an interactive user. * enter: Enter repository; spawn new <$SHELL>. +* foreach: + Execute git command for every vcsh repository. + + `-g`: Execute in general context. + * help: Display help. @@ -121,12 +128,14 @@ an interactive user. * list-untracked: List all files NOT tracked by vcsh. + `-a`: Show all files. + By default, the `git ls-files --exclude-standard` is called. + + `-r`: Recursive mode. By default, the file list is shallow and stops at directory levels where - possible. If you prefer to get a list of all files, append `-r` for - recursive mode. + possible. - If you want to list files not tracked by a specific repository, simply - append the repository's name last. + `$repo`: List files not tracked by this specific repository. * pull: Pull from all vcsh remotes. diff --git a/t/100-init.t b/t/100-init.t index f8cb5ef..80a10c9 100644 --- a/t/100-init.t +++ b/t/100-init.t @@ -25,7 +25,6 @@ ok $output eq "test1:\n\n", 'Our new repo is there'; chdir $ENV{"HOME"} . '/.config/vcsh/repo.d/test1.git/' or die $!; ok -f 'HEAD'; -ok -d 'branches'; ok -f 'config'; ok -f 'description'; ok -d 'hooks'; diff --git a/vcsh b/vcsh index 98dd71e..98e0acd 100755 --- a/vcsh +++ b/vcsh @@ -106,13 +106,16 @@ help() { commit Commit in all repositories delete Delete an existing repository enter Enter repository; spawn new instance of \$SHELL + foreach [<-g>] + Execute a command for every repository help Display this help text init Initialize a new repository list List all repositories list-tracked \\ [] List all files tracked all or one repositories list-untracked \\ - [<-r>] [] List all files not tracked by all or one repositories + [<-a>] [<-r>] + [] List all files not tracked by all or one repositories pull Pull from all vcsh remotes push Push to vcsh remotes rename \\ @@ -220,6 +223,27 @@ enter() { hook post-enter } +foreach() { + hook pre-foreach + + # We default to prefixing `git` to all commands passed to foreach, but + # allow running in general context with -g + command_prefix=git + while getopts "g" flag; do + if [ x"$1" = x'-g' ]; then + unset command_prefix + fi + shift 1 + done + for VCSH_REPO_NAME in $(list); do + echo "$VCSH_REPO_NAME:" + GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR + use + $command_prefix "$@" + done + hook post-foreach +} + git_dir_exists() { [ -d "$GIT_DIR" ] || fatal "no repository found for '$VCSH_REPO_NAME'" 12 } @@ -280,10 +304,13 @@ list_untracked() { temp_file_untracked_copy=$(mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX") || fatal 'Could not create temp file' # Hack in support for `vcsh list-untracked -r`... + exclude_standard_opt='--exclude-standard' directory_opt="--directory" shift 1 - while getopts "r" flag; do - if [ x"$1" = x'-r' ]; then + while getopts "ar" flag; do + if [ x"$1" = x'-a' ]; then + unset exclude_standard_opt + elif [ x"$1" = x'-r' ]; then unset directory_opt fi shift 1 @@ -306,7 +333,7 @@ list_untracked() { list_untracked_helper() { export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" - git ls-files --others "$directory_opt" | ( + git ls-files --others $exclude_standard_opt "$directory_opt" | ( while read line; do echo "$line" directory_component=${line%%/*} @@ -559,6 +586,9 @@ elif [ x"$VCSH_COMMAND" = x'delete' ] || [ x"$VCSH_COMMAND" = x'rename' ] && { VCSH_REPO_NAME_NEW=$3; export VCSH_REPO_NAME_NEW; GIT_DIR_NEW=$VCSH_REPO_D/$VCSH_REPO_NAME_NEW.git; export GIT_DIR_NEW; } [ x"$VCSH_COMMAND" = x'run' ] && shift 2 +elif [ x"$VCSH_COMMAND" = x'foreach' ]; then + [ -z "$2" ] && fatal "$VCSH_COMMAND: please specify a command" 1 + shift 1 elif [ x"$VCSH_COMMAND" = x'commit' ] || [ x"$VCSH_COMMAND" = x'list' ] || [ x"$VCSH_COMMAND" = x'list-tracked' ] ||