Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.4rc3, 0.4rc4, and 0.4

tortoise: register overlay and context menu as approved extensions

some users need this for the TortoiseHg extensions to work in Explorer.

Changeset 997eb001c711

Parent 340028f30d8f

by TK Soh

Changes to one file · Browse files at 997eb001c711 Showing diff from parent 340028f30d8f Diff from another changeset...

Change 1 of 2 Show Changes Only tortoisehg.py Stacked
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
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
 #  # 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 os  import sys  import _winreg    if hasattr(sys, "frozen") and sys.frozen == 'dll':   import win32traceutil    # specify version string, otherwise 'hg identify' will be used:  version = ''    import tortoise.version  tortoise.version.remember_version(version)    # shell extension classes  from tortoise.contextmenu import ContextMenuExtension  from tortoise.iconoverlay import ChangedOverlay, AddedOverlay, UnchangedOverlay    bin_path = os.path.dirname(os.path.join(os.getcwd(), sys.argv[0]))  print "bin path = ", bin_path    # TortoiseHg registry setup  def register_tortoise_path(unregister=False):   key = r"Software\TortoiseHg"   cat = _winreg.HKEY_LOCAL_MACHINE   if (unregister):   _winreg.DeleteKey(cat, key)   print "TortoiseHg unregistered"   else:   _winreg.SetValue(cat, key, _winreg.REG_SZ, bin_path)   print "TortoiseHg registered"    # for COM registration via py2exe  def DllRegisterServer():   RegisterServer(ContextMenuExtension)   RegisterServer(ChangedOverlay)   RegisterServer(AddedOverlay)   RegisterServer(UnchangedOverlay)   register_tortoise_path()    # for COM registration via py2exe  def DllUnregisterServer():   UnregisterServer(ContextMenuExtension)   UnregisterServer(ChangedOverlay)   UnregisterServer(AddedOverlay)   UnregisterServer(UnchangedOverlay)   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 in cls.registry_keys:   _winreg.SetValue(category, keyname, _winreg.REG_SZ, cls._reg_clsid_) + + # 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 in cls.registry_keys:   try:   _winreg.DeleteKey(category, keyname)   except WindowsError, details:   import errno   if details.errno != errno.ENOENT:   raise + + # 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__':   from win32com.server import register   register.UseCommandLine(ContextMenuExtension,   finalize_register = lambda: RegisterServer(ContextMenuExtension),   finalize_unregister = lambda: UnregisterServer(ContextMenuExtension))     for cls in (ChangedOverlay, AddedOverlay, UnchangedOverlay):   register.UseCommandLine(cls,   finalize_register = lambda: RegisterServer(cls),   finalize_unregister = lambda: UnregisterServer(cls))     if "--unregister" in sys.argv[1:]:   register_tortoise_path(unregister=True)   else:   register_tortoise_path()