]>
git.madduck.net Git - code/myrepos.git/blobdiff - mr
madduck's git repository
Every one of the projects in this repository is available at the canonical
URL git://git.madduck.net/madduck/pub/<projectpath> — see
each project's metadata for the exact URL.
All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@ git. madduck. net .
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
SSH access, as well as push access can be individually
arranged .
If you use my repositories frequently, consider adding the following
snippet to ~/.gitconfig and using the third clone URL listed for each
project:
[url "git://git.madduck.net/madduck/"]
insteadOf = madduck:
-# 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()) {
sub selectrepos {
my @repos;
foreach my $repo (repolist()) {
close $in unless ref $f eq 'GLOB';
my $section;
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 $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";
+ }
+ };
+
- $_=shift @lines;
- $line++;
- chomp;
if (! $trusted && /[[:cntrl:]]/) {
trusterror("mr: illegal control character", $f, $line, $bootstrap_url);
if (! $trusted && /[[:cntrl:]]/) {
trusterror("mr: illegal control character", $f, $line, $bootstrap_url);
# continued value
while (@lines && $lines[0]=~/^\s(.+)/) {
# continued value
while (@lines && $lines[0]=~/^\s(.+)/) {
- shift(@lines);
- $line++;
$value.="\n$1";
chomp $value;
$value.="\n$1";
chomp $value;
if ($parameter eq "include") {
print "mr: including output of \"$value\"\n" if $verbose;
if ($parameter eq "include") {
print "mr: including output of \"$value\"\n" if $verbose;
- unshift @lines, `$value`;
if ($?) {
print STDERR "mr: include command exited nonzero ($?)\n";
}
if ($?) {
print STDERR "mr: include command exited nonzero ($?)\n";
}
+ $included += @inc;
+ unshift @lines, @inc;
next;
}
if (! defined $section) {
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;
}
if ($section eq 'ALIAS') {
$alias{$parameter}=$value;
if ($parameter eq 'chain' &&
length $dir && $section ne "DEFAULT") {
my $chaindir="$section";
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") {
$chaindir=$dir.$chaindir;
}
if (-e "$chaindir/.mrconfig") {
- die "$f line $line: '$_': parse error\n" ;
+ $lineerror->("parse error") ;