]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Rcs/svn.pm
tla done too
[git.ikiwiki.info.git] / IkiWiki / Rcs / svn.pm
index 987469ba07a221c561825968b05e347acf5b8ada..9b8d4be13da881f193621a510c9f32ac3e6d355f 100644 (file)
@@ -1,23 +1,58 @@
 #!/usr/bin/perl
 
+package IkiWiki;
+
 use warnings;
 use strict;
 use IkiWiki;
 use POSIX qw(setlocale LC_CTYPE);
 
-package IkiWiki::Rcs::svn;
-
-sub import { #{{{
-       if (exists $IkiWiki::config{svnpath}) {
+hook(type => "checkconfig", id => "svn", call => sub { #{{{
+       if (! defined $config{svnpath}) {
+               $config{svnpath}="trunk";
+       }
+       if (exists $config{svnpath}) {
                # code depends on the path not having extraneous slashes
-               $IkiWiki::config{svnpath}=~tr#/#/#s;
-               $IkiWiki::config{svnpath}=~s/\/$//;
-               $IkiWiki::config{svnpath}=~s/^\///;
+               $config{svnpath}=~tr#/#/#s;
+               $config{svnpath}=~s/\/$//;
+               $config{svnpath}=~s/^\///;
        }
-} #}}}
-
-
-package IkiWiki;
+}); #}}}
+
+hook(type => "getsetup", id => "svn", call => sub { #{{{
+       return
+               svnrepo => {
+                       type => "string",
+                       default => "",
+                       example => "/svn/wiki",
+                       description => "subversion repository location",
+                       safe => 0, # path
+                       rebuild => 0,
+               },
+               svnpath => {
+                       type => "string",
+                       default => "trunk",
+                       description => "path inside repository where the wiki is located",
+                       safe => 0, # paranoia
+                       rebuild => 0,
+               },
+               historyurl => {
+                       type => "string",
+                       default => "",
+                       example => "http://svn.example.org/trunk/[[file]]",
+                       description => "viewvc url to show file history ([[file]] substituted)",
+                       safe => 1,
+                       rebuild => 1,
+               },
+               diffurl => {
+                       type => "string",
+                       default => "",
+                       example => "http://svn.example.org/trunk/[[file]]?root=wiki&r1=[[r1]]&r2=[[r2]]",
+                       description => "viewvc url to show a diff ([[file]], [[r1]], and [[r2]] substituted)",
+                       safe => 1,
+                       rebuild => 1,
+               },
+}); #}}}
 
 # svn needs LC_CTYPE set to a UTF-8 locale, so try to find one. Any will do.
 sub find_lc_ctype() {
@@ -117,6 +152,28 @@ sub rcs_commit ($$$;$$) { #{{{
        return undef # success
 } #}}}
 
+sub rcs_commit_staged ($$$) {
+       # Commits all staged changes. Changes can be staged using rcs_add,
+       # rcs_remove, and rcs_rename.
+       my ($message, $user, $ipaddr)=@_;
+       
+       if (defined $user) {
+               $message="web commit by $user".(length $message ? ": $message" : "");
+       }
+       elsif (defined $ipaddr) {
+               $message="web commit from $ipaddr".(length $message ? ": $message" : "");
+       }
+       
+       if (system("svn", "commit", "--quiet",
+                  "--encoding", "UTF-8", "-m",
+                  possibly_foolish_untaint($message),
+                  $config{srcdir}) != 0) {
+               warn("svn commit failed\n");
+               return 1; # failure     
+       }
+       return undef # success
+}
+
 sub rcs_add ($) { #{{{
        # filename is relative to the root of the srcdir
        my $file=shift;
@@ -134,6 +191,40 @@ sub rcs_add ($) { #{{{
        }
 } #}}}
 
+sub rcs_remove ($) { #{{{
+       # filename is relative to the root of the srcdir
+       my $file=shift;
+
+       if (-d "$config{srcdir}/.svn") {
+               if (system("svn", "rm", "--force", "--quiet", "$config{srcdir}/$file") != 0) {
+                       warn("svn rm failed\n");
+               }
+       }
+} #}}}
+
+sub rcs_rename ($$) { #{{{
+       # filenames relative to the root of the srcdir
+       my ($src, $dest)=@_;
+       
+       if (-d "$config{srcdir}/.svn") {
+               # Add parent directory for $dest
+               my $parent=dirname($dest);
+               if (! -d "$config{srcdir}/$parent/.svn") {
+                       while (! -d "$config{srcdir}/$parent/.svn") {
+                               $parent=dirname($dest);
+                       }
+                       if (system("svn", "add", "--quiet", "$config{srcdir}/$parent") != 0) {
+                               warn("svn add $parent failed\n");
+                       }
+               }
+
+               if (system("svn", "mv", "--force", "--quiet", 
+                   "$config{srcdir}/$src", "$config{srcdir}/$dest") != 0) {
+                       warn("svn rename failed\n");
+               }
+       }
+} #}}}
+
 sub rcs_recentchanges ($) { #{{{
        my $num=shift;
        my @ret;
@@ -171,7 +262,7 @@ sub rcs_recentchanges ($) { #{{{
                my $rev = $logentry->{revision};
                my $user = $logentry->{author};
 
-               my $when=time - str2time($logentry->{date}, 'UTC');
+               my $when=str2time($logentry->{date}, 'UTC');
 
                foreach my $msgline (split(/\n/, $logentry->{msg})) {
                        push @message, { line => $msgline };
@@ -203,7 +294,8 @@ sub rcs_recentchanges ($) { #{{{
                                diffurl => $diffurl,
                        } if length $file;
                }
-               push @ret, { rev => $rev,
+               push @ret, {
+                       rev => $rev,
                        user => $user,
                        committype => $committype,
                        when => $when,
@@ -216,42 +308,9 @@ sub rcs_recentchanges ($) { #{{{
        return @ret;
 } #}}}
 
-sub rcs_notify () { #{{{
-       if (! exists $ENV{REV}) {
-               error(gettext("REV is not set, not running from svn post-commit hook, cannot send notifications"));
-       }
-       my $rev=int(possibly_foolish_untaint($ENV{REV}));
-       
-       my $user=`svnlook author $config{svnrepo} -r $rev`;
-       chomp $user;
-       
-       my $message=`svnlook log $config{svnrepo} -r $rev`;
-       if ($message=~/$config{web_commit_regexp}/) {
-               $user=defined $2 ? "$2" : "$3";
-               $message=$4;
-       }
-
-       my @changed_pages;
-       foreach my $change (`svnlook changed $config{svnrepo} -r $rev`) {
-               chomp $change;
-               if (length $config{svnpath}) {
-                       if ($change =~ /^[A-Z]+\s+\Q$config{svnpath}\E\/(.*)/) {
-                               push @changed_pages, $1;
-                       }
-               }
-               else {
-                       push @changed_pages, $change;
-               }
-       }
-       
-       require IkiWiki::UserInfo;
-       send_commit_mails(
-               sub {
-                       return $message;
-               },
-               sub {
-                       `svnlook diff $config{svnrepo} -r $rev --no-diff-deleted`;
-               }, $user, @changed_pages);
+sub rcs_diff ($) { #{{{
+       my $rev=possibly_foolish_untaint(int(shift));
+       return `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`;
 } #}}}
 
 sub rcs_getctime ($) { #{{{