public void T5B_Detects_Repository_Fetch() { Monitor.Expect(() => { _cloneB.Fetch(); }, changes => changes >= 1, deletes => deletes == 0); }
private void FetchNext(object timerState) { var hasAny = RepositoryInformationAggregator.Repositories?.Any() ?? false; if (!hasAny) { return; } // sort the repository list alphabetically each time because ... // 1. it's most comprehensive for the user // 2. makes sure that no repository is jumped over because the list // of repositories is constantly changed and not sorted in any way in memory. // So we cannot guarantuee that each repository is fetched on each iteration if we do not sort. var repositories = RepositoryInformationAggregator.Repositories .OrderBy(r => r.Name) .ToList(); // temporarily disable the timer to prevent parallel fetch executions UpdateBehavior(AutoFetchMode.Off); _lastFetchRepository++; if (repositories.Count <= _lastFetchRepository) { _lastFetchRepository = 0; } var repositoryView = repositories[_lastFetchRepository]; Console.WriteLine($"Auto-fetching {repositoryView.Name} (index {_lastFetchRepository} of {repositories.Count})"); repositoryView.IsSynchronizing = true; try { RepositoryWriter.Fetch(repositoryView.Repository); } catch { // nothing to see here } finally { // re-enable the timer to get to the next fetch UpdateBehavior(); repositoryView.IsSynchronizing = false; } }