| /******************************* |
| Update Repos |
| *******************************/ |
| |
| /* |
| |
| This task update all SUI individual distribution repos with new versions of distributions |
| |
| * Commits changes from create repo |
| * Pushes changes to GitHub |
| * Tag new releases if version changed in main repo |
| |
| */ |
| |
| var |
| gulp = require('gulp'), |
| |
| // node dependencies |
| console = require('better-console'), |
| fs = require('fs'), |
| path = require('path'), |
| git = require('gulp-git'), |
| githubAPI = require('github'), |
| requireDotFile = require('require-dot-file'), |
| |
| // 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 distribution, to avoid issues |
| stepRepo = function() { |
| |
| index = index + 1; |
| if(index >= total) { |
| callback(); |
| return; |
| } |
| |
| var |
| distribution = release.distributions[index], |
| outputDirectory = path.resolve(path.join(release.outputRoot, distribution.toLowerCase() )), |
| repoName = release.distRepoRoot + distribution, |
| |
| commitArgs = (oAuth.name !== undefined && oAuth.email !== undefined) |
| ? '--author "' + oAuth.name + ' <' + oAuth.email + '>"' |
| : '', |
| |
| distributionPackage = fs.existsSync(outputDirectory + 'package.json' ) |
| ? require(outputDirectory + 'package.json') |
| : false, |
| |
| isNewVersion = (version && distributionPackage.version != version), |
| |
| commitMessage = (isNewVersion) |
| ? 'Updated distribution to version ' + version |
| : 'Updated files from main repo', |
| |
| gitOptions = { cwd: outputDirectory }, |
| commitOptions = { args: commitArgs, cwd: outputDirectory }, |
| releaseOptions = { tag_name: version, owner: release.org, repo: repoName }, |
| |
| fileModeOptions = { args : 'config core.fileMode false', cwd: outputDirectory }, |
| usernameOptions = { args : 'config user.name "' + oAuth.name + '"', cwd: outputDirectory }, |
| emailOptions = { args : 'config user.email "' + oAuth.email + '"', cwd: outputDirectory }, |
| versionOptions = { args : 'rev-parse --verify HEAD', cwd: outputDirectory }, |
| |
| localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git')), |
| canProceed = true |
| ; |
| |
| |
| console.info('Processing repository:' + outputDirectory); |
| |
| function setConfig() { |
| git.exec(fileModeOptions, function() { |
| git.exec(usernameOptions, function () { |
| git.exec(emailOptions, function () { |
| commitFiles(); |
| }); |
| }); |
| }); |
| } |
| |
| // standard path |
| function commitFiles() { |
| // commit files |
| console.info('Committing ' + distribution + ' files', commitArgs); |
| gulp.src('./', gitOptions) |
| .pipe(git.add(gitOptions)) |
| .pipe(git.commit(commitMessage, commitOptions)) |
| .on('error', function(error) { |
| // canProceed = false; bug in git commit <https://github.com/stevelacy/gulp-git/issues/49> |
| }) |
| .on('finish', function(callback) { |
| if(canProceed) { |
| pushFiles(); |
| } |
| else { |
| console.info('Nothing new to commit'); |
| nextRepo(); |
| } |
| }) |
| ; |
| } |
| |
| // push changes to remote |
| function pushFiles() { |
| console.info('Pushing files for ' + distribution); |
| git.push('origin', 'master', { args: '', cwd: outputDirectory }, function(error) { |
| console.info('Push completed successfully'); |
| getSHA(); |
| }); |
| } |
| |
| // gets SHA of last commit |
| function getSHA() { |
| git.exec(versionOptions, function(error, version) { |
| version = version.trim(); |
| createRelease(version); |
| }); |
| } |
| |
| // create release on GitHub.com |
| function createRelease(version) { |
| if(version) { |
| releaseOptions.target_commitish = version; |
| } |
| github.releases.createRelease(releaseOptions, function() { |
| nextRepo(); |
| }); |
| } |
| |
| // Steps to next repository |
| function nextRepo() { |
| console.log('Sleeping for 1 second...'); |
| // avoid rate throttling |
| global.clearTimeout(timer); |
| timer = global.setTimeout(stepRepo, 500); |
| } |
| |
| |
| if(localRepoSetup) { |
| setConfig(); |
| } |
| else { |
| console.error('Repository must be setup before running update distributions'); |
| } |
| |
| }; |
| |
| stepRepo(); |
| |
| }; |