]>
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:
The .mrconfig file uses a variant of the INI file format. Lines starting with
"#" are comments. Lines ending with "\" are continued on to the next line.
The .mrconfig file uses a variant of the INI file format. Lines starting with
"#" are comments. Lines ending with "\" are continued on to the next line.
-The "default " section allows setting default values for the sections that
+The "DEFAULT " section allows setting default values for the sections that
-The "alias " section allows adding aliases for actions. Each parameter
+The "ALIAS " section allows adding aliases for actions. Each parameter
is an alias, and its value is the action to use.
is an alias, and its value is the action to use.
-All other sections specify where each repository is located, relative to the
-directory that contains the .mrconfig file.
+All other sections add repositories. The section header specifies the
+directory where the repository is located. This is relative to the directory
+that contains the mrconfig file, but you can also choose to use absolute
+paths.
Within a section, each parameter defines a shell command to run to handle a
given action. mr contains default handlers for the "update", "status", and
Within a section, each parameter defines a shell command to run to handle a
given action. mr contains default handlers for the "update", "status", and
will try to load a .mrconfig file from the root of the repository. (You
should avoid chaining from repositories with untrusted committers.)
will try to load a .mrconfig file from the root of the repository. (You
should avoid chaining from repositories with untrusted committers.)
+=item deleted
+
+If the "deleted" parameter is set and its command returns nonzero, then
+B<mr> will treat the repository as deleted. It won't ever actually delete
+the repository, but it will warn if it sees the repsoitory's directory.
+This is useful when one mrconfig file is shared amoung multiple machines,
+to keep track of and remember to delete old repositories.
+
=item lib
The "lib" parameter can specify some shell code that will be run before each
=item lib
The "lib" parameter can specify some shell code that will be run before each
}
if ($action eq 'help') {
}
if ($action eq 'help') {
- exec($config{''}{default }{help});
+ exec($config{''}{DEFAULT }{help});
}
# work out what repos to act on
}
# work out what repos to act on
my $nochdir=0;
foreach my $topdir (sort keys %config) {
foreach my $subdir (sort keys %{$config{$topdir}}) {
my $nochdir=0;
foreach my $topdir (sort keys %config) {
foreach my $subdir (sort keys %{$config{$topdir}}) {
- next if $subdir eq 'default';
- my $dir=$topdir.$subdir;
- next if $dir ne $directory && $dir !~ /^\Q$directory\E\//;
+ next if $subdir eq 'DEFAULT';
+ my $dir=($subdir =~/^\//) ? $subdir : $topdir.$subdir;
+ my $d=$directory;
+ $dir.="/" unless $dir=~/\/$/;
+ $d.="/" unless $d=~/\/$/;
+ next if $dir ne $directory && $dir !~ /^\Q$directory\E/;
push @repos, [$dir, $topdir, $subdir];
}
}
push @repos, [$dir, $topdir, $subdir];
}
}
# fallback to find a leaf repo
LEAF: foreach my $topdir (reverse sort keys %config) {
foreach my $subdir (reverse sort keys %{$config{$topdir}}) {
# fallback to find a leaf repo
LEAF: foreach my $topdir (reverse sort keys %config) {
foreach my $subdir (reverse sort keys %{$config{$topdir}}) {
- next if $subdir eq 'default ';
- my $dir=$topdir.$subdir;
+ next if $subdir eq 'DEFAULT ';
+ my $dir=($subdir =~/^\//) ? $subdir : $topdir.$subdir;
my $d=$directory;
$dir.="/" unless $dir=~/\/$/;
$d.="/" unless $d=~/\/$/;
my $d=$directory;
$dir.="/" unless $dir=~/\/$/;
$d.="/" unless $d=~/\/$/;
my ($action, $dir, $topdir, $subdir) = @_;
my $lib= exists $config{$topdir}{$subdir}{lib} ?
my ($action, $dir, $topdir, $subdir) = @_;
my $lib= exists $config{$topdir}{$subdir}{lib} ?
- $config{$topdir}{$subdir}{lib} : "";
+ $config{$topdir}{$subdir}{lib}."\n" : "";
+
+ if (exists $config{$topdir}{$subdir}{deleted}) {
+ if (! -d $dir) {
+ next;
+ }
+ else {
+ my $test="set -e;".$lib.$config{$topdir}{$subdir}{deleted};
+ print "mr $action: running deleted test >>$test<<\n" if $verbose;
+ my $ret=system($test);
+ if ($ret >> 8 == 0) {
+ print STDERR "mr error: $dir should be deleted yet still exists\n\n";
+ push @failed, $dir;
+ return;
+ }
+ }
+ }
if ($action eq 'checkout') {
if (-d $dir) {
if ($action eq 'checkout') {
if (-d $dir) {
if (exists $config{$topdir}{$subdir}{skip}) {
my $test="set -e;".$lib.$config{$topdir}{$subdir}{skip};
if (exists $config{$topdir}{$subdir}{skip}) {
my $test="set -e;".$lib.$config{$topdir}{$subdir}{skip};
- print "mr $action: running skip test $test \n" if $verbose;
+ print "mr $action: running skip test >>$test<< \n" if $verbose;
my $ret=system($test);
if ($ret >> 8 == 0) {
print "mr $action: $dir skipped per config file\n" if $verbose;
my $ret=system($test);
if ($ret >> 8 == 0) {
print "mr $action: $dir skipped per config file\n" if $verbose;
}
else {
if (! $nochdir) {
}
else {
if (! $nochdir) {
- print "mr $action: $dir\n";
+ print "mr $action: $topdir$sub dir\n";
- print "mr $action: $dir (in subdir $directory)\n";
+ print "mr $action: $topdir$sub dir (in subdir $directory)\n";
}
my $command="set -e; ".$lib.
}
my $command="set -e; ".$lib.
- "my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ".
+ "my_action(){ $config{$topdir}{$subdir}{$action}\n }; my_action ".
join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
- print STDERR "mr $action: running $command \n" if $verbose;
+ print STDERR "mr $action: running >>$command<< \n" if $verbose;
my $ret=system($command);
if ($ret != 0) {
print STDERR "mr $action: failed ($ret)\n" if $verbose;
my $ret=system($command);
if ($ret != 0) {
print STDERR "mr $action: failed ($ret)\n" if $verbose;
- push @failed, $topdir.$sub dir;
if ($ret >> 8 != 0) {
print STDERR "mr $action: command failed\n";
}
if ($ret >> 8 != 0) {
print STDERR "mr $action: command failed\n";
}
my $parent=$dir;
while ($parent=~s/^(.*)\/[^\/]+\/?$/$1/) {
if (exists $config{$parent} &&
my $parent=$dir;
while ($parent=~s/^(.*)\/[^\/]+\/?$/$1/) {
if (exists $config{$parent} &&
- exists $config{$parent}{default }) {
- $config{$dir}{default}={ %{$config{$parent}{default }} };
+ exists $config{$parent}{DEFAULT }) {
+ $config{$dir}{DEFAULT}={ %{$config{$parent}{DEFAULT }} };
my $value=$2;
# continuation line
my $value=$2;
# continuation line
- while ($value=~/(.*)\\$/) {
- $value=$1.<$in>;
+ while ($value=~/(.*)\\$/s ) {
+ $value=$1."\n". <$in>;
chomp $value;
}
if (! defined $section) {
die "$f line $.: parameter ($parameter) not in section\n";
}
chomp $value;
}
if (! defined $section) {
die "$f line $.: parameter ($parameter) not in section\n";
}
- if ($section ne 'alias ' &&
+ if ($section ne 'ALIAS ' &&
! exists $config{$dir}{$section} &&
! exists $config{$dir}{$section} &&
- exists $config{$dir}{default }) {
+ exists $config{$dir}{DEFAULT }) {
- $config{$dir}{$section}={ %{$config{$dir}{default }} };
+ $config{$dir}{$section}={ %{$config{$dir}{DEFAULT }} };
- if ($section eq 'alias ') {
+ if ($section eq 'ALIAS ') {
$alias{$parameter}=$value;
}
elsif ($parameter eq 'lib') {
$alias{$parameter}=$value;
}
elsif ($parameter eq 'lib') {
- $config{$dir}{$section}{lib}.=$value." ; ";
+ $config{$dir}{$section}{lib}.=$value."\n ";
}
else {
$config{$dir}{$section}{$parameter}=$value;
$knownactions{$parameter}=1;
if ($parameter eq 'chain' &&
}
else {
$config{$dir}{$section}{$parameter}=$value;
$knownactions{$parameter}=1;
if ($parameter eq 'chain' &&
- length $dir && $section ne "default " &&
+ length $dir && $section ne "DEFAULT " &&
-e $dir.$section."/.mrconfig" &&
system($value) >> 8 == 0) {
push @toload, $dir.$section."/.mrconfig";
-e $dir.$section."/.mrconfig" &&
system($value) >> 8 == 0) {
push @toload, $dir.$section."/.mrconfig";
# Finally, some useful actions that mr knows about by default.
# These can be overridden in ~/.mrconfig.
__DATA__
# Finally, some useful actions that mr knows about by default.
# These can be overridden in ~/.mrconfig.
__DATA__
co = checkout
ci = commit
ls = list
co = checkout
ci = commit
ls = list
-[default ]
-lib = \
- error() { \
- echo "mr: $@" >&2; \
- exit 1; \
+[DEFAULT ]
+lib = \
+ error() { \
+ echo "mr: $@" >&2 \
+ exit 1 \
-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" \
-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.."