* Add support for mercurial, contributed by Emanuele Aina.

master
joey 2006-09-06 20:31:55 +00:00
parent 513af0c0df
commit f7f3b0bb7d
13 changed files with 231 additions and 27 deletions

View File

@ -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

3
debian/changelog vendored
View 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

6
debian/control vendored
View 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

View 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/).

View 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.

View 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.

View 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]].

View File

@ -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.

View 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

View 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]]

View 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

View File

@ -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.

View 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.