NGPixel před 8 roky
rodič
revize
32c50eea7e
2 změnil soubory, kde provedl 134 přidání a 48 odebrání
  1. 10 4
      config.sample.yml
  2. 124 44
      models/git.js

+ 10 - 4
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
+admin: admin@company.com
+
+# -------------------------------------------------
+# Default page for Home
+# -------------------------------------------------
+
+homepage: Home.md

+ 124 - 44
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);
+		});
 
 	}