예제 #1
0
        public async Task <List <VersionInfo> > GetVersionsAsync(Project project)
        {
            List <VersionInfo> versions;

            try
            {
                versions = (await GetReleasesAsync(project))
                           .OrderByDescending(r => r.PublishedAt)
                           .Select(r => new VersionInfo
                {
                    Name        = r.TagName,
                    DisplayName = r.TagName
                }).ToList();
            }
            catch (Exception ex)
            {
                //TODO: It may not be a good idea to hide the error!
                Logger.LogError(ex.Message, ex);
                versions = new List <VersionInfo>();
            }

            if (!versions.Any() && !string.IsNullOrEmpty(project.LatestVersionBranchName))
            {
                versions.Add(new VersionInfo {
                    DisplayName = "1.0.0", Name = project.LatestVersionBranchName
                });
            }

            return(versions);
        }
예제 #2
0
        private async Task <DateTime?> GetLastSignificantUpdateTime(
            IReadOnlyList <GitHubCommit> commits,
            Project project,
            string fileName,
            DateTime?lastKnownSignificantUpdateTime,
            DateTime documentCreationTime)
        {
            if (commits == null || !commits.Any())
            {
                return(null);
            }

            var fileCommitsAfterCreation = commits.Take(commits.Count - 1);

            var commitsToEvaluate = (lastKnownSignificantUpdateTime != null
                ? fileCommitsAfterCreation.Where(c => c.Commit.Author.Date.DateTime > lastKnownSignificantUpdateTime)
                : fileCommitsAfterCreation).Where(c => c.Commit.Author.Date.DateTime > DateTime.Now.AddDays(-14));

            foreach (var gitHubCommit in commitsToEvaluate)
            {
                var fullCommit = await _githubRepositoryManager.GetSingleCommitsAsync(
                    GetOwnerNameFromUrl(project.GetGitHubUrl()),
                    GetRepositoryNameFromUrl(project.GetGitHubUrl()),
                    gitHubCommit.Sha,
                    project.GetGitHubAccessTokenOrNull());

                if (_githubPatchAnalyzer.HasPatchSignificantChanges(fullCommit.Files.First(f => f.Filename == fileName).Patch))
                {
                    return(gitHubCommit.Commit.Author.Date.DateTime);
                }
            }

            return(null);
        }
예제 #3
0
        public virtual async Task <Document> GetDocument(Project project, string documentName, string version)
        {
            var token            = project.GetGitHubAccessTokenOrNull();
            var rootUrl          = project.GetGitHubUrl(version);
            var rawRootUrl       = CalculateRawRootUrl(rootUrl);
            var rawDocumentUrl   = rawRootUrl + documentName;
            var commitHistoryUrl = project.GetGitHubUrlForCommitHistory() + documentName;
            var editLink         = rootUrl.ReplaceFirst("/tree/", "/blob/") + documentName;
            var localDirectory   = "";
            var fileName         = documentName;

            if (documentName.Contains("/"))
            {
                localDirectory = documentName.Substring(0, documentName.LastIndexOf('/'));
                fileName       = documentName.Substring(documentName.LastIndexOf('/') + 1);
            }

            return(new Document
            {
                Title = documentName,
                EditLink = editLink,
                RootUrl = rootUrl,
                RawRootUrl = rawRootUrl,
                Format = project.Format,
                LocalDirectory = localDirectory,
                FileName = fileName,
                Contributors = await GetContributors(commitHistoryUrl, token),
                Version = version,
                Content = await DownloadWebContentAsStringAsync(rawDocumentUrl, token)
            });
        }
예제 #4
0
        public virtual async Task <Document> GetDocumentAsync(Project project, string documentName, string languageCode, string version)
        {
            var token                = project.GetGitHubAccessTokenOrNull();
            var rootUrl              = project.GetGitHubUrl(version);
            var userAgent            = project.GetGithubUserAgentOrNull();
            var rawRootUrl           = CalculateRawRootUrlWithLanguageCode(rootUrl, languageCode);
            var rawDocumentUrl       = rawRootUrl + documentName;
            var commitHistoryUrl     = project.GetGitHubUrlForCommitHistory() + documentName;
            var isNavigationDocument = documentName == project.NavigationDocumentName;
            var isParameterDocument  = documentName == project.ParametersDocumentName;
            var editLink             = rootUrl.ReplaceFirst("/tree/", "/blob/") + languageCode + "/" + documentName;
            var localDirectory       = "";
            var fileName             = documentName;

            if (documentName.Contains("/"))
            {
                localDirectory = documentName.Substring(0, documentName.LastIndexOf('/'));
                fileName       = documentName.Substring(documentName.LastIndexOf('/') + 1);
            }

            return(new Document
            {
                Title = documentName,
                EditLink = editLink,
                RootUrl = rootUrl,
                RawRootUrl = rawRootUrl,
                Format = project.Format,
                LocalDirectory = localDirectory,
                FileName = fileName,
                Contributors = new List <DocumentContributor>(),
                //Contributors = !isNavigationDocument && !isParameterDocument ? await GetContributors(commitHistoryUrl, token, userAgent): new List<DocumentContributor>(),
                Version = version,
                Content = await DownloadWebContentAsStringAsync(rawDocumentUrl, token, userAgent)
            });
        }
예제 #5
0
        private async Task <IReadOnlyList <Release> > GetReleasesAsync(Project project)
        {
            var url            = project.GetGitHubUrl();
            var ownerName      = GetOwnerNameFromUrl(url);
            var repositoryName = GetRepositoryNameFromUrl(url);

            return(await _githubRepositoryManager.GetReleasesAsync(ownerName, repositoryName, project.GetGitHubAccessTokenOrNull()));
        }
예제 #6
0
        public async Task <List <VersionInfo> > GetVersionsAsync(Project project)
        {
            var url            = project.GetGitHubUrl();
            var ownerName      = GetOwnerNameFromUrl(url);
            var repositoryName = GetRepositoryNameFromUrl(url);
            var githubVersionProviderSource = GetGithubVersionProviderSource(project);

            List <VersionInfo> versions;

            try
            {
                versions = (await _githubRepositoryManager.GetVersionsAsync(ownerName, repositoryName, project.GetGitHubAccessTokenOrNull(), githubVersionProviderSource))
                           .Select(r => new VersionInfo
                {
                    Name        = r.Name,
                    DisplayName = r.Name
                }).ToList();
            }
            catch (Exception ex)
            {
                //TODO: It may not be a good idea to hide the error!
                Logger.LogError(ex.Message, ex);
                versions = new List <VersionInfo>();
            }

            if (githubVersionProviderSource == GithubVersionProviderSource.Branches && project.ExtraProperties.ContainsKey("VersionBranchPrefix"))
            {
                var prefix = (string)project.ExtraProperties["VersionBranchPrefix"];

                if (!string.IsNullOrEmpty(prefix))
                {
                    versions = versions.Where(v => v.Name.StartsWith(prefix)).ToList();
                    foreach (var v in versions)
                    {
                        v.Name        = v.Name.Substring(prefix.Length);
                        v.DisplayName = v.DisplayName.Substring(prefix.Length);
                    }
                }

                versions = _versionHelper.OrderByDescending(versions);
            }

            if (githubVersionProviderSource == GithubVersionProviderSource.Releases)
            {
                if (!versions.Any() && !string.IsNullOrEmpty(project.LatestVersionBranchName))
                {
                    versions.Add(new VersionInfo {
                        DisplayName = "1.0.0", Name = project.LatestVersionBranchName
                    });
                }
                else
                {
                    versions = _versionHelper.OrderByDescending(versions);
                }
            }

            return(versions);
        }
예제 #7
0
        private async Task <IReadOnlyList <GitHubCommit> > GetFileCommitsAsync(Project project, string version, string filename)
        {
            var url            = project.GetGitHubUrl();
            var ownerName      = GetOwnerNameFromUrl(url);
            var repositoryName = GetRepositoryNameFromUrl(url);

            return(await _githubRepositoryManager.GetFileCommitsAsync(ownerName, repositoryName,
                                                                      version, filename, project.GetGitHubAccessTokenOrNull()));
        }
예제 #8
0
        public async Task <DocumentResource> GetResource(Project project, string resourceName, string version)
        {
            var rawRootUrl = CalculateRawRootUrl(project.GetGitHubUrl(version));
            var content    = await DownloadWebContentAsByteArrayAsync(
                rawRootUrl + resourceName,
                project.GetGitHubAccessTokenOrNull()
                );

            return(new DocumentResource(content));
        }
예제 #9
0
        public virtual async Task <Document> GetDocumentAsync(Project project, string documentName, string languageCode, string version)
        {
            var token                = project.GetGitHubAccessTokenOrNull();
            var rootUrl              = project.GetGitHubUrl(version);
            var userAgent            = project.GetGithubUserAgentOrNull();
            var rawRootUrl           = CalculateRawRootUrlWithLanguageCode(rootUrl, languageCode);
            var rawDocumentUrl       = rawRootUrl + documentName;
            var isNavigationDocument = documentName == project.NavigationDocumentName;
            var isParameterDocument  = documentName == project.ParametersDocumentName;
            var editLink             = rootUrl.ReplaceFirst("/tree/", "/blob/") + languageCode + "/" + documentName;
            var localDirectory       = "";
            var fileName             = documentName;

            if (documentName.Contains("/"))
            {
                localDirectory = documentName.Substring(0, documentName.LastIndexOf('/'));
                fileName       = documentName.Substring(documentName.LastIndexOf('/') + 1);
            }

            var fileCommits = await GetFileCommitsAsync(project, version, $"docs/{languageCode}/{documentName}");

            var document = new Document(GuidGenerator.Create(),
                                        project.Id,
                                        documentName,
                                        version,
                                        languageCode,
                                        fileName,
                                        await DownloadWebContentAsStringAsync(rawDocumentUrl, token, userAgent),
                                        project.Format,
                                        editLink,
                                        rootUrl,
                                        rawRootUrl,
                                        localDirectory,
                                        fileCommits.LastOrDefault()?.Commit.Author.Date.DateTime ?? DateTime.MinValue,
                                        fileCommits.FirstOrDefault()?.Commit.Author.Date.DateTime ?? DateTime.MinValue,
                                        DateTime.Now);

            var authors = fileCommits
                          .Where(x => x.Author != null)
                          .Select(x => x.Author)
                          .GroupBy(x => x.Id)
                          .OrderByDescending(x => x.Count())
                          .Select(x => x.FirstOrDefault()).ToList();

            if (!isNavigationDocument && !isParameterDocument)
            {
                foreach (var author in authors)
                {
                    document.AddContributor(author.Login, author.HtmlUrl, author.AvatarUrl);
                }
            }

            return(document);
        }
예제 #10
0
        private async Task <IReadOnlyList <Release> > GetReleasesAsync(Project project)
        {
            var url            = project.GetGitHubUrl();
            var ownerName      = GetOwnerNameFromUrl(url);
            var repositoryName = GetRepositoryNameFromUrl(url);
            var gitHubClient   = CreateGitHubClient(project.GetGitHubAccessTokenOrNull());

            return(await gitHubClient
                   .Repository
                   .Release
                   .GetAll(ownerName, repositoryName));
        }
예제 #11
0
        public async Task <LanguageConfig> GetLanguageListAsync(Project project, string version)
        {
            var token     = project.GetGitHubAccessTokenOrNull();
            var rootUrl   = project.GetGitHubUrl(version);
            var userAgent = project.GetGithubUserAgentOrNull();

            var url = CalculateRawRootUrl(rootUrl) + "docs-langs.json";

            var configAsJson = await DownloadWebContentAsStringAsync(url, token, userAgent);

            return(JsonConvert.DeserializeObject <LanguageConfig>(configAsJson));
        }
예제 #12
0
        public async Task <LanguageConfig> GetLanguageListAsync(Project project, string version)
        {
            var token     = project.GetGitHubAccessTokenOrNull();
            var rootUrl   = project.GetGitHubUrl(version);
            var userAgent = project.GetGithubUserAgentOrNull();

            var url = CalculateRawRootUrl(rootUrl) + DocsDomainConsts.LanguageConfigFileName;

            var configAsJson = await DownloadWebContentAsStringAsync(url, token, userAgent);

            if (!JsonConvertExtensions.TryDeserializeObject <LanguageConfig>(configAsJson, out var languageConfig))
            {
                throw new UserFriendlyException($"Cannot validate language config file '{DocsDomainConsts.LanguageConfigFileName}' for the project {project.Name} - v{version}.");
            }

            return(languageConfig);
        }
예제 #13
0
        private async Task <IReadOnlyList <GitHubCommit> > GetGitHubCommitsOrNull(Project project, string documentName, string languageCode, string version)
        {
            /*
             * Getting file commits usually throws "Resource temporarily unavailable" or "Network is unreachable"
             * This is a trival information and running this inside try-catch is safer.
             */

            try
            {
                return(await GetFileCommitsAsync(project, version, project.GetGitHubInnerUrl(languageCode, documentName)));
            }
            catch (Exception e)
            {
                Logger.LogError(e.ToString());
                return(null);
            }
        }
예제 #14
0
 public async Task <List <VersionInfo> > GetVersions(Project project)
 {
     try
     {
         return((await GetReleasesAsync(project))
                .OrderByDescending(r => r.PublishedAt)
                .Select(r => new VersionInfo
         {
             Name = r.TagName,
             DisplayName = r.TagName
         }).ToList());
     }
     catch (Exception ex)
     {
         //TODO: It may not be a good idea to hide the error!
         Logger.LogError(ex.Message, ex);
         return(new List <VersionInfo>());
     }
 }
예제 #15
0
 private async Task <DateTime?> GetLastKnownSignificantUpdateTime(
     Project project,
     string documentName,
     string languageCode,
     string version,
     DateTime?lastKnownSignificantUpdateTime,
     bool isNavigationDocument,
     bool isParameterDocument,
     IReadOnlyList <GitHubCommit> commits,
     DateTime documentCreationTime)
 {
     return(!isNavigationDocument && !isParameterDocument && version == project.LatestVersionBranchName
         ? await GetLastSignificantUpdateTime(
                commits,
                project,
                project.GetGitHubInnerUrl(languageCode, documentName),
                lastKnownSignificantUpdateTime,
                documentCreationTime
                ) ?? lastKnownSignificantUpdateTime
         : null);
 }
예제 #16
0
        public virtual async Task <Document> GetDocumentAsync(Project project, string documentName, string languageCode, string version, DateTime?lastKnownSignificantUpdateTime = null)
        {
            var token                = project.GetGitHubAccessTokenOrNull();
            var rootUrl              = project.GetGitHubUrl(version);
            var userAgent            = project.GetGithubUserAgentOrNull();
            var rawRootUrl           = CalculateRawRootUrlWithLanguageCode(rootUrl, languageCode);
            var rawDocumentUrl       = rawRootUrl + documentName;
            var isNavigationDocument = documentName == project.NavigationDocumentName;
            var isParameterDocument  = documentName == project.ParametersDocumentName;
            var editLink             = rootUrl.ReplaceFirst("/tree/", "/blob/").EnsureEndsWith('/') + languageCode + "/" + documentName;
            var localDirectory       = "";
            var fileName             = documentName;

            if (documentName.Contains("/"))
            {
                localDirectory = documentName.Substring(0, documentName.LastIndexOf('/'));
                fileName       = documentName.Substring(documentName.LastIndexOf('/') + 1);
            }

            var content = await DownloadWebContentAsStringAsync(rawDocumentUrl, token, userAgent);

            var commits = await GetGitHubCommitsOrNull(project, documentName, languageCode, version);

            var documentCreationTime      = GetFirstCommitDate(commits);
            var lastUpdateTime            = GetLastCommitDate(commits);
            var lastSignificantUpdateTime = await GetLastKnownSignificantUpdateTime(project, documentName, languageCode, version, lastKnownSignificantUpdateTime, isNavigationDocument, isParameterDocument, commits, documentCreationTime);

            var document = new Document
                           (
                GuidGenerator.Create(),
                project.Id,
                documentName,
                version,
                languageCode,
                fileName,
                content,
                project.Format,
                editLink,
                rootUrl,
                rawRootUrl,
                localDirectory,
                documentCreationTime,
                lastUpdateTime,
                DateTime.Now,
                lastSignificantUpdateTime
                           );

            if (isNavigationDocument || isParameterDocument)
            {
                return(document);
            }

            var authors = GetAuthors(commits);

            foreach (var author in authors)
            {
                document.AddContributor(author.Login, author.HtmlUrl, author.AvatarUrl);
            }

            return(document);
        }
예제 #17
0
 private GithubVersionProviderSource GetGithubVersionProviderSource(Project project)
 {
     return(project.ExtraProperties.ContainsKey("GithubVersionProviderSource")
         ? (GithubVersionProviderSource)(long)project.ExtraProperties["GithubVersionProviderSource"]
         : GithubVersionProviderSource.Releases);
 }