X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/95f38e8b44cbfca1f23a640d8153c95e6650e32d..ae4ab73b5d793b03f91fdcef0fff7405f9f9d75b:/mr diff --git a/mr b/mr index 9a81f61..b37d9a5 100755 --- a/mr +++ b/mr @@ -222,7 +222,7 @@ Be verbose. =item --quiet -Be quiet. This supresses mr's usual output, as well as any output from +Be quiet. This suppresses mr's usual output, as well as any output from commands that are run (including stderr output). If a command fails, the output will be shown. @@ -602,7 +602,7 @@ sub action { my $is_checkout=($action eq 'checkout'); my $is_update=($action =~ /update/); - $ENV{MR_REPO}=$dir; + ($ENV{MR_REPO}=$dir) =~ s!/$!!; $ENV{MR_ACTION}=$action; foreach my $testname ("skip", "deleted") { @@ -946,7 +946,10 @@ sub repodir { return $ret; } -# figure out which repos to act on +# Figure out which repos to act on. Returns a list of array refs +# in the format: +# +# [ "$full_repo_path/", "$mr_config_path/", $section_header ] sub selectrepos { my @repos; foreach my $repo (repolist()) { @@ -1179,11 +1182,38 @@ sub loadconfig { close $in unless ref $f eq 'GLOB'; my $section; + + # 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 $included=undef; + my $includeline=0; + my $nextline = sub { + if ($included) { + $includeline++; + $included--; + } + else { + $included=undef; + $includeline=0; + $line++; + } + my $l=shift @lines; + chomp $l; + return $l + }; + my $lineerror = sub { + my $msg=shift; + if (defined $included) { + die "mr: $f line $line include line $includeline: $msg\n"; + } + else { + die "mr: $f line $line: $msg\n"; + } + }; + while (@lines) { - $_=shift @lines; - $line++; - chomp; + $_=$nextline->(); if (! $trusted && /[[:cntrl:]]/) { trusterror("mr: illegal control character", $f, $line, $bootstrap_url); @@ -1214,10 +1244,9 @@ sub loadconfig { # continued value while (@lines && $lines[0]=~/^\s(.+)/) { - shift(@lines); - $line++; $value.="\n$1"; chomp $value; + $nextline->(); } if (! $trusted) { @@ -1243,15 +1272,17 @@ sub loadconfig { if ($parameter eq "include") { print "mr: including output of \"$value\"\n" if $verbose; - unshift @lines, `$value`; + my @inc=`$value`; if ($?) { print STDERR "mr: include command exited nonzero ($?)\n"; } + $included += @inc; + unshift @lines, @inc; next; } if (! defined $section) { - die "$f line $.: parameter ($parameter) not in section\n"; + $lineerror->("parameter ($parameter) not in section"); } if ($section eq 'ALIAS') { $alias{$parameter}=$value; @@ -1270,7 +1301,7 @@ sub loadconfig { if ($parameter eq 'chain' && length $dir && $section ne "DEFAULT") { my $chaindir="$section"; - if ($chaindir !~ m!/!) { + if ($chaindir !~ m!^/!) { $chaindir=$dir.$chaindir; } if (-e "$chaindir/.mrconfig") { @@ -1292,7 +1323,7 @@ sub loadconfig { } } else { - die "$f line $line: '$_': parse error\n"; + $lineerror->("parse error"); } }