public override void Init() { Authenticate(); if (!IsGitWorkingTree()) { // Init git in current directory InitGitOnCurrentDirectory(); } IList<GithubRepository> repositories = GetRepositories(); if (!string.IsNullOrEmpty(RepositoryFullName)) { LinkedRepository = repositories.FirstOrDefault(r => r.FullName.Equals(RepositoryFullName, StringComparison.InvariantCultureIgnoreCase)); } else { var remoteUris = Git.GetRemoteUris(); if (remoteUris.Count == 1) { LinkedRepository = repositories.FirstOrDefault(r => RepositoryMatchUri(r, remoteUris.First())); } else if (remoteUris.Count > 0) { // filter repositories to reduce prompt options repositories = repositories.Where(r => remoteUris.Any(u => RepositoryMatchUri(r, u))).ToList(); } } if (LinkedRepository == null) { Collection<ChoiceDescription> choices = new Collection<ChoiceDescription>(repositories.Select(item => new ChoiceDescription(item.FullName)).ToList<ChoiceDescription>()); var choice = ((PSCmdlet)PSCmdlet).Host.UI.PromptForChoice( "Choose a repository", "", choices, 0 ); LinkedRepository = repositories.FirstOrDefault(r => r.FullName.Equals(choices[choice].Label)); } }
private bool RepositoryMatchUri(GithubRepository githubRepository, string remoteUri) { string cleanUri; try { UriBuilder uri = new UriBuilder(remoteUri) {UserName = null, Password = null}; cleanUri = uri.ToString(); } catch { // Fail gracefully to handle ssh scenario cleanUri = remoteUri; } return new UriBuilder(githubRepository.CloneUrl).ToString().Equals(cleanUri, StringComparison.InvariantCultureIgnoreCase) || new UriBuilder(githubRepository.HtmlUrl).ToString().Equals(cleanUri, StringComparison.InvariantCultureIgnoreCase) || new UriBuilder(githubRepository.GitUrl).ToString().Equals(cleanUri, StringComparison.InvariantCultureIgnoreCase) || githubRepository.SshUrl.Equals(cleanUri, StringComparison.InvariantCultureIgnoreCase); }