mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 23:07:18 +03:00
add some convenience features
This commit is contained in:
parent
805376a3bc
commit
70693db843
20
setup.py
Normal file
20
setup.py
Normal file
@ -0,0 +1,20 @@
|
||||
from distutils.core import setup, Extension
|
||||
|
||||
setup(
|
||||
name='fb-hg-experimental',
|
||||
version='0.1.0',
|
||||
author='Durham Goode',
|
||||
maintainer='Durham Goode',
|
||||
maintainer_email='durham@fb.com',
|
||||
url='',
|
||||
description='Experimental Mercurial extensions from Facebook',
|
||||
long_description="",
|
||||
keywords='fb hg mercurial',
|
||||
license='',
|
||||
py_modules=[
|
||||
'backups',
|
||||
'fbamend',
|
||||
'githelp',
|
||||
'smartlog',
|
||||
]
|
||||
)
|
91
tests/killdaemons.py
Executable file
91
tests/killdaemons.py
Executable file
@ -0,0 +1,91 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os, sys, time, errno, signal
|
||||
|
||||
if os.name =='nt':
|
||||
import ctypes
|
||||
|
||||
def _check(ret, expectederr=None):
|
||||
if ret == 0:
|
||||
winerrno = ctypes.GetLastError()
|
||||
if winerrno == expectederr:
|
||||
return True
|
||||
raise ctypes.WinError(winerrno)
|
||||
|
||||
def kill(pid, logfn, tryhard=True):
|
||||
logfn('# Killing daemon process %d' % pid)
|
||||
PROCESS_TERMINATE = 1
|
||||
PROCESS_QUERY_INFORMATION = 0x400
|
||||
SYNCHRONIZE = 0x00100000
|
||||
WAIT_OBJECT_0 = 0
|
||||
WAIT_TIMEOUT = 258
|
||||
handle = ctypes.windll.kernel32.OpenProcess(
|
||||
PROCESS_TERMINATE|SYNCHRONIZE|PROCESS_QUERY_INFORMATION,
|
||||
False, pid)
|
||||
if handle == 0:
|
||||
_check(0, 87) # err 87 when process not found
|
||||
return # process not found, already finished
|
||||
try:
|
||||
r = ctypes.windll.kernel32.WaitForSingleObject(handle, 100)
|
||||
if r == WAIT_OBJECT_0:
|
||||
pass # terminated, but process handle still available
|
||||
elif r == WAIT_TIMEOUT:
|
||||
_check(ctypes.windll.kernel32.TerminateProcess(handle, -1))
|
||||
else:
|
||||
_check(r)
|
||||
|
||||
# TODO?: forcefully kill when timeout
|
||||
# and ?shorter waiting time? when tryhard==True
|
||||
r = ctypes.windll.kernel32.WaitForSingleObject(handle, 100)
|
||||
# timeout = 100 ms
|
||||
if r == WAIT_OBJECT_0:
|
||||
pass # process is terminated
|
||||
elif r == WAIT_TIMEOUT:
|
||||
logfn('# Daemon process %d is stuck')
|
||||
else:
|
||||
_check(r) # any error
|
||||
except: #re-raises
|
||||
ctypes.windll.kernel32.CloseHandle(handle) # no _check, keep error
|
||||
raise
|
||||
_check(ctypes.windll.kernel32.CloseHandle(handle))
|
||||
|
||||
else:
|
||||
def kill(pid, logfn, tryhard=True):
|
||||
try:
|
||||
os.kill(pid, 0)
|
||||
logfn('# Killing daemon process %d' % pid)
|
||||
os.kill(pid, signal.SIGTERM)
|
||||
if tryhard:
|
||||
for i in range(10):
|
||||
time.sleep(0.05)
|
||||
os.kill(pid, 0)
|
||||
else:
|
||||
time.sleep(0.1)
|
||||
os.kill(pid, 0)
|
||||
logfn('# Daemon process %d is stuck - really killing it' % pid)
|
||||
os.kill(pid, signal.SIGKILL)
|
||||
except OSError, err:
|
||||
if err.errno != errno.ESRCH:
|
||||
raise
|
||||
|
||||
def killdaemons(pidfile, tryhard=True, remove=False, logfn=None):
|
||||
if not logfn:
|
||||
logfn = lambda s: s
|
||||
# Kill off any leftover daemon processes
|
||||
try:
|
||||
fp = open(pidfile)
|
||||
for line in fp:
|
||||
try:
|
||||
pid = int(line)
|
||||
except ValueError:
|
||||
continue
|
||||
kill(pid, logfn, tryhard)
|
||||
fp.close()
|
||||
if remove:
|
||||
os.unlink(pidfile)
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
path, = sys.argv[1:]
|
||||
killdaemons(path)
|
1922
tests/run-tests.py
Executable file
1922
tests/run-tests.py
Executable file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user