diff options
-rw-r--r-- | IkiWiki/Rcs/svn.pm | 1 | ||||
-rw-r--r-- | IkiWiki/Rcs/tla.pm | 252 | ||||
-rw-r--r-- | debian/changelog | 3 | ||||
-rw-r--r-- | debian/control | 2 | ||||
-rw-r--r-- | doc/features.mdwn | 6 | ||||
-rw-r--r-- | doc/ikiwiki.setup | 5 | ||||
-rw-r--r-- | doc/index.mdwn | 2 | ||||
-rw-r--r-- | doc/install.mdwn | 2 | ||||
-rw-r--r-- | doc/roadmap.mdwn | 2 | ||||
-rw-r--r-- | doc/setup.mdwn | 20 | ||||
-rw-r--r-- | doc/todo/tla.mdwn | 2 |
11 files changed, 287 insertions, 10 deletions
diff --git a/IkiWiki/Rcs/svn.pm b/IkiWiki/Rcs/svn.pm index 2bc30206b..f3e353cbe 100644 --- a/IkiWiki/Rcs/svn.pm +++ b/IkiWiki/Rcs/svn.pm @@ -1,5 +1,4 @@ #!/usr/bin/perl -# For subversion support. use warnings; use strict; diff --git a/IkiWiki/Rcs/tla.pm b/IkiWiki/Rcs/tla.pm new file mode 100644 index 000000000..0f62dfa83 --- /dev/null +++ b/IkiWiki/Rcs/tla.pm @@ -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 diff --git a/debian/changelog b/debian/changelog index a01f6c6f6..491f73508 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 diff --git a/debian/control b/debian/control index 98d57d560..5c284e0a5 100644 --- a/debian/control +++ b/debian/control @@ -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 diff --git a/doc/features.mdwn b/doc/features.mdwn index 2b06a7917..d5fa4026b 100644 --- a/doc/features.mdwn +++ b/doc/features.mdwn @@ -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. diff --git a/doc/ikiwiki.setup b/doc/ikiwiki.setup index ee5e394be..95d2d46af 100644 --- a/doc/ikiwiki.setup +++ b/doc/ikiwiki.setup @@ -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. diff --git a/doc/index.mdwn b/doc/index.mdwn index 8f3911bd9..67f099210 100644 --- a/doc/index.mdwn +++ b/doc/index.mdwn @@ -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]]. diff --git a/doc/install.mdwn b/doc/install.mdwn index 029323ada..575598546 100644 --- a/doc/install.mdwn +++ b/doc/install.mdwn @@ -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. diff --git a/doc/roadmap.mdwn b/doc/roadmap.mdwn index 2cbf6dd1c..4bd9ab671 100644 --- a/doc/roadmap.mdwn +++ b/doc/roadmap.mdwn @@ -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]] diff --git a/doc/setup.mdwn b/doc/setup.mdwn index eef068dae..b3620fb3c 100644 --- a/doc/setup.mdwn +++ b/doc/setup.mdwn @@ -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 diff --git a/doc/todo/tla.mdwn b/doc/todo/tla.mdwn new file mode 100644 index 000000000..3cca686a4 --- /dev/null +++ b/doc/todo/tla.mdwn @@ -0,0 +1,2 @@ +* Need to get post commit hook code working. +* Need some example urls for web based diffs. |