diff --git a/src/GitHub.App/Services/RepositoryCloneService.cs b/src/GitHub.App/Services/RepositoryCloneService.cs index f8a6048bec..d4bccf029f 100644 --- a/src/GitHub.App/Services/RepositoryCloneService.cs +++ b/src/GitHub.App/Services/RepositoryCloneService.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Reactive.Linq; +using System.Threading; using System.Threading.Tasks; using GitHub.Api; using GitHub.Extensions; @@ -69,8 +70,8 @@ public async Task ReadViewerRepositories(HostAddress ad { var order = new RepositoryOrder { - Field = RepositoryOrderField.Name, - Direction = OrderDirection.Asc + Field = RepositoryOrderField.PushedAt, + Direction = OrderDirection.Desc }; var affiliation = new RepositoryAffiliation?[] @@ -94,14 +95,17 @@ public async Task ReadViewerRepositories(HostAddress ad .Select(viewer => new ViewerRepositoriesModel { Owner = viewer.Login, - Repositories = viewer.Repositories(null, null, null, null, null, null, null, order, affiliation, null) + Repositories = viewer.Repositories(null, null, null, null, affiliation, null, null, order, affiliation, null) .AllPages() .Select(repositorySelection).ToList(), + ContributedToRepositories = viewer.RepositoriesContributedTo(100, null, null, null, null, null, null, order, null) + .Nodes + .Select(repositorySelection).ToList(), Organizations = viewer.Organizations(null, null, null, null).AllPages().Select(org => new { org.Login, - Repositories = org.Repositories(null, null, null, null, null, null, null, order, null, null) - .AllPages() + Repositories = org.Repositories(100, null, null, null, null, null, null, order, null, null) + .Nodes .Select(repositorySelection).ToList() }).ToDictionary(x => x.Login, x => (IReadOnlyList)x.Repositories), }).Compile(); diff --git a/src/GitHub.App/ViewModels/Dialog/Clone/RepositorySelectViewModel.cs b/src/GitHub.App/ViewModels/Dialog/Clone/RepositorySelectViewModel.cs index 487cbbfa70..6a9034bc8a 100644 --- a/src/GitHub.App/ViewModels/Dialog/Clone/RepositorySelectViewModel.cs +++ b/src/GitHub.App/ViewModels/Dialog/Clone/RepositorySelectViewModel.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Composition; +using System.Globalization; using System.Linq; using System.Reactive.Linq; using System.Threading.Tasks; @@ -118,10 +119,16 @@ public async Task Activate() .Where(r => r.Owner != results.Owner) .OrderBy(r => r.Owner) .Select(x => new RepositoryItemViewModel(x, "Collaborator repositories")); + var repositoriesContributedTo = results.ContributedToRepositories + .Select(x => new RepositoryItemViewModel(x, "Contributed to repositories")); var orgRepositories = results.Organizations .OrderBy(x => x.Key) - .SelectMany(x => x.Value.Select(y => new RepositoryItemViewModel(y, x.Key))); - Items = yourRepositories.Concat(collaboratorRepositories).Concat(orgRepositories).ToList(); + .SelectMany(x => x.Value.Select(y => new RepositoryItemViewModel(y, GroupName(x, 100)))); + Items = yourRepositories + .Concat(collaboratorRepositories) + .Concat(repositoriesContributedTo) + .Concat(orgRepositories) + .ToList(); log.Information("Read {Total} viewer repositories", Items.Count); ItemsView = CollectionViewSource.GetDefaultView(Items); ItemsView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(RepositoryItemViewModel.Group))); @@ -144,6 +151,17 @@ public async Task Activate() } } + static string GroupName(KeyValuePair> group, int max) + { + var name = group.Key; + if (group.Value.Count == max) + { + name += $" ({string.Format(CultureInfo.InvariantCulture, Resources.MostRecentlyPushed, max)})"; + } + + return name; + } + bool FilterItem(object obj) { if (obj is IRepositoryItemViewModel item && !string.IsNullOrWhiteSpace(Filter)) diff --git a/src/GitHub.Exports/Models/ViewerRepositoriesModel.cs b/src/GitHub.Exports/Models/ViewerRepositoriesModel.cs index b5a9d9659c..7987af54d1 100644 --- a/src/GitHub.Exports/Models/ViewerRepositoriesModel.cs +++ b/src/GitHub.Exports/Models/ViewerRepositoriesModel.cs @@ -7,6 +7,7 @@ public class ViewerRepositoriesModel { public string Owner { get; set; } public IReadOnlyList Repositories { get; set; } + public IReadOnlyList ContributedToRepositories { get; set; } public IDictionary> Organizations { get; set; } } } diff --git a/src/GitHub.Resources/Resources.Designer.cs b/src/GitHub.Resources/Resources.Designer.cs index 5d54d56f10..4b75172d7b 100644 --- a/src/GitHub.Resources/Resources.Designer.cs +++ b/src/GitHub.Resources/Resources.Designer.cs @@ -1026,6 +1026,15 @@ public static string months { } } + /// + /// Looks up a localized string similar to {0} most recently pushed. + /// + public static string MostRecentlyPushed { + get { + return ResourceManager.GetString("MostRecentlyPushed", resourceCulture); + } + } + /// /// Looks up a localized string similar to You must pull before you can push. /// diff --git a/src/GitHub.Resources/Resources.resx b/src/GitHub.Resources/Resources.resx index 42d50a315d..003b8be2e6 100644 --- a/src/GitHub.Resources/Resources.resx +++ b/src/GitHub.Resources/Resources.resx @@ -845,4 +845,7 @@ https://git-scm.com/download/win Couldn't find file corresponding to '{0}' in the repository. Please do a 'git fetch' or checkout the target pull request. + + {0} most recently pushed + \ No newline at end of file