X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/2f861a437094ba6d5106b3b96823788b935f82f2..b98f33c78f807d0a66d27ec56e2efbe240bd4502:/mr?ds=inline diff --git a/mr b/mr index 96f3a16..06829d2 100755 --- a/mr +++ b/mr @@ -18,7 +18,7 @@ B [options] diff B [options] log -B [options] register repository +B [options] register [repository] B [options] config section [parameter=[value] ...] @@ -80,14 +80,17 @@ List the repositories that mr will act on. =item register -The next parameter is the directory of an existing repository. The -repository will be registered in the mrconfig file. +Register an existing repository in the mrconfig file. By default, the +epository in the current directory is registered, or you can specify a +directory to register. =item config -Modifies the mrconfig file. The next parameter is the name of the section -to add or modify, and it is followed by one or more instances of -"parameter=value". Use "parameter=" to remove a parameter. +Adds, modifies, removed, or prints a value from the mrconfig file. The next +parameter is the name of the section the value is in. To add or modify a +value, follow it by one or more instances of "parameter=value". Use +"parameter=" to remove a parameter. Use just "parameter" to get the value +of a parameter. For example, to add (or edit) a repository in src/foo: @@ -177,7 +180,16 @@ A few parameters have special meanings: =item skip If the "skip" parameter is set and its command returns nonzero, then B -will skip acting on that repository. +will skip acting on that repository. The command is passed the action +name in $1. + +Here are two examples. The first skips the repo unless +mr is run by joey. The second uses the hours_since function +(included in mr's built-in library) to skip updating the repo unless it's +been at least 12 hours since the last update. + + skip = test $(whoami) != joey + skip = [ "$1" = update ] && [ $(hours_since "$1") -lt 12 ] =item chain @@ -281,16 +293,21 @@ elsif ($action eq 'config') { $section=$1; } } - my %fields; + my %changefields; foreach (@ARGV) { if (/^([^=]+)=(.*)$/) { - $fields{$1}=$2; + $changefields{$1}=$2; } else { - die "mr config: expected parameter=value, not \"$_\"\n"; + foreach my $topdir (sort keys %config) { + if (exists $config{$topdir}{$section} && + exists $config{$topdir}{$section}{$_}) { + print $config{$topdir}{$section}{$_}."\n"; + } + } } } - modifyconfig($config, $section, %fields); + modifyconfig($config, $section, %changefields) if %changefields; exit 0; } elsif ($action eq 'register') { @@ -377,7 +394,8 @@ sub action { $ENV{MR_REPO}=$dir; if (exists $config{$topdir}{$subdir}{skip}) { - my $test="set -e;".$lib.$config{$topdir}{$subdir}{skip}; + my $test="set -e;".$lib. + "my_action(){ $config{$topdir}{$subdir}{skip}\n }; my_action '$action'"; print "mr $action: running skip test >>$test<<\n" if $verbose; my $ret=system($test); if ($ret >> 8 == 0) { @@ -643,80 +661,92 @@ __DATA__ ls = list [DEFAULT] -lib = \ - error() { \ - echo "mr: $@" >&2 \ - exit 1 \ +lib = \ + error() { \ + echo "mr: $@" >&2 \ + exit 1 \ + } \ + hours_since() { \ + for dir in .git .svn .bzr CVS; do \ + if [ -e "$MR_REPO/$dir" ]; then \ + flagfile="$MR_REPO/$dir/.mr_last$1" \ + break \ + fi \ + done \ + if [ -z "$flagfile" ]; then \ + error "cannot determine flag filename" \ + fi \ + perl -wle 'print -f shift() ? int((-M _) * 24) : 9999' "$flagfile" \ + touch "$flagfile" \ } -update = \ - if [ -d "$MR_REPO"/.svn ]; then \ - svn update "$@" \ - elif [ -d "$MR_REPO"/.git ]; then \ - git pull origin master "$@" \ - elif [ -d "$MR_REPO"/.bzr ]; then \ - bzr merge "$@" \ - elif [ -d "$MR_REPO"/CVS ]; then \ - cvs update "$@" \ - else \ - error "unknown repo type" \ +update = \ + if [ -d "$MR_REPO"/.svn ]; then \ + svn update "$@" \ + elif [ -d "$MR_REPO"/.git ]; then \ + git pull origin master "$@" \ + elif [ -d "$MR_REPO"/.bzr ]; then \ + bzr merge "$@" \ + elif [ -d "$MR_REPO"/CVS ]; then \ + cvs update "$@" \ + else \ + error "unknown repo type" \ fi -status = \ - if [ -d "$MR_REPO"/.svn ]; then \ - svn status "$@" \ - elif [ -d "$MR_REPO"/.git ]; then \ - git status "$@" || true \ - elif [ -d "$MR_REPO"/.bzr ]; then \ - bzr status "$@" \ - elif [ -d "$MR_REPO"/CVS ]; then \ - cvs status "$@" \ - else \ - error "unknown repo type" \ +status = \ + if [ -d "$MR_REPO"/.svn ]; then \ + svn status "$@" \ + elif [ -d "$MR_REPO"/.git ]; then \ + git status "$@" || true \ + elif [ -d "$MR_REPO"/.bzr ]; then \ + bzr status "$@" \ + elif [ -d "$MR_REPO"/CVS ]; then \ + cvs status "$@" \ + else \ + error "unknown repo type" \ fi -commit = \ - if [ -d "$MR_REPO"/.svn ]; then \ - svn commit "$@" \ - elif [ -d "$MR_REPO"/.git ]; then \ - git commit -a "$@" && git push --all \ - elif [ -d "$MR_REPO"/.bzr ]; then \ - bzr commit "$@" && bzr push \ - elif [ -d "$MR_REPO"/CVS ]; then \ - cvs commit "$@" \ - else \ - error "unknown repo type" \ +commit = \ + if [ -d "$MR_REPO"/.svn ]; then \ + svn commit "$@" \ + elif [ -d "$MR_REPO"/.git ]; then \ + git commit -a "$@" && git push --all \ + elif [ -d "$MR_REPO"/.bzr ]; then \ + bzr commit "$@" && bzr push \ + elif [ -d "$MR_REPO"/CVS ]; then \ + cvs commit "$@" \ + else \ + error "unknown repo type" \ fi -diff = \ - if [ -d "$MR_REPO"/.svn ]; then \ - svn diff "$@" \ - elif [ -d "$MR_REPO"/.git ]; then \ - git diff "$@" \ - elif [ -d "$MR_REPO"/.bzr ]; then \ - bzr diff "$@" \ - elif [ -d "$MR_REPO"/CVS ]; then \ - cvs diff "$@" \ - else \ - error "unknown repo type" \ +diff = \ + if [ -d "$MR_REPO"/.svn ]; then \ + svn diff "$@" \ + elif [ -d "$MR_REPO"/.git ]; then \ + git diff "$@" \ + elif [ -d "$MR_REPO"/.bzr ]; then \ + bzr diff "$@" \ + elif [ -d "$MR_REPO"/CVS ]; then \ + cvs diff "$@" \ + else \ + error "unknown repo type" \ fi -log = \ - if [ -d "$MR_REPO"/.svn ]; then \ - svn log"$@" \ - elif [ -d "$MR_REPO"/.git ]; then \ - git log "$@" \ - elif [ -d "$MR_REPO"/.bzr ]; then \ - bzr log "$@" \ - elif [ -d "$MR_REPO"/CVS ]; then \ - cvs log "$@" \ - else \ - error "unknown repo type" \ +log = \ + if [ -d "$MR_REPO"/.svn ]; then \ + svn log"$@" \ + elif [ -d "$MR_REPO"/.git ]; then \ + git log "$@" \ + elif [ -d "$MR_REPO"/.bzr ]; then \ + bzr log "$@" \ + elif [ -d "$MR_REPO"/CVS ]; then \ + cvs log "$@" \ + else \ + error "unknown repo type" \ fi register = \ - if [ -z "$1" ]; then \ - error "repository directory not specified" \ + if [ -n "$1" ]; then \ + cd "$1" \ fi \ - cd "$1" \ basedir="$(basename $(pwd))" \ if [ -d .svn ]; then \ - url=$(svn info . | \ + url=$(LANG=C svn info . | \ grep -i ^URL: | cut -d ' ' -f 2) \ if [ -z "$url" ]; then \ error "cannot determine svn url" \ @@ -724,22 +754,29 @@ register = \ echo "Registering svn url: $url" \ mr config "$(pwd)" checkout="svn co $url $basedir" \ elif [ -d .git ]; then \ - url=$(git-config --get remote.origin.url) \ + url=$(LANG=C git-config --get remote.origin.url) \ if [ -z "$url" ]; then \ error "cannot determine git url" \ fi \ echo "Registering git url: $url" \ mr config "$(pwd)" checkout="git clone $url $basedir" \ + elif [ -d .bzr ]; then \ + url=$(cat .bzr/branch/parent) \ + if [ -z "$url" ]; then \ + error "cannot determine bzr url" \ + fi \ + echo "Registering bzr url: $url" \ + mr config "$(pwd)" checkout="bzr clone $url $basedir" \ else \ error "unable to register this repo type" \ fi list = true config = -help = \ - if [ ! -e "$MR_PATH" ]; then \ - error "cannot find program path" \ - fi \ - (pod2man -c mr "$MR_PATH" | man -l -) || \ +help = \ + if [ ! -e "$MR_PATH" ]; then \ + error "cannot find program path" \ + fi \ + (pod2man -c mr "$MR_PATH" | man -l -) || \ error "pod2man or man failed" ed = echo "A horse is a horse, of course, of course.."