public string GetFileContent(GeminiContext gemini, int issueid, string repositoryUrl, string filename, string revisionId, bool getPreviousRevision = false) { if (filename.IsEmpty()) { return(string.Empty); } var allIssueCommits = gemini.CodeCommits.GetAll(issueid); if (allIssueCommits == null || allIssueCommits.Count() == 0) { return(string.Empty); } var fileCommits = allIssueCommits.Where(f => f.Provider == SourceControlProvider.Bitbucket && f.Data.Contains(repositoryUrl) && f.Data.Contains(filename) && f.Data.Contains(string.Concat("\"RevisionId\":\"", revisionId))); if (fileCommits == null || fileCommits.Count() != 1) { return(string.Empty); } var fileCommitsJson = fileCommits.First().Data.FromJson <SourceControlCommit>(); FileCommitType type = fileCommitsJson.Files.Where(f => f.Filename == filename).First().Type; if (getPreviousRevision) { if (fileCommitsJson.PreviousRevisionId.IsEmpty() || type == FileCommitType.Created) { return(string.Empty); } revisionId = fileCommitsJson.PreviousRevisionId; } else { if (type == FileCommitType.Deleted) { return(string.Empty); } } RestSharp.IRestResponse response; try { response = GetResponse(string.Format("{0}raw/{1}/{2}", repositoryUrl, revisionId, filename), RestSharp.Method.GET); } catch (FileNotFoundException ex) { GeminiApp.LogException(ex, false); return(string.Empty); } catch (UnauthorizedAccessException) { throw; } catch (Exception ex) { GeminiApp.LogException(ex, false); return(string.Empty); } return(response.Content); }
public List <CodeCommit> CodeCommit(string auth, string payload = "") { if (auth.IsEmpty()) { GeminiApp.LogException(new UnauthorizedAccessException() { Source = SourceControlProvider.Bitbucket.ToString() }, false); return(null); } var authDetails = Encoding.Default.GetString(Convert.FromBase64String(auth)).Split(':'); string apikey = string.Empty; if (authDetails.Length == 2) { apikey = authDetails[0]; } CurrentUser = new UserDto(new User() { ProjectGroups = new List <ProjectGroupMembership>() { new ProjectGroupMembership() { ProjectGroupId = Countersoft.Gemini.Commons.Constants.GlobalGroupAdministrators, UserId = 0 } } }); UserContext.User = CurrentUser; PermissionsManager = PermissionsManager.Copy(CurrentUser); UserContext.PermissionsManager = PermissionsManager; if (apikey.Length == 0 || GeminiApp.Config.ApiKey.Length == 0 || !apikey.StartsWith(GeminiApp.Config.ApiKey, StringComparison.InvariantCultureIgnoreCase)) { string error; if (GeminiApp.Config.ApiKey.Length == 0) { error = "Web.config is missing API key."; } else { error = string.Format("Wrong API key: {0}.", apikey); } GeminiApp.LogException(new Exception(error) { Source = SourceControlProvider.Bitbucket.ToString() }, false); return(null); } try { var body = Request.Content.ReadAsStringAsync(); body.Wait(); //GeminiApp.LogException("Null CodeCommit", string.Concat("Null CodeCommit - ", body.Result), false); } catch { try { GeminiApp.LogException("Null CodeCommit", "Null CodeCommit - Empty!", false); } catch { } } Payload commits = System.Web.HttpContext.Current.Request.Form["payload"].FromJson <Payload>(); if (commits == null) { return(null); } List <CodeCommit> allCommits = new List <CodeCommit>(); foreach (var commit in commits.commits) { Regex ex = new Regex("GEM:(?<issueid>[0-9]+)", RegexOptions.IgnoreCase); MatchCollection matches = ex.Matches(commit.message); List <int> issueAdded = new List <int>(); List <string> filesModified = new List <string>(); foreach (var file in commit.files) { FileCommitType type = FileCommitType.Created; if (file.type.Equals("modified", StringComparison.InvariantCultureIgnoreCase)) { type = FileCommitType.Modified; } else if (file.type.Equals("removed", StringComparison.InvariantCultureIgnoreCase)) { type = FileCommitType.Deleted; } filesModified.Add(string.Concat("{\"Filename\":\"", file.file, "\", \"FileId\":\"", string.Empty, "\",\"PreviousFileRevisionId\":\"", string.Empty, "\", \"Type\":\"", type.ToString(), "\" }")); } var data = commit.ToJson(); if (matches.Count > 0) { foreach (Match match in matches) { IssueDto issue = IssueManager.Get(match.ToString().Remove(0, 4).ToInt()); if (issue != null) { if (!issueAdded.Contains(issue.Id)) { CodeCommit newCodeCommit = new CodeCommit(); newCodeCommit.Provider = SourceControlProvider.Bitbucket; newCodeCommit.Comment = commit.message; newCodeCommit.Fullname = commit.author; newCodeCommit.Data = string.Concat("{\"RevisionId\":\"", commit.raw_node, "\",\"PreviousRevisionId\":\"", commit.parents[0], "\",\"Files\":[", string.Join(",", filesModified.ToArray()), "],\"RepositoryName\":\"", commits.repository.name, "\",\"RepositoryUrl\":\"", String.Concat(commits.canon_url, commits.repository.absolute_url), "\",\"IsPrivate\":\"", commits.repository.is_private, "\"}");; newCodeCommit.IssueId = issue.Id; allCommits.Add(GeminiContext.CodeCommits.Create(newCodeCommit)); issueAdded.Add(issue.Id); try { if (match.Index + match.Length + 1 + 5 <= commit.message.Length) { var time = commit.message.Substring(match.Index + match.Length + 1, 5); var timeEx = new System.Text.RegularExpressions.Regex("[0-9][0-9]:[0-9][0-9]"); var m = timeEx.Match(time); if (m.Success) { // Okay, log time! var timeTypes = MetaManager.TimeTypeGetAll(issue.Project.TemplateId); if (timeTypes.Count > 0) { // Let's try and find the user var user = commit.author.HasValue() ? Cache.Users.Find(u => u.Username.Equals(commit.author, StringComparison.InvariantCultureIgnoreCase) || u.Email.Equals(commit.author, StringComparison.InvariantCultureIgnoreCase) || u.Fullname.Equals(commit.author, StringComparison.InvariantCultureIgnoreCase)) : null; var timeEntry = new IssueTimeTracking(); timeEntry.IssueId = issue.Id; timeEntry.ProjectId = issue.Entity.ProjectId; timeEntry.Comment = commit.message.ToMax(1990); timeEntry.EntryDate = DateTime.Now; timeEntry.Hours = m.Value.Substring(0, 2).ToInt(); timeEntry.Minutes = m.Value.Substring(3, 2).ToInt(); timeEntry.TimeTypeId = timeTypes[0].Entity.Id; timeEntry.UserId = user == null ? Countersoft.Gemini.Commons.Constants.SystemAccountUserId : user.Id; TimeTrackingManager.Create(timeEntry); } } } } catch (Exception timeEx) { LogManager.LogError(timeEx, "BitBucket - Time log"); } } } else { GeminiApp.LogException(new Exception(string.Concat("Item ID ", match.ToString().Remove(0, 4).ToInt(), " could not be found.")) { Source = "Commit Failed" }, false); } } } } return(allCommits); }