]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - doc/todo/mercurial.mdwn
better link targets
[git.ikiwiki.info.git] / doc / todo / mercurial.mdwn
index 26888131ee225ab9d9b344e0c671a153e6d385fa..e71c8106adc832fb30203868174cd857a79450e3 100644 (file)
   It seems that with the current mercurial commit code, it will always
   blindly overwrite the current file with the web edited version, losing
   any other changes.
   It seems that with the current mercurial commit code, it will always
   blindly overwrite the current file with the web edited version, losing
   any other changes.
+* `rcs_commit_staged`, `rcs_rename`, `rcs_remove`, and `rcs_diff` are not
+  implemented for mercurial, and so attachments, remove and rename plugins
+  and recentchangesdiff cannot be used with it. (These should be fairly
+  easy to add..)
 
 Posthook: in `$srcdir/.hg/hgrc`, I have the following
 
 
 Posthook: in `$srcdir/.hg/hgrc`, I have the following
 
@@ -29,23 +33,60 @@ This should update the working directory and run ikiwiki every time a change is
 > It can deadlock if the post-commit hook runs with --refresh in the
 > former case. --[[Joey]]
 
 > It can deadlock if the post-commit hook runs with --refresh in the
 > former case. --[[Joey]]
 
-The problem with --post-commit is that if you delete some pages in $SRC, ikiwiki --setup setupfile --post-commit will not delete them in $DEST.
+The problem with --post-commit is that if you delete some pages in $SRC, ikiwiki --setup setupfile --post-commit will not delete them in $DEST. --[[users/weakish]]
 
 
-I add the following to .hg/hgrc:
+> You should really be using a setup file that has `mercurial_wrapper`
+> set, and running the wrapper generated by that from your hook.
+> That will work. I think that the `--setup --post-commit` on the command
+> line is currently broken and does the same expensive rebuild process as --setup
+> alone (which doesn't delete files from $DEST either). Will fix that.
+> (fixed)
+> --[[Joey]] 
 
 
-    [hooks]
-    changegroup = hg update >&2 && ikiwiki --setup path.to.setup.file --refresh
-    post-commit = ikiwiki --setup path.to.setup.file --refresh
+>> Mercurial doesn't support put hooks in .hg/hooks/* (like git). In Mercurial, the only way to run
+>> your own hooks is specifying them in the hgrc file. (Or write a new extension.)
+>> I guess use a very long command will work.
+>> (e.g. ikiwiki --post-commit --a-lot-of-switches --set var=value $SRC $DEST)
+>> (Fortunately ikiwiki supports --set var=value so without --setup works.)
+>>
+>> Alternative is always editing via cgi or pushing.  Never work on the $SRC/repo directly.
+>> --[[users/weakish]]
 
 
-I tried the follwing commands in $SRC:
+>>> I don't see anything preventing you from using a setup file with
+>>> `mercurial_wrapper => ".hg/ikiwiki-hook",` and then modifying the hgrc
+>>> to run that wrapper. --[[Joey]] 
 
 
-    touch deadlocktest.mdwn
-    hg add
-    hg ci
+>> Thanks for pointing out this.  I have some stupid misunderstanding on the
+>> usage of mercurial_wrapper before.  The wrapper works nicely! --[[weakish]]
 
 
-No deadlock happens.  (Also I push to the $SRC from another machine, again, no deadlock.)  
+I add the following to .hg/hgrc:(I use changegroup since I don't think we need refresh per changeset, please point out if I am wrong.)
 
 
-Of course these tests are too simple.  The problem is I have no idea when the deadlock will happen. If someone is kind enough to point out, I will run more test.
+    [hooks]
+    changegroup = hg update >&2 && ikiwiki --setup path.to.setup.file --refresh
+    post-commit = path.to.the.mercurial.wrapper
+
+-----
+
+I have no idea when the deadlock will happen.  --[[users/weakish]]
+
+> For the deadlock to occur, a edit has to be made via the web.
+> 
+> Ikiwiki,
+> running as a CGI, takes a lock on the wiki, and commits the edit,
+> continuing to run in the background, with the lock still held.
+> When the edit is committed, the hg hook runs, running `ikwiki --refresh`.
+> Nearly the first thing that process does it try to lock the wiki..
+> which is already locked. This lock is taken in a blocking manner,
+> thus the deadlock -- the cgi is waiting for the commit to finish before
+> dropping the lock, and the commit is blocked waiting for the lock to be
+> released.
+> 
+> --post-commit avoids this problem by checking if the cgi is running
+> and avoiding doing anything in that case. (While still handing the
+> refresh if the commit was not made by the CGI.)
+> So in that case, the commit finishes w/o ikiwiki doing anything,
+> and the ikiwiki CGI handles the wiki refresh.
+> --[[Joey]]  
 
 
 ***
 
 
 ***