1
# Copyright (C) 2006, 2007, 2009, 2010 by Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""brz postinstall helper for win32 installation
18
Written by Alexander Belchenko
31
VERSION = "1.5.20070131"
33
USAGE = """Brz postinstall helper for win32 installation
37
-h, --help - help message
38
-v, --version - version info
40
-n, --dry-run - print actions rather than execute them
41
-q, --silent - no messages for user
43
--start-brz - update start_brz.bat
44
--add-path - add brz directory to environment PATH
45
--delete-path - delete brz directory to environment PATH
46
--add-shell-menu - add shell context menu to start brz session
47
--delete-shell-menu - delete context menu from shell
48
--check-mfc71 - check if MFC71.DLL present in system
49
""" % os.path.basename(sys.argv[0])
52
_major, _minor, _build, _platform, _text = sys.getwindowsversion()
55
# The operating system platform.
56
# This member can be one of the following values.
57
# ========================== ======================================
59
# -------------------------- --------------------------------------
60
# VER_PLATFORM_WIN32_NT The operating system is Windows Vista,
61
# 2 Windows Server "Longhorn",
62
# Windows Server 2003, Windows XP,
63
# Windows 2000, or Windows NT.
65
# VER_PLATFORM_WIN32_WINDOWS The operating system is Windows Me,
66
# 1 Windows 98, or Windows 95.
67
# ========================== ======================================
71
# don't care about real Windows name, just to force safe operations
78
(OK, ERROR) = range(2)
79
VERSION_FORMAT = "%-50s%s"
89
user_encoding = locale.getpreferredencoding() or 'ascii'
93
hkey_str = {_winreg.HKEY_LOCAL_MACHINE: 'HKEY_LOCAL_MACHINE',
94
_winreg.HKEY_CURRENT_USER: 'HKEY_CURRENT_USER',
95
_winreg.HKEY_CLASSES_ROOT: 'HKEY_CLASSES_ROOT',
103
add_shell_menu = False
104
delete_shell_menu = False
108
opts, args = getopt.getopt(sys.argv[1:], "hvnq",
121
if o in ("-h", "--help"):
124
elif o in ("-v", "--version"):
125
print(VERSION_FORMAT % (USAGE.splitlines()[0], VERSION))
128
elif o in ('-n', "--dry-run"):
130
elif o in ('-q', '--silent'):
133
elif o == "--start-brz":
135
elif o == "--add-path":
137
elif o == "--delete-path":
139
elif o == "--add-shell-menu":
140
add_shell_menu = True
141
elif o == "--delete-shell-menu":
142
delete_shell_menu = True
143
elif o == "--check-mfc71":
146
except getopt.GetoptError as msg:
151
# message box from Win32API
152
MessageBoxA = ctypes.windll.user32.MessageBoxA
155
MB_ICONEXCLAMATION = 48
157
brz_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
160
fname = os.path.join(brz_dir, "start_brz.bat")
161
if os.path.isfile(fname):
162
with open(fname, "r") as f:
163
content = f.readlines()
165
content = ["brz.exe help\n"]
167
for ix in xrange(len(content)):
169
if re.match(r'.*(?<!\\)brz\.exe([ "].*)?$',
172
content[ix] = s.replace('brz.exe',
173
'"%s"' % os.path.join(brz_dir,
175
elif s.find(r'C:\Program Files\Breezy') != -1:
176
content[ix] = s.replace(r'C:\Program Files\Breezy',
180
print("*** Write file: start_brz.bat")
181
print("*** File content:")
182
print(''.join(content))
184
with open(fname, 'w') as f:
185
f.write(''.join(content))
187
if (add_path or delete_path) and winver == 'Windows NT':
188
# find appropriate registry key:
189
# 1. HKLM\System\CurrentControlSet\Control\SessionManager\Environment
190
# 2. HKCU\Environment
191
keys = ((_winreg.HKEY_LOCAL_MACHINE, (r'System\CurrentControlSet\Control'
192
r'\Session Manager\Environment')),
193
(_winreg.HKEY_CURRENT_USER, r'Environment'),
197
for key, subkey in keys:
199
hkey = _winreg.OpenKey(key, subkey, 0, _winreg.KEY_ALL_ACCESS)
201
path_u, type_ = _winreg.QueryValueEx(hkey, 'Path')
203
if key != _winreg.HKEY_CURRENT_USER:
204
_winreg.CloseKey(hkey)
209
type_ = _winreg.REG_SZ
210
except EnvironmentError:
215
print("Cannot find appropriate registry key for PATH")
217
path_list = [i for i in path_u.split(os.pathsep) if i != '']
219
for ix, item in enumerate(path_list[:]):
225
print("*** brz already in PATH")
228
if add_path and not delete_path:
229
path_list.append(brz_dir.decode(user_encoding))
233
path_u = os.pathsep.join(path_list)
235
print("*** Registry key %s\\%s" % (hkey_str[key], subkey))
236
print("*** Modify PATH variable. New value:")
239
_winreg.SetValueEx(hkey, 'Path', 0, type_, path_u)
240
_winreg.FlushKey(hkey)
243
_winreg.CloseKey(hkey)
245
if (add_path or delete_path) and winver == 'Windows 98':
246
# mutating autoexec.bat
247
# adding or delete string:
248
# SET PATH=%PATH%;C:\PROGRA~1\Breezy
249
abat = 'C:\\autoexec.bat'
250
abak = 'C:\\autoexec.bak'
252
def backup_autoexec_bat(name, backupname, dry_run):
253
# backup autoexec.bat
254
if os.path.isfile(name):
256
shutil.copyfile(name, backupname)
258
print('*** backup copy of autoexec.bat created')
260
GetShortPathName = ctypes.windll.kernel32.GetShortPathNameA
261
buf = ctypes.create_string_buffer(260)
262
if GetShortPathName(brz_dir, buf, 260):
263
brz_dir_8_3 = buf.value
265
brz_dir_8_3 = brz_dir
266
pattern = 'SET PATH=%PATH%;' + brz_dir_8_3
269
with open(abat, 'r') as f:
270
lines = f.readlines()
273
if i.rstrip('\r\n') == pattern:
277
if delete_path and found:
278
backup_autoexec_bat(abat, abak, dry_run)
280
with open(abat, 'w') as f:
282
if i.rstrip('\r\n') != pattern:
285
print('*** Remove line <%s> from autoexec.bat' % pattern)
287
elif add_path and not found:
288
backup_autoexec_bat(abat, abak, dry_run)
290
with open(abat, 'a') as f:
294
print('*** Add line <%s> to autoexec.bat' % pattern)
296
if add_shell_menu and not delete_shell_menu:
299
hkey = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT,
301
except EnvironmentError:
304
'Unable to create registry key for context menu',
306
MB_OK | MB_ICONERROR)
309
_winreg.SetValue(hkey, '', _winreg.REG_SZ, 'Brz Here')
310
hkey2 = _winreg.CreateKey(hkey, 'command')
311
_winreg.SetValue(hkey2, '', _winreg.REG_SZ,
313
os.environ.get('COMSPEC', '%COMSPEC%'),
314
os.path.join(brz_dir, 'start_brz.bat')))
315
_winreg.CloseKey(hkey2)
316
_winreg.CloseKey(hkey)
318
if delete_shell_menu:
320
_winreg.DeleteKey(_winreg.HKEY_CLASSES_ROOT,
321
r'Folder\shell\brz\command')
322
except EnvironmentError:
326
_winreg.DeleteKey(_winreg.HKEY_CLASSES_ROOT,
328
except EnvironmentError:
333
ctypes.windll.LoadLibrary('mfc71.dll')
336
("Library MFC71.DLL is not found on your system.\n"
337
"This library needed for SFTP transport.\n"
338
"If you need to work via SFTP you should download\n"
339
"this library manually and put it to directory\n"
340
"where Brz installed.\n"
341
"For detailed instructions see:\n"
342
"http://wiki.bazaar.canonical.com/BzrOnPureWindows"
345
MB_OK | MB_ICONEXCLAMATION)
350
if __name__ == "__main__":