mercurial/server.py
author Pulkit Goyal <7895pulkit@gmail.com>
Wed, 25 Apr 2018 00:26:49 +0530
branchstable
changeset 37817 678ab0de7296
parent 37218 d2bd29dffc6c
child 38197 aac4be30e250
permissions -rw-r--r--
remotenames: mark the extension as EXPERIMENTAL I still don't feel confident about locking the behavior of all the things in the remotenames extension. Moreover the extension was introduced in this cycle only. Let's mark this extension EXPERIMENTAL for now so that we can change things especially the storage layer if required in next cycle. I will like to use cbor at storage layer too. Differential Revision: https://phab.mercurial-scm.org/D3426
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30515
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 (
30522
ff7df4bb75de chgserver: make it a core module and drop extension flags
Yuya Nishihara <yuya@tcha.org>
parents: 30519
diff changeset
    16
    chgserver,
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
    17
    cmdutil,
30516
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
    18
    commandserver,
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    19
    error,
30518
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
    20
    hgweb,
32563
3f0936b2cea9 server: use pycompat to get argv
Augie Fackler <raf@durin42.com>
parents: 32331
diff changeset
    21
    pycompat,
30515
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
37122
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
30515
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
37217
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    33
    postexecargs = {}
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    34
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    35
    if opts['daemon_postexec']:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
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: 37214
diff changeset
    37
            if inst.startswith('unlink:'):
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    38
                postexecargs['unlink'] = inst[7:]
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    39
            elif inst.startswith('chdir:'):
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    40
                postexecargs['chdir'] = inst[6:]
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    41
            elif inst != 'none':
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
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: 37214
diff changeset
    43
                                  % inst)
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    44
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
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: 37123
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: 37123
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: 37123
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: 37123
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: 37123
diff changeset
    50
    if pycompat.iswindows and opts['daemon_postexec']:
37217
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
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: 37214
diff changeset
    52
            procutil.stdout.flush()
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    53
            procutil.stderr.flush()
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
diff changeset
    54
37217
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    55
            fd = os.open(postexecargs['unlink'],
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
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: 37214
diff changeset
    57
            try:
37218
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
    58
                os.dup2(fd, procutil.stdout.fileno())
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
    59
                os.dup2(fd, procutil.stderr.fileno())
37217
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    60
            finally:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
    61
                os.close(fd)
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
diff changeset
    62
30515
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:
32581
d770a08ee9d9 server: write out pid using bytes IO instead of str IO
Augie Fackler <raf@durin42.com>
parents: 32563
diff changeset
    66
                mode = 'ab'
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    67
            else:
32581
d770a08ee9d9 server: write out pid using bytes IO instead of str IO
Augie Fackler <raf@durin42.com>
parents: 32563
diff changeset
    68
                mode = 'wb'
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    69
            fp = open(opts['pid_file'], mode)
32640
e48cb1c7a902 py3: simply use b'%d\n' to format pid in server.py
Yuya Nishihara <yuya@tcha.org>
parents: 32581
diff changeset
    70
            fp.write('%d\n' % pid)
30515
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:
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37122
diff changeset
    79
                runargs = procutil.hgcmd() + pycompat.sysargv[1:]
30515
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)
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37122
diff changeset
    92
            pid = procutil.rundetached(runargs, condfn)
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    93
            if pid < 0:
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
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: 37123
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: 37123
diff changeset
    96
                if pycompat.iswindows and os.path.exists(lockpath):
37218
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
    97
                    with open(lockpath, 'rb') as log:
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
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: 37123
diff changeset
    99
                            procutil.stderr.write(line)
30515
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:
31554
ce4ddcda868b server: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 30522
diff changeset
   103
            util.tryunlink(lockpath)
30515
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']:
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37122
diff changeset
   113
        writepid(procutil.getpid())
30515
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
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
diff changeset
   120
37217
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
   121
        if 'chdir' in postexecargs:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
   122
            os.chdir(postexecargs['chdir'])
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37122
diff changeset
   123
        procutil.hidewindow()
37122
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()
30515
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: 32640
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: 32640
diff changeset
   131
                                0o666)
37218
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
   132
        os.dup2(nullfd, procutil.stdin.fileno())
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
   133
        os.dup2(logfilefd, procutil.stdout.fileno())
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
   134
        os.dup2(logfilefd, procutil.stderr.fileno())
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
   135
        stdio = (procutil.stdin.fileno(), procutil.stdout.fileno(),
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
   136
                 procutil.stderr.fileno())
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
   137
        if nullfd not in stdio:
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   138
            os.close(nullfd)
37218
d2bd29dffc6c server: minor code cleanup
Matt Harbison <matt_harbison@yahoo.com>
parents: 37217
diff changeset
   139
        if logfile and logfilefd not in stdio:
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   140
            os.close(logfilefd)
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   141
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
diff changeset
   142
        # 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: 37123
diff changeset
   143
        # complain about a sharing violation.
37217
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
   144
        if 'unlink' in postexecargs:
73a60281a861 server: refactor 'daemon_postexec' instructions into a dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 37214
diff changeset
   145
            os.unlink(postexecargs['unlink'])
37214
f09a2eab11cf server: add an error feedback mechanism for when the daemon fails to launch
Matt Harbison <matt_harbison@yahoo.com>
parents: 37123
diff changeset
   146
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   147
    if runfn:
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   148
        return runfn()
30516
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   149
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   150
_cmdservicemap = {
30522
ff7df4bb75de chgserver: make it a core module and drop extension flags
Yuya Nishihara <yuya@tcha.org>
parents: 30519
diff changeset
   151
    'chgunix': chgserver.chgunixservice,
30516
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   152
    'pipe': commandserver.pipeservice,
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   153
    'unix': commandserver.unixforkingservice,
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   154
}
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   155
30519
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   156
def _createcmdservice(ui, repo, opts):
30516
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   157
    mode = opts['cmdserver']
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   158
    try:
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   159
        return _cmdservicemap[mode](ui, repo, opts)
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   160
    except KeyError:
dd539e2d89aa server: move service table and factory from commandserver
Yuya Nishihara <yuya@tcha.org>
parents: 30515
diff changeset
   161
        raise error.Abort(_('unknown mode %s') % mode)
30518
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   162
30519
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   163
def _createhgwebservice(ui, repo, opts):
30518
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   164
    # 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: 30516
diff changeset
   165
    if opts.get('port'):
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   166
        opts['port'] = util.getport(opts.get('port'))
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   167
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32005
diff changeset
   168
    alluis = {ui}
30518
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   169
    if repo:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   170
        baseui = repo.baseui
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   171
        alluis.update([repo.baseui, repo.ui])
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   172
    else:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   173
        baseui = ui
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   174
    webconf = opts.get('web_conf') or opts.get('webdir_conf')
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   175
    if webconf:
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   176
        if opts.get('subrepos'):
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   177
            raise error.Abort(_('--web-conf cannot be used with --subrepos'))
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   178
30518
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   179
        # 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: 30516
diff changeset
   180
        # hgwebdir to reload webconf cleanly
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   181
        servui = ui.copy()
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   182
        servui.readconfig(webconf, sections=['web'])
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   183
        alluis.add(servui)
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   184
    elif opts.get('subrepos'):
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   185
        servui = ui
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   186
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   187
        # 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: 31554
diff changeset
   188
        # message as long as webconf is None.
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   189
        if repo:
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   190
            webconf = dict()
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31554
diff changeset
   191
            cmdutil.addwebdirpath(repo, "", webconf)
30518
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   192
    else:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   193
        servui = ui
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   194
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   195
    optlist = ("name templates style address port prefix ipv6"
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   196
               " accesslog errorlog certificate encoding")
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   197
    for o in optlist.split():
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   198
        val = opts.get(o, '')
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   199
        if val in (None, ''): # should check against default options instead
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   200
            continue
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   201
        for u in alluis:
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   202
            u.setconfig("web", o, val, 'serve')
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   203
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   204
    app = hgweb.createapp(baseui, repo, webconf)
add7bcad1d9c server: move service factory from hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30516
diff changeset
   205
    return hgweb.httpservice(servui, app, opts)
30519
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   206
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   207
def createservice(ui, repo, opts):
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   208
    if opts["cmdserver"]:
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   209
        return _createcmdservice(ui, repo, opts)
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   210
    else:
a0878bc87379 server: add public function to select either cmdserver or hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 30518
diff changeset
   211
        return _createhgwebservice(ui, repo, opts)