@@ -32,8 +32,11 @@ public async Task<string> ApplyReleases(UpdateInfo updateInfo, bool silentInstal
32
32
progress = progress ?? ( _ => { } ) ;
33
33
34
34
progress ( 0 ) ;
35
- var release = await createFullPackagesFromDeltas ( updateInfo . ReleasesToApply , updateInfo . CurrentlyInstalledVersion ) ;
36
- progress ( 10 ) ;
35
+
36
+ // Progress range: 00 -> 40
37
+ var release = await createFullPackagesFromDeltas ( updateInfo . ReleasesToApply , updateInfo . CurrentlyInstalledVersion , new ApplyReleasesProgress ( updateInfo . ReleasesToApply . Count , x => progress ( CalculateProgress ( x , 0 , 40 ) ) ) ) ;
38
+
39
+ progress ( 40 ) ;
37
40
38
41
if ( release == null ) {
39
42
if ( attemptingFullInstall ) {
@@ -45,35 +48,46 @@ public async Task<string> ApplyReleases(UpdateInfo updateInfo, bool silentInstal
45
48
return getDirectoryForRelease ( updateInfo . CurrentlyInstalledVersion . Version ) . FullName ;
46
49
}
47
50
48
- var ret = await this . ErrorIfThrows ( ( ) => installPackageToAppDir ( updateInfo , release ) ,
51
+ // Progress range: 40 -> 80
52
+ var ret = await this . ErrorIfThrows ( ( ) => installPackageToAppDir ( updateInfo , release , x => progress ( CalculateProgress ( x , 40 , 80 ) ) ) ,
49
53
"Failed to install package to app dir" ) ;
50
- progress ( 30 ) ;
54
+
55
+ progress ( 80 ) ;
51
56
52
57
var currentReleases = await this . ErrorIfThrows ( ( ) => updateLocalReleasesFile ( ) ,
53
58
"Failed to update local releases file" ) ;
54
- progress ( 50 ) ;
59
+
60
+ progress ( 85 ) ;
55
61
56
62
var newVersion = currentReleases . MaxBy ( x => x . Version ) . First ( ) . Version ;
57
63
executeSelfUpdate ( newVersion ) ;
58
64
65
+ progress ( 90 ) ;
66
+
59
67
await this . ErrorIfThrows ( ( ) => invokePostInstall ( newVersion , attemptingFullInstall , false , silentInstall ) ,
60
68
"Failed to invoke post-install" ) ;
61
- progress ( 75 ) ;
69
+
70
+ progress ( 95 ) ;
62
71
63
72
this . Log ( ) . Info ( "Starting fixPinnedExecutables" ) ;
73
+
64
74
this . ErrorIfThrows ( ( ) => fixPinnedExecutables ( updateInfo . FutureReleaseEntry . Version ) ) ;
65
75
76
+ progress ( 96 ) ;
77
+
66
78
this . Log ( ) . Info ( "Fixing up tray icons" ) ;
67
79
68
80
var trayFixer = new TrayStateChanger ( ) ;
69
81
var appDir = new DirectoryInfo ( Utility . AppDirForRelease ( rootAppDirectory , updateInfo . FutureReleaseEntry ) ) ;
70
82
var allExes = appDir . GetFiles ( "*.exe" ) . Select ( x => x . Name ) . ToList ( ) ;
71
83
72
84
this . ErrorIfThrows ( ( ) => trayFixer . RemoveDeadEntries ( allExes , rootAppDirectory , updateInfo . FutureReleaseEntry . Version . ToString ( ) ) ) ;
73
- progress ( 80 ) ;
85
+
86
+ progress ( 97 ) ;
74
87
75
88
unshimOurselves ( ) ;
76
- progress ( 85 ) ;
89
+
90
+ progress ( 98 ) ;
77
91
78
92
try {
79
93
var currentVersion = updateInfo . CurrentlyInstalledVersion != null ?
@@ -83,6 +97,7 @@ await this.ErrorIfThrows(() => invokePostInstall(newVersion, attemptingFullInsta
83
97
} catch ( Exception ex ) {
84
98
this . Log ( ) . WarnException ( "Failed to clean dead versions, continuing anyways" , ex ) ;
85
99
}
100
+
86
101
progress ( 100 ) ;
87
102
88
103
return ret ;
@@ -280,7 +295,7 @@ public void RemoveShortcutsForExecutable(string exeName, ShortcutLocation locati
280
295
fixPinnedExecutables ( zf . Version ) ;
281
296
}
282
297
283
- Task < string > installPackageToAppDir ( UpdateInfo updateInfo , ReleaseEntry release )
298
+ Task < string > installPackageToAppDir ( UpdateInfo updateInfo , ReleaseEntry release , Action < int > progressCallback )
284
299
{
285
300
return Task . Run ( async ( ) => {
286
301
var target = getDirectoryForRelease ( release . Version ) ;
@@ -297,16 +312,19 @@ Task<string> installPackageToAppDir(UpdateInfo updateInfo, ReleaseEntry release)
297
312
await ReleasePackage . ExtractZipForInstall (
298
313
Path . Combine ( updateInfo . PackageDirectory , release . Filename ) ,
299
314
target . FullName ,
300
- rootAppDirectory ) ;
315
+ rootAppDirectory ,
316
+ progressCallback ) ;
301
317
302
318
return target . FullName ;
303
319
} ) ;
304
320
}
305
321
306
- async Task < ReleaseEntry > createFullPackagesFromDeltas ( IEnumerable < ReleaseEntry > releasesToApply , ReleaseEntry currentVersion )
322
+ async Task < ReleaseEntry > createFullPackagesFromDeltas ( IEnumerable < ReleaseEntry > releasesToApply , ReleaseEntry currentVersion , ApplyReleasesProgress progress )
307
323
{
308
324
Contract . Requires ( releasesToApply != null ) ;
309
325
326
+ progress = progress ?? new ApplyReleasesProgress ( releasesToApply . Count ( ) , x => { } ) ;
327
+
310
328
// If there are no remote releases at all, bail
311
329
if ( ! releasesToApply . Any ( ) ) {
312
330
return null ;
@@ -321,6 +339,16 @@ async Task<ReleaseEntry> createFullPackagesFromDeltas(IEnumerable<ReleaseEntry>
321
339
throw new Exception ( "Cannot apply combinations of delta and full packages" ) ;
322
340
}
323
341
342
+ // Progress calculation is "complex" here. We need to known how many releases, and then give each release a similar amount of
343
+ // progress. For example, when applying 5 releases:
344
+ //
345
+ // release 1: 00 => 20
346
+ // release 2: 20 => 40
347
+ // release 3: 40 => 60
348
+ // release 4: 60 => 80
349
+ // release 5: 80 => 100
350
+ //
351
+
324
352
// Smash together our base full package and the nearest delta
325
353
var ret = await Task . Run ( ( ) => {
326
354
var basePkg = new ReleasePackage ( Path . Combine ( rootAppDirectory , "packages" , currentVersion . Filename ) ) ;
@@ -329,9 +357,12 @@ async Task<ReleaseEntry> createFullPackagesFromDeltas(IEnumerable<ReleaseEntry>
329
357
var deltaBuilder = new DeltaPackageBuilder ( Directory . GetParent ( this . rootAppDirectory ) . FullName ) ;
330
358
331
359
return deltaBuilder . ApplyDeltaPackage ( basePkg , deltaPkg ,
332
- Regex . Replace ( deltaPkg . InputPackageFile , @"-delta.nupkg$" , ".nupkg" , RegexOptions . IgnoreCase | RegexOptions . CultureInvariant ) ) ;
360
+ Regex . Replace ( deltaPkg . InputPackageFile , @"-delta.nupkg$" , ".nupkg" , RegexOptions . IgnoreCase | RegexOptions . CultureInvariant ) ,
361
+ x => progress . ReportReleaseProgress ( x ) ) ;
333
362
} ) ;
334
363
364
+ progress . FinishRelease ( ) ;
365
+
335
366
if ( releasesToApply . Count ( ) == 1 ) {
336
367
return ReleaseEntry . GenerateFromFile ( ret . InputPackageFile ) ;
337
368
}
@@ -340,7 +371,7 @@ async Task<ReleaseEntry> createFullPackagesFromDeltas(IEnumerable<ReleaseEntry>
340
371
var entry = ReleaseEntry . GenerateFromFile ( fi . OpenRead ( ) , fi . Name ) ;
341
372
342
373
// Recursively combine the rest of them
343
- return await createFullPackagesFromDeltas ( releasesToApply . Skip ( 1 ) , entry ) ;
374
+ return await createFullPackagesFromDeltas ( releasesToApply . Skip ( 1 ) , entry , progress ) ;
344
375
}
345
376
346
377
void executeSelfUpdate ( SemanticVersion currentVersion )
0 commit comments