Пример #1
0
        public async Task <bool> CreateBranchAsync(string url, string name, string sourceName)
        {
            var values = GitHubUrlExtractor.ExtractFromUrl(url);

            string username = values.Item1;
            string reponame = values.Item2;

            var branch = await _client.Repository.Branch.Get(username, reponame, sourceName);

            if (branch == null)
            {
                _log.LogError("Source branch not found");
                return(false);
            }

            var reference = await _client.Git.Reference.Create(username, reponame, new NewReference($"refs/heads/{name}", branch.Commit.Sha));

            if (reference == null)
            {
                _log.LogError("Branch not created");
                return(false);
            }

            return(true);
        }
Пример #2
0
        public async Task <long> GetIdAsync(string url)
        {
            if (_lookup.TryGetValue(url, out long value))
            {
                return(value);
            }

            var values = GitHubUrlExtractor.ExtractFromUrl(url);

            string username = values.Item1;
            string reponame = values.Item2;

            _log.LogInformation("Loading repo info : {0} / {1}", username, reponame);

            // Octokit.AuthorizationException: Bad credentials
            var repository = await _client.Repository.Get(username, reponame);

            if (repository == null)
            {
                throw new DevKnack.Common.Exceptions.NotFoundException("Repository not found", url);
            }

            _lookup.TryAdd(url, repository.Id);

            return(repository.Id);
        }
Пример #3
0
        public async Task CreatePullRequestAsync(string url, string name, string targetName)
        {
            var values = GitHubUrlExtractor.ExtractFromUrl(url);

            string username = values.Item1;
            string reponame = values.Item2;

            await _client.PullRequest.Create(username, reponame, new NewPullRequest("Gitscribe translation", name, targetName));
        }
Пример #4
0
        public async Task <IEnumerable <string> > GetBranchNamesAsync(string url)
        {
            var values = GitHubUrlExtractor.ExtractFromUrl(url);

            string username = values.Item1;
            string reponame = values.Item2;

            var branches = await _client.Repository.Branch.GetAll(username, reponame);

            var names = branches.Select(b => b.Name);

            // Put master & develop at the top of the branch list
            return(names.OrderByDescending(n => n == "master" || n == "develop"));
        }
Пример #5
0
        public async Task <IEnumerable <string> > SearchAsync(string url, string extension)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException(nameof(url));
            }
            if (string.IsNullOrEmpty(extension))
            {
                throw new ArgumentNullException(nameof(extension));
            }

            string branchName = url.ExtractBranchName();

            url = url.StripBranchName(branchName);

            if (!extension.StartsWith('.'))
            {
                extension = $".{extension}";
            }

            var values = GitHubUrlExtractor.ExtractFromUrl(url);

            string username = values.Item1;
            string reponame = values.Item2;

            string search = $"extension:{extension}";
            var    req    = new SearchCodeRequest(search, username, reponame);

            if (string.IsNullOrEmpty(branchName))
            {
                var results = await _client.Search.SearchCode(req);

                // Github is searching the contents of the files too
                // Github seems generous with the match, so do a secondary filter
                var filteredResults = results.Items.Select(i => i.Path);

                return(filteredResults);
            }
            else
            {
                // Search in a specific branch
                var tree = await _client.Git.Tree.GetRecursive(username, reponame, branchName);

                var filePaths = tree.Tree.Select(item => item.Path).Where(path => Path.GetExtension(path) == extension);

                return(filePaths);
            }
        }
Пример #6
0
        public async Task <long> GetIdAsync(string url)
        {
            if (_lookup.TryGetValue(url, out long value))
            {
                return(value);
            }

            var values = GitHubUrlExtractor.ExtractFromUrl(url);

            string username = values.Item1;
            string reponame = values.Item2;

            var repository = await _client.Repository.Get(username, reponame);

            if (repository == null)
            {
                throw new DevKnack.Common.Exceptions.NotFoundException("Repository not found", url);
            }

            _lookup.TryAdd(url, repository.Id);

            return(repository.Id);
        }
Пример #7
0
        public async Task <IEnumerable <string> > SearchAsync(string url, string query)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException(nameof(url));
            }
            if (string.IsNullOrEmpty(query))
            {
                throw new ArgumentNullException(nameof(query));
            }

            string branchName = url.ExtractBranchName();

            url = url.StripBranchName(branchName);

            var values = GitHubUrlExtractor.ExtractFromUrl(url);

            string username = values.Item1;
            string reponame = values.Item2;

            //var req = new SearchCodeRequest(query, username, reponame);

            //if (string.IsNullOrEmpty(branchName))
            //{
            //    var results = await _client.Search.SearchCode(req);
            //    // Github is searching the contents of the files too
            //    // Github seems generous with the match, so do a secondary filter
            //    var filteredResults = results.Items.Select(i => i.Path);

            //    return filteredResults;
            //}
            //else
            {
                if (string.IsNullOrEmpty(branchName))
                {
                    branchName = "master";
                }

                long repositoryId = await _idLookup.GetIdAsync(url);

                // Search in a specific branch
                TreeResponse?tree;
                try
                {
                    tree = await _client.Git.Tree.GetRecursive(repositoryId, branchName);
                }
                catch (Octokit.NotFoundException)
                {
                    _log.LogWarning($"Repository not found : {url}");
                    return(Enumerable.Empty <string>());
                }

                var filePaths = tree.Tree.Select(item => item.Path);

                if (!string.IsNullOrEmpty(query))
                {
                    if (query.StartsWith("extension:"))
                    {
                        string extension = query.Replace("extension:", "");
                        filePaths = filePaths.Where(path => Path.GetExtension(path) == extension);
                    }
                    else
                    {
                        var splits = query.Split('+');
                        filePaths = filePaths.Where(path => path.Contains(splits[0]));
                    }
                }

                return(filePaths);
            }
        }