Fix bzr plugin to work with bzr 2.0.
authorLars Wirzenius <liw@liw.fi>
Sun, 4 Apr 2010 09:05:07 +0000 (21:05 +1200)
committerJoey Hess <joey@gnu.kitenet.net>
Sun, 4 Apr 2010 16:15:38 +0000 (12:15 -0400)
The output of "bzr log" seems to have changed a bit, so we change the
parsing accordingly. This has not been tested with earlier versions of
bzr.

Several problems seemed to occur, all in the bzr_log subroutine:

1. The @infos list would contain an empty hash, which would confuse the
   rest of the program.
2. This was because bzr_log would push an empty anonymous hash to the
   list whenever it thought a new record would start.
3. However, a new record marker (now?) also happens at th end of bzr log
   output.
4. Now we collect the record to a hash that gets pushed to the list only
   if it is not empty.
5. Also, sometimes bzr log outputs "revno: 1234 [merge]", so we catch only
   the revision number.
6. Finally, there may be non-headers at the of the output, so we ignore
   those.

IkiWiki/Plugin/bzr.pm

index 1ffdc23535d81578b9fab129953659028a6ec96e..e813331b79aa55231af30b6ad9c9609ffffe4775 100644 (file)
@@ -73,28 +73,37 @@ sub bzr_log ($) {
        my @infos = ();
        my $key = undef;
 
        my @infos = ();
        my $key = undef;
 
+    my $hash = {};
        while (<$out>) {
                my $line = $_;
                my ($value);
                if ($line =~ /^message:/) {
                        $key = "message";
        while (<$out>) {
                my $line = $_;
                my ($value);
                if ($line =~ /^message:/) {
                        $key = "message";
-                       $infos[$#infos]{$key} = "";
+                       $$hash{$key} = "";
                }
                elsif ($line =~ /^(modified|added|renamed|renamed and modified|removed):/) {
                        $key = "files";
                }
                elsif ($line =~ /^(modified|added|renamed|renamed and modified|removed):/) {
                        $key = "files";
-                       unless (defined($infos[$#infos]{$key})) { $infos[$#infos]{$key} = ""; }
+                       unless (defined($$hash{$key})) { $$hash{$key} = ""; }
                }
                elsif (defined($key) and $line =~ /^  (.*)/) {
                }
                elsif (defined($key) and $line =~ /^  (.*)/) {
-                       $infos[$#infos]{$key} .= "$1\n";
+                       $$hash{$key} .= "$1\n";
                }
                elsif ($line eq "------------------------------------------------------------\n") {
                }
                elsif ($line eq "------------------------------------------------------------\n") {
+                   if (keys %$hash) {
+                   push (@infos, $hash);
+                   }
+               $hash = {};
                        $key = undef;
                        $key = undef;
-                       push (@infos, {});
                }
                }
-               else {
+               elsif ($line =~ /: /) {
                        chomp $line;
                        chomp $line;
-                               ($key, $value) = split /: +/, $line, 2;
-                       $infos[$#infos]{$key} = $value;
+                       if ($line =~ /^revno: (\d+)/) {
+                           $key = "revno";
+                           $value = $1;
+                       } else {
+                       ($key, $value) = split /: +/, $line, 2;
+               }
+                       $$hash{$key} = $value;
                } 
        }
        close $out;
                } 
        }
        close $out;