var assert = require("assert");
var path = require("path");
var local = path.join.bind(path, __dirname);
var exec = require("../../utils/execPromise");
describe("Config", function() {
var NodeGit = require("../../");
var Repository = NodeGit.Repository;
var Config = NodeGit.Config;
var reposPath = local("../repos/workdir");
describe("openOnDisk", function() {
var configPath = path.join(reposPath, ".git/config");
it("opens the same config as the repo", function() {
var repo;
var onDiskConfig;
return Repository.open(reposPath)
.then(function(_repo) {
repo = _repo;
return Config.openOndisk(configPath);
})
.then(function(config) {
onDiskConfig = config;
return repo.config();
})
.then(function(repoConfig) {
return Promise.all([
onDiskConfig.getString("core.filemode"),
onDiskConfig.getString("core.bare"),
repoConfig.getString("core.filemode"),
repoConfig.getString("core.bare")
]);
})
.then(function(results) {
var onDiskFileMode = results[0];
var onDiskBare = results[1];
var repoFileMode = results[2];
var repoBare = results[3];
assert.equal(onDiskFileMode, repoFileMode);
assert.equal(onDiskBare, repoBare);
});
});
it("opens the config and can change a value", function() {
var repo;
var onDiskConfig;
var repoConfig;
var originalFileMode;
return Repository.open(reposPath)
.then(function(_repo) {
repo = _repo;
return Config.openOndisk(configPath);
})
.then(function(config) {
onDiskConfig = config;
return repo.config();
})
.then(function(_repoConfig) {
repoConfig = _repoConfig;
return Promise.all([
onDiskConfig.getString("core.filemode"),
repoConfig.getString("core.filemode")
]);
})
.then(function(results) {
var onDiskFileMode = results[0];
var repoFileMode = results[1];
assert.equal(onDiskFileMode, repoFileMode);
originalFileMode = onDiskFileMode;
var oppositeFileMode = onDiskFileMode === "true" ? "false" : "true";
return onDiskConfig.setString(
"core.filemode",
oppositeFileMode
);
})
.then(function() {
return Config.openOndisk(configPath);
})
.then(function(config) {
return Promise.all([
config.getString("core.filemode"),
repoConfig.getString("core.filemode")
]);
})
.then(function(results) {
var onDiskFileMode = results[0];
var repoFileMode = results[1];
assert.notEqual(onDiskFileMode, originalFileMode);
assert.equal(onDiskFileMode, repoFileMode);
})
.then(function() {
// cleanup
return onDiskConfig.setString(
"core.filemode",
originalFileMode
);
});
});
});
it("can get and set a global value", function() {
var savedUserName;
function finallyFn() {
return exec("git config --global user.name \"" + savedUserName + "\"");
}
return exec("git config --global user.name")
.then(function(userName) {
savedUserName = userName.trim();
return exec(
"git config --global user.name \"" + savedUserName + "-test\"");
})
.then(function() {
return NodeGit.Config.openDefault();
})
.then(function(config) {
return config.getString("user.name");
})
.then(function(userNameFromNodeGit) {
assert.equal(savedUserName + "-test", userNameFromNodeGit);
})
.then(finallyFn)
.catch(function(e) {
return finallyFn()
.then(function() {
throw e;
});
});
});
it("will reject when getting value of non-existent config key", function() {
// Test initially for finding source of a segfault. There was a problem
// where getting an empty config value crashes nodegit.
return NodeGit.Config.openDefault()
.then(function(config) {
return config.getString("user.fakevalue");
})
.catch(function (e) {
return true;
});
});
it("can get and set a repo config value", function() {
var savedUserName;
function finallyFn() {
return exec("git config user.name \"" + savedUserName + "\"", {
cwd: reposPath
});
}
return exec("git config user.name", {
cwd: reposPath
})
.then(function(userName) {
savedUserName = userName.trim();
return exec("git config user.name \"" + savedUserName + "-test\"", {
cwd: reposPath
});
})
.then(function() {
return NodeGit.Repository.open(reposPath);
})
.then(function(repo) {
return repo.config();
})
.then(function(config) {
return config.getString("user.name");
})
.then(function(userNameFromNodeGit) {
assert.equal(savedUserName + "-test", userNameFromNodeGit);
})
.then(finallyFn)
.catch(function(e) {
return finallyFn()
.then(function() {
throw e;
});
});
});
describe("getPath", function() {
it("can get path for a given config", function() {
return NodeGit.Repository.open(reposPath)
.then(function(repo) {
return repo.config();
})
.then(function(config) {
return Promise.all([
config.getPath("core.filemode"),
config.getString("core.filemode")
]);
})
.then(function(results) {
var localFilemode = results[0];
var repoFilemode = results[1];
assert.equal(localFilemode, repoFilemode);
});
});
});
});