Skip to content
This repository was archived by the owner on Jun 27, 2019. It is now read-only.

Commit 08b506e

Browse files
Added GitHubIssueTracker
1 parent 4e0c1be commit 08b506e

File tree

9 files changed

+182
-10
lines changed

9 files changed

+182
-10
lines changed

src/GitTools.Core.Tests/GitTools.Core.Tests.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,17 @@
4444
<HintPath>..\..\lib\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
4545
<Private>True</Private>
4646
</Reference>
47+
<Reference Include="Octokit, Version=0.12.0.0, Culture=neutral, processorArchitecture=MSIL">
48+
<SpecificVersion>False</SpecificVersion>
49+
<HintPath>..\..\lib\Octokit.0.12.0\lib\net45\Octokit.dll</HintPath>
50+
</Reference>
4751
<Reference Include="Shouldly, Version=2.5.0.0, Culture=neutral, PublicKeyToken=6042cbcb05cbc941, processorArchitecture=MSIL">
4852
<HintPath>..\..\lib\Shouldly.2.5.0\lib\net40\Shouldly.dll</HintPath>
4953
<Private>True</Private>
5054
</Reference>
5155
<Reference Include="System" />
5256
<Reference Include="System.Core" />
57+
<Reference Include="System.Net.Http" />
5358
<Reference Include="System.Xml.Linq" />
5459
<Reference Include="System.Data.DataSetExtensions" />
5560
<Reference Include="Microsoft.CSharp" />

src/GitTools.Core.Tests/packages.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
<package id="Fody" version="1.29.0-beta01" targetFramework="net45" />
55
<package id="ModuleInit.Fody" version="1.5.6.0" targetFramework="net45" developmentDependency="true" />
66
<package id="NUnit" version="2.6.4" targetFramework="net45" />
7+
<package id="Octokit" version="0.12.0" targetFramework="net45" />
78
<package id="Shouldly" version="2.5.0" targetFramework="net45" />
89
</packages>

src/GitTools.IssueTrackers/FodyWeavers.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<Costura>
44
<IncludeAssemblies>
55
Atlassian.Jira
6+
Octokit
67
</IncludeAssemblies>
78
</Costura>
89
<JetBrainsAnnotations />

src/GitTools.IssueTrackers/GitTools.IssueTrackers.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@
5656
<HintPath>..\..\lib\MethodTimer.Fody.1.15.3.0\Lib\portable-net4+sl5+wp8+win8+wpa81+MonoAndroid16+MonoTouch40\MethodTimer.dll</HintPath>
5757
<Private>True</Private>
5858
</Reference>
59+
<Reference Include="Octokit">
60+
<HintPath>..\..\lib\Octokit.0.12.0\lib\net45\Octokit.dll</HintPath>
61+
</Reference>
5962
<Reference Include="System" />
6063
<Reference Include="System.Core" />
6164
<Reference Include="System.Xml.Linq" />
@@ -74,6 +77,7 @@
7477
<Compile Include="Context\Extensions\IIssueTrackerContextExtensions.cs" />
7578
<Compile Include="Context\Interfaces\IIssueTrackerContext.cs" />
7679
<Compile Include="Context\IssueTrackerContext.cs" />
80+
<Compile Include="IssueTrackers\GitHub\GitHubIssueTracker.cs" />
7781
<Compile Include="IssueTrackers\IssueTrackerBase.cs" />
7882
<Compile Include="IssueTrackers\IssueTrackerFactoryr.cs" />
7983
<Compile Include="IssueTrackers\Jira\JiraIssueTracker.cs" />
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
namespace GitTools.IssueTrackers.GitHub
2+
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Globalization;
6+
using System.Linq;
7+
using System.Text.RegularExpressions;
8+
using Logging;
9+
using Octokit;
10+
using Issue = IssueTrackers.Issue;
11+
12+
public class GitHubIssueTracker : IssueTrackerBase
13+
{
14+
private static readonly ILog Log = LogProvider.GetCurrentClassLogger();
15+
16+
public GitHubIssueTracker(IIssueTrackerContext issueTrackerContext)
17+
: base(issueTrackerContext)
18+
{
19+
20+
}
21+
22+
public override IEnumerable<Issue> GetIssues(string filter = null, bool includeOpen = true, bool includeClosed = true, DateTimeOffset? since = null)
23+
{
24+
var gitHubClient = new GitHubClient(new ProductHeaderValue("GitReleaseNotes"));
25+
26+
var authentication = IssueTrackerContext.Authentication;
27+
if (authentication != null)
28+
{
29+
if (authentication.IsTokenAuthentication())
30+
{
31+
gitHubClient.Credentials = new Octokit.Credentials(authentication.Token);
32+
}
33+
34+
if (authentication.IsUsernameAndPasswordAuthentication())
35+
{
36+
gitHubClient.Credentials = new Octokit.Credentials(authentication.Username, authentication.Password);
37+
}
38+
}
39+
40+
string organisation;
41+
string repository;
42+
GetRepository(out organisation, out repository);
43+
44+
var repositoryIssueRequest = PrepareFilter(filter, includeOpen, includeClosed, since);
45+
var forRepository = gitHubClient.Issue.GetAllForRepository(organisation, repository, repositoryIssueRequest);
46+
47+
var readOnlyList = forRepository.Result.Where(i => i.ClosedAt > since);
48+
49+
var userCache = new Dictionary<string, User>();
50+
Func<User, string> getUserName = u =>
51+
{
52+
var login = u.Login;
53+
if (!userCache.ContainsKey(login))
54+
{
55+
userCache.Add(login, string.IsNullOrEmpty(u.Name) ? gitHubClient.User.Get(login).Result : u);
56+
}
57+
58+
var user = userCache[login];
59+
if (user != null)
60+
{
61+
return user.Name;
62+
}
63+
64+
return null;
65+
};
66+
67+
return readOnlyList.Select(i => new Issue("#" + i.Number.ToString(CultureInfo.InvariantCulture))
68+
{
69+
DateClosed = i.ClosedAt,
70+
Url = i.HtmlUrl.ToString(),
71+
Title = i.Title,
72+
IssueType = i.PullRequest == null ? IssueType.Issue : IssueType.PullRequest,
73+
Labels = i.Labels.Select(l => l.Name).ToArray(),
74+
//Contributors = i.PullRequest == null ? new GitReleaseNotes.Contributor[0] : new[]
75+
//{
76+
// new GitReleaseNotes.Contributor(getUserName(i.User), i.User.Login, i.User.HtmlUrl)
77+
//}
78+
});
79+
}
80+
81+
private RepositoryIssueRequest PrepareFilter(string filter, bool includeOpen = true, bool includeClosed = true, DateTimeOffset? since = null)
82+
{
83+
var repositoryIssueRequest = new RepositoryIssueRequest
84+
{
85+
Filter = IssueFilter.All,
86+
Since = since,
87+
};
88+
89+
if (includeOpen && includeClosed)
90+
{
91+
repositoryIssueRequest.State = ItemState.All;
92+
}
93+
else if (includeOpen)
94+
{
95+
repositoryIssueRequest.State = ItemState.Open;
96+
}
97+
else if (includeClosed)
98+
{
99+
repositoryIssueRequest.State = ItemState.Closed;
100+
}
101+
102+
return repositoryIssueRequest;
103+
}
104+
105+
private void GetRepository(out string organisation, out string repository)
106+
{
107+
//if (RemotePresentWhichMatches)
108+
//{
109+
// if (TryRemote(out organisation, out repository, "upstream"))
110+
// {
111+
// return;
112+
// }
113+
114+
// if (TryRemote(out organisation, out repository, "origin"))
115+
// {
116+
// return;
117+
// }
118+
119+
// var remoteName = _gitRepository.Network.Remotes.First(r => r.Url.ToLower().Contains("github.com")).Name;
120+
// if (TryRemote(out organisation, out repository, remoteName))
121+
// {
122+
// return;
123+
// }
124+
//}
125+
126+
var repoParts = IssueTrackerContext.ProjectId.Split('/');
127+
organisation = repoParts[0];
128+
repository = repoParts[1];
129+
}
130+
131+
//private bool TryRemote(out string organisation, out string repository, string remoteName)
132+
//{
133+
// var remote = _gitRepository.Network.Remotes[remoteName];
134+
// if (remote != null && remote.Url.ToLower().Contains("github.com"))
135+
// {
136+
// var urlWithoutGitExtension = remote.Url.EndsWith(".git") ? remote.Url.Substring(0, remote.Url.Length - 4) : remote.Url;
137+
// var match = Regex.Match(urlWithoutGitExtension, "github.com[/:](?<org>.*?)/(?<repo>.*)");
138+
// if (match.Success)
139+
// {
140+
// organisation = match.Groups["org"].Value;
141+
// repository = match.Groups["repo"].Value;
142+
// return true;
143+
// }
144+
// }
145+
146+
// organisation = null;
147+
// repository = null;
148+
// return false;
149+
//}
150+
}
151+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
namespace GitTools.IssueTrackers
22
{
3+
using System;
34
using System.Collections.Generic;
45

56
public interface IIssueTracker
67
{
7-
IEnumerable<Issue> GetIssues(string filter = null, bool includeOpen = true, bool includeClosed = true);
8+
IEnumerable<Issue> GetIssues(string filter = null, bool includeOpen = true, bool includeClosed = true, DateTimeOffset? since = null);
89
}
910
}
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
namespace GitTools.IssueTrackers
22
{
3+
using System;
34
using System.Collections.Generic;
45

56
public abstract class IssueTrackerBase : IIssueTracker
67
{
7-
public abstract IEnumerable<Issue> GetIssues(string filter = null, bool includeOpen = true, bool includeClosed = true);
8+
public IssueTrackerBase(IIssueTrackerContext issueTrackerContext)
9+
{
10+
IssueTrackerContext = issueTrackerContext;
11+
}
12+
13+
protected IIssueTrackerContext IssueTrackerContext { get; private set; }
14+
15+
public abstract IEnumerable<Issue> GetIssues(string filter = null, bool includeOpen = true, bool includeClosed = true, DateTimeOffset? since = null);
816
}
917
}

src/GitTools.IssueTrackers/IssueTrackers/Jira/JiraIssueTracker.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
namespace GitTools.IssueTrackers.Jira
22
{
3+
using System;
34
using System.Collections.Generic;
45
using System.Linq;
56
using Atlassian.Jira;
67
using Logging;
78
using Issue = IssueTrackers.Issue;
89
using IssueType = IssueTrackers.IssueType;
10+
using Version = IssueTrackers.Version;
911

1012
public class JiraIssueTracker : IssueTrackerBase
1113
{
1214
private static readonly ILog Log = LogProvider.GetCurrentClassLogger();
1315

1416
private static readonly HashSet<string> KnownClosedStatuses = new HashSet<string>(new [] { "resolved", "closed", "done" });
1517

16-
private readonly IIssueTrackerContext _issueTrackerContext;
17-
1818
public JiraIssueTracker(IIssueTrackerContext issueTrackerContext)
19+
: base(issueTrackerContext)
1920
{
20-
_issueTrackerContext = issueTrackerContext;
2121
}
2222

23-
public override IEnumerable<Issue> GetIssues(string filter = null, bool includeOpen = true, bool includeClosed = true)
23+
public override IEnumerable<Issue> GetIssues(string filter = null, bool includeOpen = true, bool includeClosed = true, DateTimeOffset? since = null)
2424
{
25-
Log.DebugFormat("Connecting to Jira server '{0}'", _issueTrackerContext.Server);
25+
Log.DebugFormat("Connecting to Jira server '{0}'", IssueTrackerContext.Server);
2626

27-
var jira = new Jira(_issueTrackerContext.Server, _issueTrackerContext.Authentication.Username, _issueTrackerContext.Authentication.Password);
27+
var jira = new Jira(IssueTrackerContext.Server, IssueTrackerContext.Authentication.Username, IssueTrackerContext.Authentication.Password);
2828
jira.MaxIssuesPerRequest = 500;
2929

3030
Log.Debug("Retrieving statuses");
3131

3232
var openedStatuses = GetOpenedStatuses(jira);
3333
var closedStatuses = GetClosedStatuses(jira);
3434

35-
filter = PrepareFilter(filter, openedStatuses, closedStatuses, includeOpen, includeClosed);
35+
filter = PrepareFilter(filter, openedStatuses, closedStatuses, includeOpen, includeClosed, since);
3636

3737
var issues = new List<Issue>();
3838

@@ -72,7 +72,7 @@ public override IEnumerable<Issue> GetIssues(string filter = null, bool includeO
7272
}
7373

7474
private string PrepareFilter(string filter, IEnumerable<IssueStatus> openedStatuses, IEnumerable<IssueStatus> closedStatuses,
75-
bool includeOpen = true, bool includeClosed = true)
75+
bool includeOpen = true, bool includeClosed = true, DateTimeOffset? since = null)
7676
{
7777
if (string.IsNullOrWhiteSpace(filter))
7878
{

src/GitTools.IssueTrackers/packages.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
<package id="LibLog" version="4.2.3" targetFramework="net45" />
99
<package id="MethodTimer.Fody" version="1.15.3.0" targetFramework="net45" />
1010
<package id="ModuleInit.Fody" version="1.5.6.0" targetFramework="net45" />
11+
<package id="Octokit" version="0.12.0" targetFramework="net45" />
1112
</packages>

0 commit comments

Comments
 (0)