コード例 #1
0
        public void InitializeTest()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            this.tracker = new IssueTracker();

            this.issue1 = new Issue(
                "Not possible to practise in judge.", 
                "Judge system is not working. Not possible to log in.", 
                IssuePriority.High, 
                new List<string> { "judge", "softuni" });

            this.issue2 = new Issue(
                "Not possible to practise in judge, again.", 
                "Judge system is not working, again. Not possible to log in.", 
                IssuePriority.Low, 
                new List<string> { "judge", "softuni" });

            this.user1 = new User("Helen", "0123");
            this.user2 = new User("Gosho", "0124");

            this.comment1 = new Comment(
                this.user2, 
                "The system is not working from yesterday, but they made new website and it will take a while till it starts working correctly.");
            this.comment2 = new Comment(this.user1, "Ok, thanks. I heard of that. Hope soon can practice, again.");

            this.issue1.Comments = new List<Comment> { this.comment1, this.comment2 };
        }
コード例 #2
0
 public void AddIssueTracker(IIssueTracker issueTracker)
 {
     lock (issueTrackers)
     {
         issueTrackers.Add(issueTracker);
     }
 }
コード例 #3
0
 public void RemoveIssueTracker(IIssueTracker issueTracker)
 {
     lock (issueTrackers)
     {
         issueTrackers.Remove(issueTracker);
     }
 }
コード例 #4
0
        public static IIssueTracker CreateIssueTracker(Parameters parameters)
        {
            IIssueTracker tracker = null;

            if (String.IsNullOrEmpty(parameters.Tracker) || parameters.Tracker.ToUpper() == "GITHUB")
            {
                tracker = new GitHubIssueTracker(parameters);
            }
            else
            {
                try
                {
                    var trackerUri = new Uri(parameters.Tracker);
                    if (trackerUri.Host.ToLower().EndsWith("github.com"))
                    {
                        tracker = new GitHubIssueTracker(parameters);
                    }
                    else
                    {
                        tracker = new GitLabIssueTracker(parameters);
                    }
                }
                catch (UriFormatException ex)
                {
                    Logger.LogMessageWithData("Issue Tracker Uri parsing exception: " + ex);
                }
            }

            return(tracker);
        }
コード例 #5
0
        public static SemanticReleaseNotes GenerateReleaseNotes(
            IRepository gitRepo, IIssueTracker issueTracker, SemanticReleaseNotes previousReleaseNotes,
            Categories categories, TaggedCommit tagToStartFrom, ReleaseInfo currentReleaseInfo,
            string diffUrlFormat)
        {
            var releases        = ReleaseFinder.FindReleases(gitRepo, tagToStartFrom, currentReleaseInfo);
            var findIssuesSince =
                IssueStartDateBasedOnPreviousReleaseNotes(gitRepo, previousReleaseNotes)
                ??
                tagToStartFrom.Commit.Author.When;

            var closedIssues = issueTracker.GetClosedIssues(findIssuesSince).ToArray();

            var semanticReleases = (
                from release in releases
                let releaseNoteItems = closedIssues
                                       .Where(i => (release.When == null || i.DateClosed < release.When) && (release.PreviousReleaseDate == null || i.DateClosed > release.PreviousReleaseDate))
                                       .Select(i => new ReleaseNoteItem(i.Title, i.Id, i.HtmlUrl, i.Labels, i.DateClosed, i.Contributors))
                                       .ToList <IReleaseNoteLine>()
                                       let beginningSha = release.FirstCommit == null ? null : release.FirstCommit.Substring(0, 10)
                                                          let endSha = release.LastCommit == null ? null : release.LastCommit.Substring(0, 10)
                                                                       select new SemanticRelease(release.Name, release.When, releaseNoteItems, new ReleaseDiffInfo
            {
                BeginningSha = beginningSha,
                EndSha = endSha,
                DiffUrlFormat = diffUrlFormat
            })).ToList();

            return(new SemanticReleaseNotes(semanticReleases, categories).Merge(previousReleaseNotes));
        }
コード例 #6
0
ファイル: IssueBrowserDialog.cs プロジェクト: Maxhy/TurtleHub
        public IssueBrowserDialog(Parameters parameters)
        {
            Logger.LogMessageWithData("IssueBrowserDialog()");

            InitializeComponent();

            // Set the icons here instead of them being stored in the resource file multiple times
            this.Icon             = Properties.Resources.TurtleHub;
            updateNotifyIcon.Icon = Properties.Resources.TurtleHub;

            this.parameters = parameters;

            checkBoxShowPrs.Checked = parameters.ShowPrsByDefault;

            Text = string.Format(Text, parameters.Repository);

            // Wrap the objectlistview and set the aspects appropriately
            issuelistview = new TypedObjectListView <TurtleIssue>(this.objectListView1);
            issuelistview.GetColumn(0).AspectGetter = delegate(TurtleIssue x) { return(x.Number); };
            issuelistview.GetColumn(1).AspectGetter = delegate(TurtleIssue x) { return(x.Title); };
            issuelistview.GetColumn(2).AspectGetter = delegate(TurtleIssue x) { return(x.Creator); };
            issuelistview.GetColumn(3).AspectGetter = delegate(TurtleIssue x) { return(x.Assignee); };

            // Start the tracker magic
            tracker = IssueTrackerFactory.CreateIssueTracker(parameters);
        }
コード例 #7
0
        public static SemanticReleaseNotes GenerateReleaseNotes(Context context,
            IRepository gitRepo, IIssueTracker issueTracker, SemanticReleaseNotes previousReleaseNotes,
            Categories categories, TaggedCommit tagToStartFrom, ReleaseInfo currentReleaseInfo)
        {
            var releases = ReleaseFinder.FindReleases(gitRepo, tagToStartFrom, currentReleaseInfo);
            var findIssuesSince =
                IssueStartDateBasedOnPreviousReleaseNotes(gitRepo, previousReleaseNotes)
                ??
                tagToStartFrom.Commit.Author.When;

            var closedIssues = issueTracker.GetClosedIssues(context.IssueTracker, findIssuesSince).ToArray();

            var semanticReleases = (
                from release in releases
                let releaseNoteItems = closedIssues
                    .Where(i => (release.When == null || i.DateClosed < release.When) && (release.PreviousReleaseDate == null || i.DateClosed > release.PreviousReleaseDate))
                    .Select(i => new ReleaseNoteItem(i.Title, i.Id, i.HtmlUrl, i.Labels, i.DateClosed, i.Contributors))
                    .ToList<IReleaseNoteLine>()
                let beginningSha = release.FirstCommit == null ? null : release.FirstCommit.Substring(0, 10)
                let endSha = release.LastCommit == null ? null : release.LastCommit.Substring(0, 10)
                select new SemanticRelease(release.Name, release.When, releaseNoteItems, new ReleaseDiffInfo
                {
                    BeginningSha = beginningSha,
                    EndSha = endSha,
                    //DiffUrlFormat = issueTracker.DiffUrlFormat
                })).ToList();

            return new SemanticReleaseNotes(semanticReleases, categories).Merge(previousReleaseNotes);
        }
コード例 #8
0
        public IssueTagger(IIssueTracker issueTracker)
        {
            this.IssueTracker = issueTracker;
            this.issues       = issueTracker.LastIssues;

            issueTracker.AddTagger(this);
        }
コード例 #9
0
        public void Build(out IRepository repo, out IIssueTracker issueTracker)
        {
            var commits      = new List <Commit>();
            var tags         = new List <Tag>();
            var closedIssues = new List <Issue>();

            repo         = Substitute.For <IRepository>();
            issueTracker = Substitute.For <IIssueTracker>();

            commits.Add(CreateCommit(_initialCommitTime));
            var currentDate = _initialCommitTime.AddDays(1);

            foreach (var release in _releases)
            {
                // Create a commit, which *fixes* all the closed issues in the release
                commits.Add(CreateCommit(currentDate));

                // Create closed issues
                foreach (var issue in release.Item2)
                {
                    issue.DateClosed = currentDate;
                    closedIssues.Add(issue);
                }

                // Create commit which completes the release, and tag that commit
                currentDate = currentDate.AddDays(1);
                var commit = CreateCommit(currentDate);
                commits.Add(commit);
                tags.Add(CreateTag(commit, release.Item1));
                currentDate = currentDate.AddDays(1);
            }
            foreach (var additionalIssue in _additionalIssues)
            {
                closedIssues.Add(new Issue(GetNextId())
                {
                    DateCreated = currentDate,
                    Title       = additionalIssue,
                    IssueType   = IssueType.Issue
                });
                var commit = CreateCommit(currentDate);
                commits.Add(commit);
            }

            SubstituteCommitLog(repo, commits, tags);

            var filter = new IssueTrackerFilter
            {
                IncludeClosed = true
            };

            var issuesTask = issueTracker.GetIssuesAsync(filter);
            var issues     = issuesTask.Result;

            issues.Returns(c => closedIssues.Where(i => c.Arg <DateTimeOffset?>() == null || i.DateClosed > c.Arg <DateTimeOffset?>()));
        }
コード例 #10
0
        public void TestRegisterUserWithWrongConfirmPassword()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            var expected = this.issueTracker.RegisterUser(username, password, "1111111111111");

            Assert.AreEqual(expected, "The provided passwords do not match");
        }
コード例 #11
0
        public void Build(out IRepository repo, out IIssueTracker issueTracker)
        {
            var commits = new List<Commit>();
            var tags = new List<Tag>();
            var closedIssues = new List<Issue>();
            repo = Substitute.For<IRepository>();
            issueTracker = Substitute.For<IIssueTracker>();

            commits.Add(CreateCommit(_initialCommitTime));
            var currentDate = _initialCommitTime.AddDays(1);

            foreach (var release in _releases)
            {
                // Create a commit, which *fixes* all the closed issues in the release
                commits.Add(CreateCommit(currentDate));

                // Create closed issues
                foreach (var issue in release.Item2)
                {
                    issue.DateClosed = currentDate;
                    closedIssues.Add(issue);
                }

                // Create commit which completes the release, and tag that commit
                currentDate = currentDate.AddDays(1);
                var commit = CreateCommit(currentDate);
                commits.Add(commit);
                tags.Add(CreateTag(commit, release.Item1));
                currentDate = currentDate.AddDays(1);
            }
            foreach (var additionalIssue in _additionalIssues)
            {
                closedIssues.Add(new Issue(GetNextId())
                {
                    DateCreated = currentDate,
                    Title = additionalIssue,
                    IssueType = IssueType.Issue
                });
                var commit = CreateCommit(currentDate);
                commits.Add(commit);
            }

            SubstituteCommitLog(repo, commits, tags);

            var filter = new IssueTrackerFilter
            {
                IncludeClosed = true
            };

            var issuesTask = issueTracker.GetIssuesAsync(filter);
            var issues = issuesTask.Result;

            issues.Returns(c => closedIssues.Where(i => c.Arg<DateTimeOffset?>() == null || i.DateClosed > c.Arg<DateTimeOffset?>()));
        }
コード例 #12
0
        public void TestRegisterUserWithValidUsernameAndPassword()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            var expected = this.issueTracker.RegisterUser(username, password, password);

            Assert.AreEqual(expected, string.Format("User {0} registered successfully", username));
        }
コード例 #13
0
        public void RemoveIssueTracker(IIssueTracker issueTracker)
        {
            lock (managers)
            {
                issueTrackers.Remove(issueTracker);

                foreach (var manager in managers)
                {
                    manager.RemoveFactory(issueTracker.Factory);
                }
            }
        }
コード例 #14
0
        public void TestLoginUserValid()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            this.issueTracker.RegisterUser(username, password, password);
            var expected = this.issueTracker.LoginUser(username, password);

            Assert.AreEqual(expected, string.Format("User {0} logged in successfully", username));
        }
コード例 #15
0
        public void TestRegisterUserWithDublicateName()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            this.issueTracker.RegisterUser(username, password, password);
            var expected = this.issueTracker.RegisterUser(username, "asdasdasd", "asdasdasd");

            Assert.AreEqual(expected, string.Format("A user with username {0} already exists", username));
        }
コード例 #16
0
        public void AddIssueTracker(IIssueTracker issueTracker)
        {
            lock (managers)
            {
                issueTrackers.Add(issueTracker);

                foreach (var manager in managers)
                {
                    manager.AddFactory(issueTracker.Factory);
                }
            }
        }
コード例 #17
0
        public void TestRegisterUserWhileAnotherUserIsLoggedIn()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            this.issueTracker.RegisterUser(username, password, password);
            this.issueTracker.LoginUser(username, password);
            var expected = this.issueTracker.RegisterUser(username + "OPA", "1231231213132", "1231231213132");

            Assert.AreEqual(expected, "There is already a logged in user");
        }
コード例 #18
0
 private static bool TryRemote(Repository gitRepository, string name, ReleaseNotesGenerationParameters context,
     out IIssueTracker issueTracker)
 {
     var upstream = gitRepository.Network.Remotes[name];
     if (upstream == null)
     {
         issueTracker = null;
         return false;
     }
     return IssueTrackerFactory.TryCreateIssueTrackerFromUrl(
         upstream.Url,
         context.IssueTracker.Authentication.ToIssueTrackerSettings(),
         out issueTracker);
 }
コード例 #19
0
        public async Task <SemanticReleaseNotes> GenerateReleaseNotesAsync(SemanticReleaseNotes releaseNotesToUpdate)
        {
            var           gitRepository  = new Repository(Repository.Discover(_generationParameters.WorkingDirectory));
            IIssueTracker issueTracker   = null;
            var           categories     = new Categories(_generationParameters.Categories, _generationParameters.AllLabels);
            var           tagToStartFrom = _generationParameters.AllTags
                ? gitRepository.GetFirstCommit()
                : gitRepository.GetLastTaggedCommit() ?? gitRepository.GetFirstCommit();
            var currentReleaseInfo = gitRepository.GetCurrentReleaseInfo();

            if (!string.IsNullOrEmpty(_generationParameters.Version))
            {
                currentReleaseInfo.Name = _generationParameters.Version;
                currentReleaseInfo.When = DateTimeOffset.Now;
            }
            else
            {
                currentReleaseInfo.Name = "vNext";
            }

            if (_generationParameters.UseIssueTracker)
            {
                if (_generationParameters.IssueTracker.Type.HasValue)
                {
                    issueTracker = IssueTrackerFactory.CreateIssueTracker(new IssueTrackerSettings(_generationParameters.IssueTracker.Server,
                                                                                                   _generationParameters.IssueTracker.Type.Value)
                    {
                        Project        = _generationParameters.IssueTracker.ProjectId,
                        Authentication = _generationParameters.IssueTracker.Authentication.ToIssueTrackerSettings()
                    });
                }
                else
                {
                    if (!TryRemote(gitRepository, "upstream", _generationParameters, out issueTracker) &&
                        !TryRemote(gitRepository, "origin", _generationParameters, out issueTracker))
                    {
                        throw new Exception("Unable to guess issue tracker through remote, specify issue tracker type on the command line");
                    }
                }
            }


            var releaseNotes = _generationParameters.UseIssueTracker ? await GenerateReleaseNotesAsync(_generationParameters, gitRepository, issueTracker, releaseNotesToUpdate, categories, tagToStartFrom, currentReleaseInfo)
                : await GenerateReleaseNotesAsync(
                _generationParameters, gitRepository,
                releaseNotesToUpdate, categories,
                tagToStartFrom, currentReleaseInfo);

            return(releaseNotes);
        }
コード例 #20
0
        private static bool TryRemote(Repository gitRepository, string name, ReleaseNotesGenerationParameters context,
                                      out IIssueTracker issueTracker)
        {
            var upstream = gitRepository.Network.Remotes[name];

            if (upstream == null)
            {
                issueTracker = null;
                return(false);
            }
            return(IssueTrackerFactory.TryCreateIssueTrackerFromUrl(
                       upstream.Url,
                       context.IssueTracker.Authentication.ToIssueTrackerSettings(),
                       out issueTracker));
        }
コード例 #21
0
        public void InitializeTest()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            this.tracker = new IssueTracker();

            this.issue1 = new Issue(
                "Not possible to practise in judge.",
                "Judge system is not working. Not possible to log in.",
                IssuePriority.High,
                new List<string> { "judge", "softuni" });

            this.user1 = new User("Helen", "0123");

            this.comment1 = new Comment(this.user1, "Can someone answer, please.");
            this.comment2 = new Comment(this.user1, "There is still no answer :(");

            this.issue1.Comments = new List<Comment> { this.comment1, this.comment2 };
        }
コード例 #22
0
ファイル: MainForm.cs プロジェクト: peolsson/git-changelog
        private void RefreshFromSettings()
        {
            if (!Directory.Exists(Properties.Settings.Default.GitRepositoryPath + @"\.git"))
            {
                MessageBox.Show("Invalid Git repository path: " + Properties.Settings.Default.GitRepositoryPath);
                return;
            }

            try
            {
                var issues = new IssueTrackerJira(Properties.Settings.Default.JiraHost, Properties.Settings.Default.JiraUsername, Properties.Settings.Default.JiraPassword, Properties.Settings.Default.JiraProject);
                issues.Open();
            }
            catch (Exception e)
            {
                MessageBox.Show("Invalid Jira settings :: " + e.Message);
                return;
            }

            // Reinitialize the repository
            _repo.Close();
            _repo.Open(Properties.Settings.Default.GitRepositoryPath);

            // Reinit Jira stuff
            _issues = new IssueTrackerJira(Properties.Settings.Default.JiraHost, Properties.Settings.Default.JiraUsername, Properties.Settings.Default.JiraPassword, Properties.Settings.Default.JiraProject);
            _issues.Open();

            InitializeComboBoxes();

            if (Properties.Settings.Default.JiraMatchPrefix != null && Properties.Settings.Default.JiraMatchPrefix.Length > 0)
            {
                _matchPrefix = @"(?<Identifier>" + Properties.Settings.Default.JiraMatchPrefix + ")";
            }
            else
            {
                _matchPrefix = "";
            }
        }
コード例 #23
0
 public void Initialize()
 {
     this.database = new Database();
     this.issueTracker = new IssueTracker(this.database);
     this.userTracker = new UserTracker(this.database);
 }
コード例 #24
0
 public EndpointActionDispatcher(IIssueTracker issueTracker)
 {
     this.IssueTracker = issueTracker;
 }
コード例 #25
0
        private static void PublishReleaseIfNeeded(string releaseNotesOutput, GitReleaseNotesArguments arguments, IIssueTracker issueTracker)
        {
            if (!arguments.Publish)
                return;

            Console.WriteLine("Publishing release {0} to {1}", arguments.Version, arguments.IssueTracker);
            issueTracker.PublishRelease(releaseNotesOutput);
        }
コード例 #26
0
 public void InitRegisterUser()
 {
     this.tracker = new IssueTracker();
 }
コード例 #27
0
 public EndpointActionDispatcher(IIssueTracker issueTracker)
 {
     this.IssueTracker = issueTracker;
 }
コード例 #28
0
 public void InitializeTest()
 {
     Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
     this.tracker = new IssueTracker();
 }
コード例 #29
0
 public Dispatcher(IIssueTracker issueTracker, IUserTracker userTracker)
 {
     this.issueTracker = issueTracker;
     this.userTracker = userTracker;
 }
コード例 #30
0
 public void InitCreateIssue()
 {
     this.tracker = new IssueTracker();
 }
コード例 #31
0
 dispatcher(IIssueTracker tracker)
 {
     this.tracker = tracker;
 }
コード例 #32
0
 public void InitSearchForIssue()
 {
     this.tracker = new IssueTracker();
 }
コード例 #33
0
        public static bool TryCreate(string url, string project, AuthSettings authentication, out IIssueTracker issueTracker)
        {
            // For now just check if it contains atlassian.net
            if (!string.IsNullOrWhiteSpace(url))
            {
                if (url.ToLower().Contains(".atlassian."))
                {
                    issueTracker = new JiraIssueTracker(url, project, authentication);
                    return true;
                }
            }

            issueTracker = null;
            return false;
        }
コード例 #34
0
        public static bool TryCreate(string url, string project, AuthSettings authentication, out IIssueTracker issueTracker)
        {
            var urlWithoutGitExtension = url.EndsWith(".git") ? url.Substring(0, url.Length - 4) : url;
            var match = GithubDotComRepo.Match(urlWithoutGitExtension);

            if (match.Success)
            {
                issueTracker = new GitHubIssueTracker(match.Groups["org"].Value, match.Groups["repo"].Value, null, authentication);
                return(true);
            }

            issueTracker = null;
            return(false);
        }
コード例 #35
0
ファイル: CommandExecutor.cs プロジェクト: nok32/SoftUni
 public CommandExecutor(IIssueTracker tracker)
 {
     this.Tracker = tracker;
 }
コード例 #36
0
 public void InitSearchForIssue()
 {
     this.tracker = new IssueTracker();
 }
コード例 #37
0
        public static async Task <SemanticReleaseNotes> GenerateReleaseNotesAsync(ReleaseNotesGenerationParameters generationParameters,
                                                                                  IRepository gitRepo, IIssueTracker issueTracker, SemanticReleaseNotes previousReleaseNotes,
                                                                                  Categories categories, TaggedCommit tagToStartFrom, ReleaseInfo currentReleaseInfo)
        {
            var releases = ReleaseFinder.FindReleases(gitRepo, tagToStartFrom, currentReleaseInfo);

            var findIssuesSince =
                IssueStartDateBasedOnPreviousReleaseNotes(gitRepo, previousReleaseNotes)
                ??
                tagToStartFrom.Commit.Author.When;

            var filter = new IssueTrackerFilter
            {
                Since       = findIssuesSince,
                IncludeOpen = false
            };

            var closedIssues = (await issueTracker.GetIssuesAsync(filter)).ToArray();

            // As discussed here: https://github.com/GitTools/GitReleaseNotes/issues/85

            var semanticReleases = new Dictionary <string, SemanticRelease>();

            foreach (var issue in closedIssues)
            {
                // 1) Include all issues from the issue tracker that are assigned to this release
                foreach (var fixVersion in issue.FixVersions)
                {
                    if (!fixVersion.IsReleased)
                    {
                        continue;
                    }

                    if (!semanticReleases.ContainsKey(fixVersion.Name))
                    {
                        semanticReleases.Add(fixVersion.Name, new SemanticRelease(fixVersion.Name, fixVersion.ReleaseDate));
                    }

                    var semanticRelease = semanticReleases[fixVersion.Name];

                    var releaseNoteItem = new ReleaseNoteItem(issue.Title, issue.Id, issue.Url, issue.Labels,
                                                              issue.DateClosed, new Contributor[] { /*TODO: implement*/ });

                    semanticRelease.ReleaseNoteLines.Add(releaseNoteItem);
                }

                // 2) Get closed issues from the issue tracker that have no fixversion but are closed between the last release and this release
                if (issue.FixVersions.Count == 0)
                {
                    foreach (var release in releases)
                    {
                        if (issue.DateClosed.HasValue &&
                            issue.DateClosed.Value > release.PreviousReleaseDate &&
                            (release.When == null || issue.DateClosed <= release.When))
                        {
                            if (!semanticReleases.ContainsKey(release.Name))
                            {
                                var beginningSha = release.FirstCommit != null?release.FirstCommit.Substring(0, 10) : null;

                                var endSha = release.LastCommit != null?release.LastCommit.Substring(0, 10) : null;

                                semanticReleases.Add(release.Name, new SemanticRelease(release.Name, release.When, new ReleaseDiffInfo
                                {
                                    BeginningSha = beginningSha,
                                    EndSha       = endSha,
                                    // TODO DiffUrlFormat = context.Repository.DiffUrlFormat
                                }));
                            }

                            var semanticRelease = semanticReleases[release.Name];

                            var releaseNoteItem = new ReleaseNoteItem(issue.Title, issue.Id, issue.Url, issue.Labels,
                                                                      issue.DateClosed, issue.Contributors);

                            semanticRelease.ReleaseNoteLines.Add(releaseNoteItem);
                        }
                    }
                }
            }

            // 3) Remove any duplicates
            foreach (var semanticRelease in semanticReleases.Values)
            {
                var handledIssues = new HashSet <string>();

                for (var i = 0; i < semanticRelease.ReleaseNoteLines.Count; i++)
                {
                    var releaseNoteLine = semanticRelease.ReleaseNoteLines[i] as ReleaseNoteItem;
                    if (releaseNoteLine == null)
                    {
                        continue;
                    }

                    if (handledIssues.Contains(releaseNoteLine.IssueNumber))
                    {
                        semanticRelease.ReleaseNoteLines.RemoveAt(i--);
                        continue;
                    }

                    handledIssues.Add(releaseNoteLine.IssueNumber);
                }
            }

            var semanticReleaseNotes = new SemanticReleaseNotes(semanticReleases.Values, categories);
            var mergedReleaseNotes   = semanticReleaseNotes.Merge(previousReleaseNotes);

            return(mergedReleaseNotes);
        }
コード例 #38
0
ファイル: Dispatcher.cs プロジェクト: EBojilova/CSharpHQC
 private Dispatcher(IIssueTracker tracker)
 {
     this.Tracker = tracker;
 }
コード例 #39
0
 public void InitializeTest()
 {
     Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
     tracker = new IssueTracker();
 }
コード例 #40
0
 public void InitCreateIssue()
 {
     this.tracker = new IssueTracker();
 }
コード例 #41
0
        public void TestCreateIssueMultipleValid()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            this.issueTracker.RegisterUser(username, password, password);
            string expected = string.Empty;

            for (var i = 0; i < 10; i++)
            {
                expected = this.issueTracker.CreateIssue("Title" + i, "description" + i, IssuePriority.Medium, new[] { "Tag1" + i, "tag2" });
            }

            Assert.AreEqual(expected, "Issue 10 created successfully.");
        }
コード例 #42
0
ファイル: Dispatcher.cs プロジェクト: ikolev94/Exercises
 public Dispatcher(IIssueTracker tracker)
 {
     this.tracker = tracker;
 }
コード例 #43
0
 public CommandExecutor(IIssueTracker issueTracker)
 {
     this.IssueTracker = issueTracker;
 }
コード例 #44
0
        public void TestCreateIssueValid()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            this.issueTracker.RegisterUser(username, password, password);
            var expected = this.issueTracker.CreateIssue(
                "Title",
                "description",
                IssuePriority.Medium,
                new[] { "Tag1", "tag2" });

            Assert.AreEqual(expected, "Issue 1 created successfully.");
        }
コード例 #45
0
 public void TestInit()
 {
     this.data = new GithubIssueTrackerData();
     this.tracker = new IssueTracker(this.data);
 }
コード例 #46
0
 public IssueTrackerTests()
 {
     this.issueTracker = new IssueTracker();
 }
コード例 #47
0
 public void InitGetMyIssues()
 {
     this.tracker = new IssueTracker();
 }
コード例 #48
0
 private ActionDispatcher(IIssueTracker tracker)
 {
     this.Tracker = tracker;
 }
コード例 #49
0
        public static SemanticReleaseNotes GenerateReleaseNotes(Context context)
        {
            using (var gitRepoContext = GetRepository(context))
            {
                // Remote repo's require some additional preparation before first use.
                if (gitRepoContext.IsRemote)
                {
                    gitRepoContext.PrepareRemoteRepoForUse(context.Repository.Branch);
                    if (!string.IsNullOrWhiteSpace(context.OutputFile))
                    {
                        gitRepoContext.CheckoutFilesIfExist(context.OutputFile);
                    }
                }

                var gitRepo = gitRepoContext.Repository;

                CreateIssueTrackers(gitRepo, context);

                IIssueTracker issueTracker = null;
                if (context.IssueTracker == null)
                {
                    var firstOrDefault = _issueTrackers.FirstOrDefault(i => i.Value.RemotePresentWhichMatches);
                    if (firstOrDefault.Value != null)
                    {
                        issueTracker = firstOrDefault.Value;
                    }
                }

                if (issueTracker == null)
                {
                    if (!_issueTrackers.ContainsKey(context.IssueTracker.Value))
                    {
                        throw new GitReleaseNotesException("{0} is not a known issue tracker", context.IssueTracker.Value);
                    }

                    issueTracker = _issueTrackers[context.IssueTracker.Value];
                }

                if (!issueTracker.VerifyArgumentsAndWriteErrorsToLog())
                {
                    throw new GitReleaseNotesException("Argument verification failed");
                }

                var    fileSystem           = new FileSystem.FileSystem();
                var    releaseFileWriter    = new ReleaseFileWriter(fileSystem);
                string outputFile           = null;
                var    previousReleaseNotes = new SemanticReleaseNotes();

                var outputPath      = gitRepo.Info.Path;
                var outputDirectory = new DirectoryInfo(outputPath);
                if (outputDirectory.Name == ".git")
                {
                    outputPath = outputDirectory.Parent.FullName;
                }

                if (!string.IsNullOrEmpty(context.OutputFile))
                {
                    outputFile = Path.IsPathRooted(context.OutputFile)
                        ? context.OutputFile
                        : Path.Combine(outputPath, context.OutputFile);
                    previousReleaseNotes = new ReleaseNotesFileReader(fileSystem, outputPath).ReadPreviousReleaseNotes(outputFile);
                }

                var categories     = new Categories(context.Categories, context.AllLabels);
                var tagToStartFrom = context.AllTags
                    ? GitRepositoryInfoFinder.GetFirstCommit(gitRepo)
                    : GitRepositoryInfoFinder.GetLastTaggedCommit(gitRepo) ?? GitRepositoryInfoFinder.GetFirstCommit(gitRepo);
                var currentReleaseInfo = GitRepositoryInfoFinder.GetCurrentReleaseInfo(gitRepo);
                if (!string.IsNullOrEmpty(context.Version))
                {
                    currentReleaseInfo.Name = context.Version;
                    currentReleaseInfo.When = DateTimeOffset.Now;
                }

                var releaseNotes = GenerateReleaseNotes(
                    gitRepo, issueTracker,
                    previousReleaseNotes, categories,
                    tagToStartFrom, currentReleaseInfo,
                    issueTracker.DiffUrlFormat);

                var releaseNotesOutput = releaseNotes.ToString();
                releaseFileWriter.OutputReleaseNotesFile(releaseNotesOutput, outputFile);

                return(releaseNotes);
            }
        }
コード例 #50
0
 EndpointActionDispatcher(IIssueTracker tracker)
 {
     this.tracker = tracker;
 }
コード例 #51
0
 Dispatcher(IIssueTracker issueTracker)
 {
     this.IssueTracker = issueTracker;
 }
コード例 #52
0
        public void TestLoginUserWithNotValidPassword()
        {
            this.issueTracker = new IssueTracker();

            const string username = "******";
            const string password = "******";

            this.issueTracker.RegisterUser(username, password, password);
            var expected = this.issueTracker.LoginUser(username, "babaqga");

            Assert.AreEqual(expected, string.Format("The password is invalid for user {0}", username));
        }
コード例 #53
0
ファイル: Program.cs プロジェクト: erichexter/GitReleaseNotes
        private static int GenerateReleaseNotes(string[] args)
        {
            var modelBindingDefinition = Args.Configuration.Configure <GitReleaseNotesArguments>();

            if (args.Any(a => a == "/?" || a == "?" || a.Equals("/help", StringComparison.InvariantCultureIgnoreCase)))
            {
                var help = new HelpProvider().GenerateModelHelp(modelBindingDefinition);
                var f    = new ConsoleHelpFormatter();
                f.WriteHelp(help, Console.Out);

                return(0);
            }

            var arguments = modelBindingDefinition.CreateAndBind(args);

            if (!ArgumentVerifier.VerifyArguments(arguments))
            {
                return(1);
            }

            var workingDirectory = arguments.WorkingDirectory ?? Directory.GetCurrentDirectory();

            var gitDirectory = GitDirFinder.TreeWalkForGitDir(workingDirectory);

            if (string.IsNullOrEmpty(gitDirectory))
            {
                throw new Exception("Failed to find .git directory.");
            }

            Console.WriteLine("Git directory found at {0}", gitDirectory);

            var repositoryRoot = Directory.GetParent(gitDirectory).FullName;

            var gitRepo = new Repository(gitDirectory);

            CreateIssueTrackers(gitRepo, arguments);

            IIssueTracker issueTracker = null;

            if (arguments.IssueTracker == null)
            {
                var firstOrDefault = _issueTrackers.FirstOrDefault(i => i.Value.RemotePresentWhichMatches);
                if (firstOrDefault.Value != null)
                {
                    issueTracker = firstOrDefault.Value;
                }
            }
            if (issueTracker == null)
            {
                if (!_issueTrackers.ContainsKey(arguments.IssueTracker.Value))
                {
                    throw new Exception(string.Format("{0} is not a known issue tracker", arguments.IssueTracker.Value));
                }

                issueTracker = _issueTrackers[arguments.IssueTracker.Value];
            }
            if (!issueTracker.VerifyArgumentsAndWriteErrorsToConsole())
            {
                return(1);
            }

            var    fileSystem           = new FileSystem.FileSystem();
            var    releaseFileWriter    = new ReleaseFileWriter(fileSystem);
            string outputFile           = null;
            var    previousReleaseNotes = new SemanticReleaseNotes();

            if (!string.IsNullOrEmpty(arguments.OutputFile))
            {
                outputFile = Path.IsPathRooted(arguments.OutputFile)
                    ? arguments.OutputFile
                    : Path.Combine(repositoryRoot, arguments.OutputFile);
                previousReleaseNotes = new ReleaseNotesFileReader(fileSystem, repositoryRoot).ReadPreviousReleaseNotes(outputFile);
            }

            var          categories     = arguments.Categories == null ? Categories : Categories.Concat(arguments.Categories.Split(',')).ToArray();
            TaggedCommit tagToStartFrom = arguments.AllTags
                ? GitRepositoryInfoFinder.GetFirstCommit(gitRepo)
                : GitRepositoryInfoFinder.GetLastTaggedCommit(gitRepo) ?? GitRepositoryInfoFinder.GetFirstCommit(gitRepo);
            var currentReleaseInfo = GitRepositoryInfoFinder.GetCurrentReleaseInfo(gitRepo);

            if (!string.IsNullOrEmpty(arguments.Version))
            {
                currentReleaseInfo.Name = arguments.Version;
                currentReleaseInfo.When = DateTimeOffset.Now;
            }
            var releaseNotes = ReleaseNotesGenerator.GenerateReleaseNotes(
                gitRepo, issueTracker,
                previousReleaseNotes, categories,
                tagToStartFrom, currentReleaseInfo,
                issueTracker.DiffUrlFormat);

            var releaseNotesOutput = releaseNotes.ToString();

            releaseFileWriter.OutputReleaseNotesFile(releaseNotesOutput, outputFile);

            return(0);
        }
コード例 #54
0
 public Dispatcher(IIssueTracker tracker)
 {
     this.Tracker = tracker;
 }
コード例 #55
0
        public static async Task<SemanticReleaseNotes> GenerateReleaseNotesAsync(ReleaseNotesGenerationParameters generationParameters,
            IRepository gitRepo, IIssueTracker issueTracker, SemanticReleaseNotes previousReleaseNotes,
            Categories categories, TaggedCommit tagToStartFrom, ReleaseInfo currentReleaseInfo)
        {
            var releases = ReleaseFinder.FindReleases(gitRepo, tagToStartFrom, currentReleaseInfo);

            var findIssuesSince =
                IssueStartDateBasedOnPreviousReleaseNotes(gitRepo, previousReleaseNotes)
                ??
                tagToStartFrom.Commit.Author.When;

            var filter = new IssueTrackerFilter
            {
                Since = findIssuesSince,
                IncludeOpen = false
            };

            var closedIssues = (await issueTracker.GetIssuesAsync(filter)).ToArray();

            // As discussed here: https://github.com/GitTools/GitReleaseNotes/issues/85

            var semanticReleases = new Dictionary<string, SemanticRelease>();

            foreach (var issue in closedIssues)
            {
                // 1) Include all issues from the issue tracker that are assigned to this release
                foreach (var fixVersion in issue.FixVersions)
                {
                    if (!fixVersion.IsReleased)
                    {
                        continue;
                    }

                    if (!semanticReleases.ContainsKey(fixVersion.Name))
                    {
                        semanticReleases.Add(fixVersion.Name, new SemanticRelease(fixVersion.Name, fixVersion.ReleaseDate));
                    }

                    var semanticRelease = semanticReleases[fixVersion.Name];

                    var releaseNoteItem = new ReleaseNoteItem(issue.Title, issue.Id, issue.Url, issue.Labels,
                        issue.DateClosed, new Contributor[] { /*TODO: implement*/ });

                    semanticRelease.ReleaseNoteLines.Add(releaseNoteItem);
                }

                // 2) Get closed issues from the issue tracker that have no fixversion but are closed between the last release and this release
                if (issue.FixVersions.Count == 0)
                {
                    foreach (var release in releases)
                    {
                        if (issue.DateClosed.HasValue &&
                            issue.DateClosed.Value > release.PreviousReleaseDate &&
                            (release.When == null || issue.DateClosed <= release.When))
                        {
                            if (!semanticReleases.ContainsKey(release.Name))
                            {
                                var beginningSha = release.FirstCommit != null ? release.FirstCommit.Substring(0, 10) : null;
                                var endSha = release.LastCommit != null ? release.LastCommit.Substring(0, 10) : null;

                                semanticReleases.Add(release.Name, new SemanticRelease(release.Name, release.When, new ReleaseDiffInfo
                                {
                                    BeginningSha = beginningSha,
                                    EndSha = endSha,
                                    // TODO DiffUrlFormat = context.Repository.DiffUrlFormat
                                }));
                            }

                            var semanticRelease = semanticReleases[release.Name];

                            var releaseNoteItem = new ReleaseNoteItem(issue.Title, issue.Id, issue.Url, issue.Labels,
                                issue.DateClosed, issue.Contributors);

                            semanticRelease.ReleaseNoteLines.Add(releaseNoteItem);
                        }
                    }
                }
            }

            // 3) Remove any duplicates
            foreach (var semanticRelease in semanticReleases.Values)
            {
                var handledIssues = new HashSet<string>();

                for (var i = 0; i < semanticRelease.ReleaseNoteLines.Count; i++)
                {
                    var releaseNoteLine = semanticRelease.ReleaseNoteLines[i] as ReleaseNoteItem;
                    if (releaseNoteLine == null)
                    {
                        continue;
                    }

                    if (handledIssues.Contains(releaseNoteLine.IssueNumber))
                    {
                        semanticRelease.ReleaseNoteLines.RemoveAt(i--);
                        continue;
                    }

                    handledIssues.Add(releaseNoteLine.IssueNumber);
                }
            }

            var semanticReleaseNotes = new SemanticReleaseNotes(semanticReleases.Values, categories);
            var mergedReleaseNotes = semanticReleaseNotes.Merge(previousReleaseNotes);
            return mergedReleaseNotes;
        }
コード例 #56
0
        public static bool TryCreate(string url, string project, AuthSettings authentication, out IIssueTracker issueTracker)
        {
            // For now just check if it contains atlassian.net
            if (!string.IsNullOrWhiteSpace(url))
            {
                if (url.ToLower().Contains(".atlassian."))
                {
                    issueTracker = new JiraIssueTracker(url, project, authentication);
                    return(true);
                }
            }

            issueTracker = null;
            return(false);
        }
コード例 #57
0
        /// <summary>
        /// Useful for hosted services with well known urls, for instance TryCreateIssueTrackerFromUrl("github.com/gittools/gittools.issuetracker") will work fine
        /// </summary>
        /// <param name="url">Url for project, can be git url or http url</param>
        /// <param name="project">The project name.</param>
        /// <param name="authentication">Authentication information</param>
        /// <param name="issueTracker">The issue tracker if successful</param>
        /// <returns>True on success</returns>
        public static bool TryCreateIssueTrackerFromUrl(string url, [CanBeNull] string project, [CanBeNull] AuthSettings authentication, out IIssueTracker issueTracker)
        {
            foreach (var tryCreateFactory in TryCreateFactories)
            {
                IIssueTracker createdIssueTracker;
                if (!tryCreateFactory(url, project, authentication, out createdIssueTracker))
                {
                    continue;
                }

                issueTracker = createdIssueTracker;
                return(true);
            }

            issueTracker = null;
            return(false);
        }