##// END OF EJS Templates
largefiles: factor out procedures to update standins for pre-committing...
largefiles: factor out procedures to update standins for pre-committing This patch factors out procedures to update standins for pre-committing. This is one of preparations to avoid execution of such procedures according to invocation context. For example, resuming automated committing (e.g. "hg rebase --continue") should update standins at the 1st commit, because largefiles in the working directory may be modified manually. But on the other hand, it should avoid updating standins at subsequent committings for efficiency reason. For simplicity, this patch just moves procedures mechanically only with replacing below. - "self" => "repo" - "lfutil." => (none) - "orig" invocation => returning "match" Using "fstandin" instead "standin" as the name of local variable for the loop below is the only special care, because the latter shadows the same name function in "lfutil.py". [before] for standin in standins: lfile = lfutil.splitstandin(standin) if lfdirstate[lfile] != 'r': lfutil.updatestandin(self, standin) [after] for fstandin in standins: lfile = splitstandin(fstandin) if lfdirstate[lfile] != 'r': updatestandin(repo, fstandin)

File last commit:

r21194:47606950 stable
r23185:9870173e default
Show More
killdaemons.py
91 lines | 3.0 KiB | text/x-python | PythonLexer
Matt Mackall
tests: add killdaemons helper script
r7344 #!/usr/bin/env python
Patrick Mezard
killdaemons: take file argument explicitely...
r17466 import os, sys, time, errno, signal
Matt Mackall
tests: add killdaemons helper script
r7344
Patrick Mezard
killdaemons: add windows implementation
r17465 if os.name =='nt':
import ctypes
Simon Heimberg
tests: kill for windows in killdaemons.py checks return values...
r20493
def _check(ret, expectederr=None):
if ret == 0:
winerrno = ctypes.GetLastError()
if winerrno == expectederr:
return True
raise ctypes.WinError(winerrno)
Patrick Mezard
killdaemons: add windows implementation
r17465 def kill(pid, logfn, tryhard=True):
logfn('# Killing daemon process %d' % pid)
PROCESS_TERMINATE = 1
Simon Heimberg
tests: killdaemons.py for windows distinguishes access violation and terminated...
r20496 PROCESS_QUERY_INFORMATION = 0x400
Augie Fackler
killdaemons: drop superfluous L suffix from constant...
r20698 SYNCHRONIZE = 0x00100000
Simon Heimberg
tests: killdaemons.py for windows waits for killed process to terminate...
r20494 WAIT_OBJECT_0 = 0
WAIT_TIMEOUT = 258
Patrick Mezard
killdaemons: add windows implementation
r17465 handle = ctypes.windll.kernel32.OpenProcess(
Simon Heimberg
tests: killdaemons.py for windows distinguishes access violation and terminated...
r20496 PROCESS_TERMINATE|SYNCHRONIZE|PROCESS_QUERY_INFORMATION,
False, pid)
Simon Heimberg
tests: kill for windows in killdaemons.py checks return values...
r20493 if handle == 0:
Simon Heimberg
tests: killdaemons.py for checks reason when getting no process handle
r20495 _check(0, 87) # err 87 when process not found
Simon Heimberg
tests: kill for windows in killdaemons.py checks return values...
r20493 return # process not found, already finished
try:
Simon Heimberg
tests: killdaemons.py for windows distinguishes access violation and terminated...
r20496 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)
Simon Heimberg
tests: killdaemons.py for windows waits for killed process to terminate...
r20494
# 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:
Yuya Nishihara
killdaemons: correct typo of _check() function caught by pyflakes
r21194 _check(r) # any error
Simon Heimberg
tests: kill for windows in killdaemons.py checks return values...
r20493 except: #re-raises
ctypes.windll.kernel32.CloseHandle(handle) # no _check, keep error
raise
_check(ctypes.windll.kernel32.CloseHandle(handle))
Patrick Mezard
killdaemons: add windows implementation
r17465 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
Patrick Mezard
run-tests: do not duplicate killdaemons() code
r17464 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
Patrick Mezard
killdaemons: add windows implementation
r17465 kill(pid, logfn, tryhard)
Patrick Mezard
run-tests: do not duplicate killdaemons() code
r17464 fp.close()
if remove:
os.unlink(pidfile)
except IOError:
pass
if __name__ == '__main__':
Patrick Mezard
killdaemons: take file argument explicitely...
r17466 path, = sys.argv[1:]
killdaemons(path)