public void CreateFileTest() { var filename = Guid.NewGuid() + ".txt"; var expectedContents = "Hello, World!"; // Create file _vstsHelper.SaveTextFile(_authentication, _projectName, _repoName, _branchName, filename, expectedContents, "Creating integration test file. ***NO_CI***", true); // Pull file contents (assuming it was created) var actualContents = _vstsHelper.GetFileContents(_authentication, _projectName, _repoName, _branchName, filename); // Compare contents Assert.AreEqual(expectedContents, actualContents); // Delete test file _vstsHelper.DeleteFile(_authentication, _projectName, _repoName, _branchName, filename, "Deleting integration test file. ***NO_CI***"); }
private void LoadMetadata() { Logger.LogMessage("Loading metadata file..."); var text = vstsHelper.GetFileContents(vstsAuthentication, project, repoName, branch, metadataFilename); if (text.Contains("GitItemNotFoundException")) { Logger.LogMessage("Metadata file does not exist so creating it"); metadata = new List <DocumentMetadata>(); // Track this as being created so we can perform an "add" instead of the usual "edit" metadataFileCreated = true; } else { metadata = JsonConvert.DeserializeObject <List <DocumentMetadata> >(text) ?? new List <DocumentMetadata>(); } }
public async Task Reindex() { if (Topics == null || Topics.Count < 1) { return; } var nextTopic = Topics.FirstOrDefault(); while (nextTopic != null) { var normalizedLink = nextTopic.LinkPure.ToLowerInvariant(); var content = string.Empty; if (normalizedLink.StartsWith("https://") || normalizedLink.StartsWith("http://")) { // This is an absolute link, so we can just try to load it content = await WebClientEx.GetStringAsync(nextTopic.Link); } else { switch (RepositoryType) { case RepositoryTypes.GitHubRaw: content = await WebClientEx.GetStringAsync(GetFullExternalLink(nextTopic.Title)); break; case RepositoryTypes.VstsGit: if (!string.IsNullOrEmpty(nextTopic.LinkPure)) { content = await VstsHelper.GetFileContents(nextTopic.LinkPure, VstsInstance, VstsProjectName, VstsDocsFolder, VstsPat, VstsApiVersion); } break; } } if (!string.IsNullOrEmpty(content)) { await AddToIndex(nextTopic, content, nextTopic.LinkPure.ToLowerInvariant()); } } nextTopic = nextTopic.NextTopic; }
private async Task GetHtmlContent() { var rawTopic = new TopicInformation { OriginalName = SelectedTopic.Title, Type = SelectedTopic.Type }; ImageRootUrl = string.Empty; var normalizedLink = SelectedTopic.LinkPure.ToLowerInvariant(); if (normalizedLink.StartsWith("https://") || normalizedLink.StartsWith("http://")) { // This is an absolute link, so we can just try to load it rawTopic.OriginalContent = await WebClientEx.GetStringAsync(SelectedTopic.Link); ImageRootUrl = StringHelper.JustPath(SelectedTopic.Link) + "/"; } else if (!string.IsNullOrEmpty(normalizedLink)) { var repositoryType = RepositoryTypeHelper.GetTypeFromTypeName(GetSetting <string>(SettingsEnum.RepositoryType)); // Even if the overall repository type is something else, we will switch to different repository access for specific node types, // as they may point to other repositories or require different APIs even within the same repository if (TopicTypeHelper.IsVstsWorkItemType(rawTopic?.Type)) { repositoryType = RepositoryTypes.VstsWorkItemTracking; } switch (repositoryType) { case RepositoryTypes.GitHubRaw: var fullGitHubRawUrl = GitHubMasterUrlRaw + SelectedTopic.Link; if (string.IsNullOrEmpty(rawTopic.Type)) { rawTopic.Type = TopicTypeHelper.GetTopicTypeFromLink(fullGitHubRawUrl); } if (TopicTypeHelper.IsMatch(rawTopic.Type, TopicBodyFormats.Markdown) || TopicTypeHelper.IsMatch(rawTopic.Type, TopicBodyFormats.Html)) { rawTopic.OriginalContent = await WebClientEx.GetStringAsync(fullGitHubRawUrl); } else if (TopicTypeHelper.IsMatch(rawTopic.Type, TopicBodyFormats.ImageUrl)) { rawTopic.OriginalContent = fullGitHubRawUrl; } ImageRootUrl = StringHelper.JustPath(fullGitHubRawUrl); if (!string.IsNullOrEmpty(ImageRootUrl) && !ImageRootUrl.EndsWith("/")) { ImageRootUrl += "/"; } break; case RepositoryTypes.GitHubApi: if (TopicTypeHelper.IsMatch(rawTopic.Type, TopicBodyFormats.Markdown) || TopicTypeHelper.IsMatch(rawTopic.Type, TopicBodyFormats.Html)) { var gitHubClient = new GithubRepositoryParser(GitHubOwner, GitHubRepository, GitHubPat); var gitHubContent = await gitHubClient.GetItemContent(SelectedTopic.Link); rawTopic.OriginalContent = gitHubContent.Text; } // TODO: else if (TopicTypeHelper.IsMatch(rawTopic.Type, TopicBodyFormats.ImageUrl)) // rawTopic.OriginalContent = fullGitHubRawUrl; //ImageRootUrl = StringHelper.JustPath(fullGitHubRawUrl); //if (!string.IsNullOrEmpty(ImageRootUrl) && !ImageRootUrl.EndsWith("/")) ImageRootUrl += "/"; break; case RepositoryTypes.VstsGit: if (!string.IsNullOrEmpty(SelectedTopic.LinkPure)) { rawTopic.OriginalContent = await VstsHelper.GetFileContents(SelectedTopic.LinkPure, GetSetting <string>(SettingsEnum.VstsInstance), GetSetting <string>(SettingsEnum.VstsProjectName), GetSetting <string>(SettingsEnum.VstsDocsFolder), GetSetting <string>(SettingsEnum.VstsPat), GetSetting <string>(SettingsEnum.VstsApiVersion)); } ImageRootUrl = "/___FileProxy___?mode=" + RepositoryTypeNames.VstsGit + "&path="; if (SelectedTopic.LinkPure.Contains("/")) { ImageRootUrl += StringHelper.JustPath(SelectedTopic.LinkPure) + "/"; } break; case RepositoryTypes.VstsWorkItemTracking: if ((TopicTypeHelper.IsMatch(rawTopic?.Type, TopicBodyFormats.VstsWorkItemQuery) || TopicTypeHelper.IsMatch(rawTopic?.Type, TopicBodyFormats.VstsWorkItemQueries)) && HttpContext.Request.Query.ContainsKey("workitemnumber")) { // The current node is a work item query, but we use it as a context to get the actual work item var itemNumber = int.Parse(HttpContext.Request.Query["workitemnumber"]); rawTopic.OriginalContent = await VstsHelper.GetWorkItemJson(itemNumber, GetSetting <string>(SettingsEnum.VstsInstance), GetSetting <string>(SettingsEnum.VstsPat), GetSetting <string>(SettingsEnum.VstsApiVersion)); rawTopic.Type = TopicBodyFormats.VstsWorkItem; } else if (TopicTypeHelper.IsMatch(rawTopic?.Type, TopicBodyFormats.VstsWorkItemQueries) && HttpContext.Request.Query.ContainsKey("queryid")) { // The current node is a list of work item queries, but we use it as a context to run the actual query var queryId = HttpContext.Request.Query["queryid"]; var queryInfoJson = await VstsHelper.GetWorkItemQueriesJson(queryId, GetSetting <string>(SettingsEnum.VstsInstance), GetSetting <string>(SettingsEnum.VstsProjectName), GetSetting <string>(SettingsEnum.VstsPat), GetSetting <string>(SettingsEnum.VstsApiVersion)); dynamic queryInfo = JObject.Parse(queryInfoJson); if (queryInfo != null) { Title = "Query: " + queryInfo.name; } rawTopic.OriginalContent = await VstsHelper.RunWorkItemQueryJson(queryId, GetSetting <string>(SettingsEnum.VstsInstance), GetSetting <string>(SettingsEnum.VstsProjectName), GetSetting <string>(SettingsEnum.VstsPat), GetSetting <string>(SettingsEnum.VstsApiVersion)); if (rawTopic.OriginalContent.StartsWith("{")) { rawTopic.Type = TopicBodyFormats.VstsWorkItemQuery; } else { rawTopic.Type = TopicBodyFormats.Markdown; // Something went wrong, but one way or another, we didn't end up with JSON } } else if (TopicTypeHelper.IsMatch(rawTopic?.Type, TopicBodyFormats.VstsWorkItem)) { // Plain work item node var itemNumber = int.Parse(SelectedTopic.Link); rawTopic.OriginalContent = await VstsHelper.GetWorkItemJson(itemNumber, GetSetting <string>(SettingsEnum.VstsInstance), GetSetting <string>(SettingsEnum.VstsPat), GetSetting <string>(SettingsEnum.VstsApiVersion)); } else if (TopicTypeHelper.IsMatch(rawTopic?.Type, TopicBodyFormats.VstsWorkItemQueries)) { // Plain work item queries rawTopic.OriginalContent = await VstsHelper.GetWorkItemQueriesJson(SelectedTopic.Link, GetSetting <string>(SettingsEnum.VstsInstance), GetSetting <string>(SettingsEnum.VstsProjectName), GetSetting <string>(SettingsEnum.VstsPat), GetSetting <string>(SettingsEnum.VstsApiVersion)); Title = SelectedTopic.Title; } else if (TopicTypeHelper.IsMatch(rawTopic?.Type, TopicBodyFormats.VstsWorkItemQuery)) { // Plain work item query rawTopic.OriginalContent = await VstsHelper.RunWorkItemQueryJson(SelectedTopic.Link, GetSetting <string>(SettingsEnum.VstsInstance), GetSetting <string>(SettingsEnum.VstsProjectName), GetSetting <string>(SettingsEnum.VstsPat), GetSetting <string>(SettingsEnum.VstsApiVersion)); Title = SelectedTopic.Title; } Vsts.ImageLink = "/___FileProxy___?mode=" + RepositoryTypeNames.VstsWorkItemTracking + "&topic=" + CurrentSlug + "&path="; break; } } var renderer = TopicRendererFactory.GetTopicRenderer(rawTopic); var intermediateHtml = renderer.RenderToHtml(rawTopic, ImageRootUrl, this); if (!string.IsNullOrEmpty(intermediateHtml)) { intermediateHtml = await ProcessKavaTopic(intermediateHtml); intermediateHtml = AutoGenerateTitle(intermediateHtml); intermediateHtml = ProcessBrokenImageLinks(intermediateHtml, ImageRootUrl); } Html = intermediateHtml; Json = renderer.RenderToJson(rawTopic, ImageRootUrl, this); TemplateName = renderer.GetTemplateName(rawTopic, TemplateName, this); if (string.IsNullOrEmpty(Html) && SelectedTopic != null) { var sb = new StringBuilder(); sb.Append("<h1>" + SelectedTopic.Title + "</h1>"); if (SelectedTopic.Topics.Count > 0) { sb.Append("<ul>"); foreach (var topic in SelectedTopic.Topics) { sb.Append("<li class=\"kava-auto-link\">"); sb.Append("<a href=\"" + TopicHelper.GetNormalizedName(topic.Title) + "\">"); sb.Append(topic.Title); sb.Append("</a>"); sb.Append("</li>"); } sb.Append("</ul>"); } Html = sb.ToString(); } }