X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/38353384cf7ccb4cbc81e77f82875d8a959fbea7..023e3c47a4276bbb65aa88600778dd5a183c2e71:/IkiWiki/Rcs/monotone.pm diff --git a/IkiWiki/Rcs/monotone.pm b/IkiWiki/Rcs/monotone.pm index be6b36c66..6a156892a 100644 --- a/IkiWiki/Rcs/monotone.pm +++ b/IkiWiki/Rcs/monotone.pm @@ -136,6 +136,11 @@ sub check_mergerc () { #{{{ debug("$mergerc doesn't exist. Creating file with default mergers."); open (my $out, ">", $mergerc) or error("can't open $mergerc: $!"); print $out ; + print $out <<"EOF"; + function note_netsync_revision_received(new_id, revision, certs, session_id) + execute("$config{mtnrootdir}/_MTN/ikiwiki-netsync-hook", new_id) + end +EOF close $out; } } #}}} @@ -239,14 +244,11 @@ sub rcs_commit ($$$;$$) { #{{{ # Something has been committed, has this file changed? my ($out, $err); - #$automator->setOpts("-r", $oldrev, "-r", $rev); - #my ($out, $err) = $automator->call("content_diff", $file); - #debug("Problem committing $file") if ($err ne ""); - # FIXME: use of $file in these backticks is not wise from a - # security POV. Probably safe, but should be avoided - # anyway. - my $diff = `mtn --root=$config{mtnrootdir} au content_diff -r $oldrev -r $rev $file`; # was just $out; - + $automator->setOpts("r", $oldrev, "r", $rev); + ($out, $err) = $automator->call("content_diff", $file); + debug("Problem committing $file") if ($err ne ""); + my $diff = $out; + if ($diff) { # Commit a revision with just this file changed off # the old revision. @@ -314,8 +316,6 @@ sub rcs_commit ($$$;$$) { #{{{ "Please use the non-web interface to resolve the conflicts."); } - # suspend this revision because it has - # conflict markers... if (system("mtn", "--root=$config{mtnrootdir}", "update", "-r", $mergeResult) != 0) { debug("Unable to update to rev $mergeResult after conflict-enhanced merge on conflicted commit!"); @@ -347,10 +347,10 @@ sub rcs_commit ($$$;$$) { #{{{ return $conflict; } if (defined($config{mtnsync}) && $config{mtnsync}) { - if (system("mtn", "--root=$config{mtnrootdir}", "sync", + if (system("mtn", "--root=$config{mtnrootdir}", "push", "--quiet", "--ticker=none", "--key", $config{mtnkey}) != 0) { - debug("monotone sync failed"); + debug("monotone push failed"); } } @@ -363,7 +363,7 @@ sub rcs_add ($) { #{{{ check_config(); if (system("mtn", "--root=$config{mtnrootdir}", "add", "--quiet", - "$config{srcdir}/$file") != 0) { + $file) != 0) { error("Monotone add failed"); } } #}}} @@ -421,7 +421,7 @@ sub rcs_recentchanges ($) { #{{{ $committype = "monotone"; } } elsif ($cert->{name} eq "date") { - $when = time - str2time($cert->{value}, 'UTC'); + $when = str2time($cert->{value}, 'UTC'); } elsif ($cert->{name} eq "changelog") { my $messageText = $cert->{value}; # split the changelog into multiple @@ -436,10 +436,28 @@ sub rcs_recentchanges ($) { #{{{ 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) { - push @pages, { - page => pagename($file), - } if length $file; + next unless length $file; + + if (defined $config{diffurl} and (@parents == 1)) { + my $diffurl=$config{diffurl}; + $diffurl=~s/\[\[r1\]\]/$parent/g; + $diffurl=~s/\[\[r2\]\]/$rev/g; + $diffurl=~s/\[\[file\]\]/$file/g; + push @pages, { + page => pagename($file), + diffurl => $diffurl, + }; + } + else { + push @pages, { + page => pagename($file), + } + } } push @ret, { @@ -457,54 +475,6 @@ sub rcs_recentchanges ($) { #{{{ return @ret; } #}}} -sub rcs_notify () { #{{{ - debug("The monotone rcs_notify function is currently untested. Use at own risk!"); - - if (! exists $ENV{REV}) { - error(gettext("REV is not set, not running from mtn post-commit hook, cannot send notifications")); - } - if ($ENV{REV} !~ m/($sha1_pattern)/) { # sha1 is untainted now - error(gettext("REV is not a valid revision identifier, cannot send notifications")); - } - my $rev = $1; - - check_config(); - - my $automator = Monotone->new(); - $automator->open(undef, $config{mtnrootdir}); - - my $certs = [read_certs($automator, $rev)]; - my $user; - my $message; - my $when; - - foreach my $cert (@$certs) { - if ($cert->{signature} eq "ok" && $cert->{trust} eq "trusted") { - if ($cert->{name} eq "author") { - $user = $cert->{value}; - } elsif ($cert->{name} eq "date") { - $when = $cert->{value}; - } elsif ($cert->{name} eq "changelog") { - $message = $cert->{value}; - } - } - } - - my @changed_pages = get_changed_files($automator, $rev); - - $automator->close(); - - require IkiWiki::UserInfo; - send_commit_mails( - sub { - return $message; - }, - sub { - `mtn --root=$config{mtnrootdir} au content_diff -r $rev`; - }, - $user, @changed_pages); -} #}}} - sub rcs_getctime ($) { #{{{ my $file=shift; @@ -609,4 +579,3 @@ __DATA__ return true end } -EOF