aboutsummaryrefslogtreecommitdiff
path: root/doc/todo/Auto-setup_and_maintain_Mercurial_wrapper_hooks.mdwn
diff options
context:
space:
mode:
authorhttps://www.google.com/accounts/o8/id?id=AItOawmUWmB1M35_jviFvGPYDIH-a-_Al-7OrXM <Daniel@web>2011-07-20 13:53:11 -0400
committeradmin <admin@branchable.com>2011-07-20 13:53:11 -0400
commit9a38ee9af141d89d08b8543b786acf98e88d4d0d (patch)
tree651132665c1c473c752cd6c36015fbaf7013657a /doc/todo/Auto-setup_and_maintain_Mercurial_wrapper_hooks.mdwn
parent4e10afb52db501dba2b910e1fcb88bd6817ef42f (diff)
downloadikiwiki-9a38ee9af141d89d08b8543b786acf98e88d4d0d.tar
ikiwiki-9a38ee9af141d89d08b8543b786acf98e88d4d0d.tar.gz
Diffstat (limited to 'doc/todo/Auto-setup_and_maintain_Mercurial_wrapper_hooks.mdwn')
-rw-r--r--doc/todo/Auto-setup_and_maintain_Mercurial_wrapper_hooks.mdwn218
1 files changed, 218 insertions, 0 deletions
diff --git a/doc/todo/Auto-setup_and_maintain_Mercurial_wrapper_hooks.mdwn b/doc/todo/Auto-setup_and_maintain_Mercurial_wrapper_hooks.mdwn
new file mode 100644
index 000000000..d03b7fe93
--- /dev/null
+++ b/doc/todo/Auto-setup_and_maintain_Mercurial_wrapper_hooks.mdwn
@@ -0,0 +1,218 @@
+Attempt to fix a `TODO` in `Automator.pm` in combination with the Mercurial backend.
+
+1. To define hooks, Mercurial uses paths given in the config file `.hg/hgrc`. To enable Mercurial to call `ikiwiki-wrapper` automatically after blog/wiki setup, ikiwiki thus needs to create `hgrc`.
+2. To reflect changes in `$config{srcdir}` and/or `$config{mercurial_wrapper}`, relevant lines in `hgrc` need to be updated on wrapper creation.
+
+ikiwiki can keep track of lines in `hgrc` for which it is responsible by adding a `.ikiwiki` suffix to its hooks. This is correct and recommended markup, Mercurial-wise.
+
+Two ways follow below. I prefer the long one. --[[Daniel Andersson]]
+
+Compact way (addresses only point 1)
+------------------------------------
+[This patch at pastebin](http://pastebin.com/by9f4dwX) ([raw version](http://pastebin.com/raw.php?i=by9f4dwX)).
+
+Set default `ikiwiki-wrapper` path.
+
+ diff -r 8faf136ca94f Setup/Automator.pm
+ --- a/Setup/Automator.pm Tue Jul 19 21:04:13 2011 +0200
+ +++ b/Setup/Automator.pm Wed Jul 20 15:33:21 2011 +0200
+ @@ -75,8 +75,7 @@
+ print STDERR "warning: do not know how to set up the bzr_wrapper hook!\n";
+ }
+ elsif ($config{rcs} eq 'mercurial') {
+ - # TODO
+ - print STDERR "warning: do not know how to set up the mercurial_wrapper hook!\n";
+ + $config{mercurial_wrapper}=$config{srcdir}."/.hg/ikiwiki-wrapper";
+ }
+ elsif ($config{rcs} eq 'tla') {
+ # TODO
+
+Create `$config{srcdir}/.hg/hgrc` with hook info during auto-installation script. Use relative paths to not require manual `hgrc` intervention if `$config{srcdir}` is changed. If `$config{mercurial_wrapper}` is changed, manual edit of `hgrc` is needed to catch the new wrapper path.
+
+(Is there a security risk with relative paths?)
+
+ @@ -187,6 +186,22 @@
+ die "ikiwiki --wrappers --setup $config{dumpsetup} failed";
+ }
+
+ + # Setup initial config file for Mercurial to hook up the wrapper.
+ + if ($config{rcs} eq 'mercurial' && exists $config{mercurial_wrapper}
+ + && length $config{mercurial_wrapper}) {
+ + # Use a relative path to avoid having to manually change the
+ + # autogenerated hgrc if the user changes $config{srcdir}.
+ + use File::Spec;
+ + my $mercurial_wrapper_relpath=File::Spec->abs2rel($config{mercurial_wrapper}, $config{srcdir});
+ + open (HGRC, '>', $config{srcdir}.'/.hg/hgrc');
+ + print HGRC <<EOF;
+ +[hooks]
+ +post-commit.ikiwiki = $mercurial_wrapper_relpath
+ +incoming.ikiwiki = $mercurial_wrapper_relpath
+ +EOF
+ + close (HGRC);
+ + }
+ +
+ # Add it to the wikilist.
+ mkpath("$ENV{HOME}/.ikiwiki");
+ open (WIKILIST, ">>$ENV{HOME}/.ikiwiki/wikilist") || die "$ENV{HOME}/.ikiwiki/wikilist: $!";
+
+
+Less compact but more robust way (addresses point 1 and 2)
+----------------------------------------------------------
+[This complete patch at pastebin](http://pastebin.com/AcDHjbK6) ([raw version](http://pastebin.com/raw.php?i=AcDHjbK6)).
+
+This way leaks onto additional files and adds general functionality that may or may not be wanted. The main part of the extra code is contained within `mercurial.pm`, though.
+
+Set default `ikiwiki-wrapper` path.
+
+ diff -r b08179653c00 IkiWiki/Setup/Automator.pm
+ --- a/IkiWiki/Setup/Automator.pm Wed Jul 20 16:56:09 2011 +0200
+ +++ b/IkiWiki/Setup/Automator.pm Wed Jul 20 19:28:21 2011 +0200
+ @@ -75,8 +75,7 @@
+ print STDERR "warning: do not know how to set up the bzr_wrapper hook!\n";
+ }
+ elsif ($config{rcs} eq 'mercurial') {
+ - # TODO
+ - print STDERR "warning: do not know how to set up the mercurial_wrapper hook!\n";
+ + $config{mercurial_wrapper}=$config{srcdir}."/.hg/ikiwiki-wrapper";
+ }
+ elsif ($config{rcs} eq 'tla') {
+ # TODO
+
+Create `$config{srcdir}/.hg/hgrc` during auto-installation with hook info.
+
+ @@ -182,6 +181,19 @@
+ }
+ }
+
+ + # Setup initial config file for Mercurial to hook up the wrapper. The
+ + # path to the wrapper will be automatically added when it is generated.
+ + if ($config{rcs} eq 'mercurial' && exists $config{mercurial_wrapper}
+ + && length $config{mercurial_wrapper}) {
+ + open (HGRC, '>', $config{srcdir}.'/.hg/hgrc');
+ + print HGRC <<EOF;
+ +[hooks]
+ +post-commit.ikiwiki =
+ +incoming.ikiwiki =
+ +EOF
+ + close (HGRC);
+ + }
+ +
+ # Add wrappers, make live.
+ if (system("ikiwiki", "--wrappers", "--setup", $config{dumpsetup}) != 0) {
+ die "ikiwiki --wrappers --setup $config{dumpsetup} failed";
+
+`hgrc` is setup initially. Below follows code to keep `hgrc` updated.
+
+Add backend specific function `rcs_wrapper_postcall()` for later call in `Wrappers.pm`.
+
+ diff -r b08179653c00 IkiWiki/Plugin/mercurial.pm
+ --- a/IkiWiki/Plugin/mercurial.pm Wed Jul 20 16:56:09 2011 +0200
+ +++ b/IkiWiki/Plugin/mercurial.pm Wed Jul 20 19:28:21 2011 +0200
+ @@ -21,6 +21,7 @@
+ hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
+ hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
+ hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
+ + hook(type => "rcs", id => "rcs_wrapper_postcall", call => \&rcs_wrapper_postcall);
+ }
+
+ sub checkconfig () {
+
+Pass variable to `gen_wrapper()` to decide if `rcs_wrapper_postcall()` should run. Default is `1` to update `hgrc`, since it is done non-intrusive (won't create `hgrc` if it doesn't exist, won't overwrite anything unless it is set by ikiwiki itself).
+
+ @@ -28,6 +29,7 @@
+ push @{$config{wrappers}}, {
+ wrapper => $config{mercurial_wrapper},
+ wrappermode => (defined $config{mercurial_wrappermode} ? $config{mercurial_wrappermode} : "06755"),
+ + wrapper_postcall => (defined $config{mercurial_wrapper_hgrc_update} ? $config{mercurial_wrapper_hgrc_update} : "1"),
+ };
+ }
+ }
+
+Include default configuration value and comment.
+
+ @@ -53,6 +55,13 @@
+ safe => 0,
+ rebuild => 0,
+ },
+ + mercurial_wrapper_hgrc_update => {
+ + type => "string",
+ + example => "1",
+ + description => "updates existing hgrc to reflect path changes for mercurial_wrapper",
+ + safe => 0,
+ + rebuild => 0,
+ + },
+ historyurl => {
+ type => "string",
+ example => "http://example.com:8000/log/tip/\[[file]]",
+
+`hgrc` should be updated to point to the new wrapper path. The regexp transforms lines as e.g.
+
+ post-commit.ikiwiki = /home/daniel/blog/.hg/ikiwiki-wrapper-oldpath
+ incoming.ikiwiki = /home/daniel/blog/.hg/ikiwiki-wrapper-oldpath
+
+to
+
+ post-commit.ikiwiki = $config{mercurial_wrapper}
+ incoming.ikiwiki = $config{mercurial_wrapper}
+
+with absolute paths.
+
+ @@ -402,4 +411,23 @@
+ return findtimes($file, 0);
+ }
+
+ +sub rcs_wrapper_postcall($) {
+ + # Update hgrc if it exists. Change post-commit/incoming hooks with the
+ + # .ikiwiki suffix to point to the wrapper path given in the setup file.
+ + # Work with a tempfile to not delete hgrc if the loop is interrupted
+ + # midway.
+ + my $hgrc=$config{srcdir}.'/.hg/hgrc';
+ + my $backup_suffix='.ikiwiki.bak';
+ + if (-e $hgrc) {
+ + use File::Spec;
+ + my $mercurial_wrapper_abspath=File::Spec->rel2abs($config{mercurial_wrapper}, $config{srcdir});
+ + local ($^I, @ARGV)=($backup_suffix, $hgrc);
+ + while (<>) {
+ + s/^(post-commit|incoming)(\.ikiwiki[ \t]*=[ \t]*).*$/$1$2$mercurial_wrapper_abspath/;
+ + print;
+ + }
+ + unlink($hgrc.$backup_suffix);
+ + }
+ +}
+ +
+ 1
+
+`rcs_wrapper_postcall` is made available.
+
+ diff -r b08179653c00 IkiWiki.pm
+ --- a/IkiWiki.pm Wed Jul 20 16:56:09 2011 +0200
+ +++ b/IkiWiki.pm Wed Jul 20 19:28:21 2011 +0200
+ @@ -2059,6 +2059,10 @@
+ $hooks{rcs}{rcs_getmtime}{call}->(@_);
+ }
+
+ +sub rcs_wrapper_postcall (@) {
+ + $hooks{rcs}{rcs_wrapper_postcall}{call}->(@_);
+ +}
+ +
+ sub rcs_receive () {
+ $hooks{rcs}{rcs_receive}{call}->();
+ }
+
+
+`rcs_wrapper_postcall` is called if $config{wrapper_postcall} is true, which it should only be for Mercurial at the moment.
+
+ diff -r b08179653c00 IkiWiki/Wrapper.pm
+ --- a/IkiWiki/Wrapper.pm Wed Jul 20 16:56:09 2011 +0200
+ +++ b/IkiWiki/Wrapper.pm Wed Jul 20 19:28:21 2011 +0200
+ @@ -238,6 +238,10 @@
+ }
+ #translators: The parameter is a filename.
+ debug(sprintf(gettext("successfully generated %s"), $wrapper));
+ +
+ + if (defined $config{wrapper_postcall} && $config{wrapper_postcall} ) {
+ + IkiWiki::rcs_wrapper_postcall();
+ + }
+ }
+
+ 1