GitHub update checker code refactoring

This commit is contained in:
Jaex 2016-06-20 03:24:52 +03:00
parent 1b9a39b42b
commit aa8334f439

View file

@ -41,13 +41,7 @@ public class GitHubUpdateChecker : UpdateChecker
private const string APIURL = "https://api.github.com";
private string ReleasesURL
{
get
{
return string.Format("{0}/repos/{1}/{2}/releases", APIURL, Owner, Repo);
}
}
private string ReleasesURL => $"{APIURL}/repos/{Owner}/{Repo}/releases";
public GitHubUpdateChecker(string owner, string repo)
{
@ -59,59 +53,12 @@ public override void CheckUpdate()
{
try
{
List<GitHubRelease> releases = GetReleases();
GitHubRelease latestRelease = GetLatestRelease(IncludePreRelease);
if (releases != null && releases.Count > 0)
if (UpdateReleaseInfo(latestRelease, IsPortable, IsPortable ? true : false))
{
GitHubRelease latestRelease;
if (IncludePreRelease)
{
latestRelease = releases[0];
}
else
{
latestRelease = releases.FirstOrDefault(x => !x.prerelease);
}
if (latestRelease != null && !string.IsNullOrEmpty(latestRelease.tag_name) && latestRelease.tag_name.Length > 1 && latestRelease.tag_name[0] == 'v')
{
LatestVersion = new Version(latestRelease.tag_name.Substring(1));
if (latestRelease.assets != null && latestRelease.assets.Count > 0)
{
string extension;
if (IsPortable)
{
extension = "portable.zip";
}
else
{
extension = ".exe";
}
foreach (GitHubAsset asset in latestRelease.assets)
{
if (asset != null && !string.IsNullOrEmpty(asset.name) && asset.name.EndsWith(extension, StringComparison.InvariantCultureIgnoreCase))
{
Filename = asset.name;
if (IsPortable)
{
DownloadURL = asset.browser_download_url;
}
else
{
DownloadURL = asset.url;
}
RefreshStatus();
return;
}
}
}
}
RefreshStatus();
return;
}
}
catch (Exception e)
@ -122,13 +69,20 @@ public override void CheckUpdate()
Status = UpdateStatus.UpdateCheckFailed;
}
public string GetLatestDownloadURL()
public string GetLatestDownloadURL(bool includePreRelease, bool isPortable, bool isBrowserDownloadURL)
{
List<GitHubRelease> releases = GetReleases();
if (releases != null && releases.Count > 0)
try
{
return GetDownloadURL(releases[0]);
GitHubRelease latestRelease = GetLatestRelease(includePreRelease);
if (UpdateReleaseInfo(latestRelease, isPortable, isBrowserDownloadURL))
{
return DownloadURL;
}
}
catch (Exception e)
{
DebugHelper.WriteException(e);
}
return null;
@ -140,27 +94,12 @@ public string GetDownloadCounts()
foreach (GitHubRelease release in GetReleases().Where(x => x.assets != null && x.assets.Count > 0))
{
sb.AppendFormat("{0} ({1}): {2}\r\n", release.name, DateTime.Parse(release.published_at), release.assets.Sum(x => x.download_count));
sb.AppendFormat("{0} ({1}): {2}{3}", release.name, DateTime.Parse(release.published_at), release.assets.Sum(x => x.download_count), Environment.NewLine);
}
return sb.ToString().Trim();
}
private string GetDownloadURL(GitHubRelease release)
{
if (release.assets != null && release.assets.Count > 0)
{
GitHubAsset asset = release.assets[0];
if (asset != null && !string.IsNullOrEmpty(asset.name))
{
return string.Format("https://github.com/{0}/{1}/releases/download/{2}/{3}", Owner, Repo, release.tag_name, asset.name);
}
}
return null;
}
private List<GitHubRelease> GetReleases()
{
using (WebClient wc = new WebClient())
@ -179,6 +118,70 @@ private List<GitHubRelease> GetReleases()
return null;
}
private GitHubRelease GetLatestRelease(bool includePreRelease)
{
GitHubRelease latestRelease = null;
List<GitHubRelease> releases = GetReleases();
if (releases != null && releases.Count > 0)
{
if (includePreRelease)
{
latestRelease = releases[0];
}
else
{
latestRelease = releases.FirstOrDefault(x => !x.prerelease);
}
}
return latestRelease;
}
public bool UpdateReleaseInfo(GitHubRelease release, bool isPortable, bool isBrowserDownloadURL)
{
if (release != null && !string.IsNullOrEmpty(release.tag_name) && release.tag_name.Length > 1 && release.tag_name[0] == 'v')
{
LatestVersion = new Version(release.tag_name.Substring(1));
if (release.assets != null && release.assets.Count > 0)
{
string endsWith;
if (isPortable)
{
endsWith = "portable.zip";
}
else
{
endsWith = ".exe";
}
foreach (GitHubAsset asset in release.assets)
{
if (asset != null && !string.IsNullOrEmpty(asset.name) && asset.name.EndsWith(endsWith, StringComparison.InvariantCultureIgnoreCase))
{
Filename = asset.name;
if (isBrowserDownloadURL)
{
DownloadURL = asset.browser_download_url;
}
else
{
DownloadURL = asset.url;
}
return true;
}
}
}
}
return false;
}
}
public class GitHubRelease