Skip to content

Commit 5d9f53d

Browse files
committed
Introduce Configuration.BuildFrom()
1 parent 7e7c1f5 commit 5d9f53d

File tree

4 files changed

+111
-18
lines changed

4 files changed

+111
-18
lines changed

LibGit2Sharp.Tests/ConfigurationFixture.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ public void CanSetBooleanValue()
227227
[Fact]
228228
public void SettingLocalConfigurationOutsideAReposThrows()
229229
{
230-
using (var config = new Configuration(null, null, null))
230+
using (var config = Configuration.BuildFrom(null, null, null, null))
231231
{
232232
Assert.Throws<LibGit2SharpException>(() => config.Set("unittests.intsetting", 3));
233233
}
@@ -366,5 +366,26 @@ public void CanTellIfASpecificStoreContainsAKey()
366366
Assert.Null(repo.Config.Get<string>("MCHammer.You-cant-touch-this", ConfigurationLevel.System));
367367
}
368368
}
369+
370+
[Fact]
371+
public void CanAccessConfigurationWithoutARepository()
372+
{
373+
var path = SandboxStandardTestRepoGitDir();
374+
375+
string globalConfigPath = CreateConfigurationWithDummyUser(Constants.Signature);
376+
var options = new RepositoryOptions { GlobalConfigurationLocation = globalConfigPath };
377+
378+
using (var repo = new Repository(path, options))
379+
{
380+
repo.Config.Set("my.key", "local");
381+
repo.Config.Set("my.key", "mouse", ConfigurationLevel.Global);
382+
}
383+
384+
using (var config = Configuration.BuildFrom(Path.Combine(path, ".git", "config"), globalConfigPath))
385+
{
386+
Assert.Equal("local", config.Get<string>("my.key").Value);
387+
Assert.Equal("mouse", config.Get<string>("my.key", ConfigurationLevel.Global).Value);
388+
}
389+
}
369390
}
370391
}

LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,18 +337,18 @@ protected string CreateConfigurationWithDummyUser(string name, string email)
337337
{
338338
SelfCleaningDirectory scd = BuildSelfCleaningDirectory();
339339
Directory.CreateDirectory(scd.DirectoryPath);
340-
string configFilePath = Path.Combine(scd.DirectoryPath, "global-config");
340+
string configFilePath = Path.Combine(scd.DirectoryPath, "fake-config");
341341

342-
using (Configuration config = new Configuration(configFilePath))
342+
using (Configuration config = Configuration.BuildFrom(configFilePath))
343343
{
344344
if (name != null)
345345
{
346-
config.Set("user.name", name, ConfigurationLevel.Global);
346+
config.Set("user.name", name);
347347
}
348348

349349
if (email != null)
350350
{
351-
config.Set("user.email", email, ConfigurationLevel.Global);
351+
config.Set("user.email", email);
352352
}
353353
}
354354

LibGit2Sharp/Configuration.cs

Lines changed: 84 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ namespace LibGit2Sharp
1515
public class Configuration : IDisposable,
1616
IEnumerable<ConfigurationEntry<string>>
1717
{
18+
private readonly FilePath repoConfigPath;
1819
private readonly FilePath globalConfigPath;
1920
private readonly FilePath xdgConfigPath;
2021
private readonly FilePath systemConfigPath;
2122

22-
private readonly Repository repository;
23-
2423
private ConfigurationSafeHandle configHandle;
2524

2625
/// <summary>
@@ -29,19 +28,18 @@ public class Configuration : IDisposable,
2928
protected Configuration()
3029
{ }
3130

32-
internal Configuration(Repository repository, string globalConfigurationFileLocation,
31+
internal Configuration(Repository repository, string repositoryConfigurationFileLocation, string globalConfigurationFileLocation,
3332
string xdgConfigurationFileLocation, string systemConfigurationFileLocation)
3433
{
35-
this.repository = repository;
36-
34+
repoConfigPath = repositoryConfigurationFileLocation;
3735
globalConfigPath = globalConfigurationFileLocation ?? Proxy.git_config_find_global();
3836
xdgConfigPath = xdgConfigurationFileLocation ?? Proxy.git_config_find_xdg();
3937
systemConfigPath = systemConfigurationFileLocation ?? Proxy.git_config_find_system();
4038

41-
Init();
39+
Init(repository);
4240
}
4341

44-
private void Init()
42+
private void Init(Repository repository)
4543
{
4644
configHandle = Proxy.git_config_new();
4745

@@ -56,6 +54,10 @@ private void Init()
5654

5755
Proxy.git_repository_set_config(repository.Handle, configHandle);
5856
}
57+
else if (repoConfigPath != null)
58+
{
59+
Proxy.git_config_add_file_ondisk(configHandle, repoConfigPath, ConfigurationLevel.Local);
60+
}
5961

6062
if (globalConfigPath != null)
6163
{
@@ -73,21 +75,91 @@ private void Init()
7375
}
7476
}
7577

78+
/// <summary>
79+
/// Access configuration values without a repository.
80+
/// <para>
81+
/// Generally you want to access configuration via an instance of <see cref="Repository"/> instead.
82+
/// </para>
83+
/// </summary>
84+
/// <param name="repositoryConfigurationFileLocation">Path to a Repository configuration file.</param>
85+
/// <returns>An instance of <see cref="Configuration"/>.</returns>
86+
public static Configuration BuildFrom(
87+
string repositoryConfigurationFileLocation)
88+
{
89+
return BuildFrom(repositoryConfigurationFileLocation, null, null, null);
90+
}
91+
92+
/// <summary>
93+
/// Access configuration values without a repository.
94+
/// <para>
95+
/// Generally you want to access configuration via an instance of <see cref="Repository"/> instead.
96+
/// </para>
97+
/// </summary>
98+
/// <param name="repositoryConfigurationFileLocation">Path to a Repository configuration file.</param>
99+
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a Global configuration file will be probed.</param>
100+
/// <returns>An instance of <see cref="Configuration"/>.</returns>
101+
public static Configuration BuildFrom(
102+
string repositoryConfigurationFileLocation,
103+
string globalConfigurationFileLocation)
104+
{
105+
return BuildFrom(repositoryConfigurationFileLocation, globalConfigurationFileLocation, null, null);
106+
}
107+
108+
/// <summary>
109+
/// Access configuration values without a repository.
110+
/// <para>
111+
/// Generally you want to access configuration via an instance of <see cref="Repository"/> instead.
112+
/// </para>
113+
/// </summary>
114+
/// <param name="repositoryConfigurationFileLocation">Path to a Repository configuration file.</param>
115+
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a Global configuration file will be probed.</param>
116+
/// <param name="xdgConfigurationFileLocation">Path to a XDG configuration file. If null, the default path for a XDG configuration file will be probed.</param>
117+
/// <returns>An instance of <see cref="Configuration"/>.</returns>
118+
public static Configuration BuildFrom(
119+
string repositoryConfigurationFileLocation,
120+
string globalConfigurationFileLocation,
121+
string xdgConfigurationFileLocation)
122+
{
123+
return BuildFrom(repositoryConfigurationFileLocation, globalConfigurationFileLocation, xdgConfigurationFileLocation, null);
124+
}
125+
126+
/// <summary>
127+
/// Access configuration values without a repository.
128+
/// <para>
129+
/// Generally you want to access configuration via an instance of <see cref="Repository"/> instead.
130+
/// </para>
131+
/// </summary>
132+
/// <param name="repositoryConfigurationFileLocation">Path to a Repository configuration file.</param>
133+
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a Global configuration file will be probed.</param>
134+
/// <param name="xdgConfigurationFileLocation">Path to a XDG configuration file. If null, the default path for a XDG configuration file will be probed.</param>
135+
/// <param name="systemConfigurationFileLocation">Path to a System configuration file. If null, the default path for a System configuration file will be probed.</param>
136+
/// <returns>An instance of <see cref="Configuration"/>.</returns>
137+
public static Configuration BuildFrom(
138+
string repositoryConfigurationFileLocation,
139+
string globalConfigurationFileLocation,
140+
string xdgConfigurationFileLocation,
141+
string systemConfigurationFileLocation)
142+
{
143+
return new Configuration(null, repositoryConfigurationFileLocation, globalConfigurationFileLocation, xdgConfigurationFileLocation, systemConfigurationFileLocation);
144+
}
145+
76146
/// <summary>
77147
/// Access configuration values without a repository. Generally you want to access configuration via an instance of <see cref="Repository"/> instead.
78148
/// </summary>
79149
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a global configuration file will be probed.</param>
150+
[Obsolete("This method will be removed in the next release. Please use Configuration.BuildFrom(string, string) instead.")]
80151
public Configuration(string globalConfigurationFileLocation)
81-
: this(null, globalConfigurationFileLocation, null, null)
152+
: this(null, null, globalConfigurationFileLocation, null, null)
82153
{ }
83154

84155
/// <summary>
85156
/// Access configuration values without a repository. Generally you want to access configuration via an instance of <see cref="Repository"/> instead.
86157
/// </summary>
87158
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a global configuration file will be probed.</param>
88159
/// <param name="xdgConfigurationFileLocation">Path to a XDG configuration file. If null, the default path for a XDG configuration file will be probed.</param>
160+
[Obsolete("This method will be removed in the next release. Please use Configuration.BuildFrom(string, string, string) instead.")]
89161
public Configuration(string globalConfigurationFileLocation, string xdgConfigurationFileLocation)
90-
: this(null, globalConfigurationFileLocation, xdgConfigurationFileLocation, null)
162+
: this(null, null, globalConfigurationFileLocation, xdgConfigurationFileLocation, null)
91163
{ }
92164

93165
/// <summary>
@@ -96,10 +168,10 @@ public Configuration(string globalConfigurationFileLocation, string xdgConfigura
96168
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a global configuration file will be probed.</param>
97169
/// <param name="xdgConfigurationFileLocation">Path to a XDG configuration file. If null, the default path for a XDG configuration file will be probed.</param>
98170
/// <param name="systemConfigurationFileLocation">Path to a System configuration file. If null, the default path for a system configuration file will be probed.</param>
171+
[Obsolete("This method will be removed in the next release. Please use Configuration.BuildFrom(string, string, string, string) instead.")]
99172
public Configuration(string globalConfigurationFileLocation, string xdgConfigurationFileLocation, string systemConfigurationFileLocation)
100-
: this(null, globalConfigurationFileLocation, xdgConfigurationFileLocation, systemConfigurationFileLocation)
101-
{
102-
}
173+
: this(null, null, globalConfigurationFileLocation, xdgConfigurationFileLocation, systemConfigurationFileLocation)
174+
{ }
103175

104176
/// <summary>
105177
/// Determines which configuration file has been found.

LibGit2Sharp/Repository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public Repository(string path, RepositoryOptions options)
125125
config =
126126
new Lazy<Configuration>(
127127
() =>
128-
RegisterForCleanup(new Configuration(this, configurationGlobalFilePath, configurationXDGFilePath,
128+
RegisterForCleanup(new Configuration(this, null, configurationGlobalFilePath, configurationXDGFilePath,
129129
configurationSystemFilePath)));
130130
odb = new Lazy<ObjectDatabase>(() => new ObjectDatabase(this));
131131
diff = new Diff(this);

0 commit comments

Comments
 (0)