Kiln » TortoiseHg » TortoiseHg
Clone URL:  
tortoisehg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# # Simple TortoiseSVN-like Mercurial plugin for the Windows Shell # Published under the GNU GPL, v2 or later. # Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org> # Copyright (C) 2007 Henry Ludemann <misc@hl.id.au> # Copyright (C) 2007 TK Soh <teekaysoh@gmail.com> # import pythoncom from mercurial import demandimport demandimport.ignore.append('win32traceutil') demandimport.enable() import os import sys import _winreg # shell extension classes from tortoise.contextmenu import ContextMenuExtension import tortoise.iconoverlay overlays = [getattr(tortoise.iconoverlay, overlay) for overlay in tortoise.iconoverlay.__dict__ if overlay.endswith('Overlay')] bin_path = os.path.dirname(os.path.join(os.getcwd(), sys.argv[0])) print "bin path = ", bin_path def check_tortoise_overlays(): # TortoiseOverlays must be installed, and we must be able to write there. try: hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"Software\TortoiseOverlays", 0, _winreg.KEY_ALL_ACCESS) except WindowsError: print "TortoiseOverlays is not installed." sys.exit(1) # TortoiseHg registry setup def register_tortoise_path(unregister=False): key = r"Software\TortoiseHg" cat = _winreg.HKEY_LOCAL_MACHINE if (unregister): try: _winreg.DeleteKey(cat, key) print "TortoiseHg unregistered" except WindowsError: print 'TortoiseHg was not registered' else: _winreg.SetValue(cat, key, _winreg.REG_SZ, bin_path) print "TortoiseHg registered" # for COM registration via py2exe def DllRegisterServer(): check_tortoise_overlays() RegisterServer(ContextMenuExtension) for overlay in overlays: RegisterServer(overlay) register_tortoise_path() # for COM registration via py2exe def DllUnregisterServer(): UnregisterServer(ContextMenuExtension) for overlay in overlays: UnregisterServer(overlay) register_tortoise_path(unregister=True) def RegisterServer(cls): # Add mercurial to the library path try: import mercurial except ImportError: from win32com.server import register register.UnregisterClasses(cls) raise "Error: Failed to find mercurial module!" hg_path = os.path.dirname(os.path.dirname(mercurial.__file__)) try: key = "CLSID\\%s\\PythonCOMPath" % cls._reg_clsid_ path = _winreg.QueryValue(_winreg.HKEY_CLASSES_ROOT, key) _winreg.SetValue(_winreg.HKEY_CLASSES_ROOT, key, _winreg.REG_SZ, "%s;%s" % (path, hg_path)) except: pass # Add the appropriate shell extension registry keys for category, keyname, values in cls.registry_keys: hkey = _winreg.CreateKey(category, keyname) for (name, val) in values: # todo: handle ints? _winreg.SetValueEx(hkey, name, 0, _winreg.REG_SZ, val) # register the extension on Approved list try: apath = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved' key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, apath, 0, _winreg.KEY_WRITE) _winreg.SetValueEx(key, cls._reg_clsid_, 0, _winreg.REG_SZ, 'TortoiseHg') except: pass print cls._reg_desc_, "registration complete." def UnregisterServer(cls): for category, keyname, values in cls.registry_keys: hkey = _winreg.OpenKey(category, keyname, 0, _winreg.KEY_ALL_ACCESS) for (name, val) in values: # todo: handle ints? try: _winreg.DeleteValue(hkey, name) except WindowsError, exc: print "Failed to remove registry key %s: %s" % (keyname, exc) # unregister the extension from Approved list try: apath = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved' key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, apath, 0, _winreg.KEY_WRITE) _winreg.DeleteValue(key, cls._reg_clsid_) except: pass print cls._reg_desc_, "unregistration complete." if __name__=='__main__': check_tortoise_overlays() from win32com.server import register register.UseCommandLine(ContextMenuExtension, finalize_register = lambda: RegisterServer(ContextMenuExtension), finalize_unregister = lambda: UnregisterServer(ContextMenuExtension)) for overlay in overlays: register.UseCommandLine(overlay, finalize_register = lambda: RegisterServer(overlay), finalize_unregister = lambda: UnregisterServer(overlay)) if "--unregister" in sys.argv[1:]: register_tortoise_path(unregister=True) else: register_tortoise_path()