c9-core/node_modules/c9/git.js

97 wiersze
2.4 KiB
JavaScript

"use strict";
var Url = require("url");
var Fs = require("fs");
var Path = require("path");
var exec = require("child_process").exec;
exports.isValidUrl = function(url) {
return !!exports.parse(url);
};
exports.parse = function(url) {
var m = url.match(/^(git)@([\w\.\d\-\_]+)(?:\/|:)([\w\.\d\-\_\/]+)/);
if (m) {
return {
protocol: "ssh:",
auth: m[1],
hostname: m[2],
pathname: m[3]
};
}
var parsed = Url.parse(url);
if (
parsed &&
parsed.protocol &&
parsed.protocol.match(/^(git|http|https):$/) &&
parsed.hostname &&
parsed.slashes &&
parsed.pathname
)
return {
protocol: parsed.protocol,
auth: parsed.auth || "",
hostname: parsed.hostname,
pathname: parsed.pathname.replace(/^\/+/, ""),
full: url
};
else
return null;
};
exports.getHeadRevision = function(path, callback) {
exec("git rev-parse HEAD", {
cwd: path
}, function(code, stdout, stderr) {
if (code)
return callback(stderr.toString());
return callback(null, stdout.toString().split("\n")[0]);
});
};
exports.getHeadRevisionSync = function(path) {
var ref = Fs.readFileSync(Path.join(path, ".git/HEAD"), "ascii");
ref = ref.replace(/^ref\:\s+/, "").trim();
// if it already is a commit id
if (ref.match(/^[a-z0-9]{40}$/)) {
return ref;
}
var revision;
try {
revision = Fs.readFileSync(Path.join(path, ".git", ref), "ascii");
}
catch (ex) {
// the link may be pruned by git, try the info/refs file
var info = Fs.readFileSync(Path.join(path, ".git/info/refs"), "ascii");
var lines = info.split(/[\r\n]+/);
for (var parts, i = 0, l = lines.length; i < l; ++i) {
parts = lines[i].split(/[\s\t]+/);
if (parts[1] == ref) {
revision = parts[0];
break;
}
}
}
// trim new lines
revision = revision.trim();
return revision;
};
exports.getHeadBranch = function(path, callback) {
exec("git rev-parse --abbrev-ref HEAD", {
cwd: path
}, function(code, stdout, stderr) {
if (code)
return callback(stderr.toString());
return callback(null, stdout.toString().split("\n")[0]);
});
};