as well as look for a F<.mrconfig> file in the current directory, or in one
of its parent directories.
+=item -f
+
+=item --force
+
+Force mr to act on repositories that would normally be skipped due to their
+configuration.
+
=item -v
=item --verbose
Another way to use skip is for a lazy checkout. This makes mr skip
operating on a repo unless it already exists. To enable the
-repo, you have to explicitly check it out (using "mr -d foo checkout").
+repo, you have to explicitly check it out (using "mr --force -d foo checkout").
[foo]
checkout = ...
When looking for a command to run for a given action, mr first looks for
a parameter with the same name as the action. If that is not found, it
looks for a parameter named "VCS_action" (substituting in the name of the
-version control system and the action). The name of the version control
-system is itself determined by running each defined "VCS_test" action,
-until one succeeds.
+version control system and the action).
Internally, mr has settings for "git_update", "svn_update", etc. To change
the action that is performed for a given version control system, you can
to the existing value of the parameter. In this way, actions
can be constructed accumulatively.
+=item VCS_test
+
+The name of the version control system is itself determined by
+running each defined "VCS_test" action, until one succeeds.
+
+=item VCS_dir_test
+
+This is a more optimised way to test for the version control system.
+Each "VCS_dir_test" action is run once, and can output lines consisting
+of the name of a VCS, and a directory to look for in the top of a repo
+to detect that VCS.
+
=back
=head1 UNTRUSTED MRCONFIG FILES
my $verbose=0;
my $quiet=0;
my $stats=0;
+my $force=0;
my $insecure=0;
my $interactive=0;
my $max_depth;
my $trust_all=0;
my $directory=getcwd();
+my $HOME_MR_CONFIG = "$ENV{HOME}/.mrconfig";
$ENV{MR_CONFIG}=find_mrconfig();
# globals :-(
$runner->($shellcode);
}
+sub runshpipe {
+ runsh @_, sub {
+ my $sh=shift;
+ my $ret=`$sh`;
+ chomp $ret;
+ return $ret;
+ };
+}
+
my %vcs;
+my %vcs_dir_test;
sub vcs_test {
my ($action, $dir, $topdir, $subdir) = @_;
}
my $test="";
+ my $dir_test="";
foreach my $vcs_test (
sort {
length $a <=> length $b
||
$a cmp $b
} grep { /_test$/ } keys %{$config{$topdir}{$subdir}}) {
- my ($vcs)=$vcs_test=~/(.*)_test/;
+ if ($vcs_test =~ /(.*)_dir_test/) {
+ my $vcs=$1;
+ if (! defined $vcs_dir_test{$vcs}) {
+ $dir_test.=$config{$topdir}{$subdir}{$vcs_test}."\n";
+ }
+ next;
+ }
+ my $vcs=$vcs_test =~ /(.*)_test/;
$test="my_$vcs_test() {\n$config{$topdir}{$subdir}{$vcs_test}\n}\n".$test;
$test.="if my_$vcs_test; then echo $vcs; fi\n";
}
- my $vcs=runsh "vcs test", $topdir, $subdir, $test, [], sub {
- my $sh=shift;
- my $ret=`$sh`;
- chomp $ret;
- return $ret;
- };
+ if (length $dir_test) {
+ runsh "vcs dir test", $topdir, $subdir, $dir_test, [], sub {
+ my $sh=shift;
+ foreach my $line (`$sh`) {
+ chomp $line;
+ my ($vcs, $dir)=split(" ", $line);
+ $vcs_dir_test{$vcs}=$dir;
+ }
+ }
+ }
+
+ foreach my $vcs (keys %vcs_dir_test) {
+ if (-d "$ENV{MR_REPO}/$vcs_dir_test{$vcs}") {
+ return $vcs{$dir}=$vcs;
+ }
+ }
+
+ my $vcs=runshpipe "vcs test", $topdir, $subdir, $test, [];
if ($vcs=~/\n/s) {
$vcs=~s/\n/, /g;
print STDERR "mr $action: found multiple possible repository types ($vcs) for ".fulldir($topdir, $subdir)."\n";
$ENV{MR_ACTION}=$action;
foreach my $testname ("skip", "deleted") {
+ next if $force && $testname eq "skip";
+
my $testcommand=findcommand($testname, $dir, $topdir, $subdir, $is_checkout);
if (defined $testcommand) {
my $config=shift; # must be abs_pathed already
# We always trust ~/.mrconfig.
- return 1 if $config eq abs_path("$ENV{HOME}/.mrconfig");
+ return 1 if $config eq abs_path($HOME_MR_CONFIG);
return 1 if $trust_all;
my $trustfile=$ENV{HOME}."/.mrtrust";
if (! %trusted) {
- $trusted{"$ENV{HOME}/.mrconfig"}=1;
+ $trusted{$HOME_MR_CONFIG}=1;
if (open (TRUST, "<", $trustfile)) {
while (<TRUST>) {
chomp;
}
$dir=~s/\/[^\/]*$//;
}
- return "$ENV{HOME}/.mrconfig";
+ return $HOME_MR_CONFIG;
}
sub getopts {
"d|directory=s" => sub { $directory=abs_path($_[1]) },
"c|config=s" => sub { $ENV{MR_CONFIG}=$_[1]; $config_overridden=1 },
"p|path" => sub { }, # now default, ignore
+ "f|force" => \$force,
"v|verbose" => \$verbose,
"q|quiet" => \$quiet,
"s|stats" => \$stats,
init();
startingconfig();
- loadconfig("$ENV{HOME}/.mrconfig");
+ loadconfig($HOME_MR_CONFIG);
loadconfig($ENV{MR_CONFIG});
#use Data::Dumper; print Dumper(\%config);
LANG=C bzr info | egrep -q '^Checkout'
}
lazy() {
- if [ "$MR_ACTION" = checkout ] || [ -d "$MR_REPO" ]; then
+ if [ -d "$MR_REPO" ]; then
return 1
else
return 0
fi
}
-svn_test = test -d "$MR_REPO"/.svn
-git_test = test -d "$MR_REPO"/.git
-bzr_test = test -d "$MR_REPO"/.bzr
-cvs_test = test -d "$MR_REPO"/CVS
-hg_test = test -d "$MR_REPO"/.hg
-darcs_test = test -d "$MR_REPO"/_darcs
+svn_dir_test = echo svn .svn
+git_dir_test = echo git .git
+bzr_dir_test = echo bzr .bzr
+cvs_dir_test = echo cvs CVS
+hg_dir_test = echo hg .hg
+darcs_dir_test = echo darcs _darcs
fossil_test = test -f "$MR_REPO"/_FOSSIL_
git_bare_test =
test -d "$MR_REPO"/refs/heads && test -d "$MR_REPO"/refs/tags &&