* Add recentchangesdiff plugin that adds diffs to the recentchanges feeds.
authorJoey Hess <joey@kodama.kitenet.net>
Mon, 3 Mar 2008 20:53:34 +0000 (15:53 -0500)
committerJoey Hess <joey@kodama.kitenet.net>
Mon, 3 Mar 2008 20:53:34 +0000 (15:53 -0500)
* rcs_diff is a new function that rcs modules should implement.
* Implemented rcs_diff for git, svn, and tla (tla version untested).
  Mercurial and monotone still todo.

13 files changed:
IkiWiki/Plugin/recentchanges.pm
IkiWiki/Plugin/recentchangesdiff.pm [new file with mode: 0644]
IkiWiki/Rcs/Stub.pm
IkiWiki/Rcs/git.pm
IkiWiki/Rcs/mercurial.pm
IkiWiki/Rcs/monotone.pm
IkiWiki/Rcs/svn.pm
IkiWiki/Rcs/tla.pm
debian/changelog
doc/plugins/recentchangesdiff.mdwn [new file with mode: 0644]
doc/style.css
po/ikiwiki.pot
templates/change.tmpl

index 22f934f2e8becec79e9fc8dfae6f0f1ffbd90949..e591df79f66b78e1d63e325e032c4e861f4502db 100644 (file)
@@ -133,7 +133,7 @@ sub store ($$$) { #{{{
                );
        }
 
-       # escape  wikilinks and preprocessor stuff in commit messages
+       # escape wikilinks and preprocessor stuff in commit messages
        if (ref $change->{message}) {
                foreach my $field (@{$change->{message}}) {
                        if (exists $field->{line}) {
@@ -150,7 +150,8 @@ sub store ($$$) { #{{{
                wikiname => $config{wikiname},
        );
        IkiWiki::run_hooks(pagetemplate => sub {
-               shift->(page => $page, destpage => $page, template => $template);
+               shift->(page => $page, destpage => $page,
+                       template => $template, rev => $change->{rev});
        });
 
        my $file=$page."._change";
diff --git a/IkiWiki/Plugin/recentchangesdiff.pm b/IkiWiki/Plugin/recentchangesdiff.pm
new file mode 100644 (file)
index 0000000..bd2826f
--- /dev/null
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::recentchangesdiff;
+
+use warnings;
+use strict;
+use IkiWiki 2.00;
+
+sub import { #{{{
+       hook(type => "pagetemplate", id => "recentchangesdiff",
+               call => \&pagetemplate);
+} #}}}
+
+sub pagetemplate (@) { #{{{
+       my %params=@_;
+       my $template=$params{template};
+       if ($config{rcs} && exists $params{rev} && length $params{rev} &&
+           $template->query(name => "diff")) {
+               my $diff=IkiWiki::rcs_diff($params{rev});
+               if (defined $diff && length $diff) {
+                       # escape links and preprocessor stuff
+                       $diff =~ s/(?<!\\)\[\[/\\\[\[/g;
+                       $template->param(diff => $diff);
+               }
+       }
+} #}}}
+
+1
index df347f6a994711977fd2f88c10393c53406d14b5..d94daf8bc9522b31db221c162bab410a5e16a2ed 100644 (file)
@@ -57,6 +57,12 @@ sub rcs_recentchanges ($) {
        # }
 }
 
+sub rcs_diff ($) {
+       # Optional, used to get diffs for recentchanges.
+       # The parameter is the rev from rcs_recentchanges.
+       return "";
+}
+
 sub rcs_getctime ($) {
        # Optional, used to get the page creation time from the RCS.
        error gettext("getctime not implemented");
index 26a6f42661a652249c8a4c7475dfb45578b8fc03..376d03c780336f6cc4a999fc370143a0d40f8177 100644 (file)
@@ -419,6 +419,12 @@ sub rcs_recentchanges ($) { #{{{
        return @rets;
 } #}}}
 
+sub rcs_diff ($) { #{{{
+       my $rev=shift;
+       my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
+       return join("\n", run_or_non("git", "diff", "$sha1^", $sha1));
+} #}}}
+
 sub rcs_getctime ($) { #{{{
        my $file=shift;
        # Remove srcdir prefix
index 8b1f2c6a1974347740e3d258dbeb9ae960112635..a042f4a455204f3d49e5e0c7298ed569736eb85c 100644 (file)
@@ -148,6 +148,10 @@ sub rcs_recentchanges ($) { #{{{
        return @ret;
 } #}}}
 
+sub rcs_diff ($) { #{{{
+       # TODO
+} #}}}
+
 sub rcs_getctime ($) { #{{{
        my ($file) = @_;
 
index 6a156892a096891e23bd7fb1d879f31198ea44b6..06615da111a6ce4f2aa6b24ff71df24b9f73830b 100644 (file)
@@ -475,6 +475,10 @@ sub rcs_recentchanges ($) { #{{{
        return @ret;
 } #}}}
 
+sub rcs_diff ($) { #{{{
+       # TODO
+} #}}}
+
 sub rcs_getctime ($) { #{{{
        my $file=shift;
 
index f7d2242f043209cd9ca7291d3af6186c0407990e..7bad407475808588654551c52cfd82dd7228ceac 100644 (file)
@@ -217,6 +217,11 @@ sub rcs_recentchanges ($) { #{{{
        return @ret;
 } #}}}
 
+sub rcs_diff ($) { #{{{
+       my $rev=possibly_foolish_untaint(int(shift));
+       return scalar `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`;
+} #}}}
+
 sub rcs_getctime ($) { #{{{
        my $file=shift;
 
index 23149644519a7c0f2bf173c7daa0e77bb3785587..2890ff8c73d68e1609cb18f1f313d66336bdfbde 100644 (file)
@@ -160,6 +160,20 @@ sub rcs_recentchanges ($) {
        return @ret;
 }
 
+sub rcs_diff ($) { #{{{
+       my $rev=shift;
+       my $logs = `tla logs -d $config{srcdir}`;
+       my @changesets = reverse split(/\n/, $logs);
+       my $i;
+
+       for($i=0;$i<$#changesets;$i++) {
+               last if $changesets[$i] eq $rev;
+       }
+
+       my $revminusone = $changesets[$i+1];
+       return scalar `tla diff -d $config{srcdir} $revminusone`;
+} #}}}
+
 sub rcs_getctime ($) { #{{{
        my $file=shift;
        eval q{use Date::Parse};
index 30416ecdd963b8c9faeaa85b8380cf057d62c690..a9d530c1eed18d10042c3b6999f0e2845c62d081 100644 (file)
@@ -9,6 +9,12 @@ ikiwiki (2.41) UNRELEASED; urgency=low
   * The meta plugin now allows for the robots tag to be specified without the
     risk of it being scrubbed.
 
+  [ Joey Hess ]
+  * Add recentchangesdiff plugin that adds diffs to the recentchanges feeds.
+  * rcs_diff is a new function that rcs modules should implement.
+  * Implemented rcs_diff for git, svn, and tla (tla version untested).
+    Mercurial and monotone still todo.
+
  -- martin f. krafft <madduck@debian.org>  Sun, 02 Mar 2008 17:46:38 +0100
 
 ikiwiki (2.40) unstable; urgency=low
diff --git a/doc/plugins/recentchangesdiff.mdwn b/doc/plugins/recentchangesdiff.mdwn
new file mode 100644 (file)
index 0000000..f805eab
--- /dev/null
@@ -0,0 +1,6 @@
+[[template id=plugin name=recentchangesdiff core=0 author="[[Joey]]"]]
+
+This plugin extends the [[recentchanges]] plugin, adding a diff for each
+change. The diffs are by default hidden from display on the recentchanges
+page, but will display in its feeds. The [[rcs]] must have implemented
+support for the `rcs_diff()` function for any diffs to be generated.
index 026d2c8817d6f35fd1ad76a6e4b3c9551292efbd..f9a69c4f15ef4796c6cbe011839e978a1651ce2a 100644 (file)
@@ -92,6 +92,9 @@ div.recentchanges {
 .recentchanges .desc {
        display: none;
 }
+.recentchanges .diff {
+       display: none;
+}
 .recentchanges .committer {
        float: left;
        margin: 0;
index 8be9e2734c37a37ec788e5fe9dc533e5e0e36f36..4a1c32053c84ab2b2b2872624a8486bab76db2d5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-02-24 16:02-0500\n"
+"POT-Creation-Date: 2008-03-03 15:41-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -508,7 +508,7 @@ msgstr ""
 msgid "(not toggleable in preview mode)"
 msgstr ""
 
-#: ../IkiWiki/Rcs/Stub.pm:62
+#: ../IkiWiki/Rcs/Stub.pm:68
 msgid "getctime not implemented"
 msgstr ""
 
index e476a7439b65c20e0ee37e6fb9ddccf3ee2f5b0c..55aabe201fe0e5fe5e8ddf36a92b8fd17eddc83c 100644 (file)
 </TMPL_IF>
 </TMPL_LOOP>
 </div>
+<TMPL_IF NAME="DIFF">
+<div class=diff>
+<pre>
+<TMPL_VAR NAME="DIFF" ESCAPE="HTML">
+</pre>
+</div>
+</TMPL_IF>
 <!-- <TMPL_VAR REV> -->