|
@@ -15,8 +15,14 @@ module.exports = {
|
|
|
_git: null,
|
|
|
_repo: {
|
|
|
path: '',
|
|
|
+ branch: 'master',
|
|
|
exists: false,
|
|
|
- inst: null
|
|
|
+ inst: null,
|
|
|
+ sync: true
|
|
|
+ },
|
|
|
+ _opts: {
|
|
|
+ clone: {},
|
|
|
+ push: {}
|
|
|
},
|
|
|
|
|
|
/**
|
|
@@ -41,6 +47,11 @@ module.exports = {
|
|
|
|
|
|
self._initRepo(appconfig).then((repo) => {
|
|
|
self._repo.inst = repo;
|
|
|
+
|
|
|
+ if(self._repo.sync) {
|
|
|
+ self.resync();
|
|
|
+ }
|
|
|
+
|
|
|
});
|
|
|
|
|
|
return self;
|
|
@@ -80,17 +91,20 @@ module.exports = {
|
|
|
//-> Init repository
|
|
|
|
|
|
let repoInitOperation = null;
|
|
|
+ self._repo.branch = appconfig.git.branch;
|
|
|
+ self._repo.sync = appconfig.git.remote;
|
|
|
+ self._opts.clone = self._generateCloneOptions(appconfig);
|
|
|
+ self._opts.push = self._generatePushOptions(appconfig);
|
|
|
|
|
|
if(self._repo.exists) {
|
|
|
|
|
|
winston.info('[GIT] Using existing repository...');
|
|
|
repoInitOperation = NodeGit.Repository.open(self._repo.path);
|
|
|
|
|
|
- } else if(appconfig.git.mode === 'remote') {
|
|
|
+ } else if(appconfig.git.remote) {
|
|
|
|
|
|
winston.info('[GIT] Cloning remote repository for first time...');
|
|
|
- let cloneOptions = self._generateCloneOptions(appconfig);
|
|
|
- repoInitOperation = NodeGit.Clone(appconfig.git.url, self._repo.path, cloneOptions);
|
|
|
+ repoInitOperation = NodeGit.Clone(appconfig.git.url, self._repo.path, self._opts.clone);
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -106,7 +120,11 @@ module.exports = {
|
|
|
winston.error(err);
|
|
|
}).then((repo) => {
|
|
|
|
|
|
- self._repo.inst = repo;
|
|
|
+ if(self._repo.sync) {
|
|
|
+ NodeGit.Remote.setPushurl(repo, 'origin', appconfig.git.url);
|
|
|
+ }
|
|
|
+
|
|
|
+ return repo;
|
|
|
|
|
|
winston.info('[GIT] Git repository is now ready.');
|
|
|
});
|
|
@@ -121,49 +139,111 @@ module.exports = {
|
|
|
*/
|
|
|
_generateCloneOptions(appconfig) {
|
|
|
|
|
|
- let cloneOptions = {};
|
|
|
-
|
|
|
- cloneOptions.fetchOpts = {
|
|
|
- callbacks: {
|
|
|
- credentials: () => {
|
|
|
-
|
|
|
- let cred = null;
|
|
|
- switch(appconfig.git.auth.type) {
|
|
|
- case 'basic':
|
|
|
- cred = NodeGit.Cred.userpassPlaintextNew(
|
|
|
- appconfig.git.auth.user,
|
|
|
- appconfig.git.auth.pass
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'oauth':
|
|
|
- cred = NodeGit.Cred.userpassPlaintextNew(
|
|
|
- appconfig.git.auth.token,
|
|
|
- "x-oauth-basic"
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'ssh':
|
|
|
- cred = NodeGit.Cred.sshKeyNew(
|
|
|
- appconfig.git.auth.user,
|
|
|
- appconfig.git.auth.publickey,
|
|
|
- appconfig.git.auth.privatekey,
|
|
|
- appconfig.git.auth.passphrase
|
|
|
- );
|
|
|
- break;
|
|
|
- default:
|
|
|
- cred = NodeGit.Cred.defaultNew();
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- return cred;
|
|
|
- }
|
|
|
- }
|
|
|
- };
|
|
|
+ let cloneOptions = new NodeGit.CloneOptions();
|
|
|
+ cloneOptions.fetchOpts = this._generateFetchOptions(appconfig);
|
|
|
+ return cloneOptions;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ _generateFetchOptions(appconfig) {
|
|
|
+
|
|
|
+ let fetchOptions = new NodeGit.FetchOptions();
|
|
|
+ fetchOptions.callbacks = this._generateRemoteCallbacks(appconfig);
|
|
|
+ return fetchOptions;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ _generatePushOptions(appconfig) {
|
|
|
+
|
|
|
+ let pushOptions = new NodeGit.PushOptions();
|
|
|
+ pushOptions.callbacks = this._generateRemoteCallbacks(appconfig);
|
|
|
+ return pushOptions;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ _generateRemoteCallbacks(appconfig) {
|
|
|
+
|
|
|
+ let remoteCallbacks = new NodeGit.RemoteCallbacks();
|
|
|
+ let credFunc = this._generateCredentials(appconfig);
|
|
|
+ remoteCallbacks.credentials = () => { return credFunc; };
|
|
|
|
|
|
if(os.type() === 'Darwin') {
|
|
|
- cloneOptions.fetchOpts.callbacks.certificateCheck = () => { return 1; }; // Bug in OS X, bypass certs check workaround
|
|
|
+ remoteCallbacks.certificateCheck = () => { return 1; }; // Bug in OS X, bypass certs check workaround
|
|
|
}
|
|
|
|
|
|
- return cloneOptions;
|
|
|
+ return remoteCallbacks;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ _generateCredentials(appconfig) {
|
|
|
+
|
|
|
+ let cred = null;
|
|
|
+ switch(appconfig.git.auth.type) {
|
|
|
+ case 'basic':
|
|
|
+ cred = NodeGit.Cred.userpassPlaintextNew(
|
|
|
+ appconfig.git.auth.user,
|
|
|
+ appconfig.git.auth.pass
|
|
|
+ );
|
|
|
+ break;
|
|
|
+ case 'oauth':
|
|
|
+ cred = NodeGit.Cred.userpassPlaintextNew(
|
|
|
+ appconfig.git.auth.token,
|
|
|
+ "x-oauth-basic"
|
|
|
+ );
|
|
|
+ break;
|
|
|
+ case 'ssh':
|
|
|
+ cred = NodeGit.Cred.sshKeyNew(
|
|
|
+ appconfig.git.auth.user,
|
|
|
+ appconfig.git.auth.publickey,
|
|
|
+ appconfig.git.auth.privatekey,
|
|
|
+ appconfig.git.auth.passphrase
|
|
|
+ );
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ cred = NodeGit.Cred.defaultNew();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return cred;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ resync() {
|
|
|
+
|
|
|
+ let self = this;
|
|
|
+
|
|
|
+ // Fetch
|
|
|
+
|
|
|
+ return self._repo.inst.fetch('origin', self._opts.clone.fetchOpts)
|
|
|
+ .catch((err) => {
|
|
|
+ winston.error('Unable to fetch from git origin!' + err);
|
|
|
+ })
|
|
|
+
|
|
|
+ // Merge
|
|
|
+
|
|
|
+ .then(() => {
|
|
|
+ return self._repo.inst.mergeBranches(self._repo.branch, 'origin/' + self._repo.branch);
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ winston.error('Unable to merge from remote head!' + err);
|
|
|
+ })
|
|
|
+
|
|
|
+ // Push
|
|
|
+
|
|
|
+ .then(() => {
|
|
|
+ return self._repo.inst.getRemote('origin').then((remote) => {
|
|
|
+ self._repo.inst.getStatus().then(function(arrayStatusFile) {
|
|
|
+ console.log(arrayStatusFile[0].status());
|
|
|
+ });
|
|
|
+ /*remote.push( ["refs/heads/master:refs/heads/master"], self._opts.push ).then((errNum) => {
|
|
|
+ console.log('DUDE' + errNum);
|
|
|
+ }).catch((err) => {
|
|
|
+ console.log(err);
|
|
|
+ });*/
|
|
|
+ });
|
|
|
+ }).catch((err) => {
|
|
|
+ winston.error('Unable to push to git origin!' + err);
|
|
|
+ });
|
|
|
|
|
|
}
|
|
|
|