Git fetch + merge

This commit is contained in:
NGPixel 2016-08-24 22:10:03 -04:00
parent d49f56e022
commit 32c50eea7e
2 changed files with 131 additions and 45 deletions

View File

@ -26,7 +26,6 @@ port: 80
# ------------------------------------------------- # -------------------------------------------------
datadir: datadir:
repo: ./repo
db: ./data db: ./data
uploads: ./uploads uploads: ./uploads
@ -36,9 +35,10 @@ datadir:
# Full explanation + examples in the documentation (https://requarks-wiki.readme.io/) # Full explanation + examples in the documentation (https://requarks-wiki.readme.io/)
git: git:
path: auto path: ./repo
mode: remote remote: true
url: https://github.com/Organization/Repo url: https://github.com/Organization/Repo
branch: master
auth: auth:
type: ssh type: ssh
user: gitusername user: gitusername
@ -67,3 +67,9 @@ sessionSecret: 1234567890abcdefghijklmnopqrstuvxyz
# The password is set to "admin123" by default. Change it immediately upon login!!! # The password is set to "admin123" by default. Change it immediately upon login!!!
admin: admin@company.com admin: admin@company.com
# -------------------------------------------------
# Default page for Home
# -------------------------------------------------
homepage: Home.md

View File

@ -15,8 +15,14 @@ module.exports = {
_git: null, _git: null,
_repo: { _repo: {
path: '', path: '',
branch: 'master',
exists: false, exists: false,
inst: null inst: null,
sync: true
},
_opts: {
clone: {},
push: {}
}, },
/** /**
@ -41,6 +47,11 @@ module.exports = {
self._initRepo(appconfig).then((repo) => { self._initRepo(appconfig).then((repo) => {
self._repo.inst = repo; self._repo.inst = repo;
if(self._repo.sync) {
self.resync();
}
}); });
return self; return self;
@ -80,17 +91,20 @@ module.exports = {
//-> Init repository //-> Init repository
let repoInitOperation = null; 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) { if(self._repo.exists) {
winston.info('[GIT] Using existing repository...'); winston.info('[GIT] Using existing repository...');
repoInitOperation = NodeGit.Repository.open(self._repo.path); 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...'); winston.info('[GIT] Cloning remote repository for first time...');
let cloneOptions = self._generateCloneOptions(appconfig); repoInitOperation = NodeGit.Clone(appconfig.git.url, self._repo.path, self._opts.clone);
repoInitOperation = NodeGit.Clone(appconfig.git.url, self._repo.path, cloneOptions);
} else { } else {
@ -106,7 +120,11 @@ module.exports = {
winston.error(err); winston.error(err);
}).then((repo) => { }).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.'); winston.info('[GIT] Git repository is now ready.');
}); });
@ -121,49 +139,111 @@ module.exports = {
*/ */
_generateCloneOptions(appconfig) { _generateCloneOptions(appconfig) {
let cloneOptions = {}; let cloneOptions = new NodeGit.CloneOptions();
cloneOptions.fetchOpts = this._generateFetchOptions(appconfig);
return cloneOptions;
cloneOptions.fetchOpts = { },
callbacks: {
credentials: () => {
let cred = null; _generateFetchOptions(appconfig) {
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 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') { 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);
});
} }