| /******************************* |
| Init Dist Repos |
| *******************************/ |
| |
| /* |
| |
| This task pulls the latest version of distribution from GitHub |
| |
| * Creates new repo if doesnt exist (locally & GitHub) |
| * Adds remote it doesnt exists |
| * Pulls latest changes from repo |
| |
| */ |
| |
| var |
| gulp = require('gulp'), |
| |
| // node dependencies |
| console = require('better-console'), |
| del = require('del'), |
| fs = require('fs'), |
| path = require('path'), |
| git = require('gulp-git'), |
| githubAPI = require('github'), |
| mkdirp = require('mkdirp'), |
| |
| // admin files |
| github = require('../../config/admin/github.js'), |
| release = require('../../config/admin/release'), |
| project = require('../../config/project/release'), |
| |
| |
| // oAuth configuration for GitHub |
| oAuth = fs.existsSync(__dirname + '/../../config/admin/oauth.js') |
| ? require('../../config/admin/oauth') |
| : false, |
| |
| // shorthand |
| version = project.version |
| ; |
| |
| module.exports = function(callback) { |
| |
| var |
| index = -1, |
| total = release.distributions.length, |
| timer, |
| stream, |
| stepRepo |
| ; |
| |
| if(!oAuth) { |
| console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js'); |
| return; |
| } |
| |
| // Do Git commands synchronously per component, to avoid issues |
| stepRepo = function() { |
| |
| index = index + 1; |
| |
| if(index >= total) { |
| callback(); |
| return; |
| } |
| |
| var |
| component = release.distributions[index], |
| lowerCaseComponent = component.toLowerCase(), |
| outputDirectory = path.resolve(release.outputRoot + lowerCaseComponent), |
| repoName = release.distRepoRoot + component, |
| |
| gitOptions = { cwd: outputDirectory }, |
| pullOptions = { args: '-q', cwd: outputDirectory, quiet: true }, |
| resetOptions = { args: '-q --hard', cwd: outputDirectory, quiet: true }, |
| gitURL = 'git@github.com:' + release.org + '/' + repoName + '.git', |
| repoURL = 'https://github.com/' + release.org + '/' + repoName + '/', |
| localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git')) |
| ; |
| |
| console.log('Processing repository: ' + outputDirectory); |
| |
| // create folder if doesn't exist |
| if( !fs.existsSync(outputDirectory) ) { |
| mkdirp.sync(outputDirectory); |
| } |
| |
| // clean folder |
| if(release.outputRoot.search('../repos') == 0) { |
| console.info('Cleaning dir', outputDirectory); |
| del.sync([outputDirectory + '**/*'], {silent: true, force: true}); |
| } |
| |
| // set-up local repo |
| function setupRepo() { |
| if(localRepoSetup) { |
| addRemote(); |
| } |
| else { |
| initRepo(); |
| } |
| } |
| |
| function initRepo() { |
| console.info('Initializing repository for ' + component); |
| git.init(gitOptions, function(error) { |
| if(error) { |
| console.error('Error initializing repo', error); |
| } |
| addRemote(); |
| }); |
| } |
| |
| function createRepo() { |
| console.info('Creating GitHub repo ' + repoURL); |
| github.repos.createFromOrg({ |
| org : release.org, |
| name : repoName, |
| homepage : release.homepage |
| }, function() { |
| setupRepo(); |
| }); |
| } |
| |
| function addRemote() { |
| console.info('Adding remote origin as ' + gitURL); |
| git.addRemote('origin', gitURL, gitOptions, function(){ |
| pullFiles(); |
| }); |
| } |
| |
| function pullFiles() { |
| console.info('Pulling ' + component + ' files'); |
| git.pull('origin', 'master', pullOptions, function(error) { |
| resetFiles(); |
| }); |
| } |
| |
| function resetFiles() { |
| console.info('Resetting files to head'); |
| git.reset('HEAD', resetOptions, function(error) { |
| nextRepo(); |
| }); |
| } |
| |
| function nextRepo() { |
| //console.log('Sleeping for 1 second...'); |
| // avoid rate throttling |
| global.clearTimeout(timer); |
| timer = global.setTimeout(function() { |
| stepRepo() |
| }, 0); |
| } |
| |
| |
| if(localRepoSetup) { |
| pullFiles(); |
| } |
| else { |
| setupRepo(); |
| // createRepo() only use to create remote repo (easier to do manually) |
| } |
| |
| }; |
| |
| stepRepo(); |
| |
| |
| }; |