summaryrefslogtreecommitdiffstats
path: root/lib/utils/git.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/utils/git.js')
-rw-r--r--lib/utils/git.js133
1 files changed, 0 insertions, 133 deletions
diff --git a/lib/utils/git.js b/lib/utils/git.js
deleted file mode 100644
index 6884b83..0000000
--- a/lib/utils/git.js
+++ /dev/null
@@ -1,133 +0,0 @@
-var is = require('is');
-var path = require('path');
-var crc = require('crc');
-var URI = require('urijs');
-
-var pathUtil = require('./path');
-var Promise = require('./promise');
-var command = require('./command');
-var fs = require('./fs');
-
-var GIT_PREFIX = 'git+';
-
-function Git() {
- this.tmpDir;
- this.cloned = {};
-}
-
-// Return an unique ID for a combinaison host/ref
-Git.prototype.repoID = function(host, ref) {
- return crc.crc32(host+'#'+(ref || '')).toString(16);
-};
-
-// Allocate a temporary folder for cloning repos in it
-Git.prototype.allocateDir = function() {
- var that = this;
-
- if (this.tmpDir) return Promise();
-
- return fs.tmpDir()
- .then(function(dir) {
- that.tmpDir = dir;
- });
-};
-
-// Clone a git repository if non existant
-Git.prototype.clone = function(host, ref) {
- var that = this;
-
- return this.allocateDir()
-
- // Return or clone the git repo
- .then(function() {
- // Unique ID for repo/ref combinaison
- var repoId = that.repoID(host, ref);
-
- // Absolute path to the folder
- var repoPath = path.join(that.tmpDir, repoId);
-
- if (that.cloned[repoId]) return repoPath;
-
- // Clone repo
- return command.exec('git clone '+host+' '+repoPath)
-
- // Checkout reference if specified
- .then(function() {
- that.cloned[repoId] = true;
-
- if (!ref) return;
- return command.exec('git checkout '+ref, { cwd: repoPath });
- })
- .thenResolve(repoPath);
- });
-};
-
-// Get file from a git repo
-Git.prototype.resolve = function(giturl) {
- // Path to a file in a git repo?
- if (!Git.isUrl(giturl)) {
- if (this.resolveRoot(giturl)) return Promise(giturl);
- return Promise(null);
- }
- if (is.string(giturl)) giturl = Git.parseUrl(giturl);
- if (!giturl) return Promise(null);
-
- // Clone or get from cache
- return this.clone(giturl.host, giturl.ref)
- .then(function(repo) {
- return path.resolve(repo, giturl.filepath);
- });
-};
-
-// Return root of git repo from a filepath
-Git.prototype.resolveRoot = function(filepath) {
- var relativeToGit, repoId;
-
- // No git repo cloned, or file is not in a git repository
- if (!this.tmpDir || !pathUtil.isInRoot(this.tmpDir, filepath)) return null;
-
- // Extract first directory (is the repo id)
- relativeToGit = path.relative(this.tmpDir, filepath);
- repoId = relativeToGit.split(path.sep)[0];
- if (!repoId) {
- return;
- }
-
- // Return an absolute file
- return path.resolve(this.tmpDir, repoId);
-};
-
-// Check if an url is a git dependency url
-Git.isUrl = function(giturl) {
- return (giturl.indexOf(GIT_PREFIX) === 0);
-};
-
-// Parse and extract infos
-Git.parseUrl = function(giturl) {
- var ref, uri, fileParts, filepath;
-
- if (!Git.isUrl(giturl)) return null;
- giturl = giturl.slice(GIT_PREFIX.length);
-
- uri = new URI(giturl);
- ref = uri.fragment() || null;
- uri.fragment(null);
-
- // Extract file inside the repo (after the .git)
- fileParts = uri.path().split('.git');
- filepath = fileParts.length > 1? fileParts.slice(1).join('.git') : '';
- if (filepath[0] == '/') {
- filepath = filepath.slice(1);
- }
-
- // Recreate pathname without the real filename
- uri.path(fileParts[0] + '.git');
-
- return {
- host: uri.toString(),
- ref: ref,
- filepath: filepath
- };
-};
-
-module.exports = Git;