tortoisehg.py
author TK Soh <teekaysoh@yahoo.com>
Sun, 13 Jul 2008 05:17:53 +0100
changeset 1176 997eb001c711
parent 421 0a35e08e57cc
permissions -rw-r--r--
tortoise: register overlay and context menu as approved extensions some users need this for the TortoiseHg extensions to work in Explorer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
     1
#
58
3ebc84829919 add copyright note
TK Soh <teekaysoh@yahoo.com>
parents: 22
diff changeset
     2
# Simple TortoiseSVN-like Mercurial plugin for the Windows Shell
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     3
# Published under the GNU GPL, v2 or later.
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     4
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     5
# Copyright (C) 2007 Henry Ludemann <misc@hl.id.au>
58
3ebc84829919 add copyright note
TK Soh <teekaysoh@yahoo.com>
parents: 22
diff changeset
     6
# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
     7
#
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     8
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
     9
import os
151
b8ee6fc5350b direct output to pywin trace collect when registered as DLL
TK Soh <teekaysoh@yahoo.com>
parents: 148
diff changeset
    10
import sys
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    11
import _winreg
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    12
151
b8ee6fc5350b direct output to pywin trace collect when registered as DLL
TK Soh <teekaysoh@yahoo.com>
parents: 148
diff changeset
    13
if hasattr(sys, "frozen") and sys.frozen == 'dll':
b8ee6fc5350b direct output to pywin trace collect when registered as DLL
TK Soh <teekaysoh@yahoo.com>
parents: 148
diff changeset
    14
    import win32traceutil
b8ee6fc5350b direct output to pywin trace collect when registered as DLL
TK Soh <teekaysoh@yahoo.com>
parents: 148
diff changeset
    15
421
0a35e08e57cc tortoise: add version handling based on Mercurial's versioning code
TK Soh <teekaysoh@yahoo.com>
parents: 361
diff changeset
    16
# specify version string, otherwise 'hg identify' will be used:
0a35e08e57cc tortoise: add version handling based on Mercurial's versioning code
TK Soh <teekaysoh@yahoo.com>
parents: 361
diff changeset
    17
version = ''
0a35e08e57cc tortoise: add version handling based on Mercurial's versioning code
TK Soh <teekaysoh@yahoo.com>
parents: 361
diff changeset
    18
0a35e08e57cc tortoise: add version handling based on Mercurial's versioning code
TK Soh <teekaysoh@yahoo.com>
parents: 361
diff changeset
    19
import tortoise.version
0a35e08e57cc tortoise: add version handling based on Mercurial's versioning code
TK Soh <teekaysoh@yahoo.com>
parents: 361
diff changeset
    20
tortoise.version.remember_version(version)
0a35e08e57cc tortoise: add version handling based on Mercurial's versioning code
TK Soh <teekaysoh@yahoo.com>
parents: 361
diff changeset
    21
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    22
# shell extension classes
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    23
from tortoise.contextmenu import ContextMenuExtension
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    24
from tortoise.iconoverlay import ChangedOverlay, AddedOverlay, UnchangedOverlay
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    25
212
0b0e24b16442 setup: fix installation path
TK Soh <teekaysoh@yahoo.com>
parents: 153
diff changeset
    26
bin_path = os.path.dirname(os.path.join(os.getcwd(), sys.argv[0]))
0b0e24b16442 setup: fix installation path
TK Soh <teekaysoh@yahoo.com>
parents: 153
diff changeset
    27
print "bin path = ", bin_path
0b0e24b16442 setup: fix installation path
TK Soh <teekaysoh@yahoo.com>
parents: 153
diff changeset
    28
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    29
# TortoiseHg registry setup
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    30
def register_tortoise_path(unregister=False):
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    31
    key = r"Software\TortoiseHg"
361
dfaa2d2e4705 setup: install software registry key to HKLM
TK Soh <teekaysoh@yahoo.com>
parents: 212
diff changeset
    32
    cat = _winreg.HKEY_LOCAL_MACHINE
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    33
    if (unregister):
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    34
        _winreg.DeleteKey(cat, key)
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    35
        print "TortoiseHg unregistered"
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    36
    else:
212
0b0e24b16442 setup: fix installation path
TK Soh <teekaysoh@yahoo.com>
parents: 153
diff changeset
    37
        _winreg.SetValue(cat, key, _winreg.REG_SZ, bin_path)
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    38
        print "TortoiseHg registered"
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    39
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    40
# for COM registration via py2exe
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    41
def DllRegisterServer():
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    42
    RegisterServer(ContextMenuExtension)
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    43
    RegisterServer(ChangedOverlay)
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    44
    RegisterServer(AddedOverlay)
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    45
    RegisterServer(UnchangedOverlay)
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    46
    register_tortoise_path()
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    47
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    48
# for COM registration via py2exe
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    49
def DllUnregisterServer():
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    50
    UnregisterServer(ContextMenuExtension)
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    51
    UnregisterServer(ChangedOverlay)
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    52
    UnregisterServer(AddedOverlay)
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    53
    UnregisterServer(UnchangedOverlay)
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
    54
    register_tortoise_path(unregister=True)
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    55
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    56
def RegisterServer(cls):
2
e8ddeb25f3f7 first working draft on icon overlay for Hg
TK Soh <teekaysoh@yahoo.com>
parents: 1
diff changeset
    57
    # Add mercurial to the library path
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    58
    try:
2
e8ddeb25f3f7 first working draft on icon overlay for Hg
TK Soh <teekaysoh@yahoo.com>
parents: 1
diff changeset
    59
        import mercurial
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    60
    except ImportError:
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    61
        from win32com.server import register
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    62
        register.UnregisterClasses(cls)
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    63
        raise "Error: Failed to find mercurial module!"
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    64
22
c4dd9fd12468 remove all remaining references to bzr
TK Soh <teekaysoh@yahoo.com>
parents: 3
diff changeset
    65
    hg_path = os.path.dirname(os.path.dirname(mercurial.__file__))
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    66
    try:
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    67
        key = "CLSID\\%s\\PythonCOMPath" % cls._reg_clsid_
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    68
        path = _winreg.QueryValue(_winreg.HKEY_CLASSES_ROOT, key)
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    69
        _winreg.SetValue(_winreg.HKEY_CLASSES_ROOT, key, _winreg.REG_SZ, "%s;%s" % (path, hg_path))
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    70
    except:
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    71
        pass
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    72
        
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    73
    # Add the appropriate shell extension registry keys
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    74
    for category, keyname in cls.registry_keys: 
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    75
        _winreg.SetValue(category, keyname, _winreg.REG_SZ, cls._reg_clsid_)
1176
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    76
        
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    77
    # register the extension on Approved list
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    78
    try:
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    79
        apath = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved'
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    80
        key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, apath, 0, _winreg.KEY_WRITE)
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    81
        _winreg.SetValueEx(key, cls._reg_clsid_, 0, _winreg.REG_SZ, 'TortoiseHg')
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    82
    except:
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    83
        pass
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    84
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    85
    print cls._reg_desc_, "registration complete."
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    86
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
    87
def UnregisterServer(cls):
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    88
    for category, keyname in cls.registry_keys:
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    89
        try:
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    90
            _winreg.DeleteKey(category, keyname)
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    91
        except WindowsError, details:
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    92
            import errno
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    93
            if details.errno != errno.ENOENT:
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    94
                raise
1176
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    95
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    96
    # unregister the extension from Approved list
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    97
    try:
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    98
        apath = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved'
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
    99
        key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, apath, 0, _winreg.KEY_WRITE)
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
   100
        _winreg.DeleteValue(key, cls._reg_clsid_)
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
   101
    except:
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
   102
        pass
997eb001c711 tortoise: register overlay and context menu as approved extensions
TK Soh <teekaysoh@yahoo.com>
parents: 421
diff changeset
   103
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   104
    print cls._reg_desc_, "unregistration complete."
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   105
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   106
if __name__=='__main__':
0
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   107
    from win32com.server import register
bac32db38e52 import bzr-tortoise source @ rev 222 (Sat 2007-04-21 20:03:54 -0700)
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   108
    register.UseCommandLine(ContextMenuExtension,
148
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   109
            finalize_register = lambda: RegisterServer(ContextMenuExtension),
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   110
            finalize_unregister = lambda: UnregisterServer(ContextMenuExtension))
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   111
    
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   112
    for cls in (ChangedOverlay, AddedOverlay, UnchangedOverlay):
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   113
        register.UseCommandLine(cls,
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   114
                finalize_register = lambda: RegisterServer(cls),
db8d4198ad71 COM register: overhaul to support py2exe
TK Soh <teekaysoh@yahoo.com>
parents: 147
diff changeset
   115
                finalize_unregister = lambda: UnregisterServer(cls))
153
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
   116
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
   117
    if "--unregister" in sys.argv[1:]:
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
   118
        register_tortoise_path(unregister=True)
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
   119
    else:
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
   120
        register_tortoise_path()
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
   121
98807a6fbcc5 register TortoiseHg directory during installation
TK Soh <teekaysoh@yahoo.com>
parents: 151
diff changeset
   122