public override async Task <int> ExecuteAsync() { try { IRemote remote = RemoteFactory.GetBarOnlyRemote(_options, Logger); IEnumerable <Subscription> subscriptions = await _options.FilterSubscriptions(remote); if (!subscriptions.Any()) { Console.WriteLine("No subscriptions found matching the specified criteria."); return(Constants.ErrorCode); } // Based on the current output schema, sort by source repo, target repo, target branch, etc. // Concat the input strings as a simple sorting mechanism. foreach (var subscription in subscriptions.OrderBy(subscription => $"{subscription.SourceRepository}{subscription.Channel}{subscription.TargetRepository}{subscription.TargetBranch}")) { Console.WriteLine($"{subscription.SourceRepository} ({subscription.Channel.Name}) ==> '{subscription.TargetRepository}' ('{subscription.TargetBranch}')"); Console.WriteLine($" - Id: {subscription.Id}"); Console.WriteLine($" - Update Frequency: {subscription.Policy.UpdateFrequency}"); Console.WriteLine($" - Enabled: {subscription.Enabled}"); Console.WriteLine($" - Batchable: {subscription.Policy.Batchable}"); // If batchable, the merge policies come from the repository IEnumerable <MergePolicy> mergePolicies = subscription.Policy.MergePolicies; if (subscription.Policy.Batchable == true) { mergePolicies = await remote.GetRepositoryMergePoliciesAsync(subscription.TargetRepository, subscription.TargetBranch); } Console.Write(UxHelpers.GetMergePoliciesDescription(mergePolicies, " ")); // Currently the API only returns the last applied build for requests to specific subscriptions. // This will be fixed, but for now, don't print the last applied build otherwise. if (subscription.LastAppliedBuild != null) { Console.WriteLine($" - Last Build: {subscription.LastAppliedBuild.AzureDevOpsBuildNumber} ({subscription.LastAppliedBuild.Commit})"); } } return(Constants.SuccessCode); } catch (AuthenticationException e) { Console.WriteLine(e.Message); return(Constants.ErrorCode); } catch (Exception e) { Logger.LogError(e, "Error: Failed to retrieve subscriptions"); return(Constants.ErrorCode); } }
public override async Task <int> ExecuteAsync() { try { IRemote remote = RemoteFactory.GetBarOnlyRemote(_options, Logger); IEnumerable <RepositoryBranch> allRepositories = await remote.GetRepositoriesAsync(); IEnumerable <RepositoryBranch> filteredRepositories = allRepositories.Where(repositories => (string.IsNullOrEmpty(_options.Repo) || repositories.Repository.Contains(_options.Repo, StringComparison.OrdinalIgnoreCase)) && (string.IsNullOrEmpty(_options.Branch) || repositories.Branch.Contains(_options.Branch, StringComparison.OrdinalIgnoreCase))); // List only those repos and branches that are targeted by a batchable subscription (active) unless the user // passes --all. if (!_options.All) { HashSet <string> batchableTargets = (await remote.GetSubscriptionsAsync()) .Where(s => s.Policy.Batchable) .Select <Subscription, string>(s => $"{s.TargetRepository}{s.TargetBranch}") .ToHashSet(StringComparer.OrdinalIgnoreCase); var targetedRepositories = filteredRepositories.Where(r => batchableTargets.Contains($"{r.Repository}{r.Branch}")); // If the number of repositories we're about to print is less than what we could have printed, then print a // message. int difference = filteredRepositories.Count() - targetedRepositories.Count(); if (difference != 0) { Console.WriteLine($"Filtered {difference} policies for branches not targeted by an active batchable subscription. To include, pass --all.{Environment.NewLine}"); } filteredRepositories = targetedRepositories; } foreach (var repository in filteredRepositories) { Console.WriteLine($"{repository.Repository} @ {repository.Branch}"); Console.Write(UxHelpers.GetMergePoliciesDescription(repository.MergePolicies)); } return(Constants.SuccessCode); } catch (AuthenticationException e) { Console.WriteLine(e.Message); return(Constants.ErrorCode); } catch (Exception e) { Logger.LogError(e, "Error: Failed to retrieve repositories"); return(Constants.ErrorCode); } }