]> 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:

Add a comment explaining what selectrepos() returns.
[code/myrepos.git] / mr
diff --git a/mr b/mr
index 6e27cd5ee0e59b16d67acb21b788cef479b9dac2..3a168d10e40877cc20b21ac6112005f789710959 100755 (executable)
--- a/mr
+++ b/mr
@@ -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");
                }
        }