mercurial/server.py
author Matt Harbison <matt_harbison@yahoo.com>
Fri, 30 Mar 2018 23:21:46 -0400
changeset 37215 73a60281a861
parent 37212 f09a2eab11cf
child 37216 d2bd29dffc6c
permissions -rw-r--r--
server: refactor 'daemon_postexec' instructions into a dictionary
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     1
# server.py - utility and factory of server
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     2
#
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     3
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     4
#
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     7
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     8
from __future__ import absolute_import
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     9
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    10
import os
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    11
import tempfile
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    12
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    13
from .i18n import _
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    14
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    15
from . import (
30513
ff7df4bb75de chgserver: make it a core module and drop extension flags
Yuya Nishihara <yuya@tcha.org>
parents: 30510
diff changeset
    16
    chgserver,
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
    17
    cmdutil,
30507
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
    18
    commandserver,
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    19
    error,
30509
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
    20
    hgweb,
32530
3f0936b2cea9 server: use pycompat to get argv
Augie Fackler <raf@durin42.com>
parents: 32291
diff changeset
    21
    pycompat,
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    22
    util,
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    23
)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    24
37119
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 34924
diff changeset
    25
from .utils import (
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 34924
diff changeset
    26
    procutil,
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 34924
diff changeset
    27
)
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 34924
diff changeset
    28
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    29
def runservice(opts, parentfn=None, initfn=None, runfn=None, logfile=None,
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    30
               runargs=None, appendpid=False):
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    31
    '''Run a command as a service.'''
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    32
37215
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    33
    postexecargs = {}
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    34
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    35
    if opts['daemon_postexec']:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    36
        for inst in opts['daemon_postexec']:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    37
            if inst.startswith('unlink:'):
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    38
                postexecargs['unlink'] = inst[7:]
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    39
            elif inst.startswith('chdir:'):
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    40
                postexecargs['chdir'] = inst[6:]
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    41
            elif inst != 'none':
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    42
                raise error.Abort(_('invalid value for --daemon-postexec: %s')
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    43
                                  % inst)
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    44
37212
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    45
    # When daemonized on Windows, redirect stdout/stderr to the lockfile (which
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    46
    # gets cleaned up after the child is up and running), so that the parent can
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    47
    # read and print the error if this child dies early.  See 594dd384803c.  On
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    48
    # other platforms, the child can write to the parent's stdio directly, until
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    49
    # it is redirected prior to runfn().
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    50
    if pycompat.iswindows and opts['daemon_postexec']:
37215
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    51
        if 'unlink' in postexecargs and os.path.exists(postexecargs['unlink']):
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    52
            procutil.stdout.flush()
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    53
            procutil.stderr.flush()
37212
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    54
37215
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    55
            fd = os.open(postexecargs['unlink'],
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    56
                         os.O_WRONLY | os.O_APPEND | os.O_BINARY)
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    57
            try:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    58
                os.dup2(fd, 1)
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    59
                os.dup2(fd, 2)
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    60
            finally:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
    61
                os.close(fd)
37212
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    62
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    63
    def writepid(pid):
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    64
        if opts['pid_file']:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    65
            if appendpid:
32548
d770a08ee9d9 server: write out pid using bytes IO instead of str IO
Augie Fackler <raf@durin42.com>
parents: 32530
diff changeset
    66
                mode = 'ab'
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    67
            else:
32548
d770a08ee9d9 server: write out pid using bytes IO instead of str IO
Augie Fackler <raf@durin42.com>
parents: 32530
diff changeset
    68
                mode = 'wb'
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    69
            fp = open(opts['pid_file'], mode)
32617
e48cb1c7a902 py3: simply use b'%d\n' to format pid in server.py
Yuya Nishihara <yuya@tcha.org>
parents: 32548
diff changeset
    70
            fp.write('%d\n' % pid)
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    71
            fp.close()
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    72
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    73
    if opts['daemon'] and not opts['daemon_postexec']:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    74
        # Signal child process startup with file removal
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    75
        lockfd, lockpath = tempfile.mkstemp(prefix='hg-service-')
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    76
        os.close(lockfd)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    77
        try:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    78
            if not runargs:
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37119
diff changeset
    79
                runargs = procutil.hgcmd() + pycompat.sysargv[1:]
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    80
            runargs.append('--daemon-postexec=unlink:%s' % lockpath)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    81
            # Don't pass --cwd to the child process, because we've already
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    82
            # changed directory.
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    83
            for i in xrange(1, len(runargs)):
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    84
                if runargs[i].startswith('--cwd='):
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    85
                    del runargs[i]
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    86
                    break
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    87
                elif runargs[i].startswith('--cwd'):
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    88
                    del runargs[i:i + 2]
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    89
                    break
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    90
            def condfn():
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    91
                return not os.path.exists(lockpath)
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37119
diff changeset
    92
            pid = procutil.rundetached(runargs, condfn)
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    93
            if pid < 0:
37212
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    94
                # If the daemonized process managed to write out an error msg,
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    95
                # report it.
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    96
                if pycompat.iswindows and os.path.exists(lockpath):
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    97
                    with open(lockpath) as log:
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    98
                        for line in log:
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    99
                            procutil.stderr.write(line)
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   100
                raise error.Abort(_('child process failed to start'))
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   101
            writepid(pid)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   102
        finally:
31548
ce4ddcda868b server: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 30513
diff changeset
   103
            util.tryunlink(lockpath)
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   104
        if parentfn:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   105
            return parentfn(pid)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   106
        else:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   107
            return
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   108
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   109
    if initfn:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   110
        initfn()
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   111
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   112
    if not opts['daemon']:
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37119
diff changeset
   113
        writepid(procutil.getpid())
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   114
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   115
    if opts['daemon_postexec']:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   116
        try:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   117
            os.setsid()
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   118
        except AttributeError:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   119
            pass
37212
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
   120
37215
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
   121
        if 'chdir' in postexecargs:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
   122
            os.chdir(postexecargs['chdir'])
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37119
diff changeset
   123
        procutil.hidewindow()
37119
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 34924
diff changeset
   124
        procutil.stdout.flush()
d4a2e0d5d042 procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 34924
diff changeset
   125
        procutil.stderr.flush()
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   126
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   127
        nullfd = os.open(os.devnull, os.O_RDWR)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   128
        logfilefd = nullfd
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   129
        if logfile:
34924
bfcd0d227972 server: drop executable bit from daemon log file
Yuya Nishihara <yuya@tcha.org>
parents: 32617
diff changeset
   130
            logfilefd = os.open(logfile, os.O_RDWR | os.O_CREAT | os.O_APPEND,
bfcd0d227972 server: drop executable bit from daemon log file
Yuya Nishihara <yuya@tcha.org>
parents: 32617
diff changeset
   131
                                0o666)
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   132
        os.dup2(nullfd, 0)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   133
        os.dup2(logfilefd, 1)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   134
        os.dup2(logfilefd, 2)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   135
        if nullfd not in (0, 1, 2):
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   136
            os.close(nullfd)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   137
        if logfile and logfilefd not in (0, 1, 2):
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   138
            os.close(logfilefd)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   139
37212
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
   140
        # Only unlink after redirecting stdout/stderr, so Windows doesn't
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
   141
        # complain about a sharing violation.
37215
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
   142
        if 'unlink' in postexecargs:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37212
diff changeset
   143
            os.unlink(postexecargs['unlink'])
37212
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
   144
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   145
    if runfn:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   146
        return runfn()
30507
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   147
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   148
_cmdservicemap = {
30513
ff7df4bb75de chgserver: make it a core module and drop extension flags
Yuya Nishihara <yuya@tcha.org>
parents: 30510
diff changeset
   149
    'chgunix': chgserver.chgunixservice,
30507
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   150
    'pipe': commandserver.pipeservice,
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   151
    'unix': commandserver.unixforkingservice,
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   152
}
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   153
30510
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   154
def _createcmdservice(ui, repo, opts):
30507
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   155
    mode = opts['cmdserver']
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   156
    try:
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   157
        return _cmdservicemap[mode](ui, repo, opts)
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   158
    except KeyError:
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30506
diff changeset
   159
        raise error.Abort(_('unknown mode %s') % mode)
30509
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   160
30510
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   161
def _createhgwebservice(ui, repo, opts):
30509
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   162
    # this way we can check if something was given in the command-line
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   163
    if opts.get('port'):
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   164
        opts['port'] = util.getport(opts.get('port'))
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   165
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32005
diff changeset
   166
    alluis = {ui}
30509
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   167
    if repo:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   168
        baseui = repo.baseui
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   169
        alluis.update([repo.baseui, repo.ui])
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   170
    else:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   171
        baseui = ui
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   172
    webconf = opts.get('web_conf') or opts.get('webdir_conf')
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   173
    if webconf:
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   174
        if opts.get('subrepos'):
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   175
            raise error.Abort(_('--web-conf cannot be used with --subrepos'))
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   176
30509
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   177
        # load server settings (e.g. web.port) to "copied" ui, which allows
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   178
        # hgwebdir to reload webconf cleanly
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   179
        servui = ui.copy()
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   180
        servui.readconfig(webconf, sections=['web'])
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   181
        alluis.add(servui)
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   182
    elif opts.get('subrepos'):
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   183
        servui = ui
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   184
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   185
        # If repo is None, hgweb.createapp() already raises a proper abort
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   186
        # message as long as webconf is None.
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   187
        if repo:
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   188
            webconf = dict()
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31548
diff changeset
   189
            cmdutil.addwebdirpath(repo, "", webconf)
30509
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   190
    else:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   191
        servui = ui
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   192
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   193
    optlist = ("name templates style address port prefix ipv6"
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   194
               " accesslog errorlog certificate encoding")
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   195
    for o in optlist.split():
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   196
        val = opts.get(o, '')
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   197
        if val in (None, ''): # should check against default options instead
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   198
            continue
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   199
        for u in alluis:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   200
            u.setconfig("web", o, val, 'serve')
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   201
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   202
    app = hgweb.createapp(baseui, repo, webconf)
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30507
diff changeset
   203
    return hgweb.httpservice(servui, app, opts)
30510
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   204
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   205
def createservice(ui, repo, opts):
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   206
    if opts["cmdserver"]:
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   207
        return _createcmdservice(ui, repo, opts)
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   208
    else:
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30509
diff changeset
   209
        return _createhgwebservice(ui, repo, opts)