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 564ccbb22ec659db975b34f76a103bbc9e952592..da31aec40dec60613d67901ac33470a7afbf661b 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,8 @@ +2013-09-09 Richard Hartmann <richih.mailinglist@gmail.com> + + * Release 1.20130909 + * Add support for relative worktrees + 2013-08-29 Richard Hartmann <richih.mailinglist@gmail.com> * Release 1.20130829 diff --git a/doc/vcsh.1.ronn b/doc/vcsh.1.ronn index 89ebff5a161a60eb8a1b2857259392a7addf1133..56df4ed26e74cdbb7a4109056b8415570843d846 100644 --- a/doc/vcsh.1.ronn +++ b/doc/vcsh.1.ronn @@ -184,6 +184,15 @@ Interesting knobs you can turn: Defaults to <exact>. +* <$VCSH_VCSH_WORKTREE>: + Can be <absolute>, or <relative>. + + <absolute> will set an absolute path; defaulting to <$HOME>. + + <relative> will set a path relative to <$GIT_DIR>. + + Defaults to <absolute>. + Less interesting knobs you could turn: * <$VCSH_DEBUG>: 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 2ec49557b39b6d00d39d37eb70762d7fe5956538..39240093afd50dd0a47b528abb2249fedf9e1d27 100755 --- a/vcsh +++ b/vcsh @@ -24,7 +24,7 @@ basename() { } SELF=$(basename $0) -VERSION='1.20130829' +VERSION='1.20130909.git-HEAD' fatal() { echo "$SELF: fatal: $1" >&2 @@ -81,6 +81,15 @@ fi [ -z "$VCSH_HOOK_D" ] && VCSH_HOOK_D="$XDG_CONFIG_HOME/vcsh/hooks-enabled" [ -z "$VCSH_BASE" ] && VCSH_BASE="$HOME" [ -z "$VCSH_GITIGNORE" ] && VCSH_GITIGNORE='exact' +[ -z "$VCSH_WORKTREE" ] && VCSH_WORKTREE='absolute' + +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 + +if [ ! "x$VCSH_WORKTREE" = 'xabsolute' ] && [ ! "x$VCSH_WORKTREE" = 'xrelative' ]; then + fatal "'\$VCSH_WORKTREE' must equal 'absolute', or 'relative'" 1 +fi help() { @@ -150,11 +159,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 @@ -214,9 +223,8 @@ hook() { init() { hook pre-init [ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10 - export GIT_WORK_TREE="$VCSH_BASE" - mkdir -p "$GIT_WORK_TREE" || fatal "could not create '$GIT_WORK_TREE'" 50 - cd "$GIT_WORK_TREE" || fatal "could not enter '$GIT_WORK_TREE'" 11 + mkdir -p "$VCSH_BASE" || fatal "could not create '$VCSH_BASE'" 50 + cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11 git init upgrade hook post-init @@ -269,7 +277,6 @@ push() { } retire() { - unset GIT_WORK_TREE unset VCSH_DIRECTORY } @@ -311,17 +318,26 @@ status() { upgrade() { hook pre-upgrade - use - git config core.worktree "$GIT_WORK_TREE" + # fake-bare repositories are not bare, actually. Set this to false + # because otherwise Git complains "fatal: core.bare and core.worktree + # do not make sense" + git config core.bare false + # core.worktree may be absolute or relative to $GIT_DIR, depending on + # user preference + if [ ! "x$VCSH_WORKTREE" = 'xabsolute' ]; then + git config core.worktree $(cd $GIT_DIR && GIT_WORK_TREE="$VCSH_BASE" git rev-parse --show-cdup) + elif [ ! "x$VCSH_WORKTREE" = 'xrelative' ]; then + git config core.worktree "$VCSH_BASE" + fi [ ! "x$VCSH_GITIGNORE" = 'xnone' ] && git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME" git config vcsh.vcsh 'true' + use [ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" hook post-upgrade } use() { git_dir_exists - export GIT_WORK_TREE="$(git config --get core.worktree)" export VCSH_DIRECTORY="$VCSH_REPO_NAME" } @@ -349,7 +365,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 @@ -370,50 +390,68 @@ write_gitignore() { fatal "could not move '$tempfile' to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME'" 53 } +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 -if [ "$1" = 'clone' ]; then - [ -z "$2" ] && fatal "$1: please specify a remote" 1 - export VCSH_COMMAND="$1" +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) 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' @@ -422,7 +460,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"