# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: bialix@ukr.net-20090116221952-pcct0csso2l27vux # target_branch: file:///C:/work/Bazaar/qbzr-repo/trunk/ # testament_sha1: f5258613c84fcef8377766743a0fb02f9f071c04 # timestamp: 2009-01-17 00:22:42 +0200 # base_revision_id: bialix@ukr.net-20090116205605-m5kpqqjyy9413lll # # Begin patch === modified file 'lib/__init__.py' --- lib/__init__.py 2009-01-16 12:41:59 +0000 +++ lib/__init__.py 2009-01-16 22:19:52 +0000 @@ -3,6 +3,7 @@ # QBzr - Qt frontend to Bazaar commands # Copyright (C) 2006-2008 Lukáš Lalinský # Copyright (C) 2008 Alexander Belchenko +# Copyright (C) 2008, 2009 QBzr Developers # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License === modified file 'lib/commands.py' --- lib/commands.py 2009-01-14 19:59:25 +0000 +++ lib/commands.py 2009-01-16 22:19:52 +0000 @@ -3,6 +3,7 @@ # QBzr - Qt frontend to Bazaar commands # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2008 Alexander Belchenko +# Copyright (C) 2008, 2009 QBzr Developers # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -18,6 +19,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +import os import sys from bzrlib import errors, ui from bzrlib.option import Option @@ -27,9 +29,10 @@ from bzrlib.lazy_import import lazy_import lazy_import(globals(), ''' +import signal, shlex, thread + from PyQt4 import QtGui, QtCore -import shlex -import signal, exceptions + from bzrlib import ( builtins, commands, @@ -72,6 +75,8 @@ ) ''') +from bzrlib.plugins.qbzr.lib import MS_WINDOWS + class InvalidEncodingOption(errors.BzrError): @@ -493,7 +498,6 @@ app.exec_() - class cmd_qmerge(QBzrCommand): """Perform a three-way merge.""" @@ -688,8 +692,22 @@ takes_args = ['cmd'] hidden = True + if MS_WINDOWS: + def __win32_ctrl_c(self): + import win32event + from bzrlib.plugins.qbzr.lib.subprocess import get_event_name + ev = win32event.CreateEvent(None, 0, 0, get_event_name(os.getpid())) + try: + win32event.WaitForSingleObject(ev, win32event.INFINITE) + finally: + ev.Close() + thread.interrupt_main() + def run(self, cmd): - signal.signal(signal.SIGINT, sigabrt_handler) + if MS_WINDOWS: + thread.start_new_thread(self.__win32_ctrl_c, ()) + else: + signal.signal(signal.SIGINT, sigabrt_handler) ui.ui_factory = SubprocessGUIFactory() argv = [p.decode('utf8') for p in shlex.split(cmd.encode('utf8'))] commands.run_bzr(argv) === modified file 'lib/subprocess.py' --- lib/subprocess.py 2009-01-16 20:56:05 +0000 +++ lib/subprocess.py 2009-01-16 22:19:52 +0000 @@ -3,6 +3,7 @@ # QBzr - Qt frontend to Bazaar commands # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2008 Gary van der Merwe +# Copyright (C) 2008, 2009 QBzr Developers # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -369,7 +370,8 @@ if not self.aborting: self.aborting = True if MS_WINDOWS: - self.process.kill() # this uses TerminateProcess under the hood. not very nice :-/ + # trying to send signal to our subprocess + signal_event(get_child_pid(self.process.pid())) else: # be nice and try to use ^C os.kill(self.process.pid(), signal.SIGINT) @@ -506,3 +508,35 @@ def finished(self): self._report(1.0) + + +if MS_WINDOWS: + import ctypes + if hasattr(sys, "frozen"): + ctypes.__path__.append(os.path.normpath( + os.path.join(os.path.dirname(__file__), '..', '_lib', 'ctypes'))) + from ctypes import cast, POINTER, Structure + from ctypes.wintypes import DWORD, HANDLE + + class PROCESS_INFORMATION(Structure): + _fields_ = [("hProcess", HANDLE), + ("hThread", HANDLE), + ("dwProcessID", DWORD), + ("dwThreadID", DWORD)] + + LPPROCESS_INFORMATION = POINTER(PROCESS_INFORMATION) + + def get_child_pid(voidptr): + lp = cast(int(voidptr), LPPROCESS_INFORMATION) + return lp.contents.dwProcessID + + def get_event_name(child_pid): + return 'qbzr-qsubprocess-%d' % child_pid + + def signal_event(child_pid): + import win32event + ev = win32event.CreateEvent(None, 0, 0, get_event_name(child_pid)) + try: + win32event.SetEvent(ev) + finally: + ev.Close() # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWUDlyr8ABBN/gERWQABb7/// f+f8ir////BgCFxRfaAABi21AJFAAIJJJlFPyjxNJjSnjUQ/RNT0T00g09TT1NBoNlNNkj1Dhppg hkNNMjJhANNAGE0aZMACBocNNMEMhppkZMIBpoAwmjTJgAQNBiIEZUT9JqbUbU8U0bTUGh6gYgyG QAxAHDTTBDIaaZGTCAaaAMJo0yYAEDQSSBNACZAhghpGGpMKeU2gRo9TIGEEyQBy5MOHRXR2n09G yJOEmozL73j+JU7dCDBAabmHcRHMn6ounSZhNgJmpQCNldvPTCLgCSJMjR9IGKEXbflqadlCUr8g sLa9fZ2fdLK6Qbb3Ns5IMUFpWpQszJAAwhEWTE5d7SK9WH3VSYTJkEAsdwDRla6dz5c8HKxm8tCT RWjPF2hfGADIxDGScBlJXJotjPs5+j9j9cBzYDagWAb7Hheu0WeEOoPLLr3HiIVPTm/tZ2ZK35Q1 TsqIUrg54kb0ICouE4wnCQN80w3cjR+BdmzPH3STPXok+OPGryZcsXrTqccTUdBTTQIsZKogXQb0 cOR6L5Q+fU6uvl2wD9Zn6NjzGjSMqj/XSQ9mCDSl2EM2qb433/S7brNZeJm5zAMaMPRTOvLXdxcF 0FPCp6mrNFJwNCrKWKMtUiv/fLVd1+yhnO/8vUcEwWAHwInqCj3+KiI2vPhbQ7n1VT44lqzYq3b3 KvBxvHYJAzwyKHFCGCmiL+4NZ3auCf+KOMks2zZC2MbWgwcj4juug9gxJkJOCYA8YmfV7AkECmRW iCYKx6RcMkFBEkFMCg6hHyhd6Jzkpsi1mgJ6dM1Pi/AZJVLwYa36R634mMQpxD9gwtr+coEqxySp KO+xDhjUcXlLCKYDigjYDjWXmRxJ1FTO00VxMhD5R0ah6ZJkwBeGKtKXr97IqBYIvKaBEXDWV6xt PERGWgcKwFsMyswXzEWvlncOMyZsLTRwBOpLgc4c5Z9hYWjDyskEqbE1Doh1SCARdLEa8p6iOaOw oKYE9evYGZQHcNIKM7tDoJqiAYQ2lloiqo7SspCcSMt+okPNREcesL6qlBdk6QYm9yIDwcmEVkus iWPKYGFJAuNiMUZlpaRImN98aQtypIj4Wg+sxLyNyJlpMRjS+FjKhkXDEiCLxggFNby8xeNZGOk0 FZgXF07IqykseIKiofjK20n2g9ySttNBwJ3lxYTJmBzODfh6ZOwGehxUqakO1uRpQ+wLRR4nH4EG A+/SnDIv4WuGJju1tq7kw4i4HcOJ9Az8YRcTk6J8azIDYv4D4WmYZhl7aNy6l3bQvkEw3gtK60oh betiVxpCYw2UNH5FdMGTxCb4Bt3WycJexa5bgMFgNytIVJAPEiCdShIFyQpLLo3dm8esRMlAKwzg GkN4P5TrzxYyC67WGhYBXV6/q8uyaWIGqzORi7vfSWxsLlEhYMGA6bNUeAsWchA8zkvvAxw60Fzs r1keBGaDOdR0g81HbsiPee5wGoiNI4eUHMXyPHSB+IgY/AZBql9emf3HC20ROXHhpKU7IoRR86AO MgajCa+0yMuUchlzzG9A+5wm8XEfIQP/HgZG8fDIY3LsMzmOIlZsEajv5mX9EJx257qTI6LGP29y 20OyEcOQiovJHp0dfbbS8vh+sSD3IZbtZtPIkiCODtxNBOoXoQKjzOI8w2KqnSVry4BtlAa7eb49 hJd3b5TXeQCFRBaBrzvOw7iGiboneV4quwPQ32XuTFSICuIFpal5sdZ+UNx4QUW3FaevTXkvouHO 7VE3vkhUpks3JW2NOE2JiHMqzBC1LWgPfrSsMP38z/jv4r4r2DIYKBFWRilbet6ZjzimpORqOJ3+ 6JzBjWdwSLAYx/wuidxWrbpesiUfMwwoVlgGCRGZ66SxzrWPA3qdb4KowlLlSUDosYFNrihACDvy wNWqg8qSfzHegK/QIanKBOguq4edXOA38bnXhotTAeSUxEzUqGmcqn8i37AVJ+wp/c63zyRtOfMa rwqupEaegjDqR5LsQFVCdLda/5ByMRUVeYeSA9xcUtwZcRE0PHlVHLySZhTWxwMs+3+Ulbo9KlIt UUwgyyh0BO8mOBbDJVAfnj5hjKGI0A5ZHLNSKkGXdtJVlJKfQJILnui549PYEwGgBxZFlgE/4TUh PU1sQFEEYMiUHDgGYFFw5MwDB5ePQXERO0SmnLwPjAO1FQj8T4vyUazanBuX5wFgvHaIetnQ9rVG Vaj9Y6EBqjdLoMuPHiiO5b+sQ8MbEvcKOihyGOJQgodz4heKTK64aKPMigtX3uJLdzDSWhnl3yWF uUGILFAPJDPVyWP2qZPolwNWtWiPEy9+K2Mn4Tmq1gYBcc8w/JhMS3BTAO9PrRSg06OkCDFJxHjh mZ/lBMOGGZsHDq1KQQODHMkRGeQe4qeSN3etR3aWDIHhyaPN36UbBFCsuRcIvewl6xDh1n0ruEw/ md/t6iWjUd6s6knsWuC5r2Z4A5DxHQ37JktImFTNdYwO8BVlDmIamNIqqIoea+pzdcR4FQE1ZVYf D1aCXyLPXXBWMjRhMtIjosFyDjA0H2ID05yzUhswuNgjarhRPa4X5jMwjBMI8NxmfzEewzVivbyF oWH6ZbeZKNlKgHYsaclw379aB1wONzM9hhW1BYceAJl5p6hlU09r6rKB/xdyRThQkEDlyr8=