Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
169 lines (135 sloc)
4.09 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /******************************* | |
| 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(); | |
| }; |