Mercurial hook not executing properly

后端 未结 9 1371
北恋
北恋 2020-12-30 12:02

This should be a very simple thing to have run, but for some reason it won\'t work with my Mercurial repository. All I want is for the remote repo to automatically run

相关标签:
9条回答
  • 2020-12-30 12:24

    First of all, I want to correct a few comments above.

    • Hooks are invoked also when pushing over file system.
    • It is not necessary to keep the hook in the repo on which you want them to operate. You can also write the same hook as in your question on the user end. You have to change the event from changegroup to outgoing and also to specify the URL of remote repo with the -R switch. Then if the pushing user has sufficient privileges on the remote repo, the hook will execute successfully.

    .hg/hgrc

    [hooks]
    outgoing = hg update -R $HG_URL
    

    Now towards your problem.... I suggest creating both prechangegroup and changegroup hooks and printing some debugging output.

    .hg/hgrc

    [hooks]
    prechangegroup = echo "Remote repo is at `hg tip -q`"
                     echo "Remote repo wdir is at `hg parents -q`"
    changegroup    = echo "Updating.... `hg update -v`"
                     echo "Remote repo is at `hg tip -q`"
                     echo "Remote repo wdir is at `hg parents -q`"
    

    And also push with the -v switch, so that you may know which hook is running. If you still can't figure out, post the output. I might be able to help.

    0 讨论(0)
  • 2020-12-30 12:26

    My problem was that my hgwebdir application ran as the "hg" user, but the repository was owned by me, so I had to add in this bit of config to hgweb.config to get it to run the hooks:

    [trusted]
    users = me
    
    0 讨论(0)
  • 2020-12-30 12:33

    I spent some time researching this myself. I think the answer to problem is described concisely here:

    Output has to be redirected to stderr (or /dev/null), because stdout is used for the data stream.

    Basically, you're not redirecting to stderr, and hence polluting stdout.

    0 讨论(0)
  • 2020-12-30 12:37

    took a while but I got it working.

    I started with

    [hooks]
    tag=set >&2
    commit=set >&2
    

    the >&2 pipes it to standard error so remote consoles will show it.

    when remote this should output in console if it is running

    hg push https://host/hg   -v
    

    It wasn't.

    I was using hgweb.cgi so I switched to hgweb.wsgi with no difference.

    what I discovered is that some hooks don't get called on remote.

    when I switched it to

    [hooks]
    incoming= set >&2
    

    the hooks tag and commit don't seem to get called but incoming and changeset do get called. I haven't confirmed the others.

    now that I got it working I switched back to hgweb.cgi and everything works the same.

    0 讨论(0)
  • 2020-12-30 12:40

    You need to have it in the remote repositiory's hgrc. It sounds as if it's in your local repo.

    Edit: It also depends on how you're pushing. Some methods don't invoke hooks on the right side. (ssh does, I think HTTP does, file system does not)

    Edit2: What if you push "locally" at the remote repo's computer. You might have different users/permissions between the webserver and the hgrc-file. (See [server] and trusted directives for hgrc.)

    0 讨论(0)
  • 2020-12-30 12:44

    Well, after going through the same steps of frustration as Marc W did a while ago, I finally found the solution to the problem, at least when remote serving is done with the hgwebdir WSGI script.

    I found out that when using this kind of remote push via HTTP or HTTPS, Mercurial simply ignores everything you write into the .hg/hgrc file or your repository. However, entering the hook in the hgwebdir config does the trick.

    So if the bottom line in your hgwebdir.wsgi script is something like

    application = hgwebdir('hgweb.config')
    

    the [hooks] config section needs to go into the mentioned hgweb.config.

    One drawback is that these hooks are executed for every repository listed in the [paths] section of that config. Even though HG offers another WSGI-capable function (hgweb instead of hgwebdir) to serve only a single repository, that one doesn't seem to support any hooks (neither does it have any config). This can, however, be circumvented by using a hgwebdir as described above and having some Apache RewriteRule map everything into the desired subdirectory. This one works for me:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/reponame
    RewriteRule ^(.*)$ reponame/$2 [QSA]
    

    Have fun using your remote hooks over HTTP :D

    0 讨论(0)
提交回复
热议问题