From 32c50eea7e9ea6ad6485f568195cb3c50ac5ad1a Mon Sep 17 00:00:00 2001 From: NGPixel Date: Wed, 24 Aug 2016 22:10:03 -0400 Subject: [PATCH] Git fetch + merge --- config.sample.yml | 14 ++-- models/git.js | 168 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 134 insertions(+), 48 deletions(-) diff --git a/config.sample.yml b/config.sample.yml index 92b80f07..46540363 100644 --- a/config.sample.yml +++ b/config.sample.yml @@ -26,7 +26,6 @@ port: 80 # ------------------------------------------------- datadir: - repo: ./repo db: ./data uploads: ./uploads @@ -36,9 +35,10 @@ datadir: # Full explanation + examples in the documentation (https://requarks-wiki.readme.io/) git: - path: auto - mode: remote + path: ./repo + remote: true url: https://github.com/Organization/Repo + branch: master auth: type: ssh user: gitusername @@ -66,4 +66,10 @@ sessionSecret: 1234567890abcdefghijklmnopqrstuvxyz # An account will be created using the email specified here. # The password is set to "admin123" by default. Change it immediately upon login!!! -admin: admin@company.com \ No newline at end of file +admin: admin@company.com + +# ------------------------------------------------- +# Default page for Home +# ------------------------------------------------- + +homepage: Home.md \ No newline at end of file diff --git a/models/git.js b/models/git.js index 343259f9..2a390be9 100644 --- a/models/git.js +++ b/models/git.js @@ -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); + }); }