Skip to content

Commit 8618111

Browse files
committed
include GitTools.Testing source code, so that we can debug/maintain
1 parent f64815b commit 8618111

17 files changed

+677
-4
lines changed

src/Directory.Build.props

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<Authors>GitTools and Contributors</Authors>
66
<Copyright>Copyright GitTools 2020.</Copyright>
77
<Company>$(Authors)</Company>
8-
8+
99
<PackageProjectUrl>https://github.com/GitTools/GitVersion</PackageProjectUrl>
1010
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
1111
<PackageTags>Git;Versioning;GitVersion;GitFlowVersion;GitFlow;GitHubFlow;SemVer</PackageTags>
@@ -16,6 +16,7 @@
1616
<RepositoryUrl>https://github.com/GitTools/GitVersion</RepositoryUrl>
1717
<RepositoryType>git</RepositoryType>
1818

19+
<NoWarn>1591</NoWarn>
1920
<DebugType>embedded</DebugType>
2021
<LangVersion>8.0</LangVersion>
2122

@@ -52,12 +53,14 @@
5253
<PackageReference Include="NUnit3TestAdapter" Version="$(PackageVersion_NUnit3TestAdapter)" />
5354
<PackageReference Include="NunitXml.TestLogger" Version="$(PackageVersion_NunitXmlTestLogger)" />
5455
<PackageReference Include="Shouldly" Version="$(PackageVersion_Shouldly)" />
55-
<PackageReference Include="GitTools.Testing" Version="$(PackageVersion_GitToolsTesting)" />
5656

5757
<PackageReference Include="coverlet.msbuild" Version="$(PackageVersion_CoverletMsBuild)">
5858
<PrivateAssets>all</PrivateAssets>
5959
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
6060
</PackageReference>
61+
62+
<ProjectReference Include="..\GitTools.Testing\GitTools.Testing.csproj" />
63+
6164
</ItemGroup>
6265

6366
<ItemGroup>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using System.IO;
3+
using LibGit2Sharp;
4+
5+
namespace GitTools.Testing
6+
{
7+
/// <summary>
8+
/// Creates a repo with a develop branch off master which is a single commit ahead of master
9+
/// </summary>
10+
public class BaseGitFlowRepositoryFixture : EmptyRepositoryFixture
11+
{
12+
/// <summary>
13+
/// Creates a repo with a develop branch off master which is a single commit ahead of master
14+
///
15+
/// Master will be tagged with the initial version before branching develop
16+
/// </summary>
17+
public BaseGitFlowRepositoryFixture(string initialVersion) :
18+
this(r => r.MakeATaggedCommit(initialVersion))
19+
{
20+
}
21+
22+
/// <summary>
23+
/// Creates a repo with a develop branch off master which is a single commit ahead of master
24+
///
25+
/// The initial setup actions will be performed before branching develop
26+
/// </summary>
27+
public BaseGitFlowRepositoryFixture(Action<IRepository> initialMasterAction)
28+
{
29+
SetupRepo(initialMasterAction);
30+
}
31+
32+
void SetupRepo(Action<IRepository> initialMasterAction)
33+
{
34+
var randomFile = Path.Combine(Repository.Info.WorkingDirectory, Guid.NewGuid().ToString());
35+
File.WriteAllText(randomFile, string.Empty);
36+
Commands.Stage(Repository, randomFile);
37+
38+
initialMasterAction(Repository);
39+
40+
Commands.Checkout(Repository, Repository.CreateBranch("develop"));
41+
Repository.MakeACommit();
42+
}
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using LibGit2Sharp;
3+
4+
namespace GitTools.Testing
5+
{
6+
public class EmptyRepositoryFixture : RepositoryFixtureBase
7+
{
8+
public EmptyRepositoryFixture() : base(CreateNewRepository)
9+
{
10+
}
11+
12+
private static IRepository CreateNewRepository(string path)
13+
{
14+
LibGit2Sharp.Repository.Init(path);
15+
Console.WriteLine("Created git repository at '{0}'", path);
16+
17+
return new Repository(path);
18+
}
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using LibGit2Sharp;
2+
3+
namespace GitTools.Testing
4+
{
5+
public class LocalRepositoryFixture : RepositoryFixtureBase
6+
{
7+
public LocalRepositoryFixture(IRepository repository) : base(repository)
8+
{
9+
}
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using LibGit2Sharp;
3+
4+
namespace GitTools.Testing
5+
{
6+
/// <summary>
7+
/// Creates a remote repository then clones it
8+
/// Remote = Repository
9+
/// Local = LocalRepositoryFixture
10+
/// </summary>
11+
public class RemoteRepositoryFixture : RepositoryFixtureBase
12+
{
13+
public RemoteRepositoryFixture(Func<string, IRepository> builder)
14+
: base(builder)
15+
{
16+
CreateLocalRepository();
17+
}
18+
19+
public RemoteRepositoryFixture() : this(CreateNewRepository)
20+
{
21+
}
22+
23+
/// <summary>
24+
/// Fixture pointing at the local repository
25+
/// </summary>
26+
public LocalRepositoryFixture LocalRepositoryFixture { get; private set; }
27+
28+
private static IRepository CreateNewRepository(string path)
29+
{
30+
LibGit2Sharp.Repository.Init(path);
31+
Console.WriteLine("Created git repository at '{0}'", path);
32+
33+
var repo = new Repository(path);
34+
repo.MakeCommits(5);
35+
return repo;
36+
}
37+
38+
private void CreateLocalRepository()
39+
{
40+
LocalRepositoryFixture = CloneRepository();
41+
}
42+
43+
/// <summary>
44+
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
45+
/// </summary>
46+
public override void Dispose()
47+
{
48+
LocalRepositoryFixture.Dispose();
49+
base.Dispose();
50+
}
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
using System;
2+
using GitTools.Testing.Internal;
3+
using LibGit2Sharp;
4+
5+
namespace GitTools.Testing
6+
{
7+
/// <summary>
8+
/// Fixture abstracting a git repository
9+
/// </summary>
10+
public abstract class RepositoryFixtureBase : IDisposable
11+
{
12+
readonly SequenceDiagram _sequenceDiagram;
13+
14+
protected RepositoryFixtureBase(Func<string, IRepository> repoBuilder)
15+
: this(repoBuilder(PathHelper.GetTempPath()))
16+
{
17+
}
18+
19+
protected RepositoryFixtureBase(IRepository repository)
20+
{
21+
_sequenceDiagram = new SequenceDiagram();
22+
Repository = repository;
23+
Repository.Config.Set("user.name", "Test");
24+
Repository.Config.Set("user.email", "[email protected]");
25+
}
26+
27+
public IRepository Repository { get; private set; }
28+
29+
public string RepositoryPath
30+
{
31+
get { return Repository.Info.WorkingDirectory.TrimEnd('\\'); }
32+
}
33+
34+
public SequenceDiagram SequenceDiagram
35+
{
36+
get { return _sequenceDiagram; }
37+
}
38+
39+
/// <summary>
40+
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
41+
/// </summary>
42+
public virtual void Dispose()
43+
{
44+
Repository.Dispose();
45+
46+
try
47+
{
48+
DirectoryHelper.DeleteDirectory(RepositoryPath);
49+
}
50+
catch (Exception e)
51+
{
52+
Console.WriteLine("Failed to clean up repository path at {0}. Received exception: {1}", RepositoryPath,
53+
e.Message);
54+
}
55+
56+
_sequenceDiagram.End();
57+
Console.WriteLine("**Visualisation of test:**");
58+
Console.WriteLine(string.Empty);
59+
Console.WriteLine(_sequenceDiagram.GetDiagram());
60+
}
61+
62+
public void Checkout(string branch)
63+
{
64+
Commands.Checkout(Repository, branch);
65+
}
66+
67+
public void MakeATaggedCommit(string tag)
68+
{
69+
MakeACommit();
70+
ApplyTag(tag);
71+
}
72+
73+
public void ApplyTag(string tag)
74+
{
75+
_sequenceDiagram.ApplyTag(tag, Repository.Head.FriendlyName);
76+
Repository.ApplyTag(tag);
77+
}
78+
79+
public void BranchTo(string branchName, string @as = null)
80+
{
81+
_sequenceDiagram.BranchTo(branchName, Repository.Head.FriendlyName, @as);
82+
var branch = Repository.CreateBranch(branchName);
83+
Commands.Checkout(Repository, branch);
84+
}
85+
86+
public void BranchToFromTag(string branchName, string fromTag, string onBranch, string @as = null)
87+
{
88+
_sequenceDiagram.BranchToFromTag(branchName, fromTag, onBranch, @as);
89+
var branch = Repository.CreateBranch(branchName);
90+
Commands.Checkout(Repository, branch);
91+
}
92+
93+
public void MakeACommit()
94+
{
95+
var to = Repository.Head.FriendlyName;
96+
_sequenceDiagram.MakeACommit(to);
97+
Repository.MakeACommit();
98+
}
99+
100+
/// <summary>
101+
/// Merges (no-ff) specified branch into the current HEAD of this repository
102+
/// </summary>
103+
public void MergeNoFF(string mergeSource)
104+
{
105+
_sequenceDiagram.Merge(mergeSource, Repository.Head.FriendlyName);
106+
Repository.MergeNoFF(mergeSource, Generate.SignatureNow());
107+
}
108+
109+
/// <summary>
110+
/// Clones the repository managed by this fixture into another LocalRepositoryFixture
111+
/// </summary>
112+
public LocalRepositoryFixture CloneRepository()
113+
{
114+
var localPath = PathHelper.GetTempPath();
115+
LibGit2Sharp.Repository.Clone(RepositoryPath, localPath);
116+
return new LocalRepositoryFixture(new Repository(localPath));
117+
}
118+
}
119+
}

0 commit comments

Comments
 (0)