]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Rcs/mercurial.pm
add folding
[ikiwiki.git] / IkiWiki / Rcs / mercurial.pm
index 36972c560e3c6b6f5426610bb0209bce99b86b5f..6452a0805c75bb9545690311904c43de27e016eb 100644 (file)
@@ -1,14 +1,34 @@
 #!/usr/bin/perl
 
+package IkiWiki;
+
 use warnings;
 use strict;
 use IkiWiki;
 use Encode;
 use open qw{:utf8 :std};
 
-package IkiWiki;
-
-sub mercurial_log($) {
+hook(type => "getsetup", id => "mercurial", call => sub { #{{{
+       return
+               historyurl => {
+                       type => "string",
+                       default => "",
+                       example => "http://example.com:8000/log/tip/[[file]]",
+                       description => "url to hg serve'd repository, to show file history ([[file]] substituted)",
+                       safe => 1,
+                       rebuild => 1,
+               },
+               diffurl => {
+                       type => "string",
+                       default => "",
+                       example => "http://localhost:8000/?fd=[[r2]];file=[[file]]",
+                       description => "url to hg serve'd repository, to show diff ([[file]] and [[r2]] substituted)",
+                       safe => 1,
+                       rebuild => 1,
+               },
+}); #}}}
+
+sub mercurial_log ($) { #{{{
        my $out = shift;
        my @infos;
 
@@ -52,10 +72,10 @@ sub mercurial_log($) {
        close $out;
 
        return @infos;
-}
+} #}}}
 
 sub rcs_update () { #{{{
-       my @cmdline = ("hg", "-R", "$config{srcdir}", "update");
+       my @cmdline = ("hg", "-q", "-R", "$config{srcdir}", "update");
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }
@@ -65,12 +85,26 @@ sub rcs_prepedit ($) { #{{{
        return "";
 } #}}}
 
-sub rcs_commit ($$$) { #{{{
-       my ($file, $message, $rcstoken) = @_;
+sub rcs_commit ($$$;$$) { #{{{
+       my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+
+       if (defined $user) {
+               $user = possibly_foolish_untaint($user);
+       }
+       elsif (defined $ipaddr) {
+               $user = "Anonymous from ".possibly_foolish_untaint($ipaddr);
+       }
+       else {
+               $user = "Anonymous";
+       }
 
        $message = possibly_foolish_untaint($message);
+       if (! length $message) {
+               $message = "no message given";
+       }
 
-       my @cmdline = ("hg", "-R", "$config{srcdir}", "commit", "-m", "$message");
+       my @cmdline = ("hg", "-q", "-R", $config{srcdir}, "commit", 
+                      "-m", $message, "-u", $user);
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }
@@ -78,24 +112,45 @@ 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)=@_;
+       
+       error("rcs_commit_staged not implemented for mercurial"); # TODO
+}
+
 sub rcs_add ($) { # {{{
        my ($file) = @_;
 
-       my @cmdline = ("hg", "-R", "$config{srcdir}", "add", "$file");
+       my @cmdline = ("hg", "-q", "-R", "$config{srcdir}", "add", "$config{srcdir}/$file");
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }
 } #}}}
 
+sub rcs_remove ($) { # {{{
+       my ($file) = @_;
+
+       error("rcs_remove not implemented for mercurial"); # TODO
+} #}}}
+
+sub rcs_rename ($$) { # {{{
+       my ($src, $dest) = @_;
+
+       error("rcs_rename not implemented for mercurial"); # TODO
+} #}}}
+
 sub rcs_recentchanges ($) { #{{{
        my ($num) = @_;
 
-       eval q{use CGI 'escapeHTML'};
-       error($@) if $@;
-
-       my @cmdline = ("hg", "-R", $config{srcdir}, "log", "-v", "-l", $num);
+       my @cmdline = ("hg", "-R", $config{srcdir}, "log", "-v", "-l", $num,
+               "--style", "default");
        open (my $out, "@cmdline |");
 
+       eval q{use Date::Parse};
+       error($@) if $@;
+
        my @ret;
        foreach my $info (mercurial_log($out)) {
                my @pages = ();
@@ -124,7 +179,7 @@ sub rcs_recentchanges ($) { #{{{
                        rev        => $info->{"changeset"},
                        user       => $user,
                        committype => "mercurial",
-                       when       => $info->{"date"},
+                       when       => str2time($info->{"date"}),
                        message    => [@message],
                        pages      => [@pages],
                };
@@ -133,12 +188,30 @@ sub rcs_recentchanges ($) { #{{{
        return @ret;
 } #}}}
 
-sub rcs_notify () { #{{{
+sub rcs_diff ($) { #{{{
        # TODO
 } #}}}
 
 sub rcs_getctime ($) { #{{{
-       error "getctime not implemented";
+       my ($file) = @_;
+
+       # XXX filename passes through the shell here, should try to avoid
+       # that just in case
+       my @cmdline = ("hg", "-R", $config{srcdir}, "log", "-v", "-l", '1', 
+               "--style", "default", "$config{srcdir}/$file");
+       open (my $out, "@cmdline |");
+
+       my @log = mercurial_log($out);
+
+       if (length @log < 1) {
+               return 0;
+       }
+
+       eval q{use Date::Parse};
+       error($@) if $@;
+       
+       my $ctime = str2time($log[0]->{"date"});
+       return $ctime;
 } #}}}
 
 1