my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate sha1sums
-sub import { #{{{
- if (exists $IkiWiki::hooks{rcs}) {
- error(gettext("cannot use multiple rcs plugins"));
- }
+sub import {
hook(type => "checkconfig", id => "monotone", call => \&checkconfig);
hook(type => "getsetup", id => "monotone", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (!defined($config{mtnrootdir})) {
$config{mtnrootdir} = $config{srcdir};
}
error("Monotone version too old, is $version but required 0.38");
}
- if (length $config{mtn_wrapper}) {
+ if (defined $config{mtn_wrapper} && length $config{mtn_wrapper}) {
push @{$config{wrappers}}, {
wrapper => $config{mtn_wrapper},
wrappermode => (defined $config{mtn_wrappermode} ? $config{mtn_wrappermode} : "06755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
+ plugin => {
+ safe => 0, # rcs plugin
+ rebuild => undef,
+ },
mtn_wrapper => {
type => "string",
example => "/srv/mtn/wiki/_MTN/ikiwiki-netsync-hook",
- description => "monotone netsync hook executable to generate",
+ description => "monotone netsync hook to generate",
safe => 0, # file
rebuild => 0,
},
safe => 0, # path
rebuild => 0,
},
-} #}}}
+}
-sub get_rev () { #{{{
+sub get_rev () {
my $sha1 = `mtn --root=$config{mtnrootdir} automate get_base_revision_id`;
($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
}
return $sha1;
-} #}}}
+}
-sub get_rev_auto ($) { #{{{
+sub get_rev_auto ($) {
my $automator=shift;
my @results = $automator->call("get_base_revision_id");
}
return $sha1;
-} #}}}
+}
-sub mtn_merge ($$$$) { #{{{
+sub mtn_merge ($$$$) {
my $leftRev=shift;
my $rightRev=shift;
my $branch=shift;
debug("merged $leftRev, $rightRev to make $mergeRev");
return $mergeRev;
-} #}}}
+}
-sub commit_file_to_new_rev ($$$$$$$$) { #{{{
+sub commit_file_to_new_rev ($$$$$$$$) {
my $automator=shift;
my $wsfilename=shift;
my $oldFileID=shift;
debug("Added certs for rev: $newRevID");
return $newRevID;
-} #}}}
+}
-sub read_certs ($$) { #{{{
+sub read_certs ($$) {
my $automator=shift;
my $rev=shift;
my @results = $automator->call("certs", $rev);
my @ret;
my $line = $results[0];
- while ($line =~ m/\s+key\s"(.*?)"\nsignature\s"(ok|bad|unknown)"\n\s+name\s"(.*?)"\n\s+value\s"(.*?)"\n\s+trust\s"(trusted|untrusted)"\n/sg) {
+ while ($line =~ m/\s+key\s["\[](.*?)[\]"]\nsignature\s"(ok|bad|unknown)"\n\s+name\s"(.*?)"\n\s+value\s"(.*?)"\n\s+trust\s"(trusted|untrusted)"\n/sg) {
push @ret, {
key => $1,
signature => $2,
}
return @ret;
-} #}}}
+}
-sub get_changed_files ($$) { #{{{
+sub get_changed_files ($$) {
my $automator=shift;
my $rev=shift;
}
return @ret;
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
chdir $config{srcdir}
or error("Cannot chdir to $config{srcdir}: $!");
if (system("mtn", "--root=$config{mtnrootdir}", "update", "--quiet") != 0) {
debug("monotone update failed");
}
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
my $file=shift;
chdir $config{srcdir}
# For monotone, return the revision of the file when
# editing begins.
return get_rev();
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
# Tries to commit the page; returns undef on _success_ and
# a version of the page with the rcs's conflict markers on failure.
# The file is relative to the srcdir.
}
return undef # success
-} #}}}
+}
sub rcs_commit_staged ($$$) {
# Commits all staged changes. Changes can be staged using rcs_add,
}
}
-sub rcs_add ($) { #{{{
+sub rcs_add ($) {
my $file=shift;
chdir $config{srcdir}
$file) != 0) {
error("Monotone add failed");
}
-} #}}}
+}
-sub rcs_remove ($) { # {{{
+sub rcs_remove ($) {
my $file = shift;
chdir $config{srcdir}
$file) != 0) {
error("Monotone remove failed");
}
-} #}}}
+}
-sub rcs_rename ($$) { # {{{
+sub rcs_rename ($$) {
my ($src, $dest) = @_;
chdir $config{srcdir}
$src, $dest) != 0) {
error("Monotone rename failed");
}
-} #}}}
+}
-sub rcs_recentchanges ($) { #{{{
+sub rcs_recentchanges ($) {
my $num=shift;
my @ret;
my $child = open(MTNLOG, "-|");
if (! $child) {
exec("mtn", "log", "--root=$config{mtnrootdir}", "--no-graph",
- "--brief") || error("mtn log failed to run");
+ "--brief", "--last=$num") || error("mtn log failed to run");
}
- while (($num >= 0) and (my $line = <MTNLOG>)) {
+ while (my $line = <MTNLOG>) {
if ($line =~ m/^($sha1_pattern)/) {
push @revs, $1;
- $num -= 1;
}
}
close MTNLOG || debug("mtn log exited $?");
# from the changelog
if ($cert->{key} eq $config{mtnkey}) {
$committype = "web";
- } else {
- $committype = "monotone";
+ }
+ else {
+ $committype = "mtn";
}
} elsif ($cert->{name} eq "date") {
$when = str2time($cert->{value}, 'UTC');
}
my @changed_files = get_changed_files($automator, $rev);
- my $file;
my ($out, $err) = $automator->call("parents", $rev);
my @parents = ($out =~ m/^($sha1_pattern)$/);
my $parent = $parents[0];
- foreach $file (@changed_files) {
+ foreach my $file (@changed_files) {
next unless length $file;
if (defined $config{diffurl} and (@parents == 1)) {
$automator->close();
return @ret;
-} #}}}
+}
-sub rcs_diff ($) { #{{{
+sub rcs_diff ($) {
my $rev=shift;
my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
else {
return join("", @lines);
}
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
my $file=shift;
chdir $config{srcdir}
$date=str2time($date, 'UTC');
debug("found ctime ".localtime($date)." for $file");
return $date;
-} #}}}
+}
1