~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/win32/bzr.iss.cog

(Mark Hammond) Updates to setup.py to support bundling tortoisebzr
        and qbzr into the standalone win32 installer.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
InfoAfterFile="..\tools\win32\survey.txt"
46
46
 
47
47
VersionInfoCompany="Canonical Ltd."
48
 
VersionInfoCopyright="Canonical Ltd., 2005-2007"
49
 
VersionInfoDescription="Installer for stand-alone bzr.exe"
 
48
VersionInfoCopyright="Canonical Ltd., 2005-2008"
 
49
VersionInfoDescription="Windows installer for Bazaar"
50
50
; [[[cog
51
51
; import bzrlib
52
52
; version_number = []
79
79
; [[[end]]]
80
80
 
81
81
ChangesEnvironment=yes
82
 
PrivilegesRequired=none
83
 
 
 
82
; MARKH: PrivilegesRequired=none means it can't be installed by a non-admin
 
83
; user - but sadly we still need admin - eg, tortoise overlays, installing
 
84
; into "\Program Files", installing COM objects etc all must be done by an
 
85
; admin.
 
86
PrivilegesRequired=admin
84
87
 
85
88
[Files]
86
 
Source: "*.*"; DestDir: "{app}"; Flags: ignoreversion;
87
 
Source: "lib\*.*"; DestDir: "{app}\lib"; Flags: createallsubdirs ignoreversion recursesubdirs;
88
 
Source: "doc\*.*"; DestDir: "{app}\doc"; Flags: createallsubdirs ignoreversion recursesubdirs;
89
 
Source: "plugins\*.*"; DestDir: "{app}\plugins"; Components: plugins; Flags: createallsubdirs ignoreversion recursesubdirs;
 
89
; Tortoise files - these are at the top as we use 'ExtractTemporaryFile' on
 
90
; the TortoiseOverlays MSI, and inno documents such files should be at the
 
91
; start for best performance.
 
92
; [[[cog
 
93
; if "TBZR" in os.environ: # we need a more formal way of controlling this...
 
94
;     tovmsi = os.environ["TORTOISE_OVERLAYS_MSI_WIN32"] # point at TortoiseOverlays .msi
 
95
;     cog.outl('Source: "%s"; Flags: dontcopy ignoreversion ; Components: tortoise' % tovmsi)
 
96
;     cog.outl('Source: "tbzrcache.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; Components: tortoise')
 
97
;     cog.outl('Source: "tbzrcachew.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; Components: tortoise')
 
98
;     cog.outl('Source: "tbzrcommand.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; Components: tortoise')
 
99
;     cog.outl('Source: "tbzrcommandw.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; Components: tortoise')
 
100
;     cog.outl('Source: "tbzr_tracer.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete; Components: debug')
 
101
;     # Note 'regserver' here appears to run regsvr32 without elevation, which
 
102
;     # is no good for us - so we have a [run] entry below.
 
103
;     cog.outl('Source: "tbzr.dll"; DestDir: "{app}"; Flags: ignoreversion regserver restartreplace uninsrestartdelete; Components: tortoise')
 
104
;     cog.outl(r'Source: "plugins\qbzr\*"; DestDir: "{app}\plugins\qbzr"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; Components: tortoise')
 
105
;
 
106
;     cog.outl('Source: "%s\\doc\\index.html"; DestDir: "{app}\\doc\\tbzr"; Flags: ignoreversion; Components: tortoise' % os.environ['TBZR'])
 
107
; ]]]
 
108
; [[[end]]]
 
109
 
 
110
; We can't say '*.*' due to optional components.
 
111
Source: "plugins\*.*"; DestDir: "{app}\\plugins"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete; Components: plugins
 
112
Source: "*.bat"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete;
 
113
Source: "*.url"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete;
 
114
Source: "msvc*.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete;
 
115
Source: "bz*.exe"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete;
 
116
Source: "Python*.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace uninsrestartdelete;
 
117
Source: "lib\*.*"; DestDir: "{app}\lib"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete;
 
118
Source: "doc\*.*"; DestDir: "{app}\doc"; Flags: createallsubdirs ignoreversion recursesubdirs restartreplace uninsrestartdelete;
90
119
; [[[cog
91
120
; try:
92
121
;     import pycurl
105
134
; ]]]
106
135
; [[[end]]]
107
136
 
 
137
[Types]
 
138
Name: "typical"; Description: "A typical installation"
 
139
Name: "full"; Description: "Full Installation (typical installation plus test utilities)"
 
140
Name: "compact"; Description: "Compact installation"
 
141
Name: "custom"; Description: "Custom installation"; Flags: iscustom
108
142
 
109
143
[Components]
110
 
Name: "main"; Description: "Main Files"; Types: full compact custom; Flags: fixed
111
 
Name: "plugins"; Description: "Default plugins"; Types: full custom;
 
144
Name: "main"; Description: "Main Files"; Types: full typical compact custom; Flags: fixed
 
145
Name: "plugins"; Description: "Default plugins"; Types: full typical custom;
112
146
; [[[cog
113
147
; if ca_path:
114
148
;     cog.outl('Name: "cabundle"; '
115
149
;              'Description: "CA certificates for SSL support"; '
116
 
;              'Types: full custom')
 
150
;              'Types: full typical custom')
 
151
; if "TBZR" in os.environ: # we need a more formal way of controlling this...
 
152
;     cog.outl('Name: "tortoise"; Description: "Windows Shell Extensions (TortoiseBZR) - EXPERIMENTAL"; Types: full typical custom;')
 
153
;     cog.outl('Name: "debug"; Description: "Test, diagnostic and debugging utilities"; Types: full custom;')
 
154
;
117
155
; ]]]
118
156
; [[[end]]]
119
157
 
120
 
 
121
158
[Dirs]
122
159
Name: "{userappdata}\bazaar\2.0"
123
160
Name: "{app}\plugins"; Flags: uninsalwaysuninstall
127
164
Name: "{group}\Documentation index"; Filename: "{app}\doc\index.html"; WorkingDir: "{app}\doc";
128
165
Name: "{group}\Bazaar Home Page"; Filename: "{app}\bazaar.url"; Comment: "http://www.bazaar-vcs.org";
129
166
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";
130
 
Name: "{group}\Uninstall Bazaar"; Filename: "{uninstallexe}"; IconFileName: "{sys}\shell32.dll"; IconIndex: 101; Comment: "Remove Bzr completely";
 
167
; NOTE: Intent is to change the log file location - the line below will need to change to reflect that.
 
168
Name: "{group}\Open Bzr log file"; Filename: "notepad.exe"; Parameters: "{userdocs}\.bzr.log"; Comment: "Launch notepad to view the bzr log file";
 
169
 
 
170
; [[[cog
 
171
; if "TBZR" in os.environ:
 
172
;     cog.outl(r'Name: "{group}\TortoiseBZR documentation"; Filename: "{app}\doc\tbzr\index.html"; Comment: "Launch TortoiseBZR documentation";')
 
173
; ]]]
 
174
; [[[end]]]
 
175
; No Uninstall here - Control Panel will do
131
176
 
132
177
 
133
178
[Tasks]
134
 
Name: Path; Description: "Add {app} directory to PATH environment variable";
 
179
Name: Path; Description: "Add {app} directory to PATH environment variable"
135
180
Name: Shell; Description: "Add Bzr context menu to shell"; Flags: unchecked
 
181
; [[[cog
 
182
; if "TBZR" in os.environ:
 
183
;     cog.outl('Name: TBZRReadme; Description: "View the TortoiseBZR Readme"; Components: tortoise')
 
184
; ]]]
 
185
; [[[end]]]
136
186
 
137
187
 
138
188
[Registry]
139
189
Root: HKLM; Subkey: "SOFTWARE\Bazaar"; Flags: noerror uninsdeletekey
140
190
Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "InstallPath"; ValueType: string; ValueData: "{app}"; Flags: noerror
141
 
Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "BzrlibPath"; ValueType: string; ValueData: "{app}\lib\library.zip\bzrlib"; Flags: noerror
142
 
Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "PluginsPath"; ValueType: string; ValueData: "{app}\plugins"; Flags: noerror
143
 
Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "PythonPath"; ValueType: string; ValueData: "{app}\lib\library.zip"; Flags: noerror
 
191
; Don't write stuff that can be implied
 
192
;Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "BzrlibPath"; ValueType: string; ValueData: "{app}\lib\library.zip\bzrlib"; Flags: noerror
 
193
;Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "PluginsPath"; ValueType: string; ValueData: "{app}\plugins"; Flags: noerror
 
194
;Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "PythonPath"; ValueType: string; ValueData: "{app}\lib\library.zip"; Flags: noerror
144
195
; [[[cog cog.outl('Root: HKLM; Subkey: "SOFTWARE\Bazaar"; ValueName: "Version"; ValueType: string; ValueData: "%s"; Flags: noerror' % VERSION) ]]]
145
196
; [[[end]]]
146
197
 
147
198
 
148
199
[Run]
149
200
Filename: "{app}\bzr_postinstall.exe"; Parameters: "--start-bzr"; Flags: skipifdoesntexist runhidden;
150
 
; [[[cog
151
 
; import os
152
 
; if os.path.isfile('win32_bzr.exe/lib/win32ui.pyd'):   # pywin32 mfc wrapper
153
 
;     cog.outl('Filename: "{app}\bzr_postinstall.exe"; '
154
 
;              'Parameters: "--check-mfc71"; '
155
 
;              'Flags: skipifdoesntexist skipifsilent runhidden;')
156
 
; ]]]
157
 
; [[[end]]]
158
201
Filename: "{app}\bzr_postinstall.exe"; Parameters: "--add-path"; Tasks: Path; Flags: skipifdoesntexist skipifsilent runhidden;
159
202
Filename: "{app}\bzr_postinstall.exe"; Parameters: "--add-shell-menu"; Tasks: Shell; Flags: skipifdoesntexist skipifsilent runhidden;
 
203
; [[[cog
 
204
; if "TBZR" in os.environ:
 
205
;     cog.outl('Filename: "regsvr32.exe"; Parameters: "/s tbzr.dll"; WorkingDir: "{app}"; Components: tortoise; Description: "Registering Tortoise"; StatusMsg: "Registering Tortoise"')
 
206
;     cog.outl(r'Filename: "{app}\doc\tbzr\index.html"; Tasks: TBZRReadme; Flags: shellexec')
 
207
; ]]]
 
208
; [[[end]]]
160
209
 
161
210
 
162
211
[UninstallRun]
163
 
Filename: "{app}\bzr_postinstall.exe"; Parameters: "--delete-path --delete-shell-menu --silent"; Flags: skipifdoesntexist runhidden; 
164
 
 
165
 
 
166
 
[UninstallDelete]
167
 
Type: filesandordirs; Name: "{app}\plugins\*"
 
212
; [[[cog
 
213
; if "TBZR" in os.environ:
 
214
;     cog.outl('Filename: "regsvr32.exe"; Parameters: "/u /s tbzr.dll"; WorkingDir: "{app}"; Components: tortoise; StatusMsg: "Unregistering Tortoise"; Flags: skipifdoesntexist')
 
215
; ]]]
 
216
; [[[end]]]
 
217
 
 
218
[Code]
 
219
const
 
220
  SHCNF_IDLIST = $0000;
 
221
  SHCNE_ASSOCCHANGED = $08000000;
 
222
  WM_QUIT = 18;
 
223
 
 
224
procedure SHChangeNotify(wEventId, uFlags, dwItem1, dwItem2: Integer);
 
225
 external 'SHChangeNotify@shell32.dll stdcall';
 
226
 
 
227
procedure ShutdownTBZR;
 
228
var
 
229
    hwnd: HWND;
 
230
begin
 
231
// [[[cog
 
232
// if "TBZR" not in os.environ:
 
233
//     cog.outl('        Exit;  // No TSVN set - exit this procedure.')
 
234
// ]]]
 
235
// [[[end]]]
 
236
    // ask the cache process to shut-down.
 
237
    hwnd := FindWindowByClassName('TBZRCache_Taskbar');
 
238
    if hwnd <> 0 then
 
239
        PostMessage(hwnd, WM_QUIT, 1, 0);
 
240
end;
 
241
 
 
242
procedure CurStepChanged(CurStep: TSetupStep);
 
243
var
 
244
    S, tovmsi, fqtovmsi, params: String;
 
245
    ErrorCode: Integer;
 
246
begin
 
247
    if CurStep=ssInstall then begin
 
248
        ShutdownTBZR;
 
249
    end;
 
250
 
 
251
    if CurStep=ssPostInstall then begin
 
252
        // a couple of post-install tasks
 
253
        if IsComponentSelected('tortoise') then begin
 
254
            // Need to execute:
 
255
            // msiexec /i TortoiseOverlays-1.X.X.XXXX-win32.msi /qn /norestart
 
256
// [[[cog
 
257
// if "TBZR" in os.environ:
 
258
//     import os
 
259
//     cog.outl("tovmsi := '%s';" % os.path.basename(os.environ["TORTOISE_OVERLAYS_MSI_WIN32"]))
 
260
// else:
 
261
//     cog.outl("tovmsi := '';")
 
262
// ]]]
 
263
// [[[end]]]
 
264
            ExtractTemporaryFile(tovmsi);
 
265
            fqtovmsi := AddBackslash(ExpandConstant('{tmp}')) + tovmsi;
 
266
            params := '/i "' + fqtovmsi + '" /qn /norestart';
 
267
            if not ShellExec('', 'msiexec.exe', params, '', SW_HIDE,
 
268
                             ewWaitUntilTerminated, ErrorCode) then
 
269
                MsgBox('Failed to install TortoiseOverlays: ' + SysErrorMessage(ErrorCode),
 
270
                        mbInformation, MB_OK);
 
271
            // Ideally we could be bzr_postinstall.exe this way too, but
 
272
            // its needed at uninstall time.
 
273
        end;
 
274
        // cause explorer to re-fetch handlers.
 
275
        SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
 
276
    end;
 
277
end;
 
278
 
 
279
 
 
280
function InitializeUninstall(): Boolean; 
 
281
begin
 
282
    ShutdownTBZR;
 
283
    result := True;
 
284
end;