]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines.mdwn
In all=no conditionals, depend on the influences, not the test pagespec
[git.ikiwiki.info.git] / doc / tips / Hosting_Ikiwiki_and_master_git_repository_on_different_machines.mdwn
index e971a83396ec044fa4ae25575e53e94785bd4201..35feacb714f6d7d3355bb06eb3c2c519b653ec99 100644 (file)
@@ -119,14 +119,26 @@ repository.
 
 ## Configure the git repository (on the git machine) to update the wiki after a push
 
-Add in the `post-receive` hook (file `SITE.git/hooks/post-receive`):
+Add in the `post-receive` hook (file `SITE.git/hooks/post-receive`):
 
-        wget "http://WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
+      git log -1 --format=format:%ae HEAD | grep -e '@web$' -e 'USER@HOST' ||  wget "http://WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
 
-  If your wiki is password protected, use:
+If your wiki is password protected, use:
 
-        wget "http://LOGIN:PASSWORD@WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
+      git log -1 --format=format:%ae HEAD | grep -e '@web$' -e 'USER@HOST' ||  wget "http://LOGIN:PASSWORD@WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
 
+The bit before `wget` is here to prevent updating the wiki while it is
+updating, which can lead to a deadlock. Indeed, when the wiki is edited via
+web, or a tag page is automatically added, IkiWiki pushes the changes to the
+Git machine. Then, the hook on this latter machine tries to pull changes from
+the IkiWiki machine, and here is the deadlock. Explanations of the command:
+
+* `git log -1 --format=format:%ae HEAD`: Looks for the user name of the
+  latest commit.
+* `grep -e '@web$' -e 'USER@HOST': Check whether this last commit was pushed
+  from the IkiWiki machine (change `USER@HOST` to the appropriate string).
+* `wget ...`: If the last commit does not come from the IkiWiki machine
+  (which means it comes from another machine), update the wiki.
 
 ## Going further
 
@@ -137,3 +149,8 @@ repository.
 - *Using [[gitolite|https://github.com/sitaramc/gitolite]] to manage
   repositories on the git machine* Simply replace the manipulations of git on
   the git machine by the corresponding manipulations using gitolite.
+    * With gitolite, you can use this line in a `post-update` hook:
+
+        `[ x"$GL_USER" = x"`*`gitolite-user`*`" ] || wget ...`
+
+        thus, you filter out precisely the events that originate from the server-to-be-pinged, no matter what the commit id says. (For example, if you push commits you created on a local CGI ikiwiki, they'd be called '@web' as well).