/// <summary> /// /// </summary> /// <param name="jc"></param> /// <returns></returns> public Dictionary <string, object> CreateFortniteIssue(JiraConnection jc) { var fields = new Dictionary <string, object>(); fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 fields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description fields.Add("project", new Dictionary <string, object> { { "id", 10600 } }); fields.Add("issuetype", new Dictionary <string, object> { { "id", "1" } }); // Bug //branch found in - required = false fields.Add("customfield_11201", ToBranchName.ToList()); //Platforms - required = false fields.Add("customfield_11203", new List <object>() { new Dictionary <string, object>() { { "self", Settings.Default.JiraDeploymentAddress + "/customFieldOption/11425" }, { "value", "PC" } } }); // Callstack customfield_11807 string JiraCallstack = "{noformat}" + string.Join("\r\n", ToJiraFunctionCalls) + "{noformat}"; fields.Add("customfield_11807", JiraCallstack); // Callstack return(fields); }
/// <summary> /// Adds the bugg as a new JIRA ticket /// </summary> public void CopyToJira() { var jc = JiraConnection.Get(); Dictionary <string, object> issueFields; if (BranchesFoundIn.Any(data => data.ToLower().Contains("//fort"))) { issueFields = CreateFortniteIssue(jc); } //else if (BranchesFoundIn.Any(data => data.ToLower().Contains("//orion"))) //{ // issueFields = CreateOrionIssue(); //} else { issueFields = CreateGeneralIssue(jc); } if (jc.CanBeUsed() && string.IsNullOrEmpty(this.Jira)) { // Additional Info URL / Link to Crash/Bugg string Key = jc.AddJiraTicket(issueFields); if (!string.IsNullOrEmpty(Key)) { Jira = Key; var buggs = new BuggRepository(); buggs.SetJIRAForBuggAndCrashes(Key, Id); } } }
public Backend(InstanceType instanceType, AppType appType) { settingsCollection = SettingsCollectionSerializer.DeSerialize(); trackUsage = new TrackUsage(settingsCollection.AppSettings, settingsCollection.InternalSettings, instanceType, appType); versionControl = new VersionControl(instanceType, appType, trackUsage); jiraTimerCollection = new JiraTimerCollection(settingsCollection.ExportSettings); jiraTimerCollection.exportPrompt += OnExportPromptEvent; jiraConnection = new JiraConnection(trackUsage); idleTimerCollection = new IdleTimerCollection(); ActivityChecker = new ActivityChecker(jiraTimerCollection, settingsCollection.AppSettings); ActivityChecker.NoActivityEvent += OnNoActivityEvent; hearbeat = new Timer(1800000); hearbeat.Elapsed += HearbeatOnElapsed; hearbeat.Start(); if (Settings.AppSettings.TimerRunningOnShutdown.HasValue) { var timer = jiraTimerCollection.GetTimer(Settings.AppSettings.TimerRunningOnShutdown.Value); if (timer != null && timer.DateStarted.Date == DateTime.Now.Date) { JiraTimerCollection.StartTimer(Settings.AppSettings.TimerRunningOnShutdown.Value); } Settings.AppSettings.TimerRunningOnShutdown = null; SaveSettings(false); } HearbeatOnElapsed(this, null); }
/// <summary> /// Create a new Jira for this bug /// </summary> public void CopyToJira() { var jc = JiraConnection.Get(); Dictionary <string, object> issueFields; switch (this.JiraProject) { case "UE": issueFields = CreateGeneralIssue(jc); break; case "FORT": issueFields = CreateFortniteIssue(jc); break; case "ORION": issueFields = CreateOrionIssue(jc); break; default: issueFields = CreateProjectIssue(jc, this.JiraProject); break; } if (jc.CanBeUsed() && string.IsNullOrEmpty(this.TTPID)) { // Additional Info URL / Link to Crash/Bugg var key = jc.AddJiraTicket(issueFields); if (!string.IsNullOrEmpty(key)) { TTPID = key; } } }
static void Main(string[] args) { System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; string UserName = "******"; //[email protected] string Password = "******"; //token, not password:URskwZoyEIef7z9KVbED37DA string Url = "https://jira.uds.systems/"; //https://sav-dev.atlassian.net/ JiraConnection connection = new JiraConnection() { url = Url, username = UserName, apiToken = Password, projectKey = "BB" }; string restUrl = String.Format("{0}rest/api/latest/issue/BB-1", connection.url); HttpWebResponse response = null; HttpWebRequest request = WebRequest.Create(restUrl) as HttpWebRequest; request.Method = "GET"; request.Accept = "application/json"; request.ContentType = "application/json"; request.Headers.Add("Authorization", "Basic " + GetEncodedCredentials(connection.username, connection.apiToken)); using (response = request.GetResponse() as HttpWebResponse) { if (response.StatusCode == HttpStatusCode.OK) { var reader = new StreamReader(response.GetResponseStream()); string str = reader.ReadToEnd(); Regex keyReg = new Regex(@",""key"":"".*"","); if (keyReg.Matches(str).Count > 0) { string issueKey = keyReg.Matches(str)[0].Value.Replace(",\"key\":\"", "") .Replace("\",", ""); string issueLink = connection.url + "browse/" + issueKey; } //Console.WriteLine("The server returned '{0}'\n{1}", response.StatusCode, str); //var jss = new System.Web.Script.Serialization.JavaScriptSerializer(); //var sData = jss.Deserialize<Dictionary<string, // string>>(str); //string issueKey = sData["key"].ToString(); //showSuccess("Issue created sucessfully."); //AddAttachments(issueKey); } else { //showError("Error returned from Server:" + response.StatusCode + " Status Description : " + response.StatusDescription); } } request.Abort(); }
public object Get(ConnectionRequest request) { var result = ConnectionResult.UnknownTarget; if (request.Type == null) { return(result); } switch (request.Type.ToLowerInvariant()) { case "tfs": string.Format("Connecting to TFS using {0}", request).Debug(); var tfs = new TfsConnection(); result = tfs.Connect(request.Url, request.User, request.Password); break; case "jira": string.Format("Connecting to JIRA using {0}", request).Debug(); var jira = new JiraConnection(); result = jira.Connect(request.Url, request.User, request.Password); break; case "githubissues": string.Format("Connecting to GitHub (Issues) using {0}", request).Debug(); var githubissues = new GitHubIssuesConnection(); result = githubissues.Connect(request.Host, request.User, request.Password); break; case "githubpulls": string.Format("Connecting to GitHub (Pulls) using {0}", request).Debug(); var githubpulls = new GitHubPullsConnection(); result = githubpulls.Connect(request.Host, request.User, request.Password); break; } if (result == ConnectionResult.Success) { "Connection successful.".Debug(); SaveLogin(request); return(OK()); } if (result == ConnectionResult.FailedToConnect) { return(NotAuthorized("Credentials Rejected")); } if (result == ConnectionResult.InvalidUrl) { return(BadRequest("Invalid Url")); } return(BadRequest("Unknown Target")); }
public void SaveJiraConnectionSettings() { jiraConnectionSettings.SaveSettings(); if (jiraConnection == null) { jiraConnection = new JiraConnection(jiraConnectionSettings); } else { jiraConnection.ReConnect(jiraConnectionSettings); } }
/// <summary> /// Adds the bugg as a new JIRA ticket /// </summary> public void CopyToJira() { var JC = JiraConnection.Get(); if (JC.CanBeUsed() && string.IsNullOrEmpty(this.TTPID)) { Dictionary <string, object> Fields = new Dictionary <string, object>(); Fields.Add("project", new Dictionary <string, object> { { "id", 11205 } }); // UE Fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 Fields.Add("description", "____________"); // Description Fields.Add("issuetype", new Dictionary <string, object> { { "id", "1" } }); // Bug Fields.Add("labels", new string[] { "crash" }); // <label>crash</label> Fields.Add("customfield_11500", ToJiraFirstCLAffected); // Changelist # / Found Changelist Fields.Add("environment", LatestOSAffected); // Platform // Components var SupportComponent = JC.GetNameToComponents()["Support"]; Fields.Add("components", new object[] { SupportComponent }); // ToJiraVersions Fields.Add("versions", ToJiraVersions); // ToJiraBranches Fields.Add("customfield_11201", ToJiraBranches); // ToJiraPlatforms Fields.Add("customfield_11203", ToJiraPlatforms); // Callstack customfield_11807 var Callstack = GetFunctionCalls(); string JiraCallstack = string.Join("\r\n", Callstack); Fields.Add("customfield_11807", JiraCallstack); // Callstack string Key = JC.AddJiraTicket(Fields); if (!string.IsNullOrEmpty(Key)) { TTPID = Key; BuggRepository.SetJIRAForBuggAndCrashes(Key, Id); // Update the JIRA in the bugg. Dictionary <string, object> FieldsToUpdate = new Dictionary <string, object>(); string BuggLink = "http://crashreporter/Buggs/Show/" + Id; FieldsToUpdate.Add("customfield_11205", BuggLink); // Additional Info URL / Link to Crash/Bugg JC.UpdateJiraTicket(Key, FieldsToUpdate); } } }
/// <summary> /// Adds the bugg as a new JIRA ticket /// </summary> public void CopyToJira() { var JC = JiraConnection.Get(); if (JC.CanBeUsed() && string.IsNullOrEmpty(this.Jira)) { Dictionary <string, object> Fields = new Dictionary <string, object>(); Fields.Add("project", new Dictionary <string, object> { { "id", 11205 } }); // UE Fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 Fields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description Fields.Add("issuetype", new Dictionary <string, object> { { "id", "1" } }); // Bug Fields.Add("labels", new string[] { "crash", "liveissue" }); // <label>crash, live issue</label> Fields.Add("customfield_11500", ToJiraFirstCLAffected); // Changelist # / Found Changelist Fields.Add("environment", LatestOSAffected); // Platform // Components var SupportComponent = JC.GetNameToComponents()["Support"]; Fields.Add("components", new object[] { SupportComponent }); // ToJiraVersions Fields.Add("versions", ToJiraVersions); // ToJiraBranches Fields.Add("customfield_12402", ToJiraBranches.ToList()); // NewBranchFoundIn // ToJiraPlatforms Fields.Add("customfield_11203", ToJiraPlatforms); // Callstack customfield_11807 string JiraCallstack = "{noformat}" + string.Join("\r\n", ToJiraFunctionCalls) + "{noformat}"; Fields.Add("customfield_11807", JiraCallstack); // Callstack string BuggLink = "http://crashreporter/Buggs/Show/" + Id; Fields.Add("customfield_11205", BuggLink); // Additional Info URL / Link to Crash/Bugg string Key = JC.AddJiraTicket(Fields); if (!string.IsNullOrEmpty(Key)) { Jira = Key; BuggRepository Buggs = new BuggRepository(); Buggs.SetJIRAForBuggAndCrashes(Key, Id); } } }
/// <summary> /// /// </summary> /// <param name="jc"></param> /// <returns></returns> public Dictionary <string, object> CreateOrionIssue(JiraConnection jc) { var fields = new Dictionary <string, object>(); fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 fields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description fields.Add("project", new Dictionary <string, object> { { "id", 10700 } }); fields.Add("issuetype", new Dictionary <string, object> { { "id", "1" } }); // Bug fields.Add("components", new object[] { new Dictionary <string, object> { { "id", "14604" } } }); return(fields); }
/// <summary> /// /// </summary> /// <param name="jc"></param> /// <returns></returns> public Dictionary <string, object> CreateFortniteIssue(JiraConnection jc) { var fields = new Dictionary <string, object>(); fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 fields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description fields.Add("project", new Dictionary <string, object> { { "id", 10600 } }); fields.Add("issuetype", new Dictionary <string, object> { { "id", "1" } }); // Bug //branch found in - required = false fields.Add("customfield_11201", ToBranchName.ToList()); //found CL = required = false //fields.Add("customfield_11500", th ); //Platforms - required = false fields.Add("customfield_11203", new List <object>() { new Dictionary <string, object>() { { "self", "https://jira.ol.epicgames.net/rest/api/2/customFieldOption/11425" }, { "value", "PC" } } }); //repro rate required = false //fields.Add("customfield_11900", this.Buggs_Crashes.Count); // ToJiraVersions fields.Add("assignee", new Dictionary <string, object> { { "name", "fortnite.coretech" } }); // assignee // Callstack customfield_11807 string JiraCallstack = "{noformat}" + string.Join("\r\n", ToJiraFunctionCalls) + "{noformat}"; fields.Add("customfield_11807", JiraCallstack); // Callstack return(fields); }
/// <summary> /// /// </summary> /// <returns></returns> public Dictionary <string, object> CreateGeneralIssue(JiraConnection jc) { var fields = new Dictionary <string, object>(); fields.Add("project", new Dictionary <string, object> { { "id", 11205 } }); // UE fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 fields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description fields.Add("issuetype", new Dictionary <string, object> { { "id", "1" } }); // Bug fields.Add("labels", new string[] { "crash", "liveissue" }); // <label>crash, live issue</label> fields.Add("customfield_11500", ToJiraFirstCLAffected); // Changelist # / Found Changelist fields.Add("environment", LatestOSAffected); // Platform // Components var SupportComponent = jc.GetNameToComponents()["Support"]; fields.Add("components", new object[] { SupportComponent }); // ToJiraVersions fields.Add("versions", ToJiraVersions); // ToJiraBranches fields.Add("customfield_12402", ToJiraBranches.ToList()); // NewBranchFoundIn // ToJiraPlatforms fields.Add("customfield_11203", ToJiraPlatforms); // Callstack customfield_11807 string JiraCallstack = "{noformat}" + string.Join("\r\n", ToJiraFunctionCalls) + "{noformat}"; fields.Add("customfield_11807", JiraCallstack); // Callstack string BuggLink = "http://crashreporter/Buggs/Show/" + Id; fields.Add("customfield_11205", BuggLink); return(fields); }
/// <summary> /// Test method - DELETE ME! /// </summary> public void GetJiraIssueSpec() { var jiraConnection = JiraConnection.Get(); if (!jiraConnection.CanBeUsed()) { return; } var jiraResponse = jiraConnection.JiraRequest( "/issue/createmeta?projectKeys=UE&issuetypeName=Bug&expand=projects.issuetypes.fields", JiraConnection.JiraMethod.GET, null, HttpStatusCode.OK); var projectSpec = JiraConnection.ParseJiraResponse(jiraResponse); var projects = ((ArrayList)projectSpec["projects"]); ArrayList issueTypes = null; foreach (var project in projects) { var kvp = (KeyValuePair <string, object>)project; if (project == "issuetypes") { issueTypes = kvp.Value as ArrayList; } } if (issueTypes != null) { var bug = issueTypes[0]; } //var issuetypes = projdic["issuetypes"]; //var issues = (Dictionary<string, object>) issuetypes; //var bug = (Dictionary<string, object>)issues.First().Value; //var fields = (Dictionary<string, object>)bug["fields"]; }
public Backend(InstanceType instanceType) { settingsCollection = SettingsCollectionSerializer.DeSerialize(); versionControl = new VersionControl(instanceType); trackUsage = new TrackUsage(versionControl, settingsCollection, instanceType); versionControl.UpdateCheckOccured += (sender, b) => trackUsage.TrackAppUsage(b ? TrackingType.UpdateCheckManual : TrackingType.UpdateCheck); jiraTimerCollection = new JiraTimerCollection(settingsCollection, trackUsage); jiraTimerCollection.exportPrompt += OnExportPromptEvent; jiraConnection = new JiraConnection(trackUsage); idleTimerCollection = new IdleTimerCollection(); ActivityChecker = new ActivityChecker(jiraTimerCollection, settingsCollection); withThanksCreator = new WithThanksCreator(); premiumChecker = new PremiumChecker(); ActivityChecker.NoActivityEvent += OnNoActivityEvent; var cleanUpAndTrackingHeartbeat = new Timer(TimeSpan.FromMinutes(15).TotalMilliseconds); cleanUpAndTrackingHeartbeat.Elapsed += CleanUpAndTrackingHearbeatOnElapsed; cleanUpAndTrackingHeartbeat.Start(); exportedHeartbeatMutex = new Mutex(false); var jiraExportHearbeat = new Timer(TimeSpan.FromMinutes(10).TotalMilliseconds); jiraExportHearbeat.Elapsed += JiraExportHearbeatHearbeatOnElapsed; jiraExportHearbeat.Start(); if (Settings.AppSettings.TimerRunningOnShutdown.HasValue) { var timer = jiraTimerCollection.GetTimer(Settings.AppSettings.TimerRunningOnShutdown.Value); if (timer != null && timer.DateStarted.Date == DateTime.Now.Date) { JiraTimerCollection.StartTimer(Settings.AppSettings.TimerRunningOnShutdown.Value); } Settings.AppSettings.TimerRunningOnShutdown = null; SaveSettings(false, false); } }
private static IConnection Connect(Request request, out ConnectionResult result) { result = ConnectionResult.UnknownTarget; if (request.Type == null) { return(null); } IConnection target; switch (request.Type.ToLowerInvariant()) { case "tfs": target = new TfsConnection(); result = target.Connect(request.Url, request.User, request.Password); break; case "jira": target = new JiraConnection(); result = target.Connect(request.Url, request.User, request.Password); break; case "githubissues": target = new GitHubIssuesConnection(); result = target.Connect(request.Host, request.User, request.Password); break; case "githubpulls": target = new GitHubPullsConnection(); result = target.Connect(request.Host, request.User, request.Password); break; default: target = null; break; } return(target); }
public Backend(InstanceType instanceType) { settingsCollection = new SettingsCollection(SettingsCollectionSerializer.DeSerialize()); versionControl = new VersionControl(instanceType); trackUsage = new TrackUsage(versionControl, settingsCollection, instanceType); jiraTimerCollection = new JiraTimerCollection(settingsCollection, trackUsage); recentJiraCollection = new RecentJiraCollection(); jiraConnection = new JiraConnection(trackUsage, recentJiraCollection); idleTimerCollection = new IdleTimerCollection(); ActivityChecker = new ActivityChecker(jiraTimerCollection, settingsCollection); withThanksCreator = new WithThanksCreator(); versionControl.UpdateCheckOccured += (sender, b) => trackUsage.TrackAppUsage(b ? TrackingType.UpdateCheckManual : TrackingType.UpdateCheck); jiraTimerCollection.ExportPrompt += OnExportPromptEvent; ActivityChecker.NoActivityEvent += OnNoActivityEvent; cleanUpAndTrackingHeartbeat = new Timer(TimeSpan.FromMinutes(15).TotalMilliseconds); cleanUpAndTrackingHeartbeat.Elapsed += CleanUpAndTrackingHeartbeatOnElapsed; exportedHeartbeatMutex = new Mutex(false); jiraExportHeartbeat = new Timer(TimeSpan.FromMinutes(10).TotalMilliseconds); jiraExportHeartbeat.Elapsed += JiraExportHeartbeatHeartbeatOnElapsed; }
public Backend(InstanceType instanceType, AppType appType) { settingsCollection = SettingsCollectionSerializer.DeSerialize(); trackUsage = new TrackUsage(settingsCollection.AppSettings, settingsCollection.InternalSettings, instanceType, appType); versionControl = new VersionControl(instanceType, appType, trackUsage); jiraTimerCollection = new JiraTimerCollection(settingsCollection.ExportSettings, trackUsage); jiraTimerCollection.exportPrompt += OnExportPromptEvent; jiraConnection = new JiraConnection(trackUsage); idleTimerCollection = new IdleTimerCollection(); ActivityChecker = new ActivityChecker(jiraTimerCollection, settingsCollection.AppSettings); withThanksCreator = new WithThanksCreator(); ActivityChecker.NoActivityEvent += OnNoActivityEvent; var cleanUpAndTrackingHearbeat = new Timer(1800000); // 30 minutes cleanUpAndTrackingHearbeat.Elapsed += CleanUpAndTrackingHearbeatOnElapsed; cleanUpAndTrackingHearbeat.Start(); exportedHeartbeatMutex = new Mutex(false); var jiraExportHearbeat = new Timer(600000); //10 minutes jiraExportHearbeat.Elapsed += JiraExportHearbeatHearbeatOnElapsed; jiraExportHearbeat.Start(); if (Settings.AppSettings.TimerRunningOnShutdown.HasValue) { var timer = jiraTimerCollection.GetTimer(Settings.AppSettings.TimerRunningOnShutdown.Value); if (timer != null && timer.DateStarted.Date == DateTime.Now.Date) { JiraTimerCollection.StartTimer(Settings.AppSettings.TimerRunningOnShutdown.Value); } Settings.AppSettings.TimerRunningOnShutdown = null; SaveSettings(false); } }
/// <summary> /// /// </summary> public void TestJiraMethod() { var jiraConnection = JiraConnection.Get(); if (!jiraConnection.CanBeUsed()) { return; } var response = jiraConnection.JiraRequest( "/issue/createmeta?projectKeys=OR&issuetypeNames=Bug&expand=projects.issuetypes.fields", JiraConnection.JiraMethod.GET, null, HttpStatusCode.OK); using (var responseReader = new StreamReader(response.GetResponseStream())) { var responseText = responseReader.ReadToEnd(); JObject jsonObject = JObject.Parse(responseText); var fields = jsonObject["projects"][0]["issuetypes"][0]["fields"]; var requiredFields = fields.Where(c => c["required"].Value <bool>() == true); } }
/// <summary> /// Retrieve all Buggs matching the search criteria. /// </summary> /// <param name="FormData">The incoming form of search criteria from the client.</param> /// <param name="BuggIDToBeAddedToJira">ID of the bugg that will be added to JIRA</param> /// <returns>A view to display the filtered Buggs.</returns> public ReportsViewModel GetResults(FormHelper FormData, int BuggIDToBeAddedToJira) { // @TODO yrx 2015-02-17 BuggIDToBeAddedToJira replace with List<int> based on check box and Submit? // Enumerate JIRA projects if needed. // https://jira.ol.epicgames.net//rest/api/2/project var JC = JiraConnection.Get(); var JiraComponents = JC.GetNameToComponents(); var JiraVersions = JC.GetNameToVersions(); using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString())) { string AnonumousGroup = "Anonymous"; List <String> Users = CrashRepository.GetUsersForGroup(AnonumousGroup); int AnonymousGroupID = BuggRepository.GetIdFromUserGroup(AnonumousGroup); HashSet <int> AnonumousIDs = BuggRepository.GetUserIdsFromUserGroup(AnonumousGroup); int AnonymousID = AnonumousIDs.First(); HashSet <string> UserNamesForUserGroup = BuggRepository.GetUserNamesFromUserGroups(AnonumousGroup); //FormData.DateFrom = DateTime.Now.AddDays( -1 ); var Crashes = CrashRepository .FilterByDate(CrashRepository.ListAll(), FormData.DateFrom, FormData.DateTo.AddDays(1)) // Only crashes and asserts .Where(Crash => Crash.CrashType == 1 || Crash.CrashType == 2) // Only anonymous user .Where(Crash => Crash.UserNameId.Value == AnonymousID) .Select(Crash => new { ID = Crash.Id, TimeOfCrash = Crash.TimeOfCrash.Value, //UserID = Crash.UserNameId.Value, BuildVersion = Crash.BuildVersion, JIRA = Crash.TTPID, Platform = Crash.PlatformName, FixCL = Crash.FixedChangeList, BuiltFromCL = Crash.ChangeListVersion, Pattern = Crash.Pattern, MachineID = Crash.ComputerName, Branch = Crash.Branch, }) .ToList(); int NumCrashes = Crashes.Count; /* * // Build patterns for crashes where patters is null. * var CrashesWithoutPattern = CrashRepository * .FilterByDate( CrashRepository.ListAll(), FormData.DateFrom, FormData.DateTo.AddDays( 1 ) ) * // Only crashes and asserts * .Where( Crash => Crash.Pattern == null || Crash.Pattern == "" ) * .Select( Crash => Crash ) * .ToList(); * * foreach( var Crash in CrashesWithoutPattern ) * { * ////BuildPattern( Crash ); * } */ // Total # of ALL (Anonymous) crashes in timeframe int TotalAnonymousCrashes = NumCrashes; // Total # of UNIQUE (Anonymous) crashes in timeframe HashSet <string> UniquePatterns = new HashSet <string>(); HashSet <string> UniqueMachines = new HashSet <string>(); Dictionary <string, int> PatternToCount = new Dictionary <string, int>(); //List<int> CrashesWithoutPattern = new List<int>(); //List<DateTime> CrashesWithoutPatternDT = new List<DateTime>(); foreach (var Crash in Crashes) { if (string.IsNullOrEmpty(Crash.Pattern)) { //CrashesWithoutPattern.Add( Crash.ID ); //CrashesWithoutPatternDT.Add( Crash.TimeOfCrash ); continue; } UniquePatterns.Add(Crash.Pattern); UniqueMachines.Add(Crash.MachineID); bool bAdd = !PatternToCount.ContainsKey(Crash.Pattern); if (bAdd) { PatternToCount.Add(Crash.Pattern, 1); } else { PatternToCount[Crash.Pattern]++; } } var PatternToCountOrdered = PatternToCount.OrderByDescending(X => X.Value).ToList(); // The 100 top. var PatternAndCount = PatternToCountOrdered.Take(100).ToDictionary(X => X.Key, Y => Y.Value); int TotalUniqueAnonymousCrashes = UniquePatterns.Count; // Total # of AFFECTED USERS (Anonymous) in timeframe int TotalAffectedUsers = UniqueMachines.Count; var RealBuggs = BuggRepository.GetDataContext().Buggs.Where(Bugg => PatternAndCount.Keys.Contains(Bugg.Pattern)).ToList(); // Build search string. List <string> FoundJiras = new List <string>(); Dictionary <string, List <Bugg> > JiraIDtoBugg = new Dictionary <string, List <Bugg> >(); List <Bugg> Buggs = new List <Bugg>(100); foreach (var Top in PatternAndCount) { Bugg NewBugg = new Bugg(); Bugg RealBugg = RealBuggs.Where(X => X.Pattern == Top.Key).FirstOrDefault(); if (RealBugg != null) { using (FAutoScopedLogTimer TopTimer = new FAutoScopedLogTimer(string.Format("{0}:{1}", Buggs.Count + 1, RealBugg.Id))) { // Index // number NewBugg.Id = RealBugg.Id; // CrashGroup URL (a link to the Bugg) NewBugg.TTPID = RealBugg.TTPID; // JIRA NewBugg.FixedChangeList = RealBugg.FixedChangeList; // FixCL NewBugg.NumberOfCrashes = Top.Value; // # Occurrences NewBugg.Pattern = RealBugg.Pattern; // # Occurrences //NewBugg.BuildVersion = var CrashesForBugg = Crashes.Where(Crash => Crash.Pattern == Top.Key).ToList(); NewBugg.AffectedVersions = new SortedSet <string>(); NewBugg.AffectedMajorVersions = new SortedSet <string>(); // 4.4, 4.5 and so NewBugg.BranchesFoundIn = new SortedSet <string>(); NewBugg.AffectedPlatforms = new SortedSet <string>(); HashSet <string> MachineIds = new HashSet <string>(); int FirstCLAffected = int.MaxValue; foreach (var Crash in CrashesForBugg) { // Only add machine if the number has 32 characters if (Crash.MachineID != null && Crash.MachineID.Length == 32) { MachineIds.Add(Crash.MachineID); } // Ignore bad build versions. // @TODO yrx 2015-02-17 What about launcher? if (Crash.BuildVersion.StartsWith("4.")) { if (!string.IsNullOrEmpty(Crash.BuildVersion)) { NewBugg.AffectedVersions.Add(Crash.BuildVersion); } if (!string.IsNullOrEmpty(Crash.Branch) && Crash.Branch.StartsWith("UE4")) { NewBugg.BranchesFoundIn.Add(Crash.Branch); } int CrashBuiltFromCL = 0; int.TryParse(Crash.BuiltFromCL, out CrashBuiltFromCL); if (CrashBuiltFromCL > 0) { FirstCLAffected = Math.Min(FirstCLAffected, CrashBuiltFromCL); } if (!string.IsNullOrEmpty(Crash.Platform)) { // Platform = "Platform [Desc]"; var PlatSubs = Crash.Platform.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (PlatSubs.Length >= 1) { NewBugg.AffectedPlatforms.Add(PlatSubs[0]); } } } } // CopyToJira NewBugg.ToJiraFirstCLAffected = FirstCLAffected; if (NewBugg.AffectedVersions.Count > 0) { NewBugg.BuildVersion = NewBugg.AffectedVersions.Last(); // Latest Version Affected } foreach (var AffectedBuild in NewBugg.AffectedVersions) { var Subs = AffectedBuild.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (Subs.Length >= 2) { string MajorVersion = Subs[0] + "." + Subs[1]; NewBugg.AffectedMajorVersions.Add(MajorVersion); } } NewBugg.NumberOfUniqueMachines = MachineIds.Count; // # Affected Users string LatestCLAffected = CrashesForBugg. // CL of the latest build Where(Crash => Crash.BuildVersion == NewBugg.BuildVersion). Max(Crash => Crash.BuiltFromCL); int ILatestCLAffected = -1; int.TryParse(LatestCLAffected, out ILatestCLAffected); NewBugg.LatestCLAffected = ILatestCLAffected; // Latest CL Affected string LatestOSAffected = CrashesForBugg.OrderByDescending(Crash => Crash.TimeOfCrash).First().Platform; NewBugg.LatestOSAffected = LatestOSAffected; // Latest Environment Affected NewBugg.TimeOfFirstCrash = RealBugg.TimeOfFirstCrash; // First Crash Timestamp // ToJiraSummary var Callstack = RealBugg.GetFunctionCalls(); NewBugg.ToJiraSummary = Callstack.Count > 1 ? Callstack[0] : "No valid callstack found"; // ToJiraVersions NewBugg.ToJiraVersions = new List <object>(); foreach (var Version in NewBugg.AffectedMajorVersions) { bool bValid = JC.GetNameToVersions().ContainsKey(Version); if (bValid) { NewBugg.ToJiraVersions.Add(JC.GetNameToVersions()[Version]); } } // ToJiraBranches NewBugg.ToJiraBranches = new List <object>(); foreach (var Platform in NewBugg.BranchesFoundIn) { string CleanedBranch = Platform.Contains("UE4-Releases") ? "UE4-Releases" : Platform; Dictionary <string, object> JiraBranch = null; JC.GetNameToBranchFoundIn().TryGetValue(CleanedBranch, out JiraBranch); if (JiraBranch != null && !NewBugg.ToJiraBranches.Contains(JiraBranch)) { NewBugg.ToJiraBranches.Add(JiraBranch); } } // ToJiraPlatforms NewBugg.ToJiraPlatforms = new List <object>(); foreach (var Platform in NewBugg.AffectedPlatforms) { bool bValid = JC.GetNameToPlatform().ContainsKey(Platform); if (bValid) { NewBugg.ToJiraPlatforms.Add(JC.GetNameToPlatform()[Platform]); } } // Verify valid JiraID, this may be still a TTP if (!string.IsNullOrEmpty(NewBugg.TTPID)) { int TTPID = 0; int.TryParse(NewBugg.TTPID, out TTPID); if (TTPID == 0) { AddBuggJiraMapping(NewBugg, ref FoundJiras, ref JiraIDtoBugg); } } Buggs.Add(NewBugg); } } else { FLogger.WriteEvent("Bugg for pattern " + Top.Key + " not found"); } } if (BuggIDToBeAddedToJira > 0) { var Bugg = Buggs.Where(X => X.Id == BuggIDToBeAddedToJira).FirstOrDefault(); if (Bugg != null) { Bugg.CopyToJira(); AddBuggJiraMapping(Bugg, ref FoundJiras, ref JiraIDtoBugg); } } if (JC.CanBeUsed()) { // Grab the data form JIRA. string JiraSearchQuery = string.Join(" OR ", FoundJiras); using (FAutoScopedLogTimer JiraResultsTimer = new FAutoScopedLogTimer("JiraResults")) { var JiraResults = JC.SearchJiraTickets( JiraSearchQuery, new string[] { "key", // string "summary", // string "components", // System.Collections.ArrayList, Dictionary<string,object>, name "resolution", // System.Collections.Generic.Dictionary`2[System.String,System.Object], name "fixVersions", // System.Collections.ArrayList, Dictionary<string,object>, name "customfield_11200" // string }); // Jira Key, Summary, Components, Resolution, Fix version, Fix changelist foreach (var Jira in JiraResults) { string JiraID = Jira.Key; string Summary = (string)Jira.Value["summary"]; string ComponentsText = ""; System.Collections.ArrayList Components = (System.Collections.ArrayList)Jira.Value["components"]; foreach (Dictionary <string, object> Component in Components) { ComponentsText += (string)Component["name"]; ComponentsText += " "; } Dictionary <string, object> ResolutionFields = (Dictionary <string, object>)Jira.Value["resolution"]; string Resolution = ResolutionFields != null ? (string)ResolutionFields["name"] : ""; string FixVersionsText = ""; System.Collections.ArrayList FixVersions = (System.Collections.ArrayList)Jira.Value["fixVersions"]; foreach (Dictionary <string, object> FixVersion in FixVersions) { FixVersionsText += (string)FixVersion["name"]; FixVersionsText += " "; } int FixCL = Jira.Value["customfield_11200"] != null ? (int)(decimal)Jira.Value["customfield_11200"] : 0; var BuggsForJira = JiraIDtoBugg[JiraID]; foreach (Bugg Bugg in BuggsForJira) { Bugg.JiraSummary = Summary; Bugg.JiraComponentsText = ComponentsText; Bugg.JiraResolution = Resolution; Bugg.JiraFixVersionsText = FixVersionsText; if (FixCL != 0) { Bugg.JiraFixCL = FixCL.ToString(); } } } } } return(new ReportsViewModel { Buggs = Buggs, /*Crashes = Crashes,*/ DateFrom = (long)(FormData.DateFrom - CrashesViewModel.Epoch).TotalMilliseconds, DateTo = (long)(FormData.DateTo - CrashesViewModel.Epoch).TotalMilliseconds, TotalAffectedUsers = TotalAffectedUsers, TotalAnonymousCrashes = TotalAnonymousCrashes, TotalUniqueAnonymousCrashes = TotalUniqueAnonymousCrashes }); } }
/// <summary> /// The Show action. /// </summary> /// <param name="buggsForm">The form of user data passed up from the client.</param> /// <param name="id">The unique id of the Bugg.</param> /// <returns>The view to display a Bugg on the client.</returns> public ActionResult Show(FormCollection buggsForm, int id) { using (var logTimer = new FAutoScopedLogTimer(this.GetType().ToString() + "(BuggId=" + id + ")", bCreateNewLog: true)) { // Set the display properties based on the radio buttons var displayModuleNames = buggsForm["DisplayModuleNames"] == "true"; var displayFunctionNames = buggsForm["DisplayFunctionNames"] == "true"; var displayFileNames = buggsForm["DisplayFileNames"] == "true"; var displayFilePathNames = false; if (buggsForm["DisplayFilePathNames"] == "true") { displayFilePathNames = true; displayFileNames = false; } var displayUnformattedCallStack = buggsForm["DisplayUnformattedCallStack"] == "true"; // Create a new view and populate with crashes List <Crash> crashes = null; var model = new BuggViewModel(); var newBugg = _unitOfWork.BuggRepository.GetById(id); if (newBugg == null) { return(RedirectToAction("Index")); } crashes = newBugg.Crashes.OrderByDescending(data => data.TimeOfCrash).ToList(); newBugg.CrashesInTimeFrameAll = crashes.Count; newBugg.CrashesInTimeFrameGroup = crashes.Count; newBugg.NumberOfCrashes = crashes.Count; // Handle 'CopyToJira' button var buggIdToBeAddedToJira = 0; foreach (var entry in buggsForm.Cast <object>().Where(entry => entry.ToString().Contains("CopyToJira-"))) { int.TryParse(entry.ToString().Substring("CopyToJira-".Length), out buggIdToBeAddedToJira); break; } newBugg.PrepareBuggForJira(crashes); if (buggIdToBeAddedToJira != 0) { newBugg.JiraProject = buggsForm["JiraProject"]; newBugg.CopyToJira(); } var jc = JiraConnection.Get(); var bValidJira = false; // Verify valid JiraID, this may be still a TTP if (!string.IsNullOrEmpty(newBugg.TTPID)) { var jira = 0; int.TryParse(newBugg.TTPID, out jira); if (jira == 0) { bValidJira = true; } } if (jc.CanBeUsed() && bValidJira) { // Grab the data form JIRA. var jiraSearchQuery = "key = " + newBugg.TTPID; var jiraResults = new Dictionary <string, Dictionary <string, object> >(); try { jiraResults = jc.SearchJiraTickets( jiraSearchQuery, new string[] { "key", // string "summary", // string "components", // System.Collections.ArrayList, Dictionary<string,object>, name "resolution", // System.Collections.Generic.Dictionary`2[System.String,System.Object], name "fixVersions", // System.Collections.ArrayList, Dictionary<string,object>, name "customfield_11200" // string }); } catch (System.Exception) { newBugg.JiraSummary = "JIRA MISMATCH"; newBugg.JiraComponentsText = "JIRA MISMATCH"; newBugg.JiraResolution = "JIRA MISMATCH"; newBugg.JiraFixVersionsText = "JIRA MISMATCH"; newBugg.JiraFixCL = "JIRA MISMATCH"; } // Jira Key, Summary, Components, Resolution, Fix version, Fix changelist if (jiraResults.Any()) { var jira = jiraResults.First(); var summary = (string)jira.Value["summary"]; var componentsText = ""; var components = (System.Collections.ArrayList)jira.Value["components"]; foreach (Dictionary <string, object> component in components) { componentsText += (string)component["name"]; componentsText += " "; } var resolutionFields = (Dictionary <string, object>)jira.Value["resolution"]; var resolution = resolutionFields != null ? (string)resolutionFields["name"] : ""; var fixVersionsText = ""; var fixVersions = (System.Collections.ArrayList)jira.Value["fixVersions"]; foreach (Dictionary <string, object> fixVersion in fixVersions) { fixVersionsText += (string)fixVersion["name"]; fixVersionsText += " "; } var fixCl = jira.Value["customfield_11200"] != null ? (int)(decimal)jira.Value["customfield_11200"] : 0; //Conversion to ado.net entity framework newBugg.JiraSummary = summary; newBugg.JiraComponentsText = componentsText; newBugg.JiraResolution = resolution; newBugg.JiraFixVersionsText = fixVersionsText; if (fixCl != 0) { newBugg.FixedChangeList = fixCl.ToString(); } } } // Apply any user settings if (buggsForm.Count > 0) { if (!string.IsNullOrEmpty(buggsForm["SetStatus"])) { newBugg.Status = buggsForm["SetStatus"]; newBugg.Crashes.ForEach(data => data.Status = buggsForm["SetStatus"]); } if (!string.IsNullOrEmpty(buggsForm["SetFixedIn"])) { newBugg.FixedChangeList = buggsForm["SetFixedIn"]; newBugg.Crashes.ForEach(data => data.FixedChangeList = buggsForm["SetFixedIn"]); } if (!string.IsNullOrEmpty(buggsForm["SetTTP"])) { newBugg.TTPID = buggsForm["SetTTP"]; newBugg.Crashes.ForEach(data => data.Jira = buggsForm["SetTTP"]); } _unitOfWork.BuggRepository.Update(newBugg); _unitOfWork.Save(); } // Set up the view model with the crash data model.Crashes = crashes; model.Bugg = newBugg; var newCrash = model.Crashes.FirstOrDefault(); if (newCrash != null) { var callStack = new CallStackContainer(newCrash); // Set callstack properties callStack.bDisplayModuleNames = displayModuleNames; callStack.bDisplayFunctionNames = displayFunctionNames; callStack.bDisplayFileNames = displayFileNames; callStack.bDisplayFilePathNames = displayFilePathNames; callStack.bDisplayUnformattedCallStack = displayUnformattedCallStack; model.CallStack = callStack; // Shorten very long function names. foreach (var entry in model.CallStack.CallStackEntries) { entry.FunctionName = entry.GetTrimmedFunctionName(128); } model.SourceContext = newCrash.SourceContext; model.LatestCrashSummary = newCrash.Summary; } model.LatestCrashSummary = newCrash.Summary; model.Bugg.LatestCrashSummary = newCrash.Summary; model.GenerationTime = logTimer.GetElapsedSeconds().ToString("F2"); return(View("Show", model)); } }
/// <summary> /// /// </summary> /// <param name="branchName"></param> /// <param name="startDate"></param> /// <param name="endDate"></param> /// <returns></returns> private ReportsViewModel GetResults(string branchName, DateTime startDate, DateTime endDate, int BuggIDToBeAddedToJira) { const string anonymousGroup = "Anonymous"; var anonymousGroupId = _unitOfWork.UserGroupRepository.First(data => data.Name == anonymousGroup).Id; var anonymousIDs = _unitOfWork.UserGroupRepository.First(data => data.Id == anonymousGroupId).Users.Select(data => data.Id).ToList(); var anonymousId = anonymousIDs.First(); var crashesQuery = _unitOfWork.CrashRepository.ListAll() .Where(data => data.TimeOfCrash > startDate && data.TimeOfCrash <= endDate) // Only crashes and asserts .Where(crash => crash.CrashType == 1 || crash.CrashType == 2); // Only anonymous user //.Where(crash => crash.UserNameId.Value == anonymousId); // Filter by BranchName if (!string.IsNullOrEmpty(branchName)) { crashesQuery = crashesQuery.Where(data => data.Branch == branchName); } var crashesList = crashesQuery.ToList(); var buggsList = crashesQuery.Where(data => data.Bugg != null).GroupBy(data => data.Bugg).Select(data => data.Key).ToList(); foreach (var bugg in buggsList) { if (bugg == null) { continue; } var crashes = crashesList.Where(data => data.BuggId == bugg.Id).ToList(); bugg.PrepareBuggForJira(crashes); bugg.CrashesInTimeFrameGroup = crashesList.Count(data => data.BuggId == bugg.Id); bugg.AffectedVersions = new SortedSet <string>(crashes.Select(data => data.BuildVersion)); bugg.NumberOfUniqueMachines = crashes.GroupBy(data => data.ComputerName).Count(); //get latest changelist int latestClAffected; int.TryParse(crashes.Max(data => data.ChangeListVersion), out latestClAffected); bugg.LatestCLAffected = latestClAffected; if (string.IsNullOrWhiteSpace(bugg.TTPID)) { bugg.JiraSummary = "JIRA MISMATCH"; bugg.JiraComponentsText = "JIRA MISMATCH"; bugg.JiraResolution = "JIRA MISMATCH"; bugg.JiraFixVersionsText = "JIRA MISMATCH"; bugg.JiraFixCL = "JIRA MISMATCH"; } } //Get jira connection var jiraConnection = JiraConnection.Get(); if (BuggIDToBeAddedToJira > 0) { var bugg = buggsList.FirstOrDefault(x => x.Id == BuggIDToBeAddedToJira); if (bugg != null) { bugg.CopyToJira(); } } var jiraResults = new Dictionary <string, Dictionary <string, object> >(); foreach (var Query in buggsList.Where(data => !string.IsNullOrWhiteSpace(data.TTPID)).Select(data => data.TTPID)) { try { var TempResult = jiraConnection.SearchJiraTickets( "key = " + Query, new string[] { "key", // string "summary", // string "components", // System.Collections.ArrayList, Dictionary<string,object>, name "resolution", // System.Collections.Generic.Dictionary`2[System.String,System.Object], name "fixVersions", // System.Collections.ArrayList, Dictionary<string,object>, name "customfield_11200" // string }); foreach (var Temp in TempResult) { jiraResults.Add(Temp.Key, Temp.Value); } } catch (System.Exception) { } } // Jira Key, Summary, Components, Resolution, Fix version, Fix changelist foreach (var Jira in jiraResults) { var jiraId = Jira.Key; var summary = (string)Jira.Value["summary"]; var ComponentsText = ""; System.Collections.ArrayList Components = (System.Collections.ArrayList)Jira.Value["components"]; foreach (Dictionary <string, object> Component in Components) { ComponentsText += (string)Component["name"]; ComponentsText += " "; } Dictionary <string, object> ResolutionFields = (Dictionary <string, object>)Jira.Value["resolution"]; string Resolution = ResolutionFields != null ? (string)ResolutionFields["name"] : ""; string FixVersionsText = ""; System.Collections.ArrayList FixVersions = (System.Collections.ArrayList)Jira.Value["fixVersions"]; foreach (Dictionary <string, object> FixVersion in FixVersions) { FixVersionsText += (string)FixVersion["name"]; FixVersionsText += " "; } int FixCL = Jira.Value["customfield_11200"] != null ? (int)(decimal)Jira.Value["customfield_11200"] : 0; if (buggsList.Any(data => data.TTPID == jiraId)) { var bugg = buggsList.First(data => data.TTPID == jiraId); bugg.JiraSummary = summary; bugg.JiraComponentsText = ComponentsText; bugg.JiraResolution = Resolution; bugg.JiraFixVersionsText = FixVersionsText; if (FixCL != 0) { bugg.JiraFixCL = FixCL.ToString(); } } } return(new ReportsViewModel { Buggs = buggsList.OrderByDescending(data => data.CrashesInTimeFrameGroup).ToList(), BranchName = branchName, BranchNames = _unitOfWork.CrashRepository.GetBranchesAsListItems(), DateFrom = (long)(startDate - CrashesViewModel.Epoch).TotalMilliseconds, DateTo = (long)(endDate - CrashesViewModel.Epoch).TotalMilliseconds, TotalAffectedUsers = crashesQuery.GroupBy(data => data.ComputerName).Count(), TotalAnonymousCrashes = crashesQuery.Count(), TotalUniqueAnonymousCrashes = crashesQuery.GroupBy(data => data.BuggId).Count() }); }
public void Initialise() { jiraConnection = new JiraConnection(jiraConnectionSettings); }
private void JiraExportHearbeatHearbeatOnElapsed(object sender, ElapsedEventArgs e) { exportedHeartbeatMutex.WaitOne(); var issues = new List <Issue>(); var timersNotChecked = new Dictionary <string, List <Guid> >(); try { var keepTimersForDays = settingsCollection.AppSettings.KeepTimersForDays; if (keepTimersForDays > 0) { keepTimersForDays = keepTimersForDays * -1; } var workingDate = DateTime.Now.AddDays(keepTimersForDays + 1); var doMissingTimerCheck = false; if (lastMissingTimerCheck < DateTime.UtcNow.AddHours(-1)) { doMissingTimerCheck = true; lastMissingTimerCheck = DateTime.UtcNow; } while (workingDate.Date <= DateTime.Now.Date) { var timersOnDate = jiraTimerCollection.GetTimersForADate(workingDate.Date).ToList(); if (doMissingTimerCheck) { var jirasExportedTo = JiraConnection.GetJiraIssuesFromJQL($"worklogAuthor = currentUser() and worklogDate = {workingDate.ToString("yyyy-MM-dd")}").ToList(); foreach (var issue in jirasExportedTo) { if (!timersOnDate.Any(x => x.JiraReference == issue.key)) { var issueWithWorklogs = issues.FirstOrDefault(x => x.key == issue.key); if (issueWithWorklogs == null) { issueWithWorklogs = jiraConnection.GetJiraIssue(issue.key, true); issues.Add(issueWithWorklogs); } var timerReference = jiraTimerCollection.AddTimer(issueWithWorklogs, workingDate.Date, new TimeSpan(), false); jiraTimerCollection.RefreshFromJira(timerReference, issueWithWorklogs, jiraConnection.CurrentUser); } } } foreach (var timer in timersOnDate.Where(x => !x.TempTimer)) { var issueWithWorklogs = issues.FirstOrDefault(x => x.key == timer.JiraReference); //If we have already downloaded the jira, then just refresh it. //If we have not downloaded already, we should check if we need to refresh. //If we need to refresh, download and refresh. - add to collection for future reference if (issueWithWorklogs != null) { jiraTimerCollection.RefreshFromJira(timer.UniqueId, issueWithWorklogs, jiraConnection.CurrentUser); } else if (!timer.LastJiraTimeCheck.HasValue || timer.LastJiraTimeCheck.Value < DateTime.UtcNow.AddMinutes(-30)) { issueWithWorklogs = jiraConnection.GetJiraIssue(timer.JiraReference, true); issues.Add(issueWithWorklogs); jiraTimerCollection.RefreshFromJira(timer.UniqueId, issueWithWorklogs, jiraConnection.CurrentUser); if (timersNotChecked.ContainsKey(timer.JiraReference)) { foreach (var uncheckedTimer in timersNotChecked[timer.JiraReference]) { jiraTimerCollection.RefreshFromJira(uncheckedTimer, issueWithWorklogs, jiraConnection.CurrentUser); } timersNotChecked.Remove(timer.JiraReference); } } else { if (timersNotChecked.ContainsKey(timer.JiraReference)) { timersNotChecked[timer.JiraReference].Add(timer.UniqueId); } else { timersNotChecked.Add(timer.JiraReference, new List <Guid> { timer.UniqueId }); } } } workingDate = workingDate.AddDays(1); } } catch { /*Surpress the error*/ } exportedHeartbeatMutex.ReleaseMutex(); }
/// <summary> /// Prepares Bugg for JIRA /// </summary> /// <param name="CrashesForBugg"></param> public void PrepareBuggForJira(List <CrashDataModel> CrashesForBugg) { var jiraConnection = JiraConnection.Get(); this.AffectedVersions = new SortedSet <string>(); this.AffectedMajorVersions = new SortedSet <string>(); // 4.4, 4.5 and so on this.BranchesFoundIn = new SortedSet <string>(); this.AffectedPlatforms = new SortedSet <string>(); var hashSetDescriptions = new HashSet <string>(); var machineIds = new HashSet <string>(); var firstClAffected = int.MaxValue; foreach (var crashDataModel in CrashesForBugg) { // Only add machine if the number has 32 characters if (crashDataModel.ComputerName != null && crashDataModel.ComputerName.Length == 32) { machineIds.Add(crashDataModel.ComputerName); if (crashDataModel.Description.Length > 4) { hashSetDescriptions.Add(crashDataModel.Description); } } if (!string.IsNullOrEmpty(crashDataModel.BuildVersion)) { this.AffectedVersions.Add(crashDataModel.BuildVersion); } // Depot || Stream if (!string.IsNullOrEmpty(crashDataModel.Branch)) { this.BranchesFoundIn.Add(crashDataModel.Branch); } var CrashBuiltFromCl = 0; int.TryParse(crashDataModel.ChangelistVersion, out CrashBuiltFromCl); if (CrashBuiltFromCl > 0) { firstClAffected = Math.Min(firstClAffected, CrashBuiltFromCl); } if (!string.IsNullOrEmpty(crashDataModel.PlatformName)) { // Platform = "Platform [Desc]"; var platSubs = crashDataModel.PlatformName.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (platSubs.Length >= 1) { this.AffectedPlatforms.Add(platSubs[0]); } } } //ToJiraDescriptons foreach (var line in hashSetDescriptions) { var listItem = "- " + HttpUtility.HtmlEncode(line); ToJiraDescriptions.Add(listItem); } this.ToJiraFirstCLAffected = firstClAffected; if (this.AffectedVersions.Count > 0) { this.BuildVersion = this.AffectedVersions.Last(); // Latest Version Affected } foreach (var affectedBuild in this.AffectedVersions) { var subs = affectedBuild.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (subs.Length >= 2) { var majorVersion = subs[0] + "." + subs[1]; this.AffectedMajorVersions.Add(majorVersion); } } var bv = this.BuildVersion; var latestClAffected = CrashesForBugg. // CL of the latest build Where(Crash => Crash.BuildVersion == bv). Max(Crash => Crash.ChangelistVersion); var ILatestCLAffected = -1; int.TryParse(latestClAffected, out ILatestCLAffected); this.LatestCLAffected = ILatestCLAffected; // Latest CL Affected var latestOsAffected = CrashesForBugg.OrderByDescending(Crash => Crash.TimeOfCrash).First().PlatformName; this.LatestOSAffected = latestOsAffected; // Latest Environment Affected // ToJiraSummary var functionCalls = new CallStackContainer(CrashesForBugg.First().CrashType, CrashesForBugg.First().RawCallStack, CrashesForBugg.First().PlatformName).GetFunctionCallsForJira(); if (functionCalls.Count > 0) { this.ToJiraSummary = functionCalls[0]; this.ToJiraFunctionCalls = functionCalls; } else { this.ToJiraSummary = "No valid callstack found"; this.ToJiraFunctionCalls = new List <string>(); } // ToJiraVersions this.ToJiraVersions = new List <object>(); foreach (var version in this.AffectedMajorVersions) { var bValid = jiraConnection.GetNameToVersions().ContainsKey(version); if (bValid) { this.ToJiraVersions.Add(jiraConnection.GetNameToVersions()[version]); } } // ToJiraBranches this.ToJiraBranches = new HashSet <string>(); foreach (var branchName in this.BranchesFoundIn) { if (!string.IsNullOrEmpty(branchName)) { // Stream if (branchName.StartsWith("//")) { this.ToJiraBranches.Add(branchName); } // Depot else { this.ToJiraBranches.Add(CrashReporterConstants.P4_DEPOT_PREFIX + branchName); } } } // ToJiraPlatforms this.ToJiraPlatforms = new List <object>(); foreach (var platform in this.AffectedPlatforms) { bool bValid = jiraConnection.GetNameToPlatform().ContainsKey(platform); if (bValid) { this.ToJiraPlatforms.Add(jiraConnection.GetNameToPlatform()[platform]); } } // ToJiraPlatforms this.ToBranchName = new List <object>(); foreach (var BranchName in this.BranchesFoundIn) { bool bValid = jiraConnection.GetNameToBranch().ContainsKey(BranchName); if (bValid) { this.ToBranchName.Add(jiraConnection.GetNameToBranch()[BranchName]); } } }
/// <summary> /// Prepares Bugg for JIRA /// </summary> /// <param name="CrashesForBugg"></param> public void PrepareBuggForJira(List <Crash> CrashesForBugg) { var JC = JiraConnection.Get(); this.AffectedVersions = new SortedSet <string>(); this.AffectedMajorVersions = new SortedSet <string>(); // 4.4, 4.5 and so this.BranchesFoundIn = new SortedSet <string>(); this.AffectedPlatforms = new SortedSet <string>(); this.CrashesInTimeFrameAll = CrashesForBugg.Count; this.CrashesInTimeFrameGroup = CrashesForBugg.Count; var HashSetDecsriptions = new HashSet <string>(); HashSet <string> MachineIds = new HashSet <string>(); int FirstCLAffected = int.MaxValue; foreach (var Crash in CrashesForBugg) { // Only add machine if the number has 32 characters if (Crash.MachineID != null && Crash.MachineID.Length == 32) { MachineIds.Add(Crash.MachineID); // Sent in the unattended mode 29 char if (Crash.Description.Length > 32) { HashSetDecsriptions.Add(Crash.Description); } } // Ignore bad build versions. // @TODO yrx 2015-02-17 What about launcher? if (Crash.BuildVersion.StartsWith("4.")) { if (!string.IsNullOrEmpty(Crash.BuildVersion)) { this.AffectedVersions.Add(Crash.BuildVersion); } if (!string.IsNullOrEmpty(Crash.Branch) && Crash.Branch.StartsWith("UE4")) { this.BranchesFoundIn.Add(Crash.Branch); } int CrashBuiltFromCL = 0; int.TryParse(Crash.BuiltFromCL, out CrashBuiltFromCL); if (CrashBuiltFromCL > 0) { FirstCLAffected = Math.Min(FirstCLAffected, CrashBuiltFromCL); } if (!string.IsNullOrEmpty(Crash.Platform)) { // Platform = "Platform [Desc]"; var PlatSubs = Crash.Platform.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (PlatSubs.Length >= 1) { this.AffectedPlatforms.Add(PlatSubs[0]); } } } } // CopyToJira foreach (var Line in HashSetDecsriptions) { string ListItem = "- " + HttpUtility.HtmlEncode(Line); ToJiraDescriptions.Add(ListItem); } this.ToJiraFirstCLAffected = FirstCLAffected; if (this.AffectedVersions.Count > 0) { this.BuildVersion = this.AffectedVersions.Last(); // Latest Version Affected } foreach (var AffectedBuild in this.AffectedVersions) { var Subs = AffectedBuild.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (Subs.Length >= 2) { string MajorVersion = Subs[0] + "." + Subs[1]; this.AffectedMajorVersions.Add(MajorVersion); } } string BV = this.BuildVersion; this.NumberOfUniqueMachines = MachineIds.Count; // # Affected Users string LatestCLAffected = CrashesForBugg. // CL of the latest build Where(Crash => Crash.BuildVersion == BV). Max(Crash => Crash.BuiltFromCL); int ILatestCLAffected = -1; int.TryParse(LatestCLAffected, out ILatestCLAffected); this.LatestCLAffected = ILatestCLAffected; // Latest CL Affected string LatestOSAffected = CrashesForBugg.OrderByDescending(Crash => Crash.TimeOfCrash).First().Platform; this.LatestOSAffected = LatestOSAffected; // Latest Environment Affected // ToJiraSummary var FunctionCalls = CrashesForBugg.First().GetCallStack().GetFunctionCallsForJira(); if (FunctionCalls.Count > 0) { this.ToJiraSummary = FunctionCalls[0]; this.ToJiraFunctionCalls = FunctionCalls; } else { this.ToJiraSummary = "No valid callstack found"; this.ToJiraFunctionCalls = new List <string>(); } // ToJiraVersions this.ToJiraVersions = new List <object>(); foreach (var Version in this.AffectedMajorVersions) { bool bValid = JC.GetNameToVersions().ContainsKey(Version); if (bValid) { this.ToJiraVersions.Add(JC.GetNameToVersions()[Version]); } } // ToJiraBranches this.ToJiraBranches = new List <object>(); foreach (var Platform in this.BranchesFoundIn) { string CleanedBranch = Platform.Contains("UE4-Releases") ? "UE4-Releases" : Platform; Dictionary <string, object> JiraBranch = null; JC.GetNameToBranchFoundIn().TryGetValue(CleanedBranch, out JiraBranch); if (JiraBranch != null && !this.ToJiraBranches.Contains(JiraBranch)) { this.ToJiraBranches.Add(JiraBranch); } } // ToJiraPlatforms this.ToJiraPlatforms = new List <object>(); foreach (var Platform in this.AffectedPlatforms) { bool bValid = JC.GetNameToPlatform().ContainsKey(Platform); if (bValid) { this.ToJiraPlatforms.Add(JC.GetNameToPlatform()[Platform]); } } }
/// <summary> /// Prepares Bugg for JIRA /// </summary> /// <param name="CrashesForBugg"></param> public void PrepareBuggForJira(List <Crash> CrashesForBugg) { var JC = JiraConnection.Get(); this.AffectedVersions = new SortedSet <string>(); this.AffectedMajorVersions = new SortedSet <string>(); // 4.4, 4.5 and so this.BranchesFoundIn = new SortedSet <string>(); this.AffectedPlatforms = new SortedSet <string>(); this.CrashesInTimeFrameAll = CrashesForBugg.Count; this.CrashesInTimeFrameGroup = CrashesForBugg.Count; var HashSetDescriptions = new HashSet <string>(); HashSet <string> MachineIds = new HashSet <string>(); int FirstCLAffected = int.MaxValue; foreach (var Crash in CrashesForBugg) { // Only add machine if the number has 32 characters if (Crash.MachineId != null && Crash.MachineId.Length == 32) { MachineIds.Add(Crash.MachineId); if (Crash.Description.Length > 4) { HashSetDescriptions.Add(Crash.Description); } } // @TODO Ignore bad build versions. { if (!string.IsNullOrEmpty(Crash.BuildVersion)) { this.AffectedVersions.Add(Crash.BuildVersion); } // Depot || Stream if (!string.IsNullOrEmpty(Crash.Branch)) { this.BranchesFoundIn.Add(Crash.Branch); } int CrashBuiltFromCL = 0; int.TryParse(Crash.BuiltFromCL, out CrashBuiltFromCL); if (CrashBuiltFromCL > 0) { FirstCLAffected = Math.Min(FirstCLAffected, CrashBuiltFromCL); } if (!string.IsNullOrEmpty(Crash.Platform)) { // Platform = "Platform [Desc]"; var PlatSubs = Crash.Platform.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (PlatSubs.Length >= 1) { this.AffectedPlatforms.Add(PlatSubs[0]); } } } } // CopyToJira foreach (var Line in HashSetDescriptions) { string ListItem = "- " + HttpUtility.HtmlEncode(Line); ToJiraDescriptions.Add(ListItem); } this.ToJiraFirstCLAffected = FirstCLAffected; if (this.AffectedVersions.Count > 0) { this.BuildVersion = this.AffectedVersions.Last(); // Latest Version Affected } foreach (var AffectedBuild in this.AffectedVersions) { var Subs = AffectedBuild.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (Subs.Length >= 2) { string MajorVersion = Subs[0] + "." + Subs[1]; this.AffectedMajorVersions.Add(MajorVersion); } } string BV = this.BuildVersion; this.NumberOfUniqueMachines = MachineIds.Count; // # Affected Users string LatestCLAffected = CrashesForBugg. // CL of the latest build Where(Crash => Crash.BuildVersion == BV). Max(Crash => Crash.BuiltFromCL); int ILatestCLAffected = -1; int.TryParse(LatestCLAffected, out ILatestCLAffected); this.LatestCLAffected = ILatestCLAffected; // Latest CL Affected string LatestOSAffected = CrashesForBugg.OrderByDescending(Crash => Crash.TimeOfCrash).First().Platform; this.LatestOSAffected = LatestOSAffected; // Latest Environment Affected // ToJiraSummary var FunctionCalls = new CallStackContainer(CrashesForBugg.First()).GetFunctionCallsForJira(); if (FunctionCalls.Count > 0) { this.ToJiraSummary = FunctionCalls[0]; this.ToJiraFunctionCalls = FunctionCalls; } else { this.ToJiraSummary = "No valid callstack found"; this.ToJiraFunctionCalls = new List <string>(); } // ToJiraVersions this.ToJiraVersions = new List <object>(); foreach (var Version in this.AffectedMajorVersions) { bool bValid = JC.GetNameToVersions().ContainsKey(Version); if (bValid) { this.ToJiraVersions.Add(JC.GetNameToVersions()[Version]); } } // ToJiraBranches this.ToJiraBranches = new HashSet <string>(); foreach (var BranchName in this.BranchesFoundIn) { if (!string.IsNullOrEmpty(BranchName)) { // Stream if (BranchName.StartsWith("//")) { this.ToJiraBranches.Add(BranchName); } // Depot else { this.ToJiraBranches.Add(CrashReporterConstants.P4_DEPOT_PREFIX + BranchName); } } } // ToJiraPlatforms this.ToJiraPlatforms = new List <object>(); foreach (var platform in this.AffectedPlatforms) { bool bValid = JC.GetNameToPlatform().ContainsKey(platform); if (bValid) { this.ToJiraPlatforms.Add(JC.GetNameToPlatform()[platform]); } } // ToJiraPlatforms this.ToBranchName = new List <object>(); foreach (var BranchName in this.BranchesFoundIn) { bool bValid = JC.GetNameToBranch().ContainsKey(BranchName); if (bValid) { this.ToBranchName.Add(JC.GetNameToBranch()[BranchName]); } } }
/// <summary> /// /// </summary> /// <param name="jc"></param> /// <returns></returns> public Dictionary<string, object> CreateFortniteIssue(JiraConnection jc) { var fields = new Dictionary<string, object>(); fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 fields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description fields.Add("project", new Dictionary<string, object> {{"id", 10600}}); fields.Add("issuetype", new Dictionary<string, object> {{"id", "1"}}); // Bug //branch found in - required = false fields.Add("customfield_11201", ToBranchName.ToList()); //found CL = required = false //fields.Add("customfield_11500", th ); //Platforms - required = false fields.Add("customfield_11203", new List<object>(){new Dictionary<string, object>() {{"self", "https://jira.ol.epicgames.net/rest/api/2/customFieldOption/11425"},{"value","PC"}}}); //repro rate required = false //fields.Add("customfield_11900", this.Buggs_Crashes.Count); // ToJiraVersions fields.Add("assignee", new Dictionary<string, object>{{"name", "fortnite.coretech"}});// assignee // Callstack customfield_11807 string JiraCallstack = "{noformat}" + string.Join("\r\n", ToJiraFunctionCalls) + "{noformat}"; fields.Add("customfield_11807", JiraCallstack); // Callstack return fields; }
/// <summary> /// The Show action. /// </summary> /// <param name="buggsForm">The form of user data passed up from the client.</param> /// <param name="id">The unique id of the Bugg.</param> /// <returns>The view to display a Bugg on the client.</returns> public ActionResult Show(FormCollection buggsForm, int id, int page = 0) { using (var logTimer = new FAutoScopedLogTimer(this.GetType().ToString() + "(BuggId=" + id + ")")) { using (var unitOfWork = new UnitOfWork(new CrashReportEntities())) { // Set the display properties based on the radio buttons var displayModuleNames = buggsForm["DisplayModuleNames"] == "true"; var displayFunctionNames = buggsForm["DisplayFunctionNames"] == "true"; var displayFileNames = buggsForm["DisplayFileNames"] == "true"; var displayFilePathNames = false; // Set up the view model with the Crash data if (buggsForm["Page"] != null) { int.TryParse(buggsForm["Page"], out page); } if (buggsForm["DisplayFilePathNames"] == "true") { displayFilePathNames = true; displayFileNames = false; } var displayUnformattedCallStack = buggsForm["DisplayUnformattedCallStack"] == "true"; var model = GetResult(id, page, pageSize, unitOfWork); model.SourceContext = model.CrashData.First().SourceContext; model.Bugg.PrepareBuggForJira(model.CrashData); // Handle 'CopyToJira' button var buggIdToBeAddedToJira = 0; foreach (var entry in buggsForm.Cast <object>().Where(entry => entry.ToString().Contains("CopyToJira-"))) { int.TryParse(entry.ToString().Substring("CopyToJira-".Length), out buggIdToBeAddedToJira); break; } if (buggIdToBeAddedToJira != 0) { model.Bugg.JiraProject = buggsForm["JiraProject"]; model.Bugg.CopyToJira(); } var jc = JiraConnection.Get(); var bValidJira = false; // Verify valid JiraID, this may be still a TTP if (!string.IsNullOrEmpty(model.Bugg.TTPID)) { var jira = 0; int.TryParse(model.Bugg.TTPID, out jira); if (jira == 0) { bValidJira = true; } } if (jc.CanBeUsed() && bValidJira) { // Grab the data form JIRA. var jiraSearchQuery = "key = " + model.Bugg.TTPID; var jiraResults = new Dictionary <string, Dictionary <string, object> >(); try { jiraResults = jc.SearchJiraTickets( jiraSearchQuery, new string[] { "key", // string "summary", // string "components", // System.Collections.ArrayList, Dictionary<string,object>, name "resolution", // System.Collections.Generic.Dictionary`2[System.String,System.Object], name "fixVersions", // System.Collections.ArrayList, Dictionary<string,object>, name "customfield_11200" // string }); } catch (System.Exception) { model.Bugg.JiraSummary = "JIRA MISMATCH"; model.Bugg.JiraComponentsText = "JIRA MISMATCH"; model.Bugg.JiraResolution = "JIRA MISMATCH"; model.Bugg.JiraFixVersionsText = "JIRA MISMATCH"; model.Bugg.JiraFixCL = "JIRA MISMATCH"; } // Jira Key, Summary, Components, Resolution, Fix version, Fix changelist if (jiraResults.Any()) { var jira = jiraResults.First(); var summary = (string)jira.Value["summary"]; var componentsText = ""; var components = (System.Collections.ArrayList)jira.Value["components"]; foreach (Dictionary <string, object> component in components) { componentsText += (string)component["name"]; componentsText += " "; } var resolutionFields = (Dictionary <string, object>)jira.Value["resolution"]; var resolution = resolutionFields != null ? (string)resolutionFields["name"] : ""; var fixVersionsText = ""; var fixVersions = (System.Collections.ArrayList)jira.Value["fixVersions"]; foreach (Dictionary <string, object> fixVersion in fixVersions) { fixVersionsText += (string)fixVersion["name"]; fixVersionsText += " "; } var fixCl = jira.Value["customfield_11200"] != null ? (int)(decimal)jira.Value["customfield_11200"] : 0; //Conversion to ado.net entity framework model.Bugg.JiraSummary = summary; model.Bugg.JiraComponentsText = componentsText; model.Bugg.JiraResolution = resolution; model.Bugg.JiraFixVersionsText = fixVersionsText; if (fixCl != 0) { model.Bugg.FixedChangeList = fixCl.ToString(); } } } // Apply any user settings if (buggsForm.Count > 0) { if (!string.IsNullOrEmpty(buggsForm["SetStatus"])) { model.Bugg.Status = buggsForm["SetStatus"]; unitOfWork.CrashRepository.SetStatusByBuggId(model.Bugg.Id, buggsForm["SetFixedIn"]); } if (!string.IsNullOrEmpty(buggsForm["SetFixedIn"])) { model.Bugg.FixedChangeList = buggsForm["SetFixedIn"]; unitOfWork.CrashRepository.SetFixedCLByBuggId(model.Bugg.Id, buggsForm["SetFixedIn"]); } if (!string.IsNullOrEmpty(buggsForm["SetTTP"])) { model.Bugg.TTPID = buggsForm["SetTTP"]; unitOfWork.CrashRepository.SetJiraByBuggId(model.Bugg.Id, buggsForm["SetTTP"]); } unitOfWork.BuggRepository.Update(model.Bugg); unitOfWork.Save(); } var newCrash = model.CrashData.FirstOrDefault(); if (newCrash != null) { var callStack = new CallStackContainer(newCrash.CrashType, newCrash.RawCallStack, newCrash.PlatformName); // Set callstack properties callStack.bDisplayModuleNames = displayModuleNames; callStack.bDisplayFunctionNames = displayFunctionNames; callStack.bDisplayFileNames = displayFileNames; callStack.bDisplayFilePathNames = displayFilePathNames; callStack.bDisplayUnformattedCallStack = displayUnformattedCallStack; model.CallStack = callStack; // Shorten very long function names. foreach (var entry in model.CallStack.CallStackEntries) { entry.FunctionName = entry.GetTrimmedFunctionName(128); } model.SourceContext = newCrash.SourceContext; model.LatestCrashSummary = newCrash.Summary; } model.LatestCrashSummary = newCrash.Summary; model.Bugg.LatestCrashSummary = newCrash.Summary; model.GenerationTime = logTimer.GetElapsedSeconds().ToString("F2"); //Populate Jira Projects var jiraConnection = JiraConnection.Get(); var response = jiraConnection.JiraRequest("/issue/createmeta", JiraConnection.JiraMethod.GET, null, HttpStatusCode.OK); using (var responseReader = new StreamReader(response.GetResponseStream())) { var responseText = responseReader.ReadToEnd(); JObject jsonObject = JObject.Parse(responseText); JToken fields = jsonObject["projects"]; foreach (var project in fields) { model.JiraProjects.Add(new SelectListItem() { Text = project["name"].ToObject <string>(), Value = project["key"].ToObject <string>() }); } } model.PagingInfo = new PagingInfo { CurrentPage = page, PageSize = pageSize, TotalResults = model.Bugg.NumberOfCrashes.Value }; return(View("Show", model)); } } }
/// <summary> /// Retrieve all Buggs matching the search criteria. /// </summary> /// <param name="FormData">The incoming form of search criteria from the client.</param> /// <param name="BuggIDToBeAddedToJira">ID of the bugg that will be added to JIRA</param> /// <returns>A view to display the filtered Buggs.</returns> public ReportsViewModel GetResults(FormHelper FormData, int BuggIDToBeAddedToJira) { BuggRepository BuggsRepo = new BuggRepository(); CrashRepository CrashRepo = new CrashRepository(); // @TODO yrx 2015-02-17 BuggIDToBeAddedToJira replace with List<int> based on check box and Submit? // Enumerate JIRA projects if needed. // https://jira.ol.epicgames.net//rest/api/2/project var JC = JiraConnection.Get(); var JiraComponents = JC.GetNameToComponents(); var JiraVersions = JC.GetNameToVersions(); using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString())) { string AnonumousGroup = "Anonymous"; //List<String> Users = FRepository.Get().GetUserNamesFromGroupName( AnonumousGroup ); int AnonymousGroupID = FRepository.Get(BuggsRepo).FindOrAddGroup(AnonumousGroup); HashSet <int> AnonumousIDs = FRepository.Get(BuggsRepo).GetUserIdsFromUserGroup(AnonumousGroup); int AnonymousID = AnonumousIDs.First(); HashSet <string> UserNamesForUserGroup = FRepository.Get(BuggsRepo).GetUserNamesFromGroupName(AnonumousGroup); //FormData.DateFrom = DateTime.Now.AddDays( -1 ); var Crashes = CrashRepo .FilterByDate(CrashRepo.ListAll(), FormData.DateFrom, FormData.DateTo.AddDays(1)) // Only crashes and asserts .Where(Crash => Crash.CrashType == 1 || Crash.CrashType == 2) // Only anonymous user .Where(Crash => Crash.UserNameId.Value == AnonymousID) .Select(Crash => new { ID = Crash.Id, TimeOfCrash = Crash.TimeOfCrash.Value, //UserID = Crash.UserNameId.Value, BuildVersion = Crash.BuildVersion, JIRA = Crash.TTPID, Platform = Crash.PlatformName, FixCL = Crash.FixedChangeList, BuiltFromCL = Crash.ChangeListVersion, Pattern = Crash.Pattern, MachineID = Crash.ComputerName, Branch = Crash.Branch, Description = Crash.Description, RawCallStack = Crash.RawCallStack, }) .ToList(); int NumCrashes = Crashes.Count; /* * // Build patterns for crashes where patters is null. * var CrashesWithoutPattern = FRepository.Get().Crashes * .FilterByDate( FRepository.Get().Crashes.ListAll(), FormData.DateFrom, FormData.DateTo.AddDays( 1 ) ) * // Only crashes and asserts * .Where( Crash => Crash.Pattern == null || Crash.Pattern == "" ) * .Select( Crash => Crash ) * .ToList(); * * foreach( var Crash in CrashesWithoutPattern ) * { * Crash.BuildPattern(); * } */ // Total # of ALL (Anonymous) crashes in timeframe int TotalAnonymousCrashes = NumCrashes; // Total # of UNIQUE (Anonymous) crashes in timeframe HashSet <string> UniquePatterns = new HashSet <string>(); HashSet <string> UniqueMachines = new HashSet <string>(); Dictionary <string, int> PatternToCount = new Dictionary <string, int>(); //List<int> CrashesWithoutPattern = new List<int>(); //List<DateTime> CrashesWithoutPatternDT = new List<DateTime>(); foreach (var Crash in Crashes) { if (string.IsNullOrEmpty(Crash.Pattern)) { //CrashesWithoutPattern.Add( Crash.ID ); //CrashesWithoutPatternDT.Add( Crash.TimeOfCrash ); continue; } UniquePatterns.Add(Crash.Pattern); UniqueMachines.Add(Crash.MachineID); bool bAdd = !PatternToCount.ContainsKey(Crash.Pattern); if (bAdd) { PatternToCount.Add(Crash.Pattern, 1); } else { PatternToCount[Crash.Pattern]++; } } var PatternToCountOrdered = PatternToCount.OrderByDescending(X => X.Value).ToList(); // The 100 top. var PatternAndCount = PatternToCountOrdered.Take(100).ToDictionary(X => X.Key, Y => Y.Value); int TotalUniqueAnonymousCrashes = UniquePatterns.Count; // Total # of AFFECTED USERS (Anonymous) in timeframe int TotalAffectedUsers = UniqueMachines.Count; var RealBuggs = BuggsRepo.Context.Buggs.Where(Bugg => PatternAndCount.Keys.Contains(Bugg.Pattern)).ToList(); // Build search string. HashSet <string> FoundJiras = new HashSet <string>(); Dictionary <string, List <Bugg> > JiraIDtoBugg = new Dictionary <string, List <Bugg> >(); List <Bugg> Buggs = new List <Bugg>(100); foreach (var Top in PatternAndCount) { Bugg NewBugg = RealBuggs.Where(X => X.Pattern == Top.Key).FirstOrDefault(); if (NewBugg != null) { using (FAutoScopedLogTimer TopTimer = new FAutoScopedLogTimer(string.Format("{0}:{1}", Buggs.Count + 1, NewBugg.Id))) { var CrashesForBugg = Crashes.Where(Crash => Crash.Pattern == Top.Key).ToList(); // Convert anonymous to full type; var FullCrashesForBugg = new List <Crash>(CrashesForBugg.Count); foreach (var Anon in CrashesForBugg) { FullCrashesForBugg.Add(new Crash() { ID = Anon.ID, TimeOfCrash = Anon.TimeOfCrash, BuildVersion = Anon.BuildVersion, JIRA = Anon.JIRA, Platform = Anon.Platform, FixCL = Anon.FixCL, BuiltFromCL = Anon.BuiltFromCL, Pattern = Anon.Pattern, MachineID = Anon.MachineID, Branch = Anon.Branch, Description = Anon.Description, RawCallStack = Anon.RawCallStack, }); } NewBugg.PrepareBuggForJira(FullCrashesForBugg); // Verify valid JiraID, this may be still a TTP if (!string.IsNullOrEmpty(NewBugg.TTPID)) { int TTPID = 0; int.TryParse(NewBugg.TTPID, out TTPID); if (TTPID == 0) { AddBuggJiraMapping(NewBugg, ref FoundJiras, ref JiraIDtoBugg); } } Buggs.Add(NewBugg); } } else { FLogger.Global.WriteEvent("Bugg for pattern " + Top.Key + " not found"); } } if (BuggIDToBeAddedToJira > 0) { var Bugg = Buggs.Where(X => X.Id == BuggIDToBeAddedToJira).FirstOrDefault(); if (Bugg != null) { Bugg.CopyToJira(); AddBuggJiraMapping(Bugg, ref FoundJiras, ref JiraIDtoBugg); } } if (JC.CanBeUsed()) { var BuggsCopy = new List <Bugg>(Buggs); // Grab the data form JIRA. string JiraSearchQuery = string.Join(" OR ", FoundJiras); using (FAutoScopedLogTimer JiraResultsTimer = new FAutoScopedLogTimer("JiraResults")) { var JiraResults = JC.SearchJiraTickets( JiraSearchQuery, new string[] { "key", // string "summary", // string "components", // System.Collections.ArrayList, Dictionary<string,object>, name "resolution", // System.Collections.Generic.Dictionary`2[System.String,System.Object], name "fixVersions", // System.Collections.ArrayList, Dictionary<string,object>, name "customfield_11200" // string }); // Jira Key, Summary, Components, Resolution, Fix version, Fix changelist foreach (var Jira in JiraResults) { string JiraID = Jira.Key; string Summary = (string)Jira.Value["summary"]; string ComponentsText = ""; System.Collections.ArrayList Components = (System.Collections.ArrayList)Jira.Value["components"]; foreach (Dictionary <string, object> Component in Components) { ComponentsText += (string)Component["name"]; ComponentsText += " "; } Dictionary <string, object> ResolutionFields = (Dictionary <string, object>)Jira.Value["resolution"]; string Resolution = ResolutionFields != null ? (string)ResolutionFields["name"] : ""; string FixVersionsText = ""; System.Collections.ArrayList FixVersions = (System.Collections.ArrayList)Jira.Value["fixVersions"]; foreach (Dictionary <string, object> FixVersion in FixVersions) { FixVersionsText += (string)FixVersion["name"]; FixVersionsText += " "; } int FixCL = Jira.Value["customfield_11200"] != null ? (int)(decimal)Jira.Value["customfield_11200"] : 0; List <Bugg> BuggsForJira; JiraIDtoBugg.TryGetValue(JiraID, out BuggsForJira); //var BuggsForJira = JiraIDtoBugg[JiraID]; if (BuggsForJira != null) { foreach (Bugg Bugg in BuggsForJira) { Bugg.JiraSummary = Summary; Bugg.JiraComponentsText = ComponentsText; Bugg.JiraResolution = Resolution; Bugg.JiraFixVersionsText = FixVersionsText; if (FixCL != 0) { Bugg.JiraFixCL = FixCL.ToString(); } BuggsCopy.Remove(Bugg); } } } } // If there are buggs, we need to update the summary to indicate an error. // Usually caused when bugg's project has changed. foreach (var Bugg in BuggsCopy.Where(b => !string.IsNullOrEmpty(b.TTPID))) { Bugg.JiraSummary = "JIRA MISMATCH"; Bugg.JiraComponentsText = "JIRA MISMATCH"; Bugg.JiraResolution = "JIRA MISMATCH"; Bugg.JiraFixVersionsText = "JIRA MISMATCH"; Bugg.JiraFixCL = "JIRA MISMATCH"; } } Buggs = Buggs.OrderByDescending(b => b.NumberOfCrashes).ToList(); return(new ReportsViewModel { Buggs = Buggs, /*Crashes = Crashes,*/ DateFrom = (long)(FormData.DateFrom - CrashesViewModel.Epoch).TotalMilliseconds, DateTo = (long)(FormData.DateTo - CrashesViewModel.Epoch).TotalMilliseconds, TotalAffectedUsers = TotalAffectedUsers, TotalAnonymousCrashes = TotalAnonymousCrashes, TotalUniqueAnonymousCrashes = TotalUniqueAnonymousCrashes }); } }
/// <summary> /// Create an issue description from a project ID /// </summary> /// <param name="jc"></param> /// <param name="projectId"></param> /// <returns></returns> public Dictionary <string, object> CreateProjectIssue(JiraConnection jc, string projectId) { var response = jc.JiraRequest("/issue/createmeta?projectKeys=" + projectId + "&expand=projects.issuetypes.fields", JiraConnection.JiraMethod.GET, null, HttpStatusCode.OK); var issueFields = new Dictionary <string, object>(); issueFields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 issueFields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description using (var responseReader = new StreamReader(response.GetResponseStream())) { var responseText = responseReader.ReadToEnd(); JObject jsonObject = JObject.Parse(responseText); bool fields = jsonObject["projects"][0]["issuetypes"].Any(); issueFields.Add("project", new Dictionary <string, object> { { "id", jsonObject["projects"][0]["id"].ToObject <int>() } }); if (!fields) { return(issueFields); } foreach ( JToken issuetype in jsonObject["projects"][0]["issuetypes"]) //.[0]["fields"]) { //Only fill required fields if (issuetype["subtask"].ToObject <bool>() == true) { continue; } JToken field = issuetype["fields"]; if (field["required"].ToObject <bool>() == true) { //don't fill fields with a default value if (field["hasDefaultValue"].ToObject <bool>() == true) { continue; } JToken outValue; //if (field.Value["schema"]["type"].ToObject<string>() == "array") //{ // if (field.Value["allowedValues"] != null) // { // //don't add the same key twice // if (issueFields.ContainsKey(field.Key)) // continue; // issueFields.Add(field.Key, new object[] // { // new Dictionary<string, object> // { // {"id", field.Value["allowedValues"][0]["id"].ToObject<string>()} // } // }); // } //} //else //{ // if (obj.TryGetValue("allowedValues", out outValue)) // { // //don't add the same key twice // if (issueFields.ContainsKey(field.Key)) // continue; // issueFields.Add(field.Key, // new Dictionary<string, object> // { // {"id", field.Value["allowedValues"][0]["id"].ToObject<int>()} // }); // } //} } } } return(issueFields); }
/// <summary> /// The Show action. /// </summary> /// <param name="BuggsForm">The form of user data passed up from the client.</param> /// <param name="id">The unique id of the Bugg.</param> /// <returns>The view to display a Bugg on the client.</returns> public ActionResult Show(FormCollection BuggsForm, int id) { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + "(BuggId=" + id + ")", bCreateNewLog: true)) { // Handle 'CopyToJira' button int BuggIDToBeAddedToJira = 0; foreach (var Entry in BuggsForm) { if (Entry.ToString().Contains(Bugg.JiraSubmitName)) { int.TryParse(Entry.ToString().Substring(Bugg.JiraSubmitName.Length), out BuggIDToBeAddedToJira); break; } } BuggRepository Buggs = new BuggRepository(); // Set the display properties based on the radio buttons bool DisplayModuleNames = false; if (BuggsForm["DisplayModuleNames"] == "true") { DisplayModuleNames = true; } bool DisplayFunctionNames = false; if (BuggsForm["DisplayFunctionNames"] == "true") { DisplayFunctionNames = true; } bool DisplayFileNames = false; if (BuggsForm["DisplayFileNames"] == "true") { DisplayFileNames = true; } bool DisplayFilePathNames = false; if (BuggsForm["DisplayFilePathNames"] == "true") { DisplayFilePathNames = true; DisplayFileNames = false; } bool DisplayUnformattedCallStack = false; if (BuggsForm["DisplayUnformattedCallStack"] == "true") { DisplayUnformattedCallStack = true; } // Create a new view and populate with crashes List <Crash> Crashes = null; BuggViewModel Model = new BuggViewModel(); Bugg NewBugg = Buggs.GetBugg(id); if (NewBugg == null) { return(RedirectToAction("")); } Crashes = NewBugg.GetCrashes(); using (FAutoScopedLogTimer GetCrashesTimer = new FAutoScopedLogTimer("Bugg.PrepareBuggForJira")) { if (Crashes.Count > 0) { NewBugg.PrepareBuggForJira(Crashes); if (BuggIDToBeAddedToJira != 0) { NewBugg.CopyToJira(); } } } using (FAutoScopedLogTimer JiraResultsTimer = new FAutoScopedLogTimer("Bugg.GrabJira")) { var JC = JiraConnection.Get(); bool bValidJira = false; // Verify valid JiraID, this may be still a TTP if (!string.IsNullOrEmpty(NewBugg.Jira)) { int TTPID = 0; int.TryParse(NewBugg.Jira, out TTPID); if (TTPID == 0) { //AddBuggJiraMapping( NewBugg, ref FoundJiras, ref JiraIDtoBugg ); bValidJira = true; } } if (JC.CanBeUsed() && bValidJira) { // Grab the data form JIRA. string JiraSearchQuery = "key = " + NewBugg.Jira; var JiraResults = JC.SearchJiraTickets( JiraSearchQuery, new string[] { "key", // string "summary", // string "components", // System.Collections.ArrayList, Dictionary<string,object>, name "resolution", // System.Collections.Generic.Dictionary`2[System.String,System.Object], name "fixVersions", // System.Collections.ArrayList, Dictionary<string,object>, name "customfield_11200" // string }); // Jira Key, Summary, Components, Resolution, Fix version, Fix changelist foreach (var Jira in JiraResults) { string JiraID = Jira.Key; string Summary = (string)Jira.Value["summary"]; string ComponentsText = ""; System.Collections.ArrayList Components = (System.Collections.ArrayList)Jira.Value["components"]; foreach (Dictionary <string, object> Component in Components) { ComponentsText += (string)Component["name"]; ComponentsText += " "; } Dictionary <string, object> ResolutionFields = (Dictionary <string, object>)Jira.Value["resolution"]; string Resolution = ResolutionFields != null ? (string)ResolutionFields["name"] : ""; string FixVersionsText = ""; System.Collections.ArrayList FixVersions = (System.Collections.ArrayList)Jira.Value["fixVersions"]; foreach (Dictionary <string, object> FixVersion in FixVersions) { FixVersionsText += (string)FixVersion["name"]; FixVersionsText += " "; } int FixCL = Jira.Value["customfield_11200"] != null ? (int)(decimal)Jira.Value["customfield_11200"] : 0; NewBugg.JiraSummary = Summary; NewBugg.JiraComponentsText = ComponentsText; NewBugg.JiraResolution = Resolution; NewBugg.JiraFixVersionsText = FixVersionsText; if (FixCL != 0) { NewBugg.JiraFixCL = FixCL.ToString(); } break; } } } // Apply any user settings if (BuggsForm.Count > 0) { if (!string.IsNullOrEmpty(BuggsForm["SetStatus"])) { NewBugg.Status = BuggsForm["SetStatus"]; Buggs.SetBuggStatus(NewBugg.Status, id); } if (!string.IsNullOrEmpty(BuggsForm["SetFixedIn"])) { NewBugg.FixedChangeList = BuggsForm["SetFixedIn"]; Buggs.SetBuggFixedChangeList(NewBugg.FixedChangeList, id); } if (!string.IsNullOrEmpty(BuggsForm["SetTTP"])) { NewBugg.Jira = BuggsForm["SetTTP"]; Buggs.SetJIRAForBuggAndCrashes(NewBugg.Jira, id); } // <STATUS> } // Set up the view model with the crash data Model.Bugg = NewBugg; Model.Crashes = Crashes; Crash NewCrash = Model.Crashes.FirstOrDefault(); if (NewCrash != null) { using (FScopedLogTimer LogTimer2 = new FScopedLogTimer("CallstackTrimming")) { CallStackContainer CallStack = new CallStackContainer(NewCrash); // Set callstack properties CallStack.bDisplayModuleNames = DisplayModuleNames; CallStack.bDisplayFunctionNames = DisplayFunctionNames; CallStack.bDisplayFileNames = DisplayFileNames; CallStack.bDisplayFilePathNames = DisplayFilePathNames; CallStack.bDisplayUnformattedCallStack = DisplayUnformattedCallStack; Model.CallStack = CallStack; // Shorten very long function names. foreach (CallStackEntry Entry in Model.CallStack.CallStackEntries) { Entry.FunctionName = Entry.GetTrimmedFunctionName(128); } Model.SourceContext = NewCrash.SourceContext; } Model.Bugg.LatestCrashSummary = NewCrash.Summary; } Model.GenerationTime = LogTimer.GetElapsedSeconds().ToString("F2"); return(View("Show", Model)); } }
/// <summary> /// /// </summary> /// <returns></returns> public Dictionary<string, object> CreateGeneralIssue(JiraConnection jc) { var fields = new Dictionary<string, object>(); fields.Add("project", new Dictionary<string, object> { { "id", 11205 } }); // UE fields.Add("summary", "[CrashReport] " + ToJiraSummary); // Call Stack, Line 1 fields.Add("description", string.Join("\r\n", ToJiraDescriptions)); // Description fields.Add("issuetype", new Dictionary<string, object> { { "id", "1" } }); // Bug fields.Add("labels", new string[] { "crash", "liveissue" }); // <label>crash, live issue</label> fields.Add("customfield_11500", ToJiraFirstCLAffected); // Changelist # / Found Changelist fields.Add("environment", LatestOSAffected); // Platform // Components var SupportComponent = jc.GetNameToComponents()["Support"]; fields.Add("components", new object[] { SupportComponent }); // ToJiraVersions fields.Add("versions", ToJiraVersions); // ToJiraBranches fields.Add("customfield_12402", ToJiraBranches.ToList()); // NewBranchFoundIn // ToJiraPlatforms fields.Add("customfield_11203", ToJiraPlatforms); // Callstack customfield_11807 string JiraCallstack = "{noformat}" + string.Join("\r\n", ToJiraFunctionCalls) + "{noformat}"; fields.Add("customfield_11807", JiraCallstack); // Callstack string BuggLink = "http://crashreporter/Buggs/Show/" + Id; fields.Add("customfield_11205", BuggLink); return fields; }