Skip to content

Commit

Permalink
Parse commit from packed refs if not available in refs dir. (#163)
Browse files Browse the repository at this point in the history
* Add .idea to .gitignore

* Added alternative method for parsing current commit with test.

* Fixing test.

* Remove dependency on fs-extra.
  • Loading branch information
Chas DeVeas authored and nickmerwin committed Mar 30, 2017
1 parent e476964 commit ef7e811
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@ coverage/
lib-cov/
coverage.json
npm-debug.log

# Webstorm IDE
.idea
21 changes: 20 additions & 1 deletion lib/detectLocalGit.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,25 @@ module.exports = function detectLocalGit() {
if (!branch)
return { git_commit: head };

var commit = fs.readFileSync(path.join(dir, '.git', 'refs', 'heads', branch), 'utf-8').trim();
var commit = _parseCommitHashFromRef(dir, branch);

return { git_commit: commit, git_branch: branch };
};

function _parseCommitHashFromRef(dir, branch) {
var ref = path.join(dir, '.git', 'refs', 'heads', branch);
if (fs.existsSync(ref)) {
return fs.readFileSync(ref, 'utf-8').trim();
} else {
// ref does not exist; get it from packed-refs
var commit = '';
var packedRefs = path.join(dir, '.git', 'packed-refs');
var packedRefsText = fs.readFileSync(packedRefs, 'utf-8');
packedRefsText.split('\n').forEach(function (line) {
if (line.match('refs/heads/'+branch)) {
commit = line.split(' ')[0];
}
});
return commit;
}
}
77 changes: 77 additions & 0 deletions test/detectLocalGit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
var should = require('should');
var fs = require('fs');
var path = require('path');

var detectLocalGit = require('../lib/detectLocalGit');

var ORIGINAL_CWD = process.cwd();
var TEST_DIR = path.resolve(__dirname);
var TEMP_GIT_DIR = path.join(TEST_DIR, '.git');

describe("detectLocalGit", function() {

before(function() {
_makeTempGitDir();
process.chdir(TEST_DIR);
});

after(function() {
_cleanTempGitDir();
process.chdir(ORIGINAL_CWD);
});

it('should get commit hash from packed-refs when refs/heads/master does not exist', function() {
var results = detectLocalGit();
should.exist(results);
(results).should.deepEqual({
git_commit: '0000000000000000ffffffffffffffffffffffff',
git_branch: 'master'
});
});

});

function _makeTempGitDir() {

_cleanTempGitDir();

var dir = TEMP_GIT_DIR;

fs.mkdirSync(dir);

var HEAD = path.join(dir, 'HEAD');
var packedRefs = path.join(dir, 'packed-refs');

fs.writeFileSync(HEAD, 'ref: refs/heads/master');
fs.writeFileSync(packedRefs, "" +
"# pack-refs with: peeled fully-peeled\n" +
"0000000000000000000000000000000000000000 refs/heads/other/ref\n" +
"0000000000000000ffffffffffffffffffffffff refs/heads/master\n" +
"ffffffffffffffffffffffffffffffffffffffff refs/remotes/origin/other\n");

}

function _cleanTempGitDir() {
_deleteFolderRecursive(TEMP_GIT_DIR);
}

function _deleteFolderRecursive(dir) {

if (!dir.match('node-coveralls/test')) {
throw new Error('Tried to clean a temp git directory that did not match path: node-coveralls/test');
}

if(fs.existsSync(dir)) {

fs.readdirSync(dir).forEach(function(file,index){
var curPath = path.join(dir, file);
if(fs.lstatSync(curPath).isDirectory()) { // recurse
_deleteFolderRecursive(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});

fs.rmdirSync(dir);
}
}

0 comments on commit ef7e811

Please sign in to comment.