Пример #1
0
        public void init(JiraServer server, string currentUserId, bool showAssignToMe)
        {
            jiraServer = server;

            ICollection <JiraUser> users = JiraServerCache.Instance.getUsers(server).getAllUsers();

            JiraUser selected = null;

            foreach (JiraUser user in users)
            {
                if (currentUserId != null && currentUserId.Equals(user.Id))
                {
                    selected = user;
                }
                comboUsers.Items.Add(user);
            }

            if (selected != null)
            {
                comboUsers.SelectedItem = selected;
            }

            checkAssignToMe.Visible = showAssignToMe;
            checkAssignToMe.Enabled = showAssignToMe;
            if (!showAssignToMe)
            {
                Height -= checkAssignToMe.Height + 10;
            }
        }
Пример #2
0
 public static bool Equals(object value1, string value2)
 {
     return(value1 != null && value1 switch
     {
         string actualStringValue => string.Equals(actualStringValue, value2,
                                                   StringComparison.InvariantCultureIgnoreCase),
         DateTime actualDateValue => actualDateValue == FilterParseHelpers.ParseJiraDate(value2),
         int actualIntValue => actualIntValue == int.Parse(value2, CultureInfo.InvariantCulture),
         decimal actualDecimalValue => actualDecimalValue ==
         decimal.Parse(value2, CultureInfo.InvariantCulture),
         float actualFloatValue => Math.Abs(actualFloatValue -
                                            float.Parse(value2, CultureInfo.InvariantCulture)) < 0.0001,
         double actualDoubleValue => Math.Abs(actualDoubleValue -
                                              double.Parse(value2, CultureInfo.InvariantCulture)) < 0.0001,
         long actualLongValue => actualLongValue == long.Parse(value2),
         JiraStatus actualStatusValue => actualStatusValue == value2,
         JiraIssueReference actualIssueReferenceValue => actualIssueReferenceValue == value2,
         JiraCustomFieldOption actualOptionValue => actualOptionValue == value2,
         JiraPriority actualPriorityValue => actualPriorityValue == value2,
         JiraProject actualProjectValue => actualProjectValue == value2,
         JiraUser actualUserValue => actualUserValue == value2,
         JiraIssueType actualIssueJiraType => actualIssueJiraType == value2,
         IEnumerable actualEnumerableValue => actualEnumerableValue.Cast <object>().Any(x => Equals(x, value2)),
         _ => false
     });
Пример #3
0
 public MockJira(string fakeJiraUrl, JiraUser authorizedUser,
                 IJiraIssueStore store, IJiraMetadataProvider metadataProvider)
 {
     this.store            = store;
     this.fakeJiraUrl      = fakeJiraUrl;
     this.authorizedUser   = authorizedUser;
     this.metadataProvider = metadataProvider;
 }
Пример #4
0
 public void Logout()
 {
     _jira         = null;
     Logon         = false;
     JiraUser      = null;
     Issues        = new List <IssueViewModel>();
     Username      = string.Empty;
     _userPassword = string.Empty;
 }
Пример #5
0
        private async void commitButton_Click(object sender, RoutedEventArgs e)
        {
            JiraUser newUser = new JiraUser();

            newUser.UserName   = userNameTextBox.Text;
            newUser.Password   = passBox.Password;
            newUser.ServerName = serverNameTextBox.Text;

            Jira jira = new Jira();

            myText.Text = await jira.CommitToJira(newUser);
        }
Пример #6
0
        //TODO: move this to jira client factory
        public async Task CreateJiraClient(string username, string password)
        {
            Username      = username;
            _userPassword = password;
            _jira         = Jira.CreateRestClient(_jiraUrl, Username, _userPassword);
            JiraUser      = await _jira.Users.GetUserAsync(username);

            if (JiraUser != null)
            {
                Logon = true;
            }
        }
Пример #7
0
        static void Main(string[] args)
        {
            VssConnection connection = new VssConnection(new Uri(Settings.Default.VstsURL), new VssBasicCredential(string.Empty, Settings.Default.VstsPAT));

            using (WorkItemTrackingHttpClient witClient = connection.GetClient <WorkItemTrackingHttpClient>())
            {
                Jira jiraConn = Jira.CreateRestClient(Settings.Default.JiraURL, Settings.Default.JiraUser, Settings.Default.JiraPassword);

                var issues = (from i in jiraConn.Issues.Queryable
                              orderby i.Created
                              select i).ToList();

                foreach (var issue in issues)
                {
                    JsonPatchDocument document = new JsonPatchDocument();
                    string            title    = $"{issue.Key} - {issue.Summary}";
                    title = title.Substring(0, Math.Min(title.Length, 128));
                    document.Add(new JsonPatchOperation {
                        Path = "/fields/System.Title", Value = title
                    });
                    if (issue.Description != null)
                    {
                        document.Add(new JsonPatchOperation {
                            Path = "/fields/System.Description", Value = issue.Description
                        });
                    }

                    JiraUser user = jiraConn.Users.SearchUsersAsync(issue.Reporter).Result.FirstOrDefault();
                    if (user != null)
                    {
                        document.Add(new JsonPatchOperation {
                            Path = "/fields/System.CreatedBy", Value = user.Email
                        });
                    }

                    var x = issue.CustomFields["Story points"]?.Values.FirstOrDefault() ?? "";
                    if (x != "")
                    {
                        document.Add(new JsonPatchOperation {
                            Path = "/fields/Microsoft.VSTS.Scheduling.StoryPoints", Value = x
                        });
                    }

                    const string project      = "Parrish Shoes";
                    const string workItemType = "User Story";
                    var          workItem     = witClient.CreateWorkItemAsync(document, project, workItemType).Result;
                }
            }
        }
Пример #8
0
 public Worker(
     Jira jira,
     JiraUser jiraUser,
     DriveService driveService,
     SheetsService sheetsService,
     Settings settings,
     IDictionary <string, string> googleDriveFolders)
 {
     _jira               = jira;
     _jiraUser           = jiraUser;
     _driveService       = driveService;
     _sheetsService      = sheetsService;
     _settings           = settings;
     _googleDriveFolders = googleDriveFolders;
 }
Пример #9
0
        private async void connectButton_Click(object sender, RoutedEventArgs e)
        {
            JiraUser newUser = new JiraUser();

            newUser.UserName   = userNameTextBox.Text;
            newUser.Password   = passBox.Password;
            newUser.ServerName = serverNameTextBox.Text;

            Jira jira = new Jira();

            myText.Text = await jira.LoginToJira(newUser);



            // if (jira.sessionValue != null)
            //     Frame.Navigate(typeof(JiraCommitPage));
        }
Пример #10
0
        public UserNode(JiraIssueListModel model, AbstractJiraServerFacade facade, JiraServer server, JiraUser user)
            : base(model, facade, server, user.ToString(), 0)
        {
            this.user = user;

            ContextMenuStrip = new ContextMenuStrip();

            worker = new AssigneeDropZoneWorker(Facade, Server, user);

            menuItems.Add(new ToolStripMenuItem("Open \"Assign to " + user + "\" Drop Zone", null, createDropZone));

            ContextMenuStrip.Items.Add("dummy");

            ContextMenuStrip.Items.AddRange(MenuItems.ToArray());

            ContextMenuStrip.Opening += contextMenuStripOpening;
            ContextMenuStrip.Opened  += contextMenuStripOpened;
        }
        private void addUser(object sender, EventArgs e)
        {
            AddUser      dlg    = new AddUser(Server);
            DialogResult result = dlg.ShowDialog();

            if (!result.Equals(DialogResult.OK))
            {
                return;
            }

            JiraUser user = dlg.Value;

            JiraServerCache.Instance.getUsers(Server).putUser(user);
            Nodes.Add(new UserNode(Model, Facade, Server, user));

            if (dlg.OpenDropZone)
            {
                DropZone.showDropZoneFor(Model, Server, Facade, new AssigneeDropZoneWorker(Facade, Server, user));
            }
        }
Пример #12
0
        public async void updateSubTask(string subTaskKey, string assignee)
        {
            IssueRef issueRef = new IssueRef();

            issueRef.key = subTaskKey;

            var issue = await JiraProxy.LoadIssue(issueRef);

            if (issue == null || issue.fields == null)
            {
                return;
            }

            // https://accelaeng.atlassian.net/rest/api/2/user/[email protected]
            JiraUser jiraUser = new JiraUser();

            jiraUser.name         = assignee;
            issue.fields.assignee = jiraUser;

            JiraProxy.UpdateSubTask(issue);
        }
Пример #13
0
		public JiraConnection(string url, string userName, string password, Converter<string, string> settings)
		{
			_rootUrl = url.TrimEnd('\\', '/');
			int offset = _rootUrl.LastIndexOf("/rpc/soap/jirasoapservice-v2");
			if (offset > 0)
				_rootUrl = _rootUrl.Substring(0, offset);

            _settings = settings;
			_knownUsers = new Dictionary<string, JiraUser>(StringComparer.OrdinalIgnoreCase);
			_lookupUsers = StringComparer.OrdinalIgnoreCase.Equals(settings("resolveUserNames"), "true");
			LoadUsers();
			_statuses = new Dictionary<string, JiraStatus>(StringComparer.Ordinal);

			_userName = userName;
			_password = password;
            _service = new CSharpTest.Net.SvnJiraIntegration.Jira.JiraSoapServiceService();
            _service.Url = _rootUrl + "/rpc/soap/jirasoapservice-v2";
            _service.UseDefaultCredentials = true;
            if (!String.IsNullOrEmpty(settings("jira:proxyurl")))
            {
                System.Net.ICredentials proxyAuth = System.Net.CredentialCache.DefaultCredentials;
                UriBuilder proxyuri = new UriBuilder(settings("jira:proxyurl"));
                if(!String.IsNullOrEmpty(proxyuri.UserName))
                {
                    proxyAuth = new System.Net.NetworkCredential(proxyuri.UserName, proxyuri.Password);
                    proxyuri.Password = proxyuri.UserName = String.Empty;
                }
                _service.Proxy = new System.Net.WebProxy(proxyuri.Uri);
                _service.Proxy.Credentials = proxyAuth;
            }

		    _token = null;

			Connect();
			_currentUser = GetUser(_userName);

			foreach (RemoteStatus rs in _service.getStatuses(_token))
				_statuses[rs.id] = new JiraStatus(rs);
		}
Пример #14
0
        internal JiraUser GetUser(string name)
        {
            JiraUser user;
            if (String.IsNullOrEmpty(name))
                return JiraUser.Unknown;

            if (!_knownUsers.TryGetValue(name, out user))
            {
                if(_lookupUsers)
                    _knownUsers.Add(name, user = new JiraUser(_service.getUser(_token, name)));
                else
                    _knownUsers.Add(name, user = new JiraUser(name, name));

                _store.Write(this.GetType().FullName, user.Id, user.Name);
                _store.Write(this.GetType().FullName, ALL_USERS_KEY,
                    String.Join(";", new List<String>(_knownUsers.Keys).ToArray()));
            }

            return user;
        }
Пример #15
0
            public DiscordHookMessage(DiscordBot bot, string eventType, JiraUser user, JiraIssue issue, JiraIssueIcons issueIcons, JiraComment comment)
            {
                username   = bot.Name;
                avatar_url = bot.AvatarUrl;
                List <DiscordAttachmentField> embedFields = null;

                if (!eventType.Contains("comment"))
                {
                    embedFields = new List <DiscordAttachmentField>()
                    {
                        new DiscordAttachmentField()
                        {
                            name  = "Summary",
                            value = issue.Summary
                        },

                        new DiscordAttachmentField()
                        {
                            name  = "Description",
                            value = issue.Description
                        },

                        new DiscordAttachmentField()
                        {
                            name   = "Assignee",
                            value  = issue.Assignee.Name,
                            inline = true
                        },

                        new DiscordAttachmentField()
                        {
                            name   = "Status",
                            value  = issue.Status,
                            inline = true
                        },

                        new DiscordAttachmentField()
                        {
                            name   = "Resolution",
                            value  = issue.Resolution,
                            inline = true
                        }
                    };
                }
                else
                {
                    if (comment.Contents == "" || comment.Id == "")
                    {
                        return;
                    }

                    embedFields = new List <DiscordAttachmentField>()
                    {
                        new DiscordAttachmentField()
                        {
                            name  = "Summary",
                            value = issue.Summary
                        },

                        new DiscordAttachmentField()
                        {
                            name  = "Comment",
                            value = comment.Contents
                        },

                        new DiscordAttachmentField()
                        {
                            name   = "Assignee",
                            value  = issue.Assignee.Name,
                            inline = true
                        },

                        new DiscordAttachmentField()
                        {
                            name   = "Status",
                            value  = issue.Status,
                            inline = true
                        },

                        new DiscordAttachmentField()
                        {
                            name   = "Resolution",
                            value  = issue.Resolution,
                            inline = true
                        }
                    };
                }

                if (embedFields == null)
                {
                    return;
                }

                // Set the color decimal value for the issue type - values taken from Jira's default icons
                int    embedColor;
                string footerText    = eventType.Replace("Issue", issue.Type);
                string footerIconUrl = "";

                switch (issue.Type)
                {
                case "Bug":
                    embedColor    = 15026490;                           // rgb: 229, 73, 58
                    footerIconUrl = issueIcons.BugIconURL;
                    break;

                case "Task":
                    embedColor    = 4959720;                            // rgb: 75, 173, 232
                    footerIconUrl = issueIcons.TaskIconURL;
                    break;

                case "Epic":
                    embedColor    = 9457378;                            // rgb: 144, 78, 226
                    footerIconUrl = issueIcons.EpicIconURL;
                    break;

                default:
                    embedColor = 8421504;                               // rgb: 128, 128, 128
                    break;
                }

                DiscordFooterField embedFooter = new DiscordFooterField()
                {
                    text     = footerText,
                    icon_url = footerIconUrl
                };

                embeds = new List <DiscordAttachment>()
                {
                    new DiscordAttachment()
                    {
                        author = new DiscordAuthorField()
                        {
                            name     = user.Name,
                            icon_url = user.AvatarUrl
                        },

                        color = embedColor,
                        title = eventType + " – (" + issue.Key + ") " + issue.Summary,
                        url   = issue.Url,
                        //description = eventType,

                        fields = embedFields,

                        footer    = embedFooter,
                        timestamp = issue.UpdatedTimestamp
                    }
                };
            }
Пример #16
0
        public void StartListening()
        {
            if (GetServerStatus() == ServerStatus.Running)
            {
                return;
            }
            Debug.WriteLine("In StartListening");

            SetServerStatus(ServerStatus.Running);

            while (true)
            {
                try
                {
                    listener = new HttpListener();
                    listener.Prefixes.Add(prefs.LocalIP);
                    listener.Start();
                }
                catch (Exception e)
                {
                    var msg = e.Message;
                    Trace.WriteLine(msg);
                }

                Trace.WriteLine("Listening...");

                if (stopListening)
                {
                    Debug.WriteLine("Time to stop listening.");
                    listener.Stop();
                    break;
                }

                HttpListenerContext context;
                HttpListenerRequest request;

                try
                {
                    context = listener.GetContext();
                    request = context.Request;
                }
                catch (HttpListenerException e)
                {
                    var msg = e.Message + "\n\n";
                    msg += "Either run this application as administrator, which you'll have to do every time it's started, or enter the following command (all in one line and without quotes) in an elevated command prompt, which you'll only have to do once: \n\n";
                    msg += "'netsh http add urlacl url=http://LOCAL_IP:PORT/ user=COMPUTER_NAME\\WIN_ACCOUNT_NAME'\n\n";
                    msg += "Change LOCAL_IP and PORT to the local IP and port to listen on, and COMPUTER_NAME and WIN_ACCOUNT_NAME to the computer name and Windows account username.";
                    Trace.WriteLine(msg);
                    MessageBox.Show(msg);
                    return;
                }
                catch (InvalidOperationException e)
                {
                    var msg = e.Message;
                    Trace.WriteLine(msg);
                    MessageBox.Show(msg);
                    return;
                }

                if (stopListening)
                {
                    Debug.WriteLine("Time to stop listening.");
                    listener.Stop();
                    break;
                }

                HttpListenerResponse response = context.Response;
                if (request.InputStream != null)
                {
                    using (var reader = new StreamReader(request.InputStream, Encoding.UTF8))
                    {
                        var     content   = reader.ReadToEnd();
                        dynamic json      = JObject.Parse(content);
                        var     eventType = "";
                        try
                        {
                            eventType = json.issue_event_type_name.Value;
                            eventType = eventType.Replace("_", " ");
                            eventType = eventType.First().ToString().ToUpper() + eventType.Substring(1);
                            Trace.WriteLine("Issue event type name: " + eventType);

                            if (eventType == "Issue generic")
                            {
                                eventType = "Issue moved to '" + json.issue.fields.status.name.Value + "'";
                            }
                        }
                        catch (Exception ex)
                        {
                            var msg = ex.Message;
                            Trace.WriteLine(msg);

                            eventType = json.webhookEvent.Value;
                            Trace.WriteLine("Webhook event: " + eventType);
                            return;
                        }

                        JiraUser user   = new JiraUser();
                        dynamic  author = null;
                        try
                        {
                            author    = json.user;
                            user.Name = json.user.displayName.Value;
                            //prefs.BotName = user.Name + " (JIRA)";
                        }
                        catch (Exception ex)
                        {
                            var msg = ex.Message;
                            Trace.WriteLine(msg);

                            author    = json.comment.author;
                            user.Name = json.comment.author.displayName.Value;
                            //prefs.BotName = user.Name + " (JIRA)";
                        }

                        JiraIssue   issue   = new JiraIssue();
                        JiraComment comment = new JiraComment();
                        try
                        {
                            comment.Contents = json.comment.body.Value;
                            comment.Id       = json.comment.id.Value;

                            issue.Key         = json.issue.key.Value;
                            issue.Url         = prefs.JiraBaseURL + issue.Key + "?focusedCommentId=" + comment.Id;
                            issue.Type        = json.issue.fields.issuetype.name.Value;
                            issue.Summary     = json.issue.fields.summary.Value;
                            issue.Description = json.issue.fields.description.Value;
                            issue.Status      = json.issue.fields.status.name.Value;
                            issue.Resolution  = json.issue.fields.resolution.Value;
                            if (issue.Resolution == null)
                            {
                                issue.Resolution = "Unresolved";
                            }
                            issue.Reporter = new JiraUser
                            {
                                Name      = json.issue.fields.reporter.displayName.Value,
                                AvatarUrl = ((json.issue.fields.reporter.avatarUrls as IEnumerable <object>).First() as dynamic).Value.Value
                            };
                            if (json.issue.fields.assignee == null)
                            {
                                issue.Assignee = new JiraUser {
                                    Name = "*Unassigned*"
                                };
                            }
                            else
                            {
                                issue.Assignee = new JiraUser
                                {
                                    Name      = json.issue.fields.assignee.displayName.Value,
                                    AvatarUrl = ((json.issue.fields.assignee.avatarUrls as IEnumerable <object>).First() as dynamic).Value.Value
                                };
                            }
                            issue.UpdatedTimestamp = json.issue.fields.updated.Value;
                        }
                        catch (Exception ex)
                        {
                            var msg = ex.Message;
                            Trace.WriteLine(msg);

                            issue.Key         = json.issue.key.Value;
                            issue.Url         = prefs.JiraBaseURL + issue.Key;
                            issue.Type        = json.issue.fields.issuetype.name.Value;
                            issue.Summary     = json.issue.fields.summary.Value;
                            issue.Description = json.issue.fields.description.Value;
                            issue.Status      = json.issue.fields.status.name.Value;
                            issue.Resolution  = json.issue.fields.resolution.Value;
                            if (issue.Resolution == null)
                            {
                                issue.Resolution = "Unresolved";
                            }
                            issue.Reporter = new JiraUser
                            {
                                Name      = json.issue.fields.reporter.displayName.Value,
                                AvatarUrl = ((json.issue.fields.reporter.avatarUrls as IEnumerable <object>).First() as dynamic).Value.Value
                            };
                            if (json.issue.fields.assignee == null)
                            {
                                issue.Assignee = new JiraUser {
                                    Name = "*Unassigned*"
                                };
                            }
                            else
                            {
                                issue.Assignee = new JiraUser
                                {
                                    Name      = json.issue.fields.assignee.displayName.Value,
                                    AvatarUrl = ((json.issue.fields.assignee.avatarUrls as IEnumerable <object>).First() as dynamic).Value.Value
                                };
                            }
                            issue.UpdatedTimestamp = json.issue.fields.updated.Value;
                        }
                        if (issue.Description != null && issue.Description != "")
                        {
                            // Convert code tags
                            issue.Description = issue.Description.Replace("{{", "```\n");
                            issue.Description = issue.Description.Replace("}}", "\n```");
                            issue.Description = issue.Description.Replace("{code}\r\n", "```\n");
                            issue.Description = issue.Description.Replace("\r\n{code}", "\n```");

                            // Remove bold formatting
                            issue.Description = issue.Description.Replace("*", "");

                            // Trim length
                            if (issue.Description.Length > 250)
                            {
                                issue.Description = issue.Description.Substring(0, 250);

                                // Is there an odd number of code tags?
                                int numTags = Regex.Matches(issue.Description, "```").Count;
                                if (numTags % 2 != 0)
                                {
                                    // Close the last tag
                                    issue.Description += " ...\n```" + "\n([see full description](" + issue.Url + "))";
                                }
                                else
                                {
                                    issue.Description += " ... ([see full description](" + issue.Url + "))";
                                }
                            }
                        }
                        else
                        {
                            issue.Description = "*No description*";
                        }

                        try
                        {
                            user.AvatarUrl = ((author.avatarUrls as IEnumerable <object>).First() as dynamic).Value.Value;
                        }
                        catch (Exception ex)
                        {
                            var msg = ex.Message;
                            Trace.WriteLine(msg);
                        }

                        DiscordBot bot = new DiscordBot
                        {
                            Name      = prefs.BotName,
                            AvatarUrl = prefs.JiraIconURL
                        };

                        JiraIssueIcons issueIcons = new JiraIssueIcons
                        {
                            BugIconURL  = prefs.BugIconURL,
                            TaskIconURL = prefs.TaskIconURL,
                            EpicIconURL = prefs.EpicIconURL
                        };

                        Trace.WriteLine("Got webhook event '" + eventType + "' [" + issue.Summary + "]" + " by " + user.Name);

                        try
                        {
                            var discordMessage     = new DiscordHookMessage(bot, eventType, user, issue, issueIcons, comment);
                            var discordMessageJSON = JsonConvert.SerializeObject(discordMessage, Formatting.Indented);
                            var resp = client.PostAsync(prefs.DiscordURL, new StringContent(discordMessageJSON, Encoding.UTF8, "application/json")).Result;
                            Trace.WriteLine("Discord response code: " + resp.StatusCode);
                        }
                        catch (Exception ex)
                        {
                            var msg = ex.Message;
                            Trace.WriteLine(msg);
                            //MessageBox.Show(msg);
                        }
                    }
                }
                try
                {
                    using (var writer = new StreamWriter(response.OutputStream))
                    {
                        writer.Write("Hello world!");
                        writer.Close();
                    }

                    listener.Stop();
                }
                catch (IOException ex)
                {
                    var msg = ex.Message;
                    Trace.WriteLine(msg);
                }
                catch (ObjectDisposedException ex)
                {
                    var msg = ex.Message;
                    Trace.WriteLine(msg);
                }
            }
        }
Пример #17
0
 public AssigneeDropZoneWorker(AbstractJiraServerFacade facade, JiraServer server, JiraUser user)
 {
     this.facade = facade;
     this.server = server;
     this.user   = user;
 }
Пример #18
0
 public static IMockJira File(string folderPath, string fakeHostUrl, JiraUser authorizedUser,
                              IJiraMetadataProvider metadataProvider)
 {
     return(new MockJira(fakeHostUrl, authorizedUser, new FileJiraIssueStore(folderPath), metadataProvider));
 }
Пример #19
0
 public User(JiraUser user) : base(user.Username)
 {
     ExtractUserInfo(user.DisplayName, out myName, out myDepartment);
     myEmail = user.Email;
 }
Пример #20
0
        private async Task StartReview(string date, string ticketUrl)
        {
            ticketUrl = ticketUrl.Trim();
            var match = JiraUrlRegex.Match(ticketUrl);

            if (!match.Success)
            {
                match = JiraKeyRegex.Match(ticketUrl);
                if (!match.Success)
                {
                    throw new ReviewException("Unknown jira ticket or jira issue key");
                }

                ticketUrl = $"https://jira.devfactory.com/browse/{ticketUrl}";
            }

            var issueKey = match.Groups[1].Value;

            Console.Write("Get ticket... ");
            _issue = await _jira.Issues.GetIssueAsync(issueKey);

            if (string.IsNullOrWhiteSpace(_issue.Assignee))
            {
                Console.WriteLine("done");
                throw new ReviewException("Assignee is empty");
            }

            _prAuthor = await _jira.Users.GetUserAsync(_issue.Assignee);

            Console.WriteLine("done");

            var issueStatus = _issue.Status.ToString();

            if (issueStatus != "Ready For Review" && issueStatus != "Code Review")
            {
                throw new ReviewException($"Unknown ticket state: {_issue.Status}");
            }

            Console.Write("Make checks... ");
            var failedChecks = AdditionalChecks.Make(_issue);

            Console.WriteLine("done");

            if (failedChecks.Any())
            {
                ConsoleHelper.WriteLineColor("Failed checks: ", ConsoleColor.Yellow);

                foreach (var failedCheck in failedChecks)
                {
                    ConsoleHelper.WriteLineColor(" * " + failedCheck, ConsoleColor.Yellow);
                }
            }

            Console.Write("Set peer reviewer... ");
            if (_issue.CustomFields["Peer reviewer"] == null)
            {
                _issue.CustomFields.Add("Peer reviewer", _jiraUser.Username);
                await _jira.Issues.UpdateIssueAsync(_issue);

                // Need to reload ticket. Otherwise we can't move it forward to the next status
                _issue = await _jira.Issues.GetIssueAsync(issueKey);

                Console.WriteLine("done");
            }
            else
            {
                var reviewer = _issue.CustomFields["Peer reviewer"].Values.First();
                Console.WriteLine($"already set to {reviewer}");
                if (reviewer != _jiraUser.Username)
                {
                    throw new ReviewException($"Ticket is already assigned to {reviewer}");
                }
            }

            if (issueStatus == "Ready For Review")
            {
                Console.Write("Start review... ");
                await _issue.WorkflowTransitionAsync("Start Review");

                Console.WriteLine("done");
            }

            var prUrl = _issue["Code Review Ticket URL"].ToString();

            if (!GithubHelper.ParsePrUrl(prUrl, out _prInfo))
            {
                throw new ReviewException($"Invalid PR url: {prUrl}");
            }

            var qbFolder   = _prInfo.RepoName;
            var qbFileName = $"{_issue.Key} {date}";

            if (!_googleDriveFolders.ContainsKey(qbFolder))
            {
                Console.Write("Get QB folder id... ");
                var qbFolderId = GetQbFolderId(qbFolder);
                _googleDriveFolders.Add(qbFolder, qbFolderId);
                Console.WriteLine("done");
            }

            Console.Write("Create QB file... ");
            _qbFile = CreateQbFile(qbFolder, qbFileName);
            Console.WriteLine("done");

            Console.Write("Fill QB file... ");
            FillQbSummary(ticketUrl, prUrl, _prAuthor.DisplayName);
            FillQbSheets(_issue.Type.ToString(), _issue.Summary.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) ? "csharp" : "java");
            Console.WriteLine("done");
        }
Пример #21
0
 private void LoadUsers()
 {
     string usersList;
     if (_store.Read(this.GetType().FullName, ALL_USERS_KEY, out usersList))
     {
         foreach (string suser in usersList.Split(';'))
         {
             if (_lookupUsers)
             {
                 string fullName;
                 if (_store.Read(this.GetType().FullName, suser, out fullName))
                     _knownUsers[suser] = new JiraUser(suser, fullName);
             }
             else
                 _knownUsers[suser] = new JiraUser(suser, suser);
         }
     }
 }
Пример #22
0
        private async void btnAssign_Click(object sender, EventArgs e)
        {
            this.btnAssign.Enabled = false;

            DataTable dataTable = dgvWorkLogReport.DataSource as DataTable;

            if (dataTable != null)
            {
                string Name            = "";
                string EmailAddress    = "";
                string Effort          = "";
                string SubTaskID       = "";
                string SubTaskSummary  = "";
                string SubTaskAssignee = "";
                string SubTaskComment  = "";
                string JiraKey         = "";
                string JiraSummary     = "";

                int rowCount = dataTable.Rows.Count;
                for (int k = 0; k < rowCount; k++)
                {
                    DataRow row = dataTable.Rows[k];

                    Name            = row["Name"] as string;
                    EmailAddress    = row["EmailAddress"] as string;
                    Effort          = row["Effort"] as string;
                    SubTaskID       = row["SubTaskID"] as string;
                    SubTaskSummary  = row["SubTaskSummary"] as string;
                    SubTaskAssignee = row["SubTaskAssignee"] as string;
                    SubTaskComment  = row["SubTaskComment"] as string;
                    JiraKey         = row["JiraKey"] as string;
                    JiraSummary     = row["JiraSummary"] as string;

                    if (!String.IsNullOrEmpty(SubTaskID) &&
                        !Name.Equals(SubTaskAssignee, StringComparison.InvariantCultureIgnoreCase))
                    {
                        IssueRef issueRef = new IssueRef();
                        issueRef.key = SubTaskID;

                        var issue = await JiraProxy.LoadIssue(issueRef);

                        if (issue == null || issue.fields == null)
                        {
                            return;
                        }

                        // https://accelaeng.atlassian.net/rest/api/2/user/[email protected]
                        JiraUser jiraUser = new JiraUser();

                        if ("*****@*****.**" == EmailAddress)
                        {
                            EmailAddress = "likko.zhang";
                        }
                        jiraUser.name         = EmailAddress;
                        issue.fields.assignee = jiraUser;

                        JiraProxy.UpdateSubTask(issue);
                    }
                }
            }

            this.btnAssign.Enabled = true;
        }
Пример #23
0
        public JiraConnection(string url, string userName, string password, Converter<string, string> settings)
        {
            Log.Verbose("Creating a new connection");
            _rootUrl = url.TrimEnd('\\', '/');
            int offset = _rootUrl.LastIndexOf("/rpc/soap/jirasoapservice-v2");
            if (offset > 0)
                _rootUrl = _rootUrl.Substring(0, offset);

            Log.Info("Root Url: {0}", _rootUrl);
            _settings = settings;
            _knownUsers = new Dictionary<string, JiraUser>(StringComparer.OrdinalIgnoreCase);
            _lookupUsers = StringComparer.OrdinalIgnoreCase.Equals(settings("resolveUserNames"), "true");
            Log.Info("LookUp Users: {0}", _lookupUsers);

            LoadUsers();
            _statuses = new Dictionary<string, JiraStatus>(StringComparer.Ordinal);

            _userName = userName;
            _password = password;
            Log.Verbose("Creating a new internal Soap Service");
            _service = new JiraSoapServiceService();
            Log.Verbose("Service Created");
            _service.Url = _rootUrl + "/rpc/soap/jirasoapservice-v2";
            _service.UseDefaultCredentials = true;
            if (!String.IsNullOrEmpty(settings("jira:proxyurl")))
            {
                ICredentials proxyAuth = CredentialCache.DefaultCredentials;
                var proxyuri = new UriBuilder(settings("jira:proxyurl"));
                if (!String.IsNullOrEmpty(proxyuri.UserName))
                {
                    proxyAuth = new NetworkCredential(proxyuri.UserName, proxyuri.Password);
                    proxyuri.Password = proxyuri.UserName = String.Empty;
                }
                _service.Proxy = new WebProxy(proxyuri.Uri);
                _service.Proxy.Credentials = proxyAuth;
            }

            _token = null;

            Log.Verbose("Connecting...");
            Connect();
            Log.Verbose("Connection Successfull");
            _currentUser = GetUser(_userName);

            Log.Verbose("Getting Statuses");
            foreach (RemoteStatus rs in _service.getStatuses(_token))
                _statuses[rs.id] = new JiraStatus(rs);

            Log.Verbose("Finished creating a new connection");
        }
Пример #24
0
 public static IMockJira InMemory(string fakeHostUrl, JiraUser authorizedUser,
                                  IJiraMetadataProvider metadataProvider)
 {
     return(new MockJira(fakeHostUrl, authorizedUser, new InMemoryJiraIssueStore(), metadataProvider));
 }
Пример #25
0
        private async void btnSync_Click(object sender, EventArgs e)
        {
            this.btnSync.Enabled = false;

            if (jiraIssueList == null || jiraIssueList.Count <= 0)
            {
                this.btnSync.Enabled = true;
                return;
            }

            foreach (var issue in jiraIssueList)
            {
                if (issue.subtasks == null || issue.subtasks.Count <= 0)
                {
                    continue;
                }

                foreach (var key in issue.subtasks.Keys)
                {
                    var subTask = issue.subtasks[key];

                    IssueRef issueRef = new IssueRef();
                    issueRef.key = subTask.key;
                    issueRef.id  = subTask.key;

                    if (subTask == null ||
                        subTask.timespent <= 0 ||
                        subTask.worklogs == null ||
                        subTask.worklogs.Count <= 0)
                    {
                        continue;
                    }

                    var lastWorkLog = subTask.worklogs[subTask.worklogs.Count - 1];
                    var lastAssigneeEmailAddress = lastWorkLog.assigneeEmailAddress;

                    var subTaskItem = await JiraProxy.LoadIssue(issueRef);

                    if (subTaskItem == null || subTaskItem.fields == null)
                    {
                        continue;
                    }

                    if (subTask.assignee == "Jerry Lu")
                    {
                        // https://accelaeng.atlassian.net/rest/api/2/user/[email protected]
                        JiraUser jiraUser = new JiraUser();

                        if ("*****@*****.**" == lastAssigneeEmailAddress)
                        {
                            lastAssigneeEmailAddress = "likko.zhang";
                        }
                        jiraUser.name = lastAssigneeEmailAddress;
                        subTaskItem.fields.assignee = jiraUser;

                        JiraProxy.UpdateSubTask(subTaskItem);
                    }

                    if ("Closed".Equals(issue.status, StringComparison.InvariantCultureIgnoreCase) &&
                        !"Closed".Equals(subTask.status, StringComparison.InvariantCultureIgnoreCase))
                    {
                        if ("Case".Equals(issue.issueType, StringComparison.InvariantCultureIgnoreCase))
                        {
                            if ("Review and Recreate(QA)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Review and Recreate(Dev)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Research Root Cause".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase))
                            {
                                JiraProxy.CloseSubTask(issueRef);
                            }
                        }

                        if ("Bug".Equals(issue.issueType, StringComparison.InvariantCultureIgnoreCase))
                        {
                            if ("Review and Recreate(QA)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Review and Recreate(Dev)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Research Root Cause".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Code Fix(Dev)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Write Test Case(QA)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Execute Test Case(QA)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Write Release Notes(Dev)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase) ||
                                "Review Release Notes(QA)".Equals(subTask.name, StringComparison.InvariantCultureIgnoreCase))
                            {
                                JiraProxy.CloseSubTask(issueRef);
                            }
                        }
                    }
                }
            }

            this.btnSync.Enabled = true;
        }