diff --git a/.mailmap b/.mailmap index 5c4d110333efc155fbbe94b905a3f3baa3de0c92..65c64b49bd9b9775e4cd36883013fb6f27833634 100644 --- a/.mailmap +++ b/.mailmap @@ -1,3 +1,4 @@ Richard Hartmann <richih@debian.org> <richih+github.com@richih.org> Richard Hartmann <richih@debian.org> <richih.mailinglist@gmail.com> +Richard Hartmann <richih@debian.org> <RichiH@users.noreply.github.com> Alexander Skurikhin <a.skurihin@gmail.com> <a.skurihin@gmail.com> diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 6fc85f0a3c21a3fd9ec229817c9321e3b0857907..2dad8ed3f7ed610fac2812cbe68730758925e629 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,12 +1,18 @@ -Alphabetical list of everyone who ever committed to this repository +Alphabetical list of surnames of everyone who ever committed to this repository. +Auto-generated from tools/list_CONTRIBUTORS. +Eric Bouchut <ebouchut@gmail.com> +Dridi Boukelmoune <dridi.boukelmoune@gmail.com> Vincent Demeester <vincent@demeester.fr> Thomas Ferris Nicolaisen <tfnico@gmail.com> martin f. krafft <madduck@madduck.net> Alessandro Ghedini <alessandro@ghedini.me> Valentin Haenel <valentin.haenel@gmx.de> Richard Hartmann <richih@debian.org> +Gregor Jasny <gjasny@googlemail.com> +Caleb Maclennan <caleb@alerque.com> mek-apelsin <mek@pels.in> +Evan Pitstick <nerdx00@gmail.com> Dieter Plaetinck <dieter@plaetinck.be> Corey Quinn <corey@sequestered.net> Gernot Schulz <post@gernot-schulz.com> diff --git a/Makefile b/Makefile index cb112c72b619dec628d167f17f75630a99bb34fd..4ae8d889c5f1bd35c5fc915426e008418507d881 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,8 @@ PREFIX=/usr +DOCDIR_PREFIX=$(PREFIX)/share/doc +DOCDIR=$(DOCDIR_PREFIX)/$(self) +ZSHDIR=$(PREFIX)/share/zsh/vendor-completions +RONN ?= ronn self=vcsh manpages=$(self).1 @@ -11,16 +15,16 @@ install: all install -m 0755 $(self) $(DESTDIR)$(PREFIX)/bin install -d $(DESTDIR)$(PREFIX)/share/man/man1 install -m 0644 $(manpages) $(DESTDIR)$(PREFIX)/share/man/man1 - install -d $(DESTDIR)$(PREFIX)/share/doc/$(self) - install -m 0644 README.md $(DESTDIR)$(PREFIX)/share/doc/$(self) - install -m 0644 doc/hooks $(DESTDIR)$(PREFIX)/share/doc/$(self) - install -d $(DESTDIR)$(PREFIX)/share/zsh/vendor-completions - install -m 0644 _$(self) $(DESTDIR)$(PREFIX)/share/zsh/vendor-completions + install -d $(DESTDIR)$(DOCDIR) + install -m 0644 README.md $(DESTDIR)$(DOCDIR) + install -m 0644 doc/hooks $(DESTDIR)$(DOCDIR) + install -d $(DESTDIR)$(ZSHDIR) + install -m 0644 _$(self) $(DESTDIR)$(ZSHDIR) manpages: $(manpages) $(self).1: doc/$(self).1.ronn - ronn < doc/$(self).1.ronn > $(self).1 + $(RONN) < doc/$(self).1.ronn > $(self).1 || rm $(self).1 clean: rm -rf $(self).1 @@ -28,19 +32,19 @@ clean: uninstall: rm -rf $(DESTDIR)$(PREFIX)/bin/$(self) rm -rf $(DESTDIR)$(PREFIX)/share/man/man1/$(self).1 - rm -rf $(DESTDIR)$(PREFIX)/share/doc/$(self) - rm -rf $(DESTDIR)$(PREFIX)/share/zsh/vendor-completions/_$(self) + rm -rf $(DESTDIR)$(DOCDIR) + rm -rf $(DESTDIR)$(ZSHDIR)/_$(self) # Potentially harmful, used a non-standard option on purpose. # If PREFIX=/usr/local and that's empty... purge: uninstall rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/bin/ rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/man/man1/ - rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/doc/ - rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/zsh/vendor-completions/ + rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(DOCDIR_PREFIX) + rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(ZSHDIR) test: - if which git > /dev/null ; then :; else echo "'git' not found, exiting..."; exit 1; fi + @if which git > /dev/null ; then :; else echo "'git' not found, exiting..."; exit 1; fi moo: @if [ -x /usr/games/cowsay ]; then /usr/games/cowsay "I hope you're happy now..."; fi diff --git a/README.md b/README.md index e0f78375672f506cf12114218822269b367cb66a..6166a6740c58465cd703192ed2d9269e769bcf41 100644 --- a/README.md +++ b/README.md @@ -196,10 +196,10 @@ this repository and fork your own. [$XDG_CONFIG_HOME/vcsh/repo.d/zsh.git] checkout = vcsh clone 'git://github.com/RichiH/zshrc.git' zsh - update = vcsh run zsh git pull - push = vcsh run zsh git push - status = vcsh run zsh git status - gc = vcsh run zsh git gc + update = vcsh zsh pull + push = vcsh zsh push + status = vcsh zsh status + gc = vcsh zsh gc ### config.d @@ -230,7 +230,7 @@ document (see above). vcsh will check if any file it would want to create exists. If it exists, vcsh will throw a warning and exit. Move away your old config and try again. Optionally, merge your local and your global configs afterwards and push with -`vcsh run foo git push`. +`vcsh foo push`. ## Moving into a New Host @@ -334,10 +334,10 @@ Now, it's time to edit the template config and fill it with your own remotes: And then create your own stuff: vcsh init foo - vcsh run foo git add -f bar baz quux - vcsh run foo git remote add origin git://quuux - vcsh run foo git commit - vcsh run foo git push + vcsh foo add bar baz quux + vcsh foo remote add origin git://quuux + vcsh foo commit + vcsh foo push cp $XDG_CONFIG_HOME/mr/available.d/mr.vcsh $XDG_CONFIG_HOME/mr/available.d/foo.vcsh vim $XDG_CONFIG_HOME/mr/available.d/foo.vcsh # add your own repo @@ -411,13 +411,9 @@ Neat. After you have made some changes, for which you would normally use `git add` and `git commit`, use the vcsh wrapper (like above): - vcsh run foo git add -f bar baz quux - vcsh run foo git commit - vcsh run foo git push - -By the way, you'll have to use -f/--force flag with git-add because all files -will be ignored by default. This is to show you only useful output when running -git-status. A fix for this problem is being worked on. + vcsh foo add bar baz quux + vcsh foo commit + vcsh foo push ### Using vcsh without mr @@ -434,9 +430,9 @@ To clone a repository: `vcsh clone ssh://<remote>/zsh.git` To interact with a repository, use the regular Git commands, but prepend them with `vcsh run $repository_name`. For example: - vcsh run zsh git status - vcsh run zsh git add -f .zshrc - vcsh run zsh git commit + vcsh zsh status + vcsh zsh add .zshrc + vcsh zsh commit Obviously, without mr keeping repositories up-to-date, it will have to be done manually. Alternatively, you could try something like this: diff --git a/changelog b/changelog index da31aec40dec60613d67901ac33470a7afbf661b..b0bac5d205166c3e704c18b4c85c3ce10d0fe2e9 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,14 @@ +2013-12-14 Richard Hartmann <richih.mailinglist@gmail.com> + + * Release 1.20131214 + * Revert "Implement basename() in shell" + * Fix mktemp on OS X + * Fix variable assignment bug + * Support shortnames for commands + * Improve Makefile + * Improve documentation + * Various minor improvements + 2013-09-09 Richard Hartmann <richih.mailinglist@gmail.com> * Release 1.20130909 diff --git a/tools/list_CONTRIBUTORS b/tools/list_CONTRIBUTORS index 351820564a77614b5b10f335d38cf5ba549d76fa..2954f583ab23df5fc286f7ee270d324f333b39df 100755 --- a/tools/list_CONTRIBUTORS +++ b/tools/list_CONTRIBUTORS @@ -1,5 +1,6 @@ #!/bin/sh -echo 'Alphabetical list of everyone who ever committed to this repository +echo 'Alphabetical list of surnames of everyone who ever committed to this repository. +Auto-generated from tools/list_CONTRIBUTORS. ' git shortlog -se --all | cut -f1 --complement | sort -u -k2 diff --git a/vcsh b/vcsh index 508c087a9aae50fb7736b5e0ddefb2ef6fe33dbf..2b7528f2864986c0530334a23ee50c4c756274bf 100755 --- a/vcsh +++ b/vcsh @@ -15,16 +15,8 @@ # This should always be the first line of code to facilitate debugging [ -n "$VCSH_DEBUG" ] && set -vx -basename() { - # Implemented in shell to avoid spawning another process - local file - file="${1##*/}" - [ -z "$2" ] || file="${file%$2}" - echo "$file" -} - SELF=$(basename $0) -VERSION='1.20130909' +VERSION='1.20131214' fatal() { echo "$SELF: fatal: $1" >&2 @@ -159,11 +151,11 @@ clone() { for object in $(git ls-tree -r origin/master | awk '{print $4}'); do [ -e "$object" ] && error "'$object' exists." && - VCSH_CONFLICT=1; + VCSH_CONFLICT=1 done [ "$VCSH_CONFLICT" = '1' ] && fatal "will stop after fetching and not try to merge! - Once this situation has been resolved, run 'vcsh run $VCSH_REPO_NAME git pull' to finish cloning.\n" 17 + Once this situation has been resolved, run 'vcsh run $VCSH_REPO_NAME git pull' to finish cloning." 17 git merge origin/master hook post-clone retire @@ -288,7 +280,7 @@ rename() { # Now that the repository has been renamed, we need to fix up its configuration # Overwrite old name.. GIT_DIR="$GIT_DIR_NEW" - $VCSH_REPO_NAME="$VCSH_REPO_NAME_NEW" + VCSH_REPO_NAME="$VCSH_REPO_NAME_NEW" # ..and clobber all old configuration upgrade } @@ -365,7 +357,11 @@ write_gitignore() { file="$new" done; done | sort -u) - tempfile=$(mktemp) || fatal "could not create tempfile" 51 + + # Contrary to GNU mktemp, mktemp on BSD/OSX requires a template for temp files + # Use the template GNU mktemo defaults to + tempfile=$(mktemp tmp.XXXXXXXXXX) || fatal "could not create tempfile" 51 + echo '*' > "$tempfile" || fatal "could not write to '$tempfile'" 57 for gitignore in $gitignores; do echo "$gitignore" | sed 's@^@!/@' >> "$tempfile" || fatal "could not write to '$tempfile'" 57 @@ -386,46 +382,69 @@ write_gitignore() { fatal "could not move '$tempfile' to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME'" 53 } -if [ "$1" = 'clone' ]; then - [ -z "$2" ] && fatal "$1: please specify a remote" 1 - export VCSH_COMMAND="$1" +debug `git version` + +if [ ! "x$VCSH_GITIGNORE" = 'xexact' ] && [ ! "x$VCSH_GITIGNORE" = 'xnone' ] && [ ! "x$VCSH_GITIGNORE" = 'xrecursive' ]; then + fatal "'\$VCSH_GITIGNORE' must equal 'exact', 'none', or 'recursive'" 1 +fi + +export VCSH_COMMAND="$1" + +[ "$VCSH_COMMAND" = 'clon' ] || [ "$VCSH_COMMAND" = 'clo' ] || [ "$VCSH_COMMAND" = 'cl' ] && VCSH_COMMAND='clone' +[ "$VCSH_COMMAND" = 'commi' ] || [ "$VCSH_COMMAND" = 'comm' ] || [ "$VCSH_COMMAND" = 'com' ] || [ "$VCSH_COMMAND" = 'co' ] && VCSH_COMMAND='commit' +[ "$VCSH_COMMAND" = 'delet' ] || [ "$VCSH_COMMAND" = 'dele' ] || [ "$VCSH_COMMAND" = 'del' ] || [ "$VCSH_COMMAND" = 'de' ] && VCSH_COMMAND='delete' +[ "$VCSH_COMMAND" = 'ente' ] || [ "$VCSH_COMMAND" = 'ent' ] || [ "$VCSH_COMMAND" = 'en' ] && VCSH_COMMAND='enter' +[ "$VCSH_COMMAND" = 'hel' ] || [ "$VCSH_COMMAND" = 'he' ] && VCSH_COMMAND='help' +[ "$VCSH_COMMAND" = 'ini' ] || [ "$VCSH_COMMAND" = 'in' ] && VCSH_COMMAND='init' +[ "$VCSH_COMMAND" = 'pul' ] && VCSH_COMMAND='pull' +[ "$VCSH_COMMAND" = 'pus' ] && VCSH_COMMAND='push' +[ "$VCSH_COMMAND" = 'renam' ] || [ "$VCSH_COMMAND" = 'rena' ] || [ "$VCSH_COMMAND" = 'ren' ] || [ "$VCSH_COMMAND" = 're' ] && VCSH_COMMAND='rename' +[ "$VCSH_COMMAND" = 'ru' ] && VCSH_COMMAND='run' +[ "$VCSH_COMMAND" = 'statu' ] || [ "$VCSH_COMMAND" = 'stat' ] || [ "$VCSH_COMMAND" = 'sta' ] || [ "$VCSH_COMMAND" = 'st' ] && VCSH_COMMAND='status' +[ "$VCSH_COMMAND" = 'upgrad' ] || [ "$VCSH_COMMAND" = 'upgra' ] || [ "$VCSH_COMMAND" = 'upgr' ] || [ "$VCSH_COMMAND" = 'upg' ] && VCSH_COMMAND='upgrade' +[ "$VCSH_COMMAND" = 'versio' ] || [ "$VCSH_COMMAND" = 'versi' ] || [ "$VCSH_COMMAND" = 'vers' ] || [ "$VCSH_COMMAND" = 'ver' ] || [ "$VCSH_COMMAND" = 've' ] && VCSH_COMMAND='version' +[ "$VCSH_COMMAND" = 'whic' ] || [ "$VCSH_COMMAND" = 'whi' ] || [ "$VCSH_COMMAND" = 'wh' ] && VCSH_COMMAND='which' +[ "$VCSH_COMMAND" = 'write' ] || [ "$VCSH_COMMAND" = 'writ' ] || [ "$VCSH_COMMAND" = 'wri' ] || [ "$VCSH_COMMAND" = 'wr' ] && VCSH_COMMAND='write-gitignore' + + +if [ "$VCSH_COMMAND" = 'clone' ]; then + [ -z "$2" ] && fatal "$VCSH_COMMAND: please specify a remote" 1 GIT_REMOTE="$2" [ -n "$3" ] && VCSH_REPO_NAME="$3" || VCSH_REPO_NAME=$(basename "$GIT_REMOTE" .git) + [ -z "$VCSH_REPO_NAME" ] && fatal "$VCSH_COMMAND: could not determine repository name" 1 export VCSH_REPO_NAME export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" -elif [ "$1" = 'version' ]; then +elif [ "$VCSH_COMMAND" = 'version' ]; then echo "$SELF $VERSION" + git version exit -elif [ "$1" = 'which' ]; then - [ -z "$2" ] && fatal "$1: please specify a filename" 1 - [ -n "$3" ] && fatal "$1: too many parameters" 1 - export VCSH_COMMAND="$1" +elif [ "$VCSH_COMMAND" = 'which' ]; then + [ -z "$2" ] && fatal "$VCSH_COMMAND: please specify a filename" 1 + [ -n "$3" ] && fatal "$VCSH_COMMAND: too many parameters" 1 export VCSH_COMMAND_PARAMETER="$2" -elif [ "$1" = 'delete' ] || - [ "$1" = 'enter' ] || - [ "$1" = 'init' ] || - [ "$1" = 'list-tracked-by' ] || - [ "$1" = 'rename' ] || - [ "$1" = 'run' ] || - [ "$1" = 'upgrade' ] || - [ "$1" = 'write-gitignore' ]; then - [ -z $2 ] && fatal "$1: please specify repository to work on" 1 - [ "$1" = 'rename' -a -z "$3" ] && fatal "$1: please specify a target name" 1 - [ "$1" = 'run' -a -z "$3" ] && fatal "$1: please specify a command" 1 - export VCSH_COMMAND="$1" +elif [ "$VCSH_COMMAND" = 'delete' ] || + [ "$VCSH_COMMAND" = 'enter' ] || + [ "$VCSH_COMMAND" = 'init' ] || + [ "$VCSH_COMMAND" = 'list-tracked-by' ] || + [ "$VCSH_COMMAND" = 'rename' ] || + [ "$VCSH_COMMAND" = 'run' ] || + [ "$VCSH_COMMAND" = 'upgrade' ] || + [ "$VCSH_COMMAND" = 'write-gitignore' ]; then + [ -z $2 ] && fatal "$VCSH_COMMAND: please specify repository to work on" 1 + [ "$VCSH_COMMAND" = 'rename' -a -z "$3" ] && fatal "$VCSH_COMMAND: please specify a target name" 1 + [ "$VCSH_COMMAND" = 'run' -a -z "$3" ] && fatal "$VCSH_COMMAND: please specify a command" 1 export VCSH_REPO_NAME="$2" export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" [ "$VCSH_COMMAND" = 'rename' ] && { export VCSH_REPO_NAME_NEW="$3"; export GIT_DIR_NEW="$VCSH_REPO_D/$VCSH_REPO_NAME_NEW.git"; } [ "$VCSH_COMMAND" = 'run' ] && shift 2 -elif [ "$1" = 'commit' ] || - [ "$1" = 'list' ] || - [ "$1" = 'list-tracked' ] || - [ "$1" = 'pull' ] || - [ "$1" = 'push' ]; then - export VCSH_COMMAND="$1" -elif [ "$1" = 'status' ]; then - export VCSH_COMMAND="$1" +elif [ "$VCSH_COMMAND" = 'commit' ] || + [ "$VCSH_COMMAND" = 'list' ] || + [ "$VCSH_COMMAND" = 'list-tracked' ] || + [ "$VCSH_COMMAND" = 'pull' ] || + [ "$VCSH_COMMAND" = 'push' ]; then + : +elif [ "$VCSH_COMMAND" = 'status' ]; then export VCSH_REPO_NAME="$2" elif [ -n "$2" ]; then export VCSH_COMMAND='run' @@ -434,7 +453,7 @@ elif [ -n "$2" ]; then [ -d $GIT_DIR ] || { help; exit 1; } shift 1 set -- "git" "$@" -elif [ -n "$1" ]; then +elif [ -n "$VCSH_COMMAND" ]; then export VCSH_COMMAND='enter' export VCSH_REPO_NAME="$1" export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"