You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							96 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
	
	
							96 lines
						
					
					
						
							2.1 KiB
						
					
					
				
 | 
						|
if (typeof Promise === 'undefined') { | 
						|
   throw new ReferenceError("Promise wrappers must be enabled to use the promise API"); | 
						|
} | 
						|
 | 
						|
function isAsyncCall (fn) { | 
						|
   return /^[^)]+then\s*\)/.test(fn) || /\._run\(/.test(fn); | 
						|
} | 
						|
 | 
						|
module.exports = function (baseDir) { | 
						|
 | 
						|
   var Git = require('./src/git'); | 
						|
   var gitFactory = require('./src'); | 
						|
   var git; | 
						|
 | 
						|
 | 
						|
   var chain = Promise.resolve(); | 
						|
 | 
						|
   try { | 
						|
      git = gitFactory(baseDir); | 
						|
   } | 
						|
   catch (e) { | 
						|
      chain = Promise.reject(e); | 
						|
   } | 
						|
 | 
						|
   return Object.keys(Git.prototype).reduce(function (promiseApi, fn) { | 
						|
      if (/^_|then/.test(fn)) { | 
						|
         return promiseApi; | 
						|
      } | 
						|
 | 
						|
      if (isAsyncCall(Git.prototype[fn])) { | 
						|
         promiseApi[fn] = git ? asyncWrapper(fn, git) : function () { | 
						|
            return chain; | 
						|
         }; | 
						|
      } | 
						|
 | 
						|
      else { | 
						|
         promiseApi[fn] = git ? syncWrapper(fn, git, promiseApi) : function () { | 
						|
            return promiseApi; | 
						|
         }; | 
						|
      } | 
						|
 | 
						|
      return promiseApi; | 
						|
 | 
						|
   }, {}); | 
						|
 | 
						|
   function asyncWrapper (fn, git) { | 
						|
      return function () { | 
						|
         var args = [].slice.call(arguments); | 
						|
 | 
						|
         if (typeof args[args.length] === 'function') { | 
						|
            throw new TypeError( | 
						|
               "Promise interface requires that handlers are not supplied inline, " + | 
						|
               "trailing function not allowed in call to " + fn); | 
						|
         } | 
						|
 | 
						|
         return chain.then(function () { | 
						|
            return new Promise(function (resolve, reject) { | 
						|
               args.push(function (err, result) { | 
						|
                  if (err) { | 
						|
                     return reject(toError(err)); | 
						|
                  } | 
						|
 | 
						|
                  resolve(result); | 
						|
               }); | 
						|
 | 
						|
               git[fn].apply(git, args); | 
						|
            }); | 
						|
         }); | 
						|
      }; | 
						|
   } | 
						|
 | 
						|
   function syncWrapper (fn, git, api) { | 
						|
      return function () { | 
						|
         git[fn].apply(git, arguments); | 
						|
 | 
						|
         return api; | 
						|
      }; | 
						|
   } | 
						|
 | 
						|
}; | 
						|
 | 
						|
function toError (error) { | 
						|
 | 
						|
   if (error instanceof Error) { | 
						|
      return error; | 
						|
   } | 
						|
 | 
						|
   if (typeof error === 'string') { | 
						|
      return new Error(error); | 
						|
   } | 
						|
 | 
						|
   return Object.create(new Error(error), { | 
						|
      git: { value: error }, | 
						|
   }); | 
						|
}
 | 
						|
 |