public static IEnumerable<string> Update(Repo[] repos, Ref[] allNewRefs) { Dictionary<Repo, Ref[]> updates = new Dictionary<Repo, Ref[]>(); var oldRefs = repos.SelectMany(r => r.Refs).ToArray(); foreach (var repo in repos) { var newRefs = allNewRefs.Where(r => r.Alias == repo.Alias).ToArray(); updates[repo] = newRefs; foreach (var r in newRefs) { /* determine what happened */ var existingRef = repo.Refs.FirstOrDefault(q => q.Name == r.Name); if (existingRef != null && existingRef.Sha == r.Sha) continue; yield return CharacterizeChange(existingRef, r, oldRefs); } foreach (var q in repo.Refs) if (!newRefs.Any(r => r.Name == q.Name)) yield return CharacterizeChange(q, null, oldRefs); } foreach (var repo in repos) repo.Refs = updates[repo]; }