The "lib" parameter can specify some shell code that will be run
before each command, this can be a useful way to define shell
-functions for other commands to use. Unlike most other parameters,
-this can be specified multiple times, in which case the chunks of
-shell code are accumulatively concatenated together. This is
-particularly useful because it allows the user to build a library of
-shell functions defined in the [DEFAULT] section scattered across
-various mr modules (files referenced by an C<include> directive).
+functions for other commands to use.
+
+Unlike most other parameters, this can be specified multiple times, in
+which case the chunks of shell code are accumulatively concatenated
+together.
=item fixups
like permissions fixups, or other tweaks to the repository content,
whenever the repository is changed.
-=item pre_ and post_
-
-If a "pre_action" parameter is set, its command is run before mr performs the
-specified action. Similarly, "post_action" parameters are run after mr
-successfully performs the specified action. For example, "pre_commit" is
-run before committing; "post_update" is run after updating.
-
-=back
+=item VCS_action
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
override these VCS specific actions. To add a new version control system,
you can just add VCS specific actions for it.
-As with the C<lib> parameter, if a parameter is suffixed with
-C<_append>, its value is concatenated to the existing value of the
-parameter for that config block, rather than overwriting it. In this
-way, actions such as C<fixup> can be constructed accumulatively.
+=item pre_ and post_
+
+If a "pre_action" parameter is set, its command is run before mr performs the
+specified action. Similarly, "post_action" parameters are run after mr
+successfully performs the specified action. For example, "pre_commit" is
+run before committing; "post_update" is run after updating.
+
+=item _append
+
+Any parameter can be suffixed with C<_append>, to add an additional value
+to the existing value of the parameter. In this way, actions
+can be constructed accumulatively.
+
+=back
=head1 UNTRUSTED MRCONFIG FILES
return 0;
}
-sub trusterror {
- my ($err, $file, $line, $url)=@_;
-
- if (defined $url) {
- die "$err in untrusted $url line $line\n".
- "(To trust this url, --trust-all can be used; but please use caution;\n".
- "this can allow arbitrary code execution!)\n";
- }
- else {
- die "$err in untrusted $file line $line\n".
- "(To trust this file, list it in ~/.mrtrust.)\n";
- }
-}
-
my %loaded;
sub loadconfig {
my $f=shift;
# Keep track of the current line in the config file;
# when a file is included track the current line from the include.
- my $line=0;
+ my $lineno=0;
my $included=undef;
- my $includeline=0;
+
+ my $line;
my $nextline = sub {
if ($included) {
- $includeline++;
$included--;
}
else {
$included=undef;
- $includeline=0;
- $line++;
+ $lineno++;
}
- my $l=shift @lines;
- chomp $l;
- return $l
+ $line=shift @lines;
+ chomp $line;
+ return $line;
};
my $lineerror = sub {
my $msg=shift;
if (defined $included) {
- die "mr: $f line $line include line $includeline: $msg\n";
+ die "mr: $msg at $f line $lineno, included line: $line\n";
+ }
+ else {
+ die "mr: $msg at $f line $lineno\n";
+ }
+ };
+ my $trusterror = sub {
+ my $msg=shift;
+ my ($err, $file, $lineno, $url)=@_;
+
+ if (defined $bootstrap_url) {
+ die "mr: $err in untrusted $bootstrap_url line $lineno\n".
+ "(To trust this url, --trust-all can be used; but please use caution;\n".
+ "this can allow arbitrary code execution!)\n";
}
else {
- die "mr: $f line $line: $msg\n";
+ die "mr: $err in untrusted $file line $lineno\n".
+ "(To trust this file, list it in ~/.mrtrust.)\n";
}
};
$_=$nextline->();
if (! $trusted && /[[:cntrl:]]/) {
- trusterror("mr: illegal control character", $f, $line, $bootstrap_url);
+ $trusterror->("illegal control character");
}
next if /^\s*\#/ || /^\s*$/;
if (! is_trusted_repo($section) ||
$section eq 'ALIAS' ||
$section eq 'DEFAULT') {
- trusterror("mr: illegal section \"[$section]\"", $f, $line, $bootstrap_url)
+ $trusterror->("illegal section \"[$section]\"");
}
}
$section=expandenv($section) if $trusted;
# settings in specific known-safe formats.
if ($parameter eq 'checkout') {
if (! is_trusted_checkout($value)) {
- trusterror("mr: illegal checkout command \"$value\"", $f, $line, $bootstrap_url);
+ $trusterror->("illegal checkout command \"$value\"");
}
}
elsif ($parameter eq 'order') {
# safe.
}
else {
- trusterror("mr: illegal setting \"$parameter=$value\"", $f, $line, $bootstrap_url);
+ $trusterror->("illegal setting \"$parameter=$value\"");
}
}