diff --git a/CHANGELOG.md b/CHANGELOG.md index c3a1c4042..9ad501620 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ All notable changes to this project will be documented in this file. - [GUI] Use better console hiding API (#4051 by: HebaruSan) - [Core] Trigger progress updates for frozen downloads (#4052 by: HebaruSan) - [GUI] Fix NRE on trying to update all when there's nothing to update (#4054 by: HebaruSan) +- [Core] Tolerate null repo URLs (#4077 by: HebaruSan) ### Internal diff --git a/Core/Net/NetFileCache.cs b/Core/Net/NetFileCache.cs index 614fe1e04..98097b979 100644 --- a/Core/Net/NetFileCache.cs +++ b/Core/Net/NetFileCache.cs @@ -555,7 +555,7 @@ public static string CreateURLHash(Uri url) { using (SHA1 sha1 = SHA1.Create()) { - byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(url.ToString())); + byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(url?.ToString() ?? "")); return BitConverter.ToString(hash).Replace("-", "").Substring(0, 8); } diff --git a/Core/Repositories/Repository.cs b/Core/Repositories/Repository.cs index 8dd85c5f5..6e449599b 100644 --- a/Core/Repositories/Repository.cs +++ b/Core/Repositories/Repository.cs @@ -49,7 +49,7 @@ public bool Equals(Repository other) => other != null && uri == other.uri; public override int GetHashCode() - => uri.GetHashCode(); + => uri?.GetHashCode() ?? 0; public override string ToString() => string.Format("{0} ({1}, {2})", name, priority, uri); diff --git a/Core/Repositories/RepositoryDataManager.cs b/Core/Repositories/RepositoryDataManager.cs index 3b014e3ed..4e76e8363 100644 --- a/Core/Repositories/RepositoryDataManager.cs +++ b/Core/Repositories/RepositoryDataManager.cs @@ -91,7 +91,7 @@ public IEnumerable GetAllAvailableModules(IEnumerable repos, IProgress percentProgress) { // Look up the sizes of repos that have uncached files - var reposAndSizes = repos.Where(r => !repositoriesData.ContainsKey(r)) + var reposAndSizes = repos.Where(r => r.uri != null && !repositoriesData.ContainsKey(r)) .Select(r => new Tuple(r, GetRepoDataPath(r))) .Where(tuple => File.Exists(tuple.Item2)) .Select(tuple => new Tuple(tuple.Item1, @@ -140,13 +140,15 @@ public UpdateResult Update(Repository[] repos, // Check if any ETags have changed, quit if not user.RaiseProgress(Properties.Resources.NetRepoCheckingForUpdates, 0); - var toUpdate = repos.DefaultIfEmpty(new Repository("default", game.DefaultRepositoryURL)) + var toUpdate = repos.DefaultIfEmpty(new Repository($"{game.ShortName}-{Repository.default_ckan_repo_name}", + game.DefaultRepositoryURL)) .DistinctBy(r => r.uri) - .Where(r => r.uri.IsFile - || skipETags - || (!etags.TryGetValue(r.uri, out string etag) - || !File.Exists(GetRepoDataPath(r)) - || etag != Net.CurrentETag(r.uri))) + .Where(r => r.uri != null + && (r.uri.IsFile + || skipETags + || (!etags.TryGetValue(r.uri, out string etag) + || !File.Exists(GetRepoDataPath(r)) + || etag != Net.CurrentETag(r.uri)))) .ToArray(); if (toUpdate.Length < 1) { @@ -300,7 +302,7 @@ private IEnumerable GetRepoDatas(IEnumerable repos) new Dictionary(); private string GetRepoDataPath(Repository repo) - => GetRepoDataPath(repo, NetFileCache.CreateURLHash(repo.uri)); + => GetRepoDataPath(repo, NetFileCache.CreateURLHash(repo?.uri)); private string GetRepoDataPath(Repository repo, string hash) => Directory.EnumerateFiles(reposDir) diff --git a/GUI/Dialogs/SettingsDialog.cs b/GUI/Dialogs/SettingsDialog.cs index 5cadd1215..dc6dc74a2 100644 --- a/GUI/Dialogs/SettingsDialog.cs +++ b/GUI/Dialogs/SettingsDialog.cs @@ -134,7 +134,7 @@ private void RefreshReposListBox(bool saveChanges = true) .OrderBy(r => r.priority) .Select(r => new ListViewItem(new string[] { - r.name, r.uri.ToString(), + r.name, r.uri?.ToString() ?? "", }) { Tag = r,