X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/09afd4d8b287a7401451541a93343987db979db8..41154ea11d56079c1a1a68336589652000a84fe6:/mr diff --git a/mr b/mr index ba0cf0a..f14ba4d 100755 --- a/mr +++ b/mr @@ -417,12 +417,11 @@ to keep track of and remember to delete old repositories. 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 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 @@ -431,14 +430,7 @@ is checked out, or updated. This provides an easy way to do things 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 @@ -452,10 +444,20 @@ the action that is performed for a given version control system, you can 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 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 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 @@ -1117,20 +1119,6 @@ sub is_trusted_checkout { 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; @@ -1195,30 +1183,43 @@ sub loadconfig { # 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"; } }; @@ -1226,7 +1227,7 @@ sub loadconfig { $_=$nextline->(); if (! $trusted && /[[:cntrl:]]/) { - trusterror("mr: illegal control character", $f, $line, $bootstrap_url); + $trusterror->("illegal control character"); } next if /^\s*\#/ || /^\s*$/; @@ -1237,7 +1238,7 @@ sub loadconfig { 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; @@ -1264,7 +1265,7 @@ sub loadconfig { # 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') { @@ -1276,7 +1277,7 @@ sub loadconfig { # safe. } else { - trusterror("mr: illegal setting \"$parameter=$value\"", $f, $line, $bootstrap_url); + $trusterror->("illegal setting \"$parameter=$value\""); } }