diff options
Diffstat (limited to 'IkiWiki/Rcs')
-rw-r--r-- | IkiWiki/Rcs/bzr.pm | 44 | ||||
-rw-r--r-- | IkiWiki/Rcs/git.pm | 64 | ||||
-rw-r--r-- | IkiWiki/Rcs/mercurial.pm | 48 | ||||
-rw-r--r-- | IkiWiki/Rcs/monotone.pm | 96 | ||||
-rw-r--r-- | IkiWiki/Rcs/svn.pm | 75 | ||||
-rw-r--r-- | IkiWiki/Rcs/tla.pm | 44 |
6 files changed, 344 insertions, 27 deletions
diff --git a/IkiWiki/Rcs/bzr.pm b/IkiWiki/Rcs/bzr.pm index c80356159..5df522f6e 100644 --- a/IkiWiki/Rcs/bzr.pm +++ b/IkiWiki/Rcs/bzr.pm @@ -8,6 +8,50 @@ use IkiWiki; use Encode; use open qw{:utf8 :std}; +hook(type => "checkconfig", id => "bzr", call => sub { #{{{ + if (! defined $config{diffurl}) { + $config{diffurl}=""; + } + if (length $config{bzr_wrapper}) { + push @{$config{wrappers}}, { + wrapper => $config{bzr_wrapper}, + wrappermode => (defined $config{bzr_wrappermode} ? $config{bzr_wrappermode} : "06755"), + }; + } +}); #}}} + +hook(type => "getsetup", id => "bzr", call => sub { #{{{ + return + bzr_wrapper => { + type => "string", + #example => "", # FIXME add example + description => "bzr post-commit executable to generate", + safe => 0, # file + rebuild => 0, + }, + bzr_wrappermode => { + type => "string", + example => '06755', + description => "mode for bzr_wrapper (can safely be made suid)", + safe => 0, + rebuild => 0, + }, + historyurl => { + type => "string", + #example => "", # FIXME add example + description => "url to show file history, using loggerhead ([[file]] substituted)", + safe => 1, + rebuild => 1, + }, + diffurl => { + type => "string", + example => "http://example.com/revision?start_revid=[[r2]]#[[file]]-s", + description => "url to view a diff, using loggerhead ([[file]] and [[r2]] substituted)", + safe => 1, + rebuild => 1, + }, +}); #}}} + sub bzr_log ($) { #{{{ my $out = shift; my @infos = (); diff --git a/IkiWiki/Rcs/git.pm b/IkiWiki/Rcs/git.pm index ecf560d0b..6c9aca650 100644 --- a/IkiWiki/Rcs/git.pm +++ b/IkiWiki/Rcs/git.pm @@ -11,6 +11,70 @@ use open qw{:utf8 :std}; my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums my $dummy_commit_msg = 'dummy commit'; # message to skip in recent changes +hook(type => "checkconfig", id => "git", call => sub { #{{{ + if (! defined $config{diffurl}) { + $config{diffurl}=""; + } + if (! defined $config{gitorigin_branch}) { + $config{gitorigin_branch}="origin"; + } + if (! defined $config{gitmaster_branch}) { + $config{gitmaster_branch}="master"; + } + if (length $config{git_wrapper}) { + push @{$config{wrappers}}, { + wrapper => $config{git_wrapper}, + wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"), + }; + } +}); #}}} + +hook(type => "getsetup", id => "git", call => sub { #{{{ + return + git_wrapper => { + type => "string", + example => "/git/wiki.git/hooks/post-update", + description => "git post-update executable to generate", + safe => 0, # file + rebuild => 0, + }, + git_wrappermode => { + type => "string", + example => '06755', + description => "mode for git_wrapper (can safely be made suid)", + safe => 0, + rebuild => 0, + }, + historyurl => { + type => "string", + example => "http://git.example.com/gitweb.cgi?p=wiki.git;a=history;f=[[file]]", + description => "gitweb url to show file history ([[file]] substituted)", + safe => 1, + rebuild => 1, + }, + diffurl => { + type => "string", + example => "http://git.example.com/gitweb.cgi?p=wiki.git;a=blobdiff;h=[[sha1_to]];hp=[[sha1_from]];hb=[[sha1_parent]];f=[[file]]", + description => "gitweb url to show a diff ([[sha1_to]], [[sha1_from]], [[sha1_parent]], and [[file]] substituted)", + safe => 1, + rebuild => 1, + }, + gitorigin_branch => { + type => "string", + example => "origin", + description => "where to pull and push changes (set to empty string to disable)", + safe => 0, # paranoia + rebuild => 0, + }, + gitmaster_branch => { + type => "string", + example => "master", + description => "branch that the wiki is stored in", + safe => 0, # paranoia + rebuild => 0, + }, +}); #}}} + sub _safe_git (&@) { #{{{ # Start a child process safely without resorting /bin/sh. # Return command output or success state (in scalar context). diff --git a/IkiWiki/Rcs/mercurial.pm b/IkiWiki/Rcs/mercurial.pm index 8c3f03e07..3a98e09d8 100644 --- a/IkiWiki/Rcs/mercurial.pm +++ b/IkiWiki/Rcs/mercurial.pm @@ -8,7 +8,51 @@ use IkiWiki; use Encode; use open qw{:utf8 :std}; -sub mercurial_log($) { +hook(type => "checkconfig", id => "mercurial", call => sub { #{{{ + if (! defined $config{diffurl}) { + $config{diffurl}=""; + } + if (length $config{mercurial_wrapper}) { + push @{$config{wrappers}}, { + wrapper => $config{mercurial_wrapper}, + wrappermode => (defined $config{mercurial_wrappermode} ? $config{mercurial_wrappermode} : "06755"), + }; + } +}); #}}} + +hook(type => "getsetup", id => "mercurial", call => sub { #{{{ + return + mercurial_wrapper => { + type => "string", + #example => # FIXME add example + description => "mercurial post-commit executable to generate", + safe => 0, # file + rebuild => 0, + }, + mercurial_wrappermode => { + type => "string", + example => '06755', + description => "mode for mercurial_wrapper (can safely be made suid)", + safe => 0, + rebuild => 0, + }, + historyurl => { + type => "string", + 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", + 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,7 +96,7 @@ sub mercurial_log($) { close $out; return @infos; -} +} #}}} sub rcs_update () { #{{{ my @cmdline = ("hg", "-q", "-R", "$config{srcdir}", "update"); diff --git a/IkiWiki/Rcs/monotone.pm b/IkiWiki/Rcs/monotone.pm index 500af5c58..d7e8f296a 100644 --- a/IkiWiki/Rcs/monotone.pm +++ b/IkiWiki/Rcs/monotone.pm @@ -11,7 +11,7 @@ use Date::Format qw(time2str); my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate sha1sums -sub check_config() { #{{{ +hook(type => "checkconfig", id => "monotone", call => sub { #{{{ if (!defined($config{mtnrootdir})) { $config{mtnrootdir} = $config{srcdir}; } @@ -19,9 +19,6 @@ sub check_config() { #{{{ error("Ikiwiki srcdir does not seem to be a Monotone workspace (or set the mtnrootdir)!"); } - chdir $config{srcdir} - or error("Cannot chdir to $config{srcdir}: $!"); - my $child = open(MTN, "-|"); if (! $child) { open STDERR, ">/dev/null"; @@ -43,7 +40,66 @@ sub check_config() { #{{{ if ($version < 0.38) { error("Monotone version too old, is $version but required 0.38"); } -} #}}} + + if (length $config{mtn_wrapper}) { + push @{$config{wrappers}}, { + wrapper => $config{mtn_wrapper}, + wrappermode => (defined $config{mtn_wrappermode} ? $config{mtn_wrappermode} : "06755"), + }; + } +}); #}}} + +hook(type => "getsetup", id => "monotone", call => sub { #{{{ + return + mtn_wrapper => { + type => "string", + example => "/srv/mtn/wiki/_MTN/ikiwiki-netsync-hook", + description => "monotone netsync hook executable to generate", + safe => 0, # file + rebuild => 0, + }, + mtn_wrappermode => { + type => "string", + example => '06755', + description => "mode for mtn_wrapper (can safely be made suid)", + safe => 0, + rebuild => 0, + }, + mtnkey => { + type => "string", + example => 'web@example.com', + description => "your monotone key", + safe => 1, + rebuild => 0, + }, + historyurl => { + type => "string", + example => "http://viewmtn.example.com/branch/head/filechanges/com.example.branch/[[file]]", + description => "viewmtn url to show file history ([[file]] substituted)", + safe => 1, + rebuild => 1, + }, + diffurl => { + type => "string", + example => "http://viewmtn.example.com/revision/diff/[[r1]]/with/[[r2]]/[[file]]", + description => "viewmtn url to show a diff ([[r1]], [[r2]], and [[file]] substituted)", + safe => 1, + rebuild => 1, + }, + mtnsync => { + type => "boolean", + example => 0, + description => "sync on update and commit?", + safe => 0, # paranoia + rebuild => 0, + }, + mtnrootdir => { + type => "string", + description => "path to your workspace (defaults to the srcdir; specify if the srcdir is a subdirectory of the workspace)", + safe => 0, # path + rebuild => 0, + }, +}); #}}} sub get_rev () { #{{{ my $sha1 = `mtn --root=$config{mtnrootdir} automate get_base_revision_id`; @@ -190,7 +246,8 @@ sub get_changed_files ($$) { #{{{ } #}}} sub rcs_update () { #{{{ - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); if (defined($config{mtnsync}) && $config{mtnsync}) { if (system("mtn", "--root=$config{mtnrootdir}", "sync", @@ -208,7 +265,8 @@ sub rcs_update () { #{{{ sub rcs_prepedit ($) { #{{{ my $file=shift; - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); # For monotone, return the revision of the file when # editing begins. @@ -236,7 +294,8 @@ sub rcs_commit ($$$;$$) { #{{{ $author="Web: Anonymous"; } - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); my ($oldrev)= $rcstoken=~ m/^($sha1_pattern)$/; # untaint my $rev = get_rev(); @@ -367,7 +426,8 @@ sub rcs_commit_staged ($$$) { # Note - this will also commit any spurious changes that happen to be # lying around in the working copy. There shouldn't be any, but... - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); my $author; @@ -391,7 +451,8 @@ sub rcs_commit_staged ($$$) { sub rcs_add ($) { #{{{ my $file=shift; - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); if (system("mtn", "--root=$config{mtnrootdir}", "add", "--quiet", $file) != 0) { @@ -402,7 +463,8 @@ sub rcs_add ($) { #{{{ sub rcs_remove ($) { # {{{ my $file = shift; - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); # Note: it is difficult to undo a remove in Monotone at the moment. # Until this is fixed, it might be better to make 'rm' move things @@ -420,7 +482,8 @@ sub rcs_remove ($) { # {{{ sub rcs_rename ($$) { # {{{ my ($src, $dest) = @_; - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); if (system("mtn", "--root=$config{mtnrootdir}", "rename", "--quiet", $src, $dest) != 0) { @@ -432,7 +495,8 @@ sub rcs_recentchanges ($) { #{{{ my $num=shift; my @ret; - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); # use log --brief to get a list of revs, as this # gives the results in a nice order @@ -539,7 +603,8 @@ sub rcs_diff ($) { #{{{ my $rev=shift; my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); my $child = open(MTNDIFF, "-|"); if (! $child) { @@ -561,7 +626,8 @@ sub rcs_diff ($) { #{{{ sub rcs_getctime ($) { #{{{ my $file=shift; - check_config(); + chdir $config{srcdir} + or error("Cannot chdir to $config{srcdir}: $!"); my $child = open(MTNLOG, "-|"); if (! $child) { diff --git a/IkiWiki/Rcs/svn.pm b/IkiWiki/Rcs/svn.pm index 9081c3902..0e7df3659 100644 --- a/IkiWiki/Rcs/svn.pm +++ b/IkiWiki/Rcs/svn.pm @@ -1,23 +1,78 @@ #!/usr/bin/perl -package IkiWiki::Rcs::svn; +package IkiWiki; use warnings; use strict; use IkiWiki; use POSIX qw(setlocale LC_CTYPE); -sub import { #{{{ - if (exists $IkiWiki::config{svnpath}) { +hook(type => "checkconfig", id => "svn", call => sub { #{{{ + if (! defined $config{diffurl}) { + $config{diffurl}=""; + } + if (! defined $config{svnpath}) { + $config{svnpath}="trunk"; + } + if (exists $config{svnpath}) { # code depends on the path not having extraneous slashes - $IkiWiki::config{svnpath}=~tr#/#/#s; - $IkiWiki::config{svnpath}=~s/\/$//; - $IkiWiki::config{svnpath}=~s/^\///; + $config{svnpath}=~tr#/#/#s; + $config{svnpath}=~s/\/$//; + $config{svnpath}=~s/^\///; } -} #}}} - - -package IkiWiki; + if (length $config{svn_wrapper}) { + push @{$config{wrappers}}, { + wrapper => $config{svn_wrapper}, + wrappermode => (defined $config{svn_wrappermode} ? $config{svn_wrappermode} : "04755"), + }; + } +}); #}}} + +hook(type => "getsetup", id => "svn", call => sub { #{{{ + return + svnrepo => { + type => "string", + example => "/svn/wiki", + description => "subversion repository location", + safe => 0, # path + rebuild => 0, + }, + svnpath => { + type => "string", + example => "trunk", + description => "path inside repository where the wiki is located", + safe => 0, # paranoia + rebuild => 0, + }, + svn_wrapper => { + type => "string", + example => "/svn/wikirepo/hooks/post-commit", + description => "svn post-commit executable to generate", + safe => 0, # file + rebuild => 0, + }, + svn_wrappermode => { + type => "string", + example => '04755', + description => "mode for svn_wrapper (can safely be made suid)", + safe => 0, + rebuild => 0, + }, + historyurl => { + type => "string", + example => "http://svn.example.org/trunk/[[file]]", + description => "viewvc url to show file history ([[file]] substituted)", + safe => 1, + rebuild => 1, + }, + diffurl => { + type => "string", + example => "http://svn.example.org/trunk/[[file]]?root=wiki&r1=[[r1]]&r2=[[r2]]", + description => "viewvc url to show a diff ([[file]], [[r1]], and [[r2]] substituted)", + safe => 1, + rebuild => 1, + }, +}); #}}} # svn needs LC_CTYPE set to a UTF-8 locale, so try to find one. Any will do. sub find_lc_ctype() { diff --git a/IkiWiki/Rcs/tla.pm b/IkiWiki/Rcs/tla.pm index 4232e1fe8..e1389a346 100644 --- a/IkiWiki/Rcs/tla.pm +++ b/IkiWiki/Rcs/tla.pm @@ -6,6 +6,50 @@ use warnings; use strict; use IkiWiki; +hook(type => "checkconfig", id => "tla", call => sub { #{{{ + if (! defined $config{diffurl}) { + $config{diffurl}=""; + } + if (length $config{tla_wrapper}) { + push @{$config{wrappers}}, { + wrapper => $config{tla_wrapper}, + wrappermode => (defined $config{tla_wrappermode} ? $config{tla_wrappermode} : "06755"), + }; + } +}); #}}} + +hook(type => "getsetup", id => "tla", call => sub { #{{{ + return + tla_wrapper => { + type => "string", + #example => "", # TODO example + description => "tla post-commit executable to generate", + safe => 0, # file + rebuild => 0, + }, + tla_wrappermode => { + type => "string", + example => '06755', + description => "mode for tla_wrapper (can safely be made suid)", + safe => 0, + rebuild => 0, + }, + historyurl => { + type => "string", + #example => "", # TODO example + description => "url to show file history ([[file]] substituted)", + safe => 1, + rebuild => 1, + }, + diffurl => { + type => "string", + #example => "", # TODO example + description => "url to show a diff ([[file]] and [[rev]] substituted)", + safe => 1, + rebuild => 1, + }, +}); #}}} + sub quiet_system (@) { # See Debian bug #385939. open (SAVEOUT, ">&STDOUT"); |