]>
git.madduck.net Git - code/myrepos.git/blobdiff - mr
madduck's git repository
Every one of the projects in this repository is available at the canonical
URL git://git.madduck.net/madduck/pub/<projectpath> — see
each project's metadata for the exact URL.
All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@ git. madduck. net .
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
SSH access, as well as push access can be individually
arranged .
If you use my repositories frequently, consider adding the following
snippet to ~/.gitconfig and using the third clone URL listed for each
project:
[url "git://git.madduck.net/madduck/"]
insteadOf = madduck:
-B<mr> [options] register repository
+B<mr> [options] register [repository]
B<mr> [options] config section [parameter=[value] ...]
B<mr> [options] config section [parameter=[value] ...]
-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.
-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:
For example, to add (or edit) a repository in src/foo:
=item skip
If the "skip" parameter is set and its command returns nonzero, then B<mr>
=item skip
If the "skip" parameter is set and its command returns nonzero, then B<mr>
-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 ]
foreach (@ARGV) {
if (/^([^=]+)=(.*)$/) {
foreach (@ARGV) {
if (/^([^=]+)=(.*)$/) {
- 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') {
exit 0;
}
elsif ($action eq 'register') {
if (exists $config{$topdir}{$subdir}{deleted}) {
if (! -d $dir) {
if (exists $config{$topdir}{$subdir}{deleted}) {
if (! -d $dir) {
}
else {
my $test="set -e;".$lib.$config{$topdir}{$subdir}{deleted};
}
else {
my $test="set -e;".$lib.$config{$topdir}{$subdir}{deleted};
$ENV{MR_REPO}=$dir;
if (exists $config{$topdir}{$subdir}{skip}) {
$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) {
print "mr $action: running skip test >>$test<<\n" if $verbose;
my $ret=system($test);
if ($ret >> 8 == 0) {
+ if (! -e $f) {
+ return;
+ }
+
my $absf=abs_path($f);
if ($loaded{$absf}) {
return;
my $absf=abs_path($f);
if ($loaded{$absf}) {
return;
my %changefields=@_;
my @lines;
my %changefields=@_;
my @lines;
if (-e $f) {
open(my $in, "<", $f) || die "mr: open $f: $!\n";
@lines=<$in>;
close $in;
}
if (-e $f) {
open(my $in, "<", $f) || die "mr: open $f: $!\n";
@lines=<$in>;
close $in;
}
+ my $addfields=sub {
+ my @blanks;
+ while ($out[$#out] =~ /^\s*$/) {
+ unshift @blanks, pop @out;
+ }
+ foreach my $field (sort keys %changefields) {
+ if (length $changefields{$field}) {
+ push @out, "$field = $changefields{$field}\n";
+ }
+ }
+ push @out, @blanks;
+ };
+
while (@lines) {
$_=shift(@lines);
while (@lines) {
$_=shift(@lines);
elsif (/^\s*\[([^\]]*)\]\s*$/) {
if (defined $section &&
$section eq $targetsection) {
elsif (/^\s*\[([^\]]*)\]\s*$/) {
if (defined $section &&
$section eq $targetsection) {
- my @blanks;
- while ($out[$#out] =~ /^\s*$/) {
- unshift @blanks, pop @out;
- }
- foreach my $field (sort keys %changefields) {
- if (length $changefields{$field}) {
- push @out, "$field = $changefields{$field}\n";
- }
- }
- push @out, @blanks;
+ if (defined $section &&
+ $section eq $targetsection) {
+ $addfields->();
+ }
+ elsif (%changefields) {
push @out, "\n[$targetsection]\n";
foreach my $field (sort keys %changefields) {
if (length $changefields{$field}) {
push @out, "\n[$targetsection]\n";
foreach my $field (sort keys %changefields) {
if (length $changefields{$field}) {
-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" \
-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" \
-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" \
-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" \
-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" \
- if [ -z "$1" ]; then \
- error "repository directory not specified" \
+ if [ -n "$1" ]; then \
+ cd "$1" \
basedir="$(basename $(pwd))" \
if [ -d .svn ]; then \
basedir="$(basename $(pwd))" \
if [ -d .svn ]; then \
+ url=$(LANG=C svn info . | \
grep -i ^URL: | cut -d ' ' -f 2) \
if [ -z "$url" ]; then \
error "cannot determine svn url" \
grep -i ^URL: | cut -d ' ' -f 2) \
if [ -z "$url" ]; then \
error "cannot determine svn url" \
echo "Registering svn url: $url" \
mr config "$(pwd)" checkout="svn co $url $basedir" \
elif [ -d .git ]; then \
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" \
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 =
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.."
error "pod2man or man failed"
ed = echo "A horse is a horse, of course, of course.."