* Add support for tla, contributed by Clint Adama. Closes: #385936

master
joey 2006-09-04 06:15:54 +00:00
parent 44c8d86339
commit 99d52a1794
11 changed files with 287 additions and 10 deletions

View File

@ -1,5 +1,4 @@
#!/usr/bin/perl
# For subversion support.
use warnings;
use strict;

252
IkiWiki/Rcs/tla.pm 100644
View File

@ -0,0 +1,252 @@
#!/usr/bin/perl
use warnings;
use strict;
use IkiWiki;
use POSIX qw(setlocale LC_CTYPE);
package IkiWiki;
my $tla_webcommit=qr/^web commit (by (\w+)|from (\d+\.\d+\.\d+\.\d+)):?(.*)/;
sub quiet_system (@) {
open (SAVEOUT, ">&STDOUT");
close STDOUT;
my $ret=system(@_);
open (STDOUT, ">&SAVEOUT");
close SAVEOUT;
return $ret;
}
sub rcs_update () { #{{{
if (-d "$config{srcdir}/{arch}") {
if (quiet_system("tla", "replay", "-d", $config{srcdir}) != 0) {
warn("tla replay failed\n");
}
}
} #}}}
sub rcs_prepedit ($) { #{{{
my $file=shift;
if (-d "$config{srcdir}/{arch}") {
# For Arch, return the tree-id of archive when
# editing begins.
my $rev=`tla tree-id $config{srcdir}`;
return defined $rev ? $rev : "";
}
} #}}}
sub rcs_commit ($$$) { #{{{
my $file=shift;
my $message=shift;
my $rcstoken=shift;
if (-d "$config{srcdir}/{arch}") {
# Check to see if the page has been changed by someone
# else since rcs_prepedit was called.
my ($oldrev)=$rcstoken=~/^([A-Za-z0-9@\/._-]+)$/; # untaint
my $rev=`tla tree-id $config{srcdir}`;
if (defined $rev && defined $oldrev && $rev ne $oldrev) {
# Merge their changes into the file that we've
# changed.
if (system("tla", "update", "-d",
"$config{srcdir}/$file") != 0) {
warn("tla update failed\n");
}
}
if (quiet_system("tla", "commit",
"-L".possibly_foolish_untaint($message),
'-d', $config{srcdir}) != 0) {
my $conflict=readfile("$config{srcdir}/$file");
if (system("tla", "undo", "--quiet", "-d", "$config{srcdir}") != 0) {
warn("tla undo failed\n");
}
return $conflict;
}
}
return undef # success
} #}}}
sub rcs_add ($) { #{{{
my $file=shift;
if (-d "$config{srcdir}/{arch}") {
if (quiet_system("tla", "add", "$config{srcdir}/$file") != 0) {
warn("tla add failed\n");
}
}
} #}}}
sub rcs_recentchanges ($) {
my $num=shift;
my @ret;
return unless -d "$config{srcdir}/{arch}";
eval q{use Date::Parse};
eval q{use Mail::Header};
my $logs = `tla logs -d $config{srcdir}`;
my @changesets = reverse split(/\n/, $logs);
for (my $i=0; $i<$num && $i<$#changesets; $i++) {
my ($change)=$changesets[$i]=~/^([A-Za-z0-9@\/._-]+)$/; # untaint
open(LOG, "tla cat-log -d $config{srcdir} $change|");
my $head = Mail::Header->new(\*LOG);
close(LOG);
my $rev = $head->get("Revision");
my $summ = $head->get("Summary");
my $newfiles = $head->get("New-files");
my $modfiles = $head->get("Modified-files");
my $user = $head->get("Creator");
my @paths = grep {!/^.*\/\.arch-ids\/.*\.id$/} split(/ /,
"$newfiles $modfiles");
my $sdate = $head->get("Standard-date");
my $when = time - str2time($sdate, 'UTC');
my $committype = "web";
if (defined $summ && $summ =~ /$tla_webcommit/) {
$user = defined $2 ? "$2" : "$3";
$summ = $4;
}
else {
$committype="tla";
}
my @message;
push @message, { line => escapeHTML($summ) };
$user = escapeHTML($user);
my @pages;
foreach my $file (@paths) {
my $diffurl=$config{diffurl};
$diffurl=~s/\[\[file\]\]/$file/g;
$diffurl=~s/\[\[rev\]\]/$change/g;
push @pages, {
page => pagename($file),
diffurl => $diffurl,
} if length $file;
}
push @ret, { rev => $change,
user => $user,
committype => $committype,
when => $when,
message => [@message],
pages => [@pages],
} if @pages;
last if $i == $num;
}
return @ret;
}
sub rcs_notify () { #{{{
# FIXME: Not set
if (! exists $ENV{REV}) {
error("REV is not set, not running from tla post-commit hook, cannot send notifications");
}
my $rev=int(possibly_foolish_untaint($ENV{REV}));
eval q{use Mail::Header};
open(LOG, $ENV{"ARCH_LOG"});
my $head = Mail::Header->new(\*LOG);
close(LOG);
my $message = $head->get("Summary");
my $user = $head->get("Creator");
my $newfiles = $head->get("New-files");
my $modfiles = $head->get("Modified-files");
my @changed_pages = grep {!/^.*\/\.arch-ids\/.*\.id$/} split(/ /,
"$newfiles $modfiles");
if ($message =~ /$tla_webcommit/) {
$user=defined $2 ? "$2" : "$3";
$message=$4;
}
require IkiWiki::UserInfo;
my @email_recipients=commit_notify_list($user, @changed_pages);
if (@email_recipients) {
# TODO: if a commit spans multiple pages, this will send
# subscribers a diff that might contain pages they did not
# sign up for. Should separate the diff per page and
# reassemble into one mail with just the pages subscribed to.
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];
my $diff=`tla diff -d $ENV{ARCH_TREE_ROOT} $revminusone`;
my $subject="$config{wikiname} update of ";
if (@changed_pages > 2) {
$subject.="$changed_pages[0] $changed_pages[1] etc";
}
else {
$subject.=join(" ", @changed_pages);
}
$subject.=" by $user";
my $template=template("notifymail.tmpl");
$template->param(
wikiname => $config{wikiname},
diff => $diff,
user => $user,
message => $message,
);
eval q{use Mail::Sendmail};
foreach my $email (@email_recipients) {
sendmail(
To => $email,
From => "$config{wikiname} <$config{adminemail}>",
Subject => $subject,
Message => $template->output,
) or error("Failed to send update notification mail");
}
}
} #}}}
sub rcs_getctime ($) { #{{{
my $file=shift;
eval q{use Date::Parse};
eval q{use Mail::Header};
my $logs = `tla logs -d $config{srcdir}`;
my @changesets = reverse split(/\n/, $logs);
my $sdate;
for (my $i=0; $i<$#changesets; $i++) {
my $change = $changesets[$i];
open(LOG, "tla cat-log -d $config{srcdir} $change|");
my $head = Mail::Header->new(\*LOG);
close(LOG);
$sdate = $head->get("Standard-date");
my $newfiles = $head->get("New-files");
my ($lastcreation) = grep {/^$file$/} split(/ /, "$newfiles");
last if defined($lastcreation);
}
my $date=str2time($sdate, 'UTC');
debug("found ctime ".localtime($date)." for $file");
return $date;
} #}}}
1

3
debian/changelog vendored
View File

@ -4,8 +4,9 @@ ikiwiki (1.25) UNRELEASED; urgency=low
zombies; this hit htmltidy especially badly.
* 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 Adama. Closes: #385936
-- Joey Hess <joeyh@debian.org> Mon, 4 Sep 2006 00:19:50 -0400
-- Joey Hess <joeyh@debian.org> Mon, 4 Sep 2006 01:33:17 -0400
ikiwiki (1.24) unstable; urgency=low

2
debian/control vendored
View File

@ -10,7 +10,7 @@ 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, hyperestraier
Suggests: viewcvs, librpc-xml-perl, libtext-wikiformat-perl, python-docutils, polygen, tidy, libxml-feed-perl
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

View File

@ -10,9 +10,9 @@ 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 to work in a distributed fashion all the
time. (It's also possible to [[plugins/write]] a plugin to support other
systems.)
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.)
ikiwiki can be run from a [[post-commit]] hook to update your wiki
immediately whenever you commit.

View File

@ -30,6 +30,11 @@ use IkiWiki::Setup::Standard {
#historyurl => "http://git.host/gitweb.cgi?p=wiki.git;a=history;f=[[file]]",
#diffurl => "http://git.host/gitweb.cgi?p=wiki.git;a=blobdiff;h=[[sha1_to]];hp=[[sha1_from]];hb=[[sha1_parent]];f=[[file]]",
# Tla stuff.
#rcs => "tla"
#historyurl => ??,
#diffurl => ??,
wrappers => [
#{
# # The cgi wrapper.

View File

@ -2,7 +2,7 @@
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]]).
Instead it can use [[Subversion]] (or [[Git]] or [[tla]]).
* [[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

@ -9,6 +9,8 @@ installed, and also uses the following perl modules if available:
`HTML::Template` `Mail::Sendmail` `Time::Duration` `Date::Parse`,
`HTML::Scrubber`, `RPC::XML`, `XML::Simple`, `XML::Feed`.
The [[tla]] support also needs the `MailTools` perl module.
Various [[plugins]] use other libraries and utlities; see their individual
documentation for details.

View File

@ -24,7 +24,7 @@ Released 29 April 2006.
* 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 in tree)_
_(status: supports git and tla in tree)_
* 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]] or [[Git]],
and that has optional support for commits from the web.
you through setting up a wiki that is stored in [[Subversion]], [[Git]], or
[[TLA]], and that has optional support for commits from the web.
1. [[Install]] ikiwiki. See [[download]] for where to get it.
@ -19,6 +19,11 @@ and that has optional support for commits from the web.
git add .
git commit -m create -a
# TLA
mkdir /tla
tla make-archive me@localhost--wiki /tla/wikirepo
tla my-id "<me@localhost>"
3. Check out the repository to make the working copy that ikiwiki will use.
# Subversion
@ -27,6 +32,13 @@ and that has optional support for commits from the web.
# Git
git clone /git/wikirepo ~/wikiwc
# TLA
mkdir ~/wikiwc
cd ~/wikiwc
tla archive-setup me@localhost--wiki/wiki--0
tla init-tree me@localhost--wiki/wiki--0
tla import
4. Build your wiki for the first time.
ikiwiki --verbose ~/wikiwc/ ~/public_html/wiki/ \
@ -52,6 +64,10 @@ and that has optional support for commits from the web.
git commit -m customised index.mdwn
git push origin
# TLA
tla add index.mdwn
tla commit
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

View File

@ -0,0 +1,2 @@
* Need to get post commit hook code working.
* Need some example urls for web based diffs.