10000 Introduce Configuration.HasConfig() · Saaman/libgit2sharp@28a225f · GitHub
[go: up one dir, main page]

Skip to content

Commit 28a225f

Browse files
committed
Introduce Configuration.HasConfig()
Signed-off-by: Unit Test <yoram.harmelin@gmail.com>
1 parent d766a6f commit 28a225f

File tree

4 files changed

+44
-48
lines changed

4 files changed

+44
-48
lines changed

LibGit2Sharp.Tests/CommitFixture.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,8 @@ public void CanCommitWithSignatureFromConfig()
483483
Assert.True(Path.IsPathRooted(dir));
484484
Assert.True(Directory.Exists(dir));
485485

486-
InconclusiveIf(() => !repo.Config.HasGlobalConfig, "No Git global configuration available");
486+
InconclusiveIf(() => !repo.Config.HasConfig(ConfigurationLevel.Global),
487+
"No Git global configuration available");
487488

488489
const string relativeFilepath = "new.txt";
489490
string filePath = Path.Combine(repo.Info.WorkingDirectory, relativeFilepath);

LibGit2Sharp.Tests/ConfigurationFixture.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void CanUnsetAnEntryFromTheGlobalConfiguration()
8787

8888
using (var repo = new Repository(BareTestRepoPath, options))
8989
{
90-
Assert.True(repo.Config.HasGlobalConfig);
90+
Assert.True(repo.Config.HasConfig(ConfigurationLevel.Global));
9191
Assert.Equal(42, repo.Config.Get<int>("Wow.Man-I-am-totally-global").Value);
9292

9393
repo.Config.Unset("Wow.Man-I-am-totally-global");
@@ -103,7 +103,8 @@ public void CanGetGlobalStringValue()
103103
{
104104
using (var repo = new Repository(StandardTestRepoPath))
105105
{
106-
InconclusiveIf(() => !repo.Config.HasGlobalConfig, "No Git global configuration available");
106+
InconclusiveIf(() => !repo.Config.HasConfig(ConfigurationLevel.Global),
107+
"No Git global configuration available");
107108

108109
Assert.NotNull(repo.Config.Get<string>("user.name"));
109110
}
@@ -114,7 +115,9 @@ public void CanGetGlobalStringValueWithoutRepo()
114115
{
115116
using (var config = new Configuration())
116117
{
117-
InconclusiveIf(() => !config.HasGlobalConfig, "No Git global configuration available");
118+
InconclusiveIf(() => !config.HasConfig(ConfigurationLevel.Global),
119+
"No Git global configuration available");
120+
118121
Assert.NotNull(config.Get<string>("user.name"));
119122
}
120123
}
@@ -161,7 +164,9 @@ public void CanEnumerateGlobalConfig()
161164
{
162165
using (var repo = new Repository(StandardTestRepoPath))
163166
{
164-
InconclusiveIf(() => !repo.Config.HasGlobalConfig, "No Git global configuration available");
167+
InconclusiveIf(() => !repo.Config.HasConfig(ConfigurationLevel.Global),
168+
"No Git global configuration available");
169+
165170
var entry = repo.Config.FirstOrDefault<ConfigurationEntry<string>>(e => e.Key == "user.name");
166171
Assert.NotNull(entry);
167172
Assert.NotNull(entry.Value);
@@ -196,7 +201,8 @@ public void CanSetGlobalStringValue()
196201
{
197202
using (var repo = new Repository(StandardTestRepoPath))
198203
{
199-
InconclusiveIf(() => !repo.Config.HasGlobalConfig, "No Git global configuration available");
204+
InconclusiveIf(() => !repo.Config.HasConfig(ConfigurationLevel.Global),
205+
"No Git global configuration available");
200206

201207
var existing = repo.Config.Get<string>("user.name");
202208
Assert.NotNull(existing);
@@ -219,7 +225,8 @@ public void CanSetGlobalStringValueWithoutRepo()
219225
{
220226
using(var config = new Configuration())
221227
{
222-
InconclusiveIf(() => !config.HasGlobalConfig, "No Git global configuration available");
228+
InconclusiveIf(() => !config.HasConfig(ConfigurationLevel.Global),
229+
"No Git global configuration available");
223230

224231
var existing = config.Get<string>("user.name");
225232
Assert.NotNull(existing);

LibGit2Sharp.Tests/RepositoryOptionsFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public void CanProvideDifferentConfigurationFilesToARepository()
166166

167167
using (var repo = new Repository(BareTestRepoPath, options))
168168
{
169-
Assert.True(repo.Config.HasGlobalConfig);
169+
Assert.True(repo.Config.HasConfig(ConfigurationLevel.Global));
170170
Assert.Equal(name, repo.Config.Get<string>("user.name").Value);
171171
Assert.Equal(email, repo.Config.Get<string>("user.email").Value);
172172

LibGit2Sharp/Configuration.cs

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -90,27 +90,27 @@ public Configuration(string globalConfigurationFileLocation = null, string syste
9090
}
9191

9292
/// <summary>
93-
/// Determines if there is a local repository level Git configuration file.
93+
/// Determines if a Git configuration file specific to the current interactive user has been found.
9494
/// </summary>
95-
private bool HasLocalConfig
95+
public virtual bool HasGlobalConfig
9696
{
97-
get { return localHandle != null; }
97+
get { return HasConfig(ConfigurationLevel.Global); }
9898
}
9999

100100
/// <summary>
101-
/// Determines if a Git configuration file specific to the current interactive user has been found.
101+
/// Determines if a system-wide Git configuration file has been found.
102102
/// </summary>
103-
public virtual bool HasGlobalConfig
103+
public virtual bool HasSystemConfig
104104
{
105-
get { return globalConfigPath != null; }
105+
get { return HasConfig(ConfigurationLevel.System); }
106106
}
107107

108108
/// <summary>
109-
/// Determines if a system-wide Git configuration file has been found.
109+
/// Determines which configuration file has been found.
110110
/// </summary>
111-
public virtual bool HasSystemConfig
111+
public virtual bool HasConfig(ConfigurationLevel level)
112112
{
113-
get { return systemConfigPath != null; }
113+
return RetrieveConfigurationHandle(level, false) != null;
114114
}
115115

116116
#region IDisposable Members
@@ -136,7 +136,7 @@ public virtual void Unset(string key, ConfigurationLevel level = ConfigurationLe
136136
{
137137
Ensure.ArgumentNotNullOrEmptyString(key, "key");
138138

139-
ConfigurationSafeHandle h = RetrieveConfigurationHandle(level);
139+
ConfigurationSafeHandle h = RetrieveConfigurationHandle(level, true);
140140

141141
bool success = Proxy.git_config_delete(h, key);
142142

@@ -412,7 +412,7 @@ public virtual void Set<T>(string key, T value, ConfigurationLevel level = Confi
412412
{
413413
Ensure.ArgumentNotNullOrEmptyString(key, "key");
414414

415-
ConfigurationSafeHandle h = RetrieveConfigurationHandle(level);
415+
ConfigurationSafeHandle h = RetrieveConfigurationHandle(level, true);
416416

417417
if (!configurationTypedUpdater.ContainsKey(typeof(T)))
418418
{
@@ -423,42 +423,23 @@ public virtual void Set<T>(string key, T value, ConfigurationLevel level = Confi
423423
Save();
424424
}
425425

426-
private ConfigurationSafeHandle RetrieveConfigurationHandle(ConfigurationLevel level)
426+
private ConfigurationSafeHandle RetrieveConfigurationHandle(ConfigurationLevel level, bool throwIfStoreHasNotBeenFound)
427427
{
428-
if (level == ConfigurationLevel.Local && !HasLocalConfig)
428+
Func<Configuration, ConfigurationSafeHandle> handleRetriever;
429+
if (!configurationHandleRetriever.TryGetValue(level, out handleRetriever))
429430
{
430-
throw new LibGit2SharpException("No local configuration file has been found. You must use ConfigurationLevel.Global when accessing configuration outside of repository.");
431+
throw new ArgumentException(
432+
string.Format(CultureInfo.InvariantCulture, "Configuration level has an unexpected value ('{0}').",
433+
level), "level");
431434
}
432435

433-
if (level == ConfigurationLevel.Global && !HasGlobalConfig)
434-
{
435-
throw new LibGit2SharpException("No global configuration file has been found.");
436-
}
436+
ConfigurationSafeHandle h = handleRetriever(this);
437437

438-
if (level == ConfigurationLevel.System && !HasSystemConfig)
438+
if (h == null && throwIfStoreHasNotBeenFound)
439439
{
440-
throw new LibGit2SharpException("No system configuration file has been found.");
440+
throw new LibGit2SharpException("No matching configuration file has been found.");
441441
}
442442

443-
ConfigurationSafeHandle h;
444-
445-
switch (level)
446-
{
447-
case ConfigurationLevel.Local:
448-
h = localHandle;
449-
break;
450-
451-
case ConfigurationLevel.Global:
452-
h = globalHandle;
453-
break;
454-
455-
case ConfigurationLevel.System:
456-
h = systemHandle;
457-
break;
458-
459-
default:
460-
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Configuration level has an unexpected value ('{0}').", level), "level");
461-
}
462443
return h;
463444
}
464445

@@ -467,14 +448,21 @@ private static Action<string, object, ConfigurationSafeHandle> GetUpdater<T>(Act
467448
return (key, val, handle) => setter(handle, key, (T)val);
468449
}
469450

470-
private readonly IDictionary<Type, Action<string, object, ConfigurationSafeHandle>> configurationTypedUpdater = new Dictionary<Type, Action<string, object, ConfigurationSafeHandle>>
451+
private readonly static IDictionary<Type, Action<string, object, ConfigurationSafeHandle>> configurationTypedUpdater = new Dictionary<Type, Action<string, object, ConfigurationSafeHandle>>
471452
{
472453
{ typeof(int), GetUpdater<int>(Proxy.git_config_set_int32) },
473454
{ typeof(long), GetUpdater<long>(Proxy.git_config_set_int64) },
474455
{ typeof(bool), GetUpdater<bool>(Proxy.git_config_set_bool) },
475456
{ typeof(string), GetUpdater<string>(Proxy.git_config_set_string) },
476457
};
477458

459+
private readonly static IDictionary<ConfigurationLevel, Func<Configuration, ConfigurationSafeHandle>> configurationHandleRetriever = new Dictionary<ConfigurationLevel, Func<Configuration, ConfigurationSafeHandle>>
460+
{
461+
{ ConfigurationLevel.Local, cfg => cfg.localHandle },
462+
{ ConfigurationLevel.Global, cfg => cfg.globalHandle },
463+
{ ConfigurationLevel.System, cfg => cfg.systemHandle },
464+
};
465+
478466
IEnumerator<ConfigurationEntry<string>> IEnumerable<ConfigurationEntry<String>>.GetEnumerator()
479467
{
480468
return BuildConfigEntries().Cast<ConfigurationEntry<string>>().GetEnumerator();

0 commit comments

Comments
 (0)
0