* Add support for mercurial, contributed by Emanuele Aina.
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Wed, 6 Sep 2006 20:31:55 +0000 (20:31 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Wed, 6 Sep 2006 20:31:55 +0000 (20:31 +0000)
13 files changed:
IkiWiki/Rcs/mercurial.pm [new file with mode: 0644]
debian/changelog
debian/control
doc/about_rcs_backends.mdwn
doc/features.mdwn
doc/ikiwiki.setup
doc/index.mdwn
doc/mercurial.mdwn [new file with mode: 0644]
doc/post-commit.mdwn
doc/roadmap.mdwn
doc/setup.mdwn
doc/todo/mercurial.mdwn [new file with mode: 0644]
doc/usage.mdwn

diff --git a/IkiWiki/Rcs/mercurial.pm b/IkiWiki/Rcs/mercurial.pm
new file mode 100644 (file)
index 0000000..82a2fa6
--- /dev/null
@@ -0,0 +1,143 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use IkiWiki;
+use Encode;
+use open qw{:utf8 :std};
+
+package IkiWiki;
+
+sub mercurial_log($) {
+       my $out = shift;
+       my @infos;
+
+       while (<$out>) {
+               my $line = $_;
+               my ($key, $value);
+
+               if (/^description:/) {
+                       $key = "description";
+                       $value = "";
+
+                       # slurp everything as the description text 
+                       # until the next changeset
+                       while (<$out>) {
+                               if (/^changeset: /) {
+                                       $line = $_;
+                                       last;
+                               }
+
+                               $value .= $_;
+                       }
+
+                       local $/ = "";
+                       chomp $value;
+                       $infos[$#infos]{$key} = $value;
+               }
+
+               chomp $line;
+               ($key, $value) = split /: +/, $line, 2;
+
+               if ($key eq "changeset") {
+                       push @infos, {};
+
+                       # remove the revision index, which is strictly 
+                       # local to the repository
+                       $value =~ s/^\d+://;
+               }
+
+               $infos[$#infos]{$key} = $value;
+       }
+       close $out;
+
+       return @infos;
+}
+
+sub rcs_update () { #{{{
+       my @cmdline = ("hg", "-R", "$config{srcdir}", "update");
+       if (system(@cmdline) != 0) {
+               warn "'@cmdline' failed: $!";
+       }
+} #}}}
+
+sub rcs_prepedit ($) { #{{{
+       return "";
+} #}}}
+
+sub rcs_commit ($$$) { #{{{
+       my ($file, $message, $rcstoken) = @_;
+
+       $message = possibly_foolish_untaint($message);
+
+       my @cmdline = ("hg", "-R", "$config{srcdir}", "commit", "-m", "$message");
+       if (system(@cmdline) != 0) {
+               warn "'@cmdline' failed: $!";
+       }
+
+       return undef; # success
+} #}}}
+
+sub rcs_add ($) { # {{{
+       my ($file) = @_;
+
+       my @cmdline = ("hg", "-R", "$config{srcdir}", "add", "$file");
+       if (system(@cmdline) != 0) {
+               warn "'@cmdline' failed: $!";
+       }
+} #}}}
+
+sub rcs_recentchanges ($) { #{{{
+       my ($num) = @_;
+
+       eval q{use CGI 'escapeHTML'};
+
+       my @cmdline = ("hg", "-R", $config{srcdir}, "log", "-v", "-l", $num);
+       open (my $out, "@cmdline |");
+
+       my @ret;
+       foreach my $info (mercurial_log($out)) {
+               my @pages = ();
+               my @message = ();
+        
+               foreach my $msgline (split(/\n/, $info->{description})) {
+                       push @message, { line => $msgline };
+               }
+
+               foreach my $file (split / /,$info->{files}) {
+                       my $diffurl = $config{'diffurl'};
+                       $diffurl =~ s/\[\[file\]\]/$file/go;
+                       $diffurl =~ s/\[\[r2\]\]/$info->{changeset}/go;
+
+                       push @pages, {
+                               page => pagename($file),
+                               diffurl => $diffurl,
+                       };
+               }
+
+               my $user = $info->{"user"};
+               $user =~ s/\s*<.*>\s*$//;
+               $user =~ s/^\s*//;
+
+               push @ret, {
+                       rev        => $info->{"changeset"},
+                       user       => $user,
+                       committype => "mercurial",
+                       when       => $info->{"date"},
+                       message    => [@message],
+                       pages      => [@pages],
+               };
+       }
+
+       return @ret;
+} #}}}
+
+sub rcs_notify () { #{{{
+       # TODO
+} #}}}
+
+sub rcs_getctime ($) { #{{{
+       error "getctime not implemented";
+} #}}}
+
+1
index 99932e00738d6ba82a86ca7545a3fbef0a032a20..8f9bfe2ec3baf2b36ef464407f0c8ca7000262c1 100644 (file)
@@ -5,8 +5,9 @@ ikiwiki (1.25) UNRELEASED; urgency=low
   * Drop real uid/gid in the suid wrapper, thus allowing commits to remote
     subversion repos and fixing some other issues.
   * Add support for tla, contributed by Clint Adams. Closes: #385936
+  * Add support for mercurial, contributed by Emanuele Aina.
 
- -- Joey Hess <joeyh@debian.org>  Wed,  6 Sep 2006 15:47:25 -0400
+ -- Joey Hess <joeyh@debian.org>  Wed,  6 Sep 2006 15:55:39 -0400
 
 ikiwiki (1.24) unstable; urgency=low
 
index 2b8bdbb320a3d24927962d9427bb1f4a21b4c39f..05ea1bcf58227b2c5dc134f0ba31a0106c379c9a 100644 (file)
@@ -9,13 +9,13 @@ Standards-Version: 3.7.2
 Package: ikiwiki
 Architecture: all
 Depends: ${perl:Depends}, libxml-simple-perl, markdown, libtimedate-perl, libhtml-template-perl, libhtml-scrubber-perl, libcgi-formbuilder-perl (>= 3.02.02), libtime-duration-perl, libcgi-session-perl, libmail-sendmail-perl, gcc | c-compiler, libc6-dev | libc-dev, libhtml-parser-perl
-Recommends: subversion | git-core | tla, hyperestraier
+Recommends: subversion | git-core | tla | mercurual, hyperestraier
 Suggests: viewcvs, librpc-xml-perl, libtext-wikiformat-perl, python-docutils, polygen, tidy, libxml-feed-perl, libmailtools-perl
 Description: a wiki compiler
  ikiwiki converts a directory full of wiki pages into html pages suitable
  for publishing on a website. Unlike many wikis, ikiwiki does not have its
- own means of storing page history. Instead it can use Subversion (or
Git or tla).
+ own means of storing page history, and instead uses a revision control
system (such as  Subversion).
  .
  ikiwiki implements all of the other standard features of a wiki, including
  web-based page editing, user registration and logins, a RecentChanges
index 0a95b7f54feb7976f90ce2b7a957b00588cd0146..95d641e726dc4161a43ac69a2f55314794f27d44 100644 (file)
@@ -117,8 +117,33 @@ part).  GIT doesn't have a similar functionality like 'svn merge -rOLD:NEW
 FILE' (please see the relevant comment in mergepast for more details), so I
 had to invent an ugly hack just for the purpose.
 
-## [mercurial](http://www.selenic.com/mercurial/)
+## [Mercurial](http://www.selenic.com/mercurial/)
 
-Being worked on by Emanuele Aina.
+The Mercurial backend is still in a early phase, so it may not be mature 
+enough, but it should be simple to understand and use.
 
-<http://techn.ocracy.org/ikiwiki>
+As Mercurial is a distributed RCS, it lacks the distinction between 
+repository and working copy (every wc is a repo).
+
+This means that the Mercurial backend uses directly the repository as 
+working copy (the master M and the working copy W described in the svn 
+example are the same thing).
+
+You only need to specify 'srcdir' (the repository M) and 'destdir' (where
+the HTML will be generated).
+
+Master repository M.
+
+RCS commit from the outside are installed into M.
+
+M is directly used as working copy (M is also W).
+
+HTML is generated from the working copy in M. rcs_update() will update 
+to the last committed revision in M (the same as 'hg update').
+If you use an 'update' hook you can generate automatically the HTML
+in the destination directory each time 'hg update' is called.
+
+CGI operates on M. rcs_commit() will commit directly in M.
+
+If you have any question or suggestion about the Mercurial backend 
+please refer to [Emanuele](http://nerd.ocracy.org/em/).
index d5fa4026b20bb90fba1dc5f81fafb9e4a1977677..c568213bf3093d31c31ea027e94fcff1527f8a74 100644 (file)
@@ -4,18 +4,18 @@ An overview of some of ikiwiki's features:
 ## Uses a real RCS
 
 Rather than implement its own system for storing page histories etc,
-ikiwiki uses a real RCS. This isn't because we're lazy, it's because a
-real RCS is a good thing to have, and there are advantages to using one
-that are not possible with a standard wiki.
+ikiwiki uses a real Revision Control System. This isn't because we're
+lazy, it's because a real RCS is a good thing to have, and there are
+advantages to using one that are not possible with a standard wiki.
 
 Instead of editing pages in a stupid web form, you can use vim and commit
-changes via svn. Or work disconnected using svk and push your changes out
-when you come online. Or use git or tla to work in a distributed fashion
-all the time. (It's also possible to [[plugins/write]] a plugin to support
-other systems.)
+changes via [[Subversion]]. Or work disconnected using svk and push your
+changes out when you come online. Or use [[git]], [[tla]], or [[mercurial]]
+to work in a distributed fashion all the time. (It's also possible to
+[[plugins/write]] a plugin to support other systems.)
 
 ikiwiki can be run from a [[post-commit]] hook to update your wiki
-immediately whenever you commit.
+immediately whenever you commit a change using the RCS.
 
 Note that ikiwiki does not require a RCS to function. If you want to
 run a simple wiki without page history, it can do that too.
index 95d2d46af9e146e9e5c70b01381dc40670463787..ac84352df3e51f47f7e7128e8f0b18c784248d1d 100644 (file)
@@ -35,6 +35,11 @@ use IkiWiki::Setup::Standard {
        #historyurl => ??,
        #diffurl => ??,
 
+       # Mercurial stuff.
+       #rcs => "mercurial",
+       #historyurl => "http://localhost:8000/", # hg serve'd local repository
+       #diffurl => "http://localhost:8000/?fd=[[changeset]];file=[[file]]",
+
        wrappers => [
                #{
                #       # The cgi wrapper.
index 67f099210f168617de771dad36dd741e5fcfb86a..2dd90247c38b662dabdf1fe2255d3e92f1d0ba3b 100644 (file)
@@ -1,8 +1,8 @@
 [[ikiwiki_logo|logo/ikiwiki.png]]  
 ikiwiki is a **wiki compiler**. It converts wiki pages
 into html pages suitable for publishing on a website. Unlike a traditional
-wiki, ikiwiki does not have its own means of storing page history.
-Instead it can use [[Subversion]] (or [[Git]] or [[tla]]).
+wiki, ikiwiki does not have its own means of storing page history,
+and instead uses a revision control system (such as [[Subversion]]).
 
 * [[News]] is a blog (built using ikiwiki) of news items about ikiwiki.
   It's the best way to find out when there's a new version to [[Download]].
diff --git a/doc/mercurial.mdwn b/doc/mercurial.mdwn
new file mode 100644 (file)
index 0000000..5eaae19
--- /dev/null
@@ -0,0 +1,8 @@
+[Mercurial](http://selenic.com/mercurial) is a distributed revison control
+system developed by Matt Mackall. Ikiwiki supports storing a wiki in a
+mercurial repository.
+
+Ikiwiki can run as a post-update hook to update a wiki whenever commits
+come in. When running as a [[cgi]] with Mercurial, ikiwiki automatically
+commits edited pages, and uses the Mercurial history to generate the
+[[RecentChanges]] page.
index 8def3d751661a8863aad68b4bfa8e24ecc6e967d..84375dad03155bf209f540912b3dc8426f11c590 100644 (file)
@@ -1,5 +1,5 @@
 A post-commit hook is run every time you commit a change to your
-[[subversion]] (or [[git]]) repository. To make the wiki be updated each
+[[subversion]] (or [[git]] or [[mercurial]]) repository. To make the wiki be updated each
 time a commit is made, it can be run from (or as) a post-commit hook.
 
 The best way to run ikiwiki in a post-commit hook is using a wrapper, which
index 4bd9ab671fd62c577db58cf6a668e5dffa7b56da..a4b4919d4cac88ac72711e3760ed8d887eb3d79d 100644 (file)
@@ -22,9 +22,8 @@ Released 29 April 2006.
   possible)_
 * Improved [[todo/html]] stylesheets and templates.
 * Improved scalable [[logo]]. _(status: done)_
-* Support for at least one RCS aside from svn. Once it supports two, it should
-  quickly grow to support them all.. See [[about_rcs_backends]]
-  _(status: supports git and tla in tree)_
+* Support for at other revision control systems aside from svn.
+  See [[about_rcs_backends]] _(status: supports git, tla, mercurial)_
 * Support for one other markup language, probably restructured text.
   _(status: done, but the rst plugin needs improvement)_
 * No serious known [[bugs]]
index e2396f777355a374441f4d9e06378ba9c06f92ff..c6a8f297eb2ff313afc33090c63b0933ffc54f61 100644 (file)
@@ -1,6 +1,6 @@
 So you want to set up your own wiki using ikiwiki? This tutorial will walk
-you through setting up a wiki that is stored in [[Subversion]], [[Git]], or
-[[TLA]], and that has optional support for commits from the web.
+you through setting up a wiki that is stored in [[Subversion]], [[Git]],
+[[TLA]] or [[Mercurial]], and that has optional support for commits from the web.
 
 1. [[Install]] ikiwiki. See [[download]] for where to get it.
 
@@ -26,6 +26,9 @@ you through setting up a wiki that is stored in [[Subversion]], [[Git]], or
                # Edit {arch}/=tagging-method and change the precious
                # line to add the .ikiwiki directory to the regexp.
 
+               # Mercurial
+               hg init /hg/wikirepo
+
 3. Check out the repository to make the working copy that ikiwiki will use.
 
                # Subversion
@@ -41,6 +44,12 @@ you through setting up a wiki that is stored in [[Subversion]], [[Git]], or
                tla init-tree me@localhost--wiki/wiki--0
                tla import
 
+               # Mercurial
+               # Mercurial uses a single repo approach, so no need to
+               # clone anything. Because the following examples
+               # refer to the ~/wikiwc working copy we symlink it:
+               ln -s /hg/wikirepo ~/wikiwc
+
 4. Build your wiki for the first time.
 
                ikiwiki --verbose ~/wikiwc/ ~/public_html/wiki/ \
@@ -70,6 +79,10 @@ you through setting up a wiki that is stored in [[Subversion]], [[Git]], or
                tla add index.mdwn
                tla commit
 
+               # Mercurial
+               hg add index.mdwn
+               hg commit -m customised index.mdwn
+
    You can also add any files you like from scratch of course.
 
 6. Repeat steps 4 and 5 as desired, editing or adding pages and rebuilding
@@ -92,12 +105,13 @@ you through setting up a wiki that is stored in [[Subversion]], [[Git]], or
    that all of these are pointing to the right directories, and read
    through and configure the rest of the file to your liking.
 
-   If you want to use git, comment out the subversion stuff, uncomment and
-   edit the git stuff.
+   If you want to use something other than subversion, comment out the
+   subversion configuration, and uncomment and edit the configuration for
+   your chosen RCS.
 
    Note that the default file has a block to configure an [[post-commit]] 
    wrapper to update the wiki. You need to uncomment the related block for
-   whatever rcs you use and comment out the other rcs blocks.
+   whatever RCS you use and comment out the other rcs blocks.
 
    When you're satisfied, run `ikiwiki --setup ikiwiki.setup`, and it
    will set everything up and update your wiki.
@@ -111,7 +125,7 @@ you through setting up a wiki that is stored in [[Subversion]], [[Git]], or
 9. Add [[PageHistory]] links to the top of pages. This requires you to have
    setup a repository browser.  For Subversion, you may use [[ViewCVS]] or
    something similar to access your [[Subversion]] repository.  For Git,
-   [[Gitweb]] can be used.
+   [[Gitweb]] can be used, etc.
    
    The `historyurl` setting makes ikiwiki add the links, and in that url,
    "\[[file]]" is replaced with the name of the file to view. So edit
diff --git a/doc/todo/mercurial.mdwn b/doc/todo/mercurial.mdwn
new file mode 100644 (file)
index 0000000..e25039b
--- /dev/null
@@ -0,0 +1,4 @@
+* Need to get post commit hook working (or an example of how to use it.)
+* Need --ctime support.
+* rcs_notify is not implemented
+* Is the code sufficiently robust? It just warns when mercurial fails.
index 4456e8c1ce66119bd981169f366b76ba2bbc6829..0c7e7d036cb266c30374cb81a0c481b63b13a631 100644 (file)
@@ -120,6 +120,11 @@ configuration options of their own.
   If you use git, the `source` directory is assumed to be a clone of the
   [[git]] repository.
 
+  If you use tla, the `source` directory is assumed to be a tla import.
+
+  If you use mercurial, the `source` directory is assumed to be the
+  [[mercurial]] repository.
+
   In [[CGI]] mode, with a revision control system enabled pages edited via
   the web will be committed. Also, the [[RecentChanges]] link will be placed
   on pages.