will try to load a .mrconfig file from the root of the repository. (You
should avoid chaining from repositories with untrusted committers.)
+=item include
+
+If the "include" parameter is set, its command is ran, and should output
+additional mrconfig file content. The content is included as if it were
+part of the including file.
+
+Unlike all other parameters, this parameter does not need to be placed
+within a section.
+
=item lib
The "lib" parameter can specify some shell code that will be run before each
next unless length $topdir;
if ($directory=~/^\Q$topdir\E/) {
$ENV{MR_CONFIG}=$configfiles{$topdir};
+ $directory=$topdir;
last;
}
}
}
$ENV{MR_REPO}=getcwd();
- my $command=findcommand("register", '', '', 'DEFAULT');
+ my $command=findcommand("register", $ENV{MR_REPO}, $directory, 'DEFAULT');
if (! defined $command) {
die "mr $action: unknown repository type\n";
}
$ENV{MR_REPO}=~s/.*\/(.*)/$1/;
- $command="set -e; ".$config{''}{DEFAULT}{lib}."\n".
+ $command="set -e; ".$config{$directory}{DEFAULT}{lib}."\n".
"my_action(){ $command\n }; my_action ".
join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
- print STDERR "mr $action: running >>$command<<\n" if $verbose;
+ print "mr $action: running >>$command<<\n" if $verbose;
exec($command) || die "exec: $!";
}
length $a <=> length $b
||
$a cmp $b
- } grep { /_test/ } keys %{$config{$topdir}{$subdir}}) {
+ } grep { /_test$/ } keys %{$config{$topdir}{$subdir}}) {
my ($rcs)=$rcs_test=~/(.*)_test/;
$test="my_$rcs_test() {\n$config{$topdir}{$subdir}{$rcs_test}\n}\n".$test;
$test.="if my_$rcs_test; then echo $rcs; fi\n";
sub findcommand { #{{{
my ($action, $dir, $topdir, $subdir) = @_;
+
+ if (exists $config{$topdir}{$subdir}{$action}) {
+ return $config{$topdir}{$subdir}{$action};
+ }
my $rcs=rcs_test(@_);
exists $config{$topdir}{$subdir}{$rcs."_".$action}) {
return $config{$topdir}{$subdir}{$rcs."_".$action};
}
- elsif (exists $config{$topdir}{$subdir}{$action}) {
- return $config{$topdir}{$subdir}{$action};
- }
else {
return undef;
}
$command="set -e; ".$lib.
"my_action(){ $command\n }; my_action ".
join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
- print STDERR "mr $action: running >>$command<<\n" if $verbose;
+ print "mr $action: running >>$command<<\n" if $verbose;
my $ret=system($command);
if ($ret != 0) {
if (($? & 127) == 2) {
chomp $value;
}
+ if ($parameter eq "include") {
+ print "mr: including output of \"$value\"\n" if $verbose;
+ unshift @lines, `$value`;
+ next;
+ }
+
if (! defined $section) {
die "$f line $.: parameter ($parameter) not in section\n";
}
[DEFAULT]
order = 10
lib =
+ PWD="$(pwd)"
error() {
echo "mr: $@" >&2
exit 1
test -d "$MR_REPO"/refs/heads && test -d "$MR_REPO"/refs/tags &&
test -d "$MR_REPO"/objects && test -f "$MR_REPO"/config &&
test "$(GIT_CONFIG="$MR_REPO"/config git-config --get core.bare)" = true
-git_fake_bare_test =
- test -d "$MR_REPO"/refs/heads && test -d "$MR_REPO"/refs/tags &&
- test -d "$MR_REPO"/objects && test -f "$MR_REPO"/config &&
- test "$(GIT_CONFIG="$MR_REPO"/config git-config --get core.bare)" = false
svn_update = svn update "$@"
git_update = if [ "$@" ]; then git pull "$@"; else git pull -t origin master; fi
cvs_update = cvs update "$@"
hg_update = hg pull "$@" && hg update "$@"
darcs_update = darcs pull -a "$@"
-git_fake_bare_update =
- # all this is because of a bug in git-fetch, which requires GIT_DIR set
- local git_dir_override; git_dir_override=.git
- case "$(get_git_repo_type "$MR_REPO")" in
- fake-bare) git_dir_override="$MR_REPO";;
- esac
- args="$@"
- [ -z "$args" ] && args="-t origin master"
- eval GIT_DIR="$git_dir_override" git pull "$args"
svn_status = svn status "$@"
git_status = git status "$@" || true
cvs_status = cvs status "$@"
hg_status = hg status "$@"
darcs_status = darcs whatsnew -ls "$@"
-git_fake_bare_status = git status "$@" || true
svn_commit = svn commit "$@"
git_commit = git commit -a "$@" && git push --all
cvs_commit = cvs commit "$@"
hg_commit = hg commit -m "$@" && hg push
darcs_commit = darcs commit -a -m "$@" && darcs push -a
-git_fake_bare_commit = error "commit does not work for fake bare git repositories (yet)."
svn_diff = svn diff "$@"
git_diff = git diff "$@"
cvs_diff = cvs diff "$@"
hg_diff = hg diff "$@"
darcs_diff = darcs diff "$@"
-git_fake_bare_diff = error "diff does not work for fake bare git repositories (yet)."
svn_log = svn log "$@"
git_log = git log "$@"
hg_log = hg log "$@"
darcs_log = darcs changes "$@"
git_bare_log = git log "$@"
-git_fake_bare_log = git log "$@"
svn_register =
url=$(LANG=C svn info . | grep -i ^URL: | cut -d ' ' -f 2)
error "cannot determine svn url"
fi
echo "Registering svn url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "`pwd`" checkout="svn co $url $MR_REPO"
+ mr -c "$MR_CONFIG" config "$PWD" checkout="svn co '$url' '$MR_REPO'"
git_register =
url="$(LANG=C git-config --get remote.origin.url)" || true
if [ -z "$url" ]; then
error "cannot determine git url"
fi
echo "Registering git url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "`pwd`" checkout="git clone $url $MR_REPO"
+ mr -c "$MR_CONFIG" config "$PWD" checkout="git clone '$url' '$MR_REPO'"
bzr_register =
url=$(cat .bzr/branch/parent)
if [ -z "$url" ]; then
error "cannot determine bzr url"
fi
echo "Registering bzr url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "`pwd`" checkout="bzr clone $url $MR_REPO"
+ mr -c "$MR_CONFIG" config "$PWD" checkout="bzr clone '$url' '$MR_REPO'"
cvs_register =
repo=$(cat CVS/Repository)
root=$(cat CVS/Root)
error "cannot determine cvs root"
fi
echo "Registering cvs repository $repo at root $root"
- mr -c "$MR_CONFIG" config "`pwd`" checkout="cvs -d '$root' co -d $MR_REPO $repo"
+ mr -c "$MR_CONFIG" config "$PWD" checkout="cvs -d '$root' co -d '$MR_REPO' '$repo'"
hg_register =
url=$(hg showconfig paths.default)
echo "Registering mercurial repo url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "`pwd`" checkout="hg clone $url $MR_REPO"
+ mr -c "$MR_CONFIG" config "$PWD" checkout="hg clone '$url' '$MR_REPO'"
darcs_register =
url=$(cat _darcs/prefs/defaultrepo)
echo "Registering darcs repository $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "`pwd`" checkout="darcs get $url $MR_REPO"
+ mr -c "$MR_CONFIG" config "$PWD" checkout="darcs get '$url'p '$MR_REPO'"
git_bare_register =
url="$(LANG=C GIT_CONFIG=config git-config --get remote.origin.url)" || true
if [ -z "$url" ]; then
error "cannot determine git url"
fi
- mr -c "$MR_CONFIG" config "`pwd`" \
- lib="GIT_WORK_TREE=$work_tree; export GIT_WORK_TREE"
echo "Registering git url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "`pwd`" checkout="git clone --bare $url $MR_REPO"
-git_fake_bare_register =
- url="$(LANG=C GIT_CONFIG=config git-config --get remote.origin.url)" || true
- if [ -z "$url" ]; then
- error "cannot determine git url"
- fi
- worktree="$(git-config --get core.worktree)" || true
- worktree="${worktree%%/}/"
- if [ ! -d "$worktree" ]; then
- error "git worktree $worktree does not exist"
- fi
- mr -c "$MR_CONFIG" config "`pwd`" \
- lib="GIT_WORK_TREE=$work_tree; export GIT_WORK_TREE"
- echo "Registering git url: $url in $MR_CONFIG (with worktree $worktree)"
- mr -c "$MR_CONFIG" config "`pwd`" \
- checkout="
- git clone --no-checkout $url $MR_REPO
- cd $MR_REPO
- git read-tree HEAD
- git checkout-index -a --prefix='$work_tree' || true
- git config core.worktree '$worktree'"
- mv .git/* . && rmdir .git"
+ mr -c "$MR_CONFIG" config "$PWD" checkout="git clone --bare '$url' '$MR_REPO'"
help =
if [ ! -e "$MR_PATH" ]; then