Skip to content

Commit 6edfe44

Browse files
committed
Introduce Configuration.BuildFrom()
1 parent cd95adb commit 6edfe44

File tree

4 files changed

+108
-12
lines changed

4 files changed

+108
-12
lines changed

LibGit2Sharp.Tests/ConfigurationFixture.cs

Lines changed: 21 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,25 @@ 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+
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+
}
369389
}
370390
}

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: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ 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;
@@ -29,11 +30,12 @@ public class Configuration : IDisposable,
2930
protected Configuration()
3031
{ }
3132

32-
internal Configuration(Repository repository, string globalConfigurationFileLocation,
33+
internal Configuration(Repository repository, string repositoryConfigurationFileLocation, string globalConfigurationFileLocation,
3334
string xdgConfigurationFileLocation, string systemConfigurationFileLocation)
3435
{
3536
this.repository = repository;
3637

38+
repoConfigPath = repositoryConfigurationFileLocation;
3739
globalConfigPath = globalConfigurationFileLocation ?? Proxy.git_config_find_global();
3840
xdgConfigPath = xdgConfigurationFileLocation ?? Proxy.git_config_find_xdg();
3941
systemConfigPath = systemConfigurationFileLocation ?? Proxy.git_config_find_system();
@@ -56,6 +58,10 @@ private void Init()
5658

5759
Proxy.git_repository_set_config(repository.Handle, configHandle);
5860
}
61+
else if (repoConfigPath != null)
62+
{
63+
Proxy.git_config_add_file_ondisk(configHandle, repoConfigPath, ConfigurationLevel.Local);
64+
}
5965

6066
if (globalConfigPath != null)
6167
{
@@ -73,21 +79,91 @@ private void Init()
7379
}
7480
}
7581

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

84159
/// <summary>
85160
/// Access configuration values without a repository. Generally you want to access configuration via an instance of <see cref="Repository"/> instead.
86161
/// </summary>
87162
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a global configuration file will be probed.</param>
88163
/// <param name="xdgConfigurationFileLocation">Path to a XDG configuration file. If null, the default path for a XDG configuration file will be probed.</param>
164+
[Obsolete("This method will be removed in the next release. Please use Configuration.BuildFrom(string, string, string) instead.")]
89165
public Configuration(string globalConfigurationFileLocation, string xdgConfigurationFileLocation)
90-
: this(null, globalConfigurationFileLocation, xdgConfigurationFileLocation, null)
166+
: this(null, null, globalConfigurationFileLocation, xdgConfigurationFileLocation, null)
91167
{ }
92168

93169
/// <summary>
@@ -96,10 +172,10 @@ public Configuration(string globalConfigurationFileLocation, string xdgConfigura
96172
/// <param name="globalConfigurationFileLocation">Path to a Global configuration file. If null, the default path for a global configuration file will be probed.</param>
97173
/// <param name="xdgConfigurationFileLocation">Path to a XDG configuration file. If null, the default path for a XDG configuration file will be probed.</param>
98174
/// <param name="systemConfigurationFileLocation">Path to a System configuration file. If null, the default path for a system configuration file will be probed.</param>
175+
[Obsolete("This method will be removed in the next release. Please use Configuration.BuildFrom(string, string, string, string) instead.")]
99176
public Configuration(string globalConfigurationFileLocation, string xdgConfigurationFileLocation, string systemConfigurationFileLocation)
100-
: this(null, globalConfigurationFileLocation, xdgConfigurationFileLocation, systemConfigurationFileLocation)
101-
{
102-
}
177+
: this(null, null, globalConfigurationFileLocation, xdgConfigurationFileLocation, systemConfigurationFileLocation)
178+
{ }
103179

104180
/// <summary>
105181
/// 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)