comparison mercurial/commands.py @ 214:2d60aa9bde0a

catch TERM signal in command processor -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 catch TERM signal in command processor This keeps kill from interrupting a transaction without cleanup. manifest hash: c50091696a3396dfed5c3168bd9e0d94c457a04b -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCniLNywK+sNU5EO8RAvepAKCCnEX7vPheIyOu2IvV6dDahdFMWACeMih6 E2R3rA/MGACxG9HpSNH6lak= =HR1s -----END PGP SIGNATURE-----
author mpm@selenic.com
date Wed, 01 Jun 2005 13:04:13 -0800
parents d2172916ef6c
children 8ff4532376a4
comparison
equal deleted inserted replaced
213:d2172916ef6c 214:2d60aa9bde0a
1 import os, re, traceback, sys 1 import os, re, traceback, sys, signal
2 from mercurial import fancyopts, ui, hg 2 from mercurial import fancyopts, ui, hg
3 3
4 class UnknownCommand(Exception): pass 4 class UnknownCommand(Exception): pass
5 5
6 def filterfiles(list, files): 6 def filterfiles(list, files):
157 if re.match(e + "$", cmd): 157 if re.match(e + "$", cmd):
158 return table[e] 158 return table[e]
159 159
160 raise UnknownCommand(cmd) 160 raise UnknownCommand(cmd)
161 161
162 class SignalInterrupt(Exception): pass
163
164 def catchterm(*args):
165 raise SignalInterrupt
166
162 def dispatch(args): 167 def dispatch(args):
163 options = {} 168 options = {}
164 opts = [('v', 'verbose', None, 'verbose'), 169 opts = [('v', 'verbose', None, 'verbose'),
165 ('d', 'debug', None, 'debug'), 170 ('d', 'debug', None, 'debug'),
166 ('q', 'quiet', None, 'quiet'), 171 ('q', 'quiet', None, 'quiet'),
179 not options["noninteractive"]) 184 not options["noninteractive"])
180 185
181 # deal with unfound commands later 186 # deal with unfound commands later
182 i = find(cmd) 187 i = find(cmd)
183 188
189 signal.signal(signal.SIGTERM, catchterm)
190
184 cmdoptions = {} 191 cmdoptions = {}
185 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) 192 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2])
186 193
187 if cmd not in norepo.split(): 194 if cmd not in norepo.split():
188 repo = hg.repository(ui = u) 195 repo = hg.repository(ui = u)
190 else: 197 else:
191 d = lambda: i[0](u, *args, **cmdoptions) 198 d = lambda: i[0](u, *args, **cmdoptions)
192 199
193 try: 200 try:
194 d() 201 d()
202 except SignalInterrupt:
203 u.warn("killed!\n")
195 except KeyboardInterrupt: 204 except KeyboardInterrupt:
196 u.warn("interrupted!\n") 205 u.warn("interrupted!\n")
197 except TypeError, inst: 206 except TypeError, inst:
198 # was this an argument error? 207 # was this an argument error?
199 tb = traceback.extract_tb(sys.exc_info()[2]) 208 tb = traceback.extract_tb(sys.exc_info()[2])