예제 #1
0
        public async Task <UpdateInfo> CheckForUpdateAsync(UpdateCheckArgs args = null)
        {
            var assetName       = args?.AssetName ?? config.AssetName;
            var allowPreRelease = args != null && args.AllowPreRelease;
            var ignoreTags      = args?.IgnoreTags ?? new string[] { };
            var uri             = args?.Uri ?? config.UpdateUrl;

            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json"));
            client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(assetName, config.Version));

            // Get the latest releases from GitHub
            using (var response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead, cancellationToken))
            {
                var content = await response.Content.ReadAsStringAsync();

                response.EnsureSuccessStatusCode();

                var results = JsonSerializer.Deserialize <List <GitHubRelease> >(content);

                var latest = results.FirstOrDefault(x => (allowPreRelease || !x.prerelease) &&
                                                    !ignoreTags.Any(tag => tag.Equals(x.tag_name, StringComparison.OrdinalIgnoreCase)));
                if (latest == null)
                {
                    Trace.TraceWarning("Couldn't find a release from the list returned by GitHub");
                    return(null);
                }

                var asset = latest.assets.FirstOrDefault(x => x.name.Equals(assetName, StringComparison.OrdinalIgnoreCase));
                if (asset == null)
                {
                    Trace.TraceWarning($"Couldn't find '${assetName}' in the release assets for " + latest.name);
                    return(null);
                }

                var info = new UpdateInfo
                {
                    Version        = new SemanticVersion(latest.tag_name),
                    Uri            = asset.browser_download_url.ToString(),
                    IsPreRelease   = latest.prerelease,
                    Name           = asset.name,
                    CurrentVersion = new SemanticVersion(config.Version)
                };

                return(info);
            }
        }
예제 #2
0
        /// <summary>
        /// Downloads and launches any available update, otherwise returns <c>false</c>. You should exit immediately
        /// if <c>true</c> is returned, as the update process will be waiting for processes to exit and release locks.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        public async Task <bool> UpdateAsync(UpdateCheckArgs args = null)
        {
            // Check for available update
            var update = await CheckForUpdateAsync(args);

            if (update != null && update.IsUpgrade())
            {
                // Download the update side by side
                var file = await DownloadAsync(update, config.Progress, cancellationToken);

                // Launch the downloaded update
                Launch(new LaunchArgs(file.Filename));

                return(true);
            }

            return(false);
        }
예제 #3
0
 public static UpdateInfo CheckForUpdate(this ApplicationUpdater updater, UpdateCheckArgs args = null)
 {
     return(updater.CheckForUpdateAsync(args).GetAwaiter().GetResult());
 }
예제 #4
0
 public static bool EnsureUpdated(this ApplicationUpdater updater, UpdateCheckArgs args = null, bool register = true)
 {
     return(EnsureUpdatedAsync(updater, args, register).GetAwaiter().GetResult());
 }
예제 #5
0
        public static async Task <bool> EnsureUpdatedAsync(this ApplicationUpdater updater, UpdateCheckArgs args = null, bool register = true)
        {
            // Ensure the application is registered if necessary
            if (register)
            {
                await updater.InstallAsync().ConfigureAwait(false);
            }

            // Check for
            if (await updater.UpdateAsync(args).ConfigureAwait(false))
            {
                return(true);
            }
            return(await updater.UpdateAsync(args).ConfigureAwait(false));
        }