Merge lp:~a1s/brz/3.2-windows-installer into lp:brz/3.2
- 3.2-windows-installer
- Merge into 3.2
Proposed by
Aleksandr Smyshliaev
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Jelmer Vernooij | ||||
Approved revision: | no longer in the source branch. | ||||
Merge reported by: | The Breezy Bot | ||||
Merged at revision: | not available | ||||
Proposed branch: | lp:~a1s/brz/3.2-windows-installer | ||||
Merge into: | lp:brz/3.2 | ||||
Diff against target: |
355 lines (+119/-46) 7 files modified
Makefile (+3/-2) setup.py (+32/-17) tools/package_mf.py (+45/-16) tools/win32/brz.iss.cog (+19/-7) tools/win32/info.txt (+3/-3) tools/win32/ostools.py (+16/-0) tools/win32/start_brz.bat (+1/-1) |
||||
To merge this branch: | bzr merge lp:~a1s/brz/3.2-windows-installer | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jelmer Vernooij | Approve | ||
Review via email: mp+411927@code.launchpad.net |
Commit message
Make "make installer" pass on Windows
Description of the change
With these changes, I was able to build Breezy installer package on Windows.
Many commands still don't work, and I wasn't able to compile subvertpy, so the built-in plugin for Subversion is only added when subvertpy exists on the system.
Also, it would be nice to have an icon to pack with Windows executables.
To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'Makefile' | |||
2 | --- Makefile 2021-02-19 02:53:40 +0000 | |||
3 | +++ Makefile 2021-11-16 15:36:22 +0000 | |||
4 | @@ -253,7 +253,7 @@ | |||
5 | 253 | $(PYTHON) setup.py build_ext -i -f $(PYTHON_BUILDFLAGS) | 253 | $(PYTHON) setup.py build_ext -i -f $(PYTHON_BUILDFLAGS) |
6 | 254 | $(PYTHON) setup.py py2exe > py2exe.log | 254 | $(PYTHON) setup.py py2exe > py2exe.log |
7 | 255 | $(PYTHON) tools/win32/ostools.py copytodir tools/win32/start_brz.bat win32_brz.exe | 255 | $(PYTHON) tools/win32/ostools.py copytodir tools/win32/start_brz.bat win32_brz.exe |
9 | 256 | $(PYTHON) tools/win32/ostools.py copytodir tools/win32/bazaar.url win32_brz.exe | 256 | $(PYTHON) tools/win32/ostools.py copytodir tools/win32/breezy.url win32_brz.exe |
10 | 257 | 257 | ||
11 | 258 | # win32 installer for brz.exe | 258 | # win32 installer for brz.exe |
12 | 259 | installer: exe copy-docs | 259 | installer: exe copy-docs |
13 | @@ -268,7 +268,8 @@ | |||
14 | 268 | 268 | ||
15 | 269 | copy-docs: docs | 269 | copy-docs: docs |
16 | 270 | $(PYTHON) tools/win32/ostools.py copytodir README win32_brz.exe/doc | 270 | $(PYTHON) tools/win32/ostools.py copytodir README win32_brz.exe/doc |
18 | 271 | $(PYTHON) tools/win32/ostools.py copytree $(WEB_DOCS) win32_brz.exe | 271 | $(PYTHON) tools/win32/ostools.py copydir doc/en/_build/html win32_brz.exe/doc |
19 | 272 | $(PYTHON) tools/win32/ostools.py copydir doc/developers/_build/html win32_brz.exe/doc/developers | ||
20 | 272 | 273 | ||
21 | 273 | # clean on win32 all installer-related files and directories | 274 | # clean on win32 all installer-related files and directories |
22 | 274 | clean-win32: clean-docs | 275 | clean-win32: clean-docs |
23 | 275 | 276 | ||
24 | === modified file 'setup.py' | |||
25 | --- setup.py 2021-08-18 22:38:08 +0000 | |||
26 | +++ setup.py 2021-11-16 15:36:22 +0000 | |||
27 | @@ -366,7 +366,8 @@ | |||
28 | 366 | ico_root = os.path.join(tbzr_root, 'tbreezy', 'resources') | 366 | ico_root = os.path.join(tbzr_root, 'tbreezy', 'resources') |
29 | 367 | icos = [] # list of (path_root, relative_ico_path) | 367 | icos = [] # list of (path_root, relative_ico_path) |
30 | 368 | # First always brz's icon and its in the root of the brz tree. | 368 | # First always brz's icon and its in the root of the brz tree. |
32 | 369 | icos.append(('', 'brz.ico')) | 369 | # FIXME: There's no such thing as brz.ico |
33 | 370 | #icos.append(('', 'brz.ico')) | ||
34 | 370 | for root, dirs, files in os.walk(ico_root): | 371 | for root, dirs, files in os.walk(ico_root): |
35 | 371 | icos.extend([(ico_root, os.path.join(root, f)[len(ico_root) + 1:]) | 372 | icos.extend([(ico_root, os.path.join(root, f)[len(ico_root) + 1:]) |
36 | 372 | for f in files if f.endswith('.ico')]) | 373 | for f in files if f.endswith('.ico')]) |
37 | @@ -524,7 +525,7 @@ | |||
38 | 524 | 525 | ||
39 | 525 | elif 'py2exe' in sys.argv: | 526 | elif 'py2exe' in sys.argv: |
40 | 526 | # py2exe setup | 527 | # py2exe setup |
42 | 527 | import py2exe | 528 | from py2exe import distutils_buildexe as py2exe |
43 | 528 | 529 | ||
44 | 529 | # pick real brz version | 530 | # pick real brz version |
45 | 530 | import breezy | 531 | import breezy |
46 | @@ -568,15 +569,17 @@ | |||
47 | 568 | self.outfiles.extend([f + 'o' for f in compile_names]) | 569 | self.outfiles.extend([f + 'o' for f in compile_names]) |
48 | 569 | # end of class install_data_with_bytecompile | 570 | # end of class install_data_with_bytecompile |
49 | 570 | 571 | ||
51 | 571 | target = py2exe.build_exe.Target( | 572 | target = py2exe.runtime.Target( |
52 | 572 | script="brz", | 573 | script="brz", |
53 | 573 | dest_base="brz", | 574 | dest_base="brz", |
55 | 574 | icon_resources=[(0, 'brz.ico')], | 575 | # FIXME: There's no such thing as brz.ico |
56 | 576 | #icon_resources=[(0, 'brz.ico')], | ||
57 | 575 | name=META_INFO['name'], | 577 | name=META_INFO['name'], |
58 | 576 | version=version_str, | 578 | version=version_str, |
59 | 577 | description=META_INFO['description'], | 579 | description=META_INFO['description'], |
62 | 578 | author=META_INFO['author'], | 580 | maintainer=META_INFO['maintainer'], |
63 | 579 | copyright="(c) Canonical Ltd, 2005-2010", | 581 | copyright="Copyright 2005-2012 Canonical Ltd.\n" |
64 | 582 | "Copyright 2017-2021 Breezy developers", | ||
65 | 580 | company_name="Canonical Ltd.", | 583 | company_name="Canonical Ltd.", |
66 | 581 | comments=META_INFO['description'], | 584 | comments=META_INFO['description'], |
67 | 582 | ) | 585 | ) |
68 | @@ -637,6 +640,14 @@ | |||
69 | 637 | # rest of the svn plugin wasn't. So we tell py2exe to leave the | 640 | # rest of the svn plugin wasn't. So we tell py2exe to leave the |
70 | 638 | # plugins out of the .zip file | 641 | # plugins out of the .zip file |
71 | 639 | excludes.extend(["breezy.plugins." + d for d in dirs]) | 642 | excludes.extend(["breezy.plugins." + d for d in dirs]) |
72 | 643 | # svn plugin requires subvertpy, | ||
73 | 644 | # and pip cannot install it on Windows. | ||
74 | 645 | # When subvertpy is not available, remove svn from plugins | ||
75 | 646 | if "svn" in dirs: | ||
76 | 647 | try: | ||
77 | 648 | import subvertpy | ||
78 | 649 | except ImportError: | ||
79 | 650 | dirs.remove("svn") | ||
80 | 640 | x = [] | 651 | x = [] |
81 | 641 | for i in files: | 652 | for i in files: |
82 | 642 | # Throw away files we don't want packaged. Note that plugins may | 653 | # Throw away files we don't want packaged. Note that plugins may |
83 | @@ -651,16 +662,20 @@ | |||
84 | 651 | if x: | 662 | if x: |
85 | 652 | target_dir = root[len('breezy/'):] # install to 'plugins/...' | 663 | target_dir = root[len('breezy/'):] # install to 'plugins/...' |
86 | 653 | plugins_files.append((target_dir, x)) | 664 | plugins_files.append((target_dir, x)) |
88 | 654 | # find modules for built-in plugins | 665 | # find modules required by built-in plugins |
89 | 655 | import tools.package_mf | 666 | import tools.package_mf |
95 | 656 | mf = tools.package_mf.CustomModuleFinder() | 667 | mf = tools.package_mf.CustomModuleFinder('.') |
96 | 657 | mf.run_package('breezy/plugins') | 668 | mf.load_package_recursive('breezy.plugins') |
97 | 658 | packs, mods = mf.get_result() | 669 | (packs, mods) = mf.get_result() |
98 | 659 | additional_packages.update(packs) | 670 | # Don't add the plugins packages and modules, |
99 | 660 | includes.extend(mods) | 671 | # as they are listed in excluded |
100 | 672 | additional_packages.update(pack for pack in packs | ||
101 | 673 | if not (pack.startswith('breezy.plugins.') or pack in excludes)) | ||
102 | 674 | includes.extend(mod for mod in mods | ||
103 | 675 | if not (mod.startswith('breezy.plugins.') or mod in excludes)) | ||
104 | 661 | 676 | ||
105 | 662 | console_targets = [target, | 677 | console_targets = [target, |
107 | 663 | 'tools/win32/bzr_postinstall.py', | 678 | 'tools/win32/brz_postinstall.py', |
108 | 664 | ] | 679 | ] |
109 | 665 | gui_targets = [gui_target] | 680 | gui_targets = [gui_target] |
110 | 666 | data_files = topics_files + plugins_files + I18N_FILES | 681 | data_files = topics_files + plugins_files + I18N_FILES |
111 | @@ -715,7 +730,7 @@ | |||
112 | 715 | "includes": includes, | 730 | "includes": includes, |
113 | 716 | "excludes": excludes, | 731 | "excludes": excludes, |
114 | 717 | "dll_excludes": dll_excludes, | 732 | "dll_excludes": dll_excludes, |
116 | 718 | "dist_dir": "win32_bzr.exe", | 733 | "dist_dir": "win32_brz.exe", |
117 | 719 | "optimize": 2, | 734 | "optimize": 2, |
118 | 720 | "custom_boot_script": | 735 | "custom_boot_script": |
119 | 721 | "tools/win32/py2exe_boot_common.py", | 736 | "tools/win32/py2exe_boot_common.py", |
120 | @@ -725,10 +740,10 @@ | |||
121 | 725 | # We want the libaray.zip to have optimize = 2, but the exe to have | 740 | # We want the libaray.zip to have optimize = 2, but the exe to have |
122 | 726 | # optimize = 1, so that .py files that get compilied at run time | 741 | # optimize = 1, so that .py files that get compilied at run time |
123 | 727 | # (e.g. user installed plugins) dont have their doc strings removed. | 742 | # (e.g. user installed plugins) dont have their doc strings removed. |
126 | 728 | class py2exe_no_oo_exe(py2exe.build_exe.py2exe): | 743 | class py2exe_no_oo_exe(py2exe.py2exe): |
127 | 729 | def build_executable(self, *args, **kwargs): | 744 | def run(self, *args, **kwargs): |
128 | 730 | self.optimize = 1 | 745 | self.optimize = 1 |
130 | 731 | py2exe.build_exe.py2exe.build_executable(self, *args, **kwargs) | 746 | super(py2exe_no_oo_exe, self).run(*args, **kwargs) |
131 | 732 | self.optimize = 2 | 747 | self.optimize = 2 |
132 | 733 | 748 | ||
133 | 734 | if __name__ == '__main__': | 749 | if __name__ == '__main__': |
134 | 735 | 750 | ||
135 | === modified file 'tools/package_mf.py' | |||
136 | --- tools/package_mf.py 2018-11-16 12:25:18 +0000 | |||
137 | +++ tools/package_mf.py 2021-11-16 15:36:22 +0000 | |||
138 | @@ -16,10 +16,12 @@ | |||
139 | 16 | 16 | ||
140 | 17 | """Custom module finder for entire package""" | 17 | """Custom module finder for entire package""" |
141 | 18 | 18 | ||
142 | 19 | import modulefinder | ||
143 | 20 | import os | 19 | import os |
144 | 21 | import sys | 20 | import sys |
145 | 22 | 21 | ||
146 | 22 | # At present, this is only used on Windows (see setup.py) | ||
147 | 23 | from py2exe import mf310 as modulefinder | ||
148 | 24 | |||
149 | 23 | 25 | ||
150 | 24 | class CustomModuleFinder(modulefinder.ModuleFinder): | 26 | class CustomModuleFinder(modulefinder.ModuleFinder): |
151 | 25 | """Custom module finder for processing python packages, | 27 | """Custom module finder for processing python packages, |
152 | @@ -35,27 +37,54 @@ | |||
153 | 35 | modulefinder.ModuleFinder.__init__( | 37 | modulefinder.ModuleFinder.__init__( |
154 | 36 | self, path, debug, excludes, replace_paths) | 38 | self, path, debug, excludes, replace_paths) |
155 | 37 | 39 | ||
158 | 38 | def run_package(self, package_path): | 40 | def load_package_recursive(self, fqname): |
159 | 39 | """Recursively process each module in package with run_script method. | 41 | """Recursively process each module in package |
160 | 40 | 42 | ||
162 | 41 | :param package_path: path to package directory. | 43 | :param fqname: name of the package. |
163 | 42 | """ | 44 | """ |
165 | 43 | stack = [package_path] | 45 | # Load all the parents |
166 | 46 | parent = None | ||
167 | 47 | path = [] | ||
168 | 48 | for partname in fqname.split("."): | ||
169 | 49 | parent_path = ".".join(path) | ||
170 | 50 | path.append(partname) | ||
171 | 51 | # import_module works recursively, | ||
172 | 52 | # and some of the dependencies may try | ||
173 | 53 | # to import modules not present on the system. | ||
174 | 54 | # (The actual error is | ||
175 | 55 | # AttributeError: 'NoneType' object has no attribute 'is_package') | ||
176 | 56 | # Ignore errors here and bail out in the collection loop. | ||
177 | 57 | try: | ||
178 | 58 | self.import_module(partname, ".".join(path), | ||
179 | 59 | self.modules.get(parent_path, None)) | ||
180 | 60 | except: | ||
181 | 61 | pass | ||
182 | 62 | stack = [(fqname, parent_path)] | ||
183 | 44 | while stack: | 63 | while stack: |
188 | 45 | curdir = stack.pop(0) | 64 | (package, parent_path) = stack.pop(0) |
189 | 46 | py = os.listdir(curdir) | 65 | # Here we assume that all parents have already been imported. |
190 | 47 | for i in py: | 66 | # Abort when a parent is missing. |
191 | 48 | full = os.path.join(curdir, i) | 67 | parent = self.modules[parent_path] |
192 | 68 | pkg_module = self.import_module(package, package, parent) | ||
193 | 69 | curdir = pkg_module.__file__ | ||
194 | 70 | dirlist = os.listdir(curdir) | ||
195 | 71 | for filename in dirlist: | ||
196 | 72 | full = os.path.join(curdir, filename) | ||
197 | 49 | if os.path.isdir(full): | 73 | if os.path.isdir(full): |
198 | 74 | if filename == "tests": | ||
199 | 75 | continue | ||
200 | 50 | init = os.path.join(full, '__init__.py') | 76 | init = os.path.join(full, '__init__.py') |
201 | 51 | if os.path.isfile(init): | 77 | if os.path.isfile(init): |
209 | 52 | stack.append(full) | 78 | stack.append((".".join((package, filename)), package)) |
210 | 53 | continue | 79 | continue |
211 | 54 | if not i.endswith('.py'): | 80 | if not filename.endswith('.py'): |
212 | 55 | continue | 81 | continue |
213 | 56 | if i == 'setup.py': # skip | 82 | if filename == 'setup.py': # skip |
214 | 57 | continue | 83 | continue |
215 | 58 | self.run_script(full) | 84 | # We only accept .py files, so could use [:-3] too - faster... |
216 | 85 | partname = os.path.splitext(filename)[0] | ||
217 | 86 | self.import_module(partname, | ||
218 | 87 | ".".join((package, partname)), pkg_module) | ||
219 | 59 | 88 | ||
220 | 60 | def get_result(self): | 89 | def get_result(self): |
221 | 61 | """Return 2-tuple: (list of packages, list of modules)""" | 90 | """Return 2-tuple: (list of packages, list of modules)""" |
222 | 62 | 91 | ||
223 | === modified file 'tools/win32/brz.iss.cog' | |||
224 | --- tools/win32/brz.iss.cog 2017-06-02 21:28:05 +0000 | |||
225 | +++ tools/win32/brz.iss.cog 2021-11-16 15:36:22 +0000 | |||
226 | @@ -78,6 +78,14 @@ | |||
227 | 78 | ; [[[cog cog.outl('AppVersion=%s' % VERSION) ]]] | 78 | ; [[[cog cog.outl('AppVersion=%s' % VERSION) ]]] |
228 | 79 | ; [[[end]]] | 79 | ; [[[end]]] |
229 | 80 | 80 | ||
230 | 81 | ; [[[cog | ||
231 | 82 | ; import platform | ||
232 | 83 | ; | ||
233 | 84 | ; if platform.machine().endswith("64"): | ||
234 | 85 | ; cog.outl('ArchitecturesAllowed=x64') | ||
235 | 86 | ; cog.outl('ArchitecturesInstallIn64BitMode=x64') | ||
236 | 87 | ; ]]] | ||
237 | 88 | ; [[[end]]] | ||
238 | 81 | ChangesEnvironment=yes | 89 | ChangesEnvironment=yes |
239 | 82 | ; MARKH: PrivilegesRequired=none means it can't be installed by a non-admin | 90 | ; MARKH: PrivilegesRequired=none means it can't be installed by a non-admin |
240 | 83 | ; user - but sadly we still need admin - eg, tortoise overlays, installing | 91 | ; user - but sadly we still need admin - eg, tortoise overlays, installing |
241 | @@ -115,8 +123,12 @@ | |||
242 | 115 | Source: "plugins\*.*"; DestDir: "{app}\\plugins"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; Components: plugins | 123 | Source: "plugins\*.*"; DestDir: "{app}\\plugins"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; Components: plugins |
243 | 116 | Source: "*.bat"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; | 124 | Source: "*.bat"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; |
244 | 117 | Source: "*.url"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; | 125 | Source: "*.url"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; |
247 | 118 | Source: "msvc*.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; | 126 | ; Python3 includes vcruntime*.dll which is not packed in by py2exe. |
248 | 119 | Source: "bz*.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; | 127 | ; I'm not sure if the installer has to contain it. |
249 | 128 | ; It looks like the binaries work OK without vcruntime dll. | ||
250 | 129 | ; Delete this dll line when we're sure. | ||
251 | 130 | ;Source: "msvc*.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; | ||
252 | 131 | Source: "brz*.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; | ||
253 | 120 | Source: "Python*.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; | 132 | Source: "Python*.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; |
254 | 121 | Source: "lib\*.*"; DestDir: "{app}\lib"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; | 133 | Source: "lib\*.*"; DestDir: "{app}\lib"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; |
255 | 122 | Source: "doc\*.*"; DestDir: "{app}\doc"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; | 134 | Source: "doc\*.*"; DestDir: "{app}\doc"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; |
256 | @@ -141,7 +153,7 @@ | |||
257 | 141 | ; imageformats plugins for PyQt4 | 153 | ; imageformats plugins for PyQt4 |
258 | 142 | ; [[[cog | 154 | ; [[[cog |
259 | 143 | ; plug_dir = os.path.join(os.path.dirname(cog.inFile), # $(bzr_src_root)/tools/win32 | 155 | ; plug_dir = os.path.join(os.path.dirname(cog.inFile), # $(bzr_src_root)/tools/win32 |
261 | 144 | ; '..', '..', 'win32_bzr.exe', 'imageformats') | 156 | ; '..', '..', 'win32_brz.exe', 'imageformats') |
262 | 145 | ; if os.path.isdir(plug_dir): | 157 | ; if os.path.isdir(plug_dir): |
263 | 146 | ; cog.outl('Source: "imageformats\\*.*"; DestDir: "{app}\\imageformats"; ' | 158 | ; cog.outl('Source: "imageformats\\*.*"; DestDir: "{app}\\imageformats"; ' |
264 | 147 | ; 'Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete;') | 159 | ; 'Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete;') |
265 | @@ -179,9 +191,9 @@ | |||
266 | 179 | [Icons] | 191 | [Icons] |
267 | 180 | Name: "{group}\Documentation index"; Filename: "{app}\doc\index.html"; WorkingDir: "{app}\doc"; | 192 | Name: "{group}\Documentation index"; Filename: "{app}\doc\index.html"; WorkingDir: "{app}\doc"; |
268 | 181 | Name: "{group}\Breezy Home Page"; Filename: "{app}\breezy.url"; Comment: "https://www.breezy-vcs.org/"; | 193 | Name: "{group}\Breezy Home Page"; Filename: "{app}\breezy.url"; Comment: "https://www.breezy-vcs.org/"; |
270 | 182 | Name: "{group}\Start Bzr in cmd shell"; Filename: "{cmd}"; Parameters: "/K start_bzr.bat"; WorkingDir: "{app}"; IconFilename: "{app}\bzr.exe"; Comment: "Open new Bzr session"; | 194 | Name: "{group}\Start Bzr in cmd shell"; Filename: "{cmd}"; Parameters: "/K start_brz.bat"; WorkingDir: "{app}"; IconFilename: "{app}\brz.exe"; Comment: "Open new Bzr session"; |
271 | 183 | ; NOTE: Intent is to change the log file location - the line below will need to change to reflect that. | 195 | ; NOTE: Intent is to change the log file location - the line below will need to change to reflect that. |
273 | 184 | Name: "{group}\Open Bzr log file"; Filename: "notepad.exe"; Parameters: "{userdocs}\.bzr.log"; Comment: "Launch notepad to view the bzr log file"; | 196 | Name: "{group}\Open Bzr log file"; Filename: "notepad.exe"; Parameters: "{userdocs}\.brz.log"; Comment: "Launch notepad to view the brz log file"; |
274 | 185 | 197 | ||
275 | 186 | ; [[[cog | 198 | ; [[[cog |
276 | 187 | ; if "TBZR" in os.environ: | 199 | ; if "TBZR" in os.environ: |
277 | @@ -224,7 +236,7 @@ | |||
278 | 224 | 236 | ||
279 | 225 | 237 | ||
280 | 226 | [UninstallRun] | 238 | [UninstallRun] |
282 | 227 | Filename: "{app}\bzr_postinstall.exe"; Parameters: "--delete-path --delete-shell-menu --silent"; Flags: skipifdoesntexist runhidden; | 239 | Filename: "{app}\brz_postinstall.exe"; Parameters: "--delete-path --delete-shell-menu --silent"; Flags: skipifdoesntexist runhidden; |
283 | 228 | ; [[[cog | 240 | ; [[[cog |
284 | 229 | ; if "TBZR" in os.environ: | 241 | ; if "TBZR" in os.environ: |
285 | 230 | ; cog.outl('Filename: "regsvr32.exe"; Parameters: "/u /s /i: tbzrshellext_x86.dll"; WorkingDir: "{app}"; Components: tortoise; StatusMsg: "Unregistering Tortoise"; Flags: skipifdoesntexist') | 242 | ; cog.outl('Filename: "regsvr32.exe"; Parameters: "/u /s /i: tbzrshellext_x86.dll"; WorkingDir: "{app}"; Components: tortoise; StatusMsg: "Unregistering Tortoise"; Flags: skipifdoesntexist') |
286 | @@ -320,7 +332,7 @@ | |||
287 | 320 | ewWaitUntilTerminated, ErrorCode) then | 332 | ewWaitUntilTerminated, ErrorCode) then |
288 | 321 | MsgBox('Failed to install TortoiseOverlays: ' + SysErrorMessage(ErrorCode), | 333 | MsgBox('Failed to install TortoiseOverlays: ' + SysErrorMessage(ErrorCode), |
289 | 322 | mbInformation, MB_OK); | 334 | mbInformation, MB_OK); |
291 | 323 | // Ideally we could be bzr_postinstall.exe this way too, but | 335 | // Ideally we could be brz_postinstall.exe this way too, but |
292 | 324 | // its needed at uninstall time. | 336 | // its needed at uninstall time. |
293 | 325 | end; | 337 | end; |
294 | 326 | // cause explorer to re-fetch handlers. | 338 | // cause explorer to re-fetch handlers. |
295 | 327 | 339 | ||
296 | === modified file 'tools/win32/info.txt' | |||
297 | --- tools/win32/info.txt 2010-03-30 20:13:52 +0000 | |||
298 | +++ tools/win32/info.txt 2021-11-16 15:36:22 +0000 | |||
299 | @@ -1,6 +1,6 @@ | |||
302 | 1 | Bazaar is free software; you can redistribute and/or modify it under | 1 | Breezy is free software; you can redistribute and/or modify it |
303 | 2 | the terms of the GNU General Public License version 2. | 2 | under the terms of the GNU General Public License version 2. |
304 | 3 | 3 | ||
305 | 4 | See: http://www.gnu.org/copyleft/gpl.html | 4 | See: http://www.gnu.org/copyleft/gpl.html |
306 | 5 | 5 | ||
308 | 6 | Managing source code in Bazaar does not make it subject to the GPL. | 6 | Managing source code in Breezy does not make it subject to the GPL. |
309 | 7 | 7 | ||
310 | === modified file 'tools/win32/ostools.py' | |||
311 | --- tools/win32/ostools.py 2020-01-31 17:43:44 +0000 | |||
312 | +++ tools/win32/ostools.py 2021-11-16 15:36:22 +0000 | |||
313 | @@ -12,6 +12,9 @@ | |||
314 | 12 | ostools.py copytree FILES... DIR | 12 | ostools.py copytree FILES... DIR |
315 | 13 | copy files to specified directory keeping relative paths | 13 | copy files to specified directory keeping relative paths |
316 | 14 | 14 | ||
317 | 15 | ostools.py copydir SOURCE TARGET | ||
318 | 16 | recursively copy SOURCE directory tree to TARGET directory | ||
319 | 17 | |||
320 | 15 | ostools.py remove [FILES...] [DIRS...] | 18 | ostools.py remove [FILES...] [DIRS...] |
321 | 16 | remove files or directories (recursive) | 19 | remove files or directories (recursive) |
322 | 17 | """ | 20 | """ |
323 | @@ -89,6 +92,19 @@ | |||
324 | 89 | 92 | ||
325 | 90 | return 0 | 93 | return 0 |
326 | 91 | 94 | ||
327 | 95 | if cmd == 'copydir': | ||
328 | 96 | if len(argv) != 2: | ||
329 | 97 | print("Usage: ostools.py copydir SOURCE TARGET") | ||
330 | 98 | return 1 | ||
331 | 99 | |||
332 | 100 | def _copy(src, dest, follow_symlinks=True): | ||
333 | 101 | shutil.copy(src, dest, follow_symlinks=follow_symlinks) | ||
334 | 102 | print("Copied:", src, "=>", dest) | ||
335 | 103 | shutil.copytree(argv[0], argv[1], | ||
336 | 104 | copy_function=_copy, dirs_exist_ok=True) | ||
337 | 105 | |||
338 | 106 | return 0 | ||
339 | 107 | |||
340 | 92 | if cmd == 'remove': | 108 | if cmd == 'remove': |
341 | 93 | if len(argv) == 0: | 109 | if len(argv) == 0: |
342 | 94 | print("Usage: ostools.py remove [FILES...] [DIRS...]") | 110 | print("Usage: ostools.py remove [FILES...] [DIRS...]") |
343 | 95 | 111 | ||
344 | === modified file 'tools/win32/start_brz.bat' | |||
345 | --- tools/win32/start_brz.bat 2017-05-21 14:47:52 +0000 | |||
346 | +++ tools/win32/start_brz.bat 2021-11-16 15:36:22 +0000 | |||
347 | @@ -6,7 +6,7 @@ | |||
348 | 6 | REM ****************************************************** | 6 | REM ****************************************************** |
349 | 7 | 7 | ||
350 | 8 | REM Add the Brz directory to system-wide PATH environment variable | 8 | REM Add the Brz directory to system-wide PATH environment variable |
352 | 9 | SET PATH=C:\Program Files\Bazaar;%PATH% | 9 | SET PATH=C:\Program Files\Breezy;%PATH% |
353 | 10 | 10 | ||
354 | 11 | REM Change next line to set-up e-mail to identify yourself in brz | 11 | REM Change next line to set-up e-mail to identify yourself in brz |
355 | 12 | REM SET BZREMAIL= | 12 | REM SET BZREMAIL= |