@keymanapp/kmc
Version:
Keyman Developer compiler command line tools
63 lines • 2.5 kB
JavaScript
import { execFileSync } from 'child_process';
// RFC3339 pattern, UTC
export const expectedGitDateFormat = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d\d\d)?Z$/;
/**
* Returns the date and time of the last commit from git for the passed in path
* @param path Path for which to retrieve the last commit message
* @returns string, in RFC3339, 'YYYY-MM-DDThh:nn:ss.SSSZ'
*/
export function getLastGitCommitDate(path) {
// git log -1 --no-merges --format=%at
let result = callGitLog([
'log', // git log
'-1', // one commit only
'--no-merges', // we're only interested in 'real' commits
'--format=%at', // emit only the commit date as a UNIX timestamp
'--',
path
]);
if (typeof result != 'string') {
return null;
}
if (result == '') {
// #12626: no history was found, but not an error. We may have only a merge
// commit in history for that file, allow merges in the log
result = callGitLog([
'log', // git log
'-1', // one commit only
'--format=%at', // emit only the commit date as a UNIX timestamp
'--',
path
]);
if (typeof result != 'string') {
return null;
}
}
const sec = Number.parseInt(result);
if (Number.isNaN(sec)) {
// We received invalid data, perhaps a git error string so just ignore
return null;
}
// We receive a timestamp in seconds but we need milliseconds
return new Date(sec * 1000).toISOString();
}
function callGitLog(params) {
try {
const result = execFileSync('git', params, {
encoding: 'utf-8', // force a string result rather than Buffer
windowsHide: true, // on windows, we may need this to suppress a console window popup
stdio: ['pipe', 'pipe', 'pipe'] // all output via pipe, so we don't get git errors on console
});
return result.trim();
}
catch (e) {
// If git is not available, or the file is not in-repo, then it is probably
// fine to just silently return null, as the only machines where this is
// critical are the CI machines where we build and deploy .keyboard_info
// files, and where git will always be available. It would be possible to
// have this raise an error in CI environments, but the chance of error
// seems low.
return null;
}
}
//# sourceMappingURL=getLastGitCommitDate.js.map