]>
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] commit [-m "message"]
B<mr> [options] commit [-m "message"]
B<mr> [options] action [params ...]
=head1 DESCRIPTION
B<mr> [options] action [params ...]
=head1 DESCRIPTION
-Checks out all the registered repositories that are not already checked
-out.
+Checks out any repositories that are not already checked out.
-Updates each registered re pository from its configured remote repository.
+Updates each repository from its configured remote repository.
If a repository isn't checked out yet, it will first check it out.
=item status
If a repository isn't checked out yet, it will first check it out.
=item status
-Displays a status report for each registered re pository, showing what
+Displays a status report for each repository, showing what
uncommitted changes are present in the repository.
=item commit (or ci)
uncommitted changes are present in the repository.
=item commit (or ci)
-Commits changes to each registered repository. (By default, changes
-are pushed to the remote repository too, when using distributed systems
-like git.)
+Commits changes to each repository. (By default, changes are pushed to the
+remote repository too, when using distributed systems like git.)
The optional -m parameter allows specifying a commit message.
The optional -m parameter allows specifying a commit message.
+=item diff
+
+Show a diff of uncommitted changes.
+
+=item list
+
+List the repositories that mr will act on.
+
+=item help
+
+Displays this help.
+
=back
Actions can be abbreviated to any unambiguous subsctring, so
"mr st" is equivilant to "mr status".
=back
Actions can be abbreviated to any unambiguous subsctring, so
"mr st" is equivilant to "mr status".
+B<mr> operates on all registered repsitories at or below your working
+directory. Or, if you are in a subdirectory of a repository, it will act on
+only that repository.
+
+Additional parameters can be passed to other commands than "commit", they
+will be passed on unchanged to the underlying revision control system.
+This is mostly useful if the repositories mr will act on all use the same
+revision control system.
+
"v" => \$verbose,
);
if (! $result || @ARGV < 1) {
"v" => \$verbose,
);
if (! $result || @ARGV < 1) {
- die("Usage: mr [-d directory] action [params ...]\n");
+ die("Usage: mr [-d directory] action [params ...]\n".
+ "(Use mr help for man page.)\n");
+
#use Data::Dumper;
#print Dumper(\%config);
#use Data::Dumper;
#print Dumper(\%config);
+eval {
+ use FindBin qw($Bin $Script);
+ $ENV{MR_PATH}=$Bin."/".$Script;
+};
+
+# alias expansion and command stemming
my $action=shift @ARGV;
if (! exists $knownactions{$action}) {
if (exists $alias{$action}) {
my $action=shift @ARGV;
if (! exists $knownactions{$action}) {
if (exists $alias{$action}) {
+if ($action eq 'help') {
+ exec($config{''}{default}{help});
+}
+
+# handle being in a subdir of a repository
+foreach my $topdir (sort keys %config) {
+ foreach my $subdir (sort keys %{$config{$topdir}}) {
+ if ($directory =~ /^\Q$topdir$subdir\E\//) {
+ $directory=$topdir.$subdir;
+ }
+ }
+}
+
my (@failed, @successful, @skipped);
my (@failed, @successful, @skipped);
foreach my $topdir (sort keys %config) {
foreach my $subdir (sort keys %{$config{$topdir}}) {
next if $subdir eq 'default';
foreach my $topdir (sort keys %config) {
foreach my $subdir (sort keys %{$config{$topdir}}) {
next if $subdir eq 'default';
if (defined $directory &&
$dir ne $directory &&
$dir !~ /^\Q$directory\E\//) {
if (defined $directory &&
$dir ne $directory &&
$dir !~ /^\Q$directory\E\//) {
- print "mr $action: $dir skipped per -d parameter ($directory)\n" if $verbose;
- push @skipped, $dir;
- print "\n" unless $first;
- $first=0;
-
action($action, $dir, $topdir, $subdir);
action($action, $dir, $topdir, $subdir);
push @skipped, $dir;
}
else {
push @skipped, $dir;
}
else {
- print "mr $action: in $dir\n";
+ print "mr $action: $dir\n";
my $command="set -e; ".$lib.
"my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ".
join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
my $command="set -e; ".$lib.
"my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ".
join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
else {
push @successful, $dir;
}
else {
push @successful, $dir;
}
-print "\n mr $action: finished (".join("; ",
+print "mr $action: finished (".join("; ",
showstat($#successful+1, "successful", "successful"),
showstat($#failed+1, "failed", "failed"),
showstat($#skipped+1, "skipped", "skipped"),
showstat($#successful+1, "successful", "successful"),
showstat($#failed+1, "failed", "failed"),
showstat($#skipped+1, "skipped", "skipped"),
else \
error "unknown repo type"; \
fi
else \
error "unknown repo type"; \
fi
+diff = \
+ if [ -d .svn ]; then \
+ svn diff "$@"; \
+ elif [ -d .git ]; then \
+ git diff "$@"; \
+ else \
+ error "unknown repo type"; \
+ fi
+list = true
+help = \
+ if [ ! -e "$MR_PATH" ]; then \
+ error "cannot find program path";\
+ fi; \
+ (pod2man -c mr "$MR_PATH" | man -l -) || \
+ error "pod2man or man failed"