11 changed files with 527 additions and 106 deletions
Split View
Diff Options
-
3tasks/admin/components/create.js
-
28tasks/admin/components/init.js
-
6tasks/admin/components/update.js
-
109tasks/admin/distributions/create.js
-
170tasks/admin/distributions/init.js
-
177tasks/admin/distributions/update.js
-
64tasks/admin/register-repos.js
-
13tasks/admin/release-all.js
-
16tasks/admin/release.js
-
28tasks/collections/admin.js
-
19tasks/config/admin/release.js
@ -0,0 +1,109 @@ |
|||
/******************************* |
|||
Create Distributions |
|||
*******************************/ |
|||
|
|||
/* |
|||
This will create individual distribution repositories for each SUI distribution |
|||
|
|||
* copy distribution files to release |
|||
* update package.json file |
|||
*/ |
|||
|
|||
var |
|||
gulp = require('gulp'), |
|||
|
|||
// node dependencies
|
|||
console = require('better-console'), |
|||
del = require('del'), |
|||
fs = require('fs'), |
|||
path = require('path'), |
|||
runSequence = require('run-sequence'), |
|||
|
|||
// admin dependencies
|
|||
concatFileNames = require('gulp-concat-filenames'), |
|||
debug = require('gulp-debug'), |
|||
flatten = require('gulp-flatten'), |
|||
git = require('gulp-git'), |
|||
jsonEditor = require('gulp-json-editor'), |
|||
plumber = require('gulp-plumber'), |
|||
rename = require('gulp-rename'), |
|||
replace = require('gulp-replace'), |
|||
tap = require('gulp-tap'), |
|||
|
|||
// config
|
|||
config = require('../config/user'), |
|||
release = require('../config/admin/release'), |
|||
project = require('../config/project/release'), |
|||
|
|||
// shorthand
|
|||
version = project.version, |
|||
output = config.paths.output |
|||
|
|||
; |
|||
|
|||
|
|||
module.exports = function(callback) { |
|||
var |
|||
stream, |
|||
index, |
|||
tasks = [] |
|||
; |
|||
|
|||
for(index in release.distributions) { |
|||
|
|||
var |
|||
distribution = release.distributions[index] |
|||
; |
|||
|
|||
// streams... designed to save time and make coding fun...
|
|||
(function(distribution) { |
|||
|
|||
var |
|||
outputDirectory = release.outputRoot + distribution, |
|||
repoName = release.distRepoRoot + distribution |
|||
task = { |
|||
repo : distribution + ' create repo', |
|||
package : distribution + ' create package.json' |
|||
} |
|||
; |
|||
|
|||
// copy files into output folder adjusting asset paths
|
|||
gulp.task(task.repo, false, function() { |
|||
return gulp.src(release.source + distribution + '.*') |
|||
.pipe(plumber()) |
|||
.pipe(flatten()) |
|||
.pipe(replace(release.paths.source, release.paths.output)) |
|||
.pipe(gulp.dest(outputDirectory)) |
|||
; |
|||
}); |
|||
|
|||
// extend package.json
|
|||
gulp.task(task.package, false, function() { |
|||
return gulp.src(zzzzzzzzzzzzz) |
|||
.pipe(plumber()) |
|||
.pipe(flatten()) |
|||
.pipe(jsonEditor(function(package) { |
|||
if(version) { |
|||
package.version = version; |
|||
} |
|||
return package; |
|||
})) |
|||
.pipe(gulp.dest(outputDirectory)) |
|||
; |
|||
}); |
|||
|
|||
// synchronous tasks in orchestrator? I think not
|
|||
gulp.task(task.all, false, function(callback) { |
|||
runSequence([ |
|||
task.repo, |
|||
task.package |
|||
], callback); |
|||
}); |
|||
|
|||
tasks.push(task.all); |
|||
|
|||
})(distribution); |
|||
} |
|||
|
|||
runSequence(tasks, callback); |
|||
}; |
@ -0,0 +1,170 @@ |
|||
/******************************* |
|||
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.components.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.components[index] |
|||
outputDirectory = path.resolve(release.outputRoot + component), |
|||
capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1), |
|||
repoName = release.distRepoRoot + capitalizedComponent, |
|||
|
|||
gitOptions = { cwd: outputDirectory }, |
|||
pullOptions = { args: '-q', cwd: outputDirectory, quiet: true }, |
|||
resetOptions = { args: '-q --hard', cwd: outputDirectory, quiet: true }, |
|||
|
|||
gitURL = 'https://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(); |
|||
|
|||
|
|||
}; |
@ -0,0 +1,177 @@ |
|||
/******************************* |
|||
Update Repos |
|||
*******************************/ |
|||
|
|||
/* |
|||
|
|||
This task update all SUI individual component repos with new versions of components |
|||
|
|||
* 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() { |
|||
|
|||
var |
|||
index = -1, |
|||
total = release.components.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) { |
|||
return; |
|||
} |
|||
|
|||
var |
|||
component = release.components[index] |
|||
outputDirectory = path.resolve(release.outputRoot + component), |
|||
capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1), |
|||
repoName = release.distRepoRoot + capitalizedComponent, |
|||
|
|||
gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git', |
|||
repoURL = 'https://github.com/' + release.org + '/' + repoName + '/', |
|||
|
|||
commitArgs = (oAuth.name !== undefined && oAuth.email !== undefined) |
|||
? '--author "' + oAuth.name + ' <' + oAuth.email + '>"' |
|||
: '', |
|||
|
|||
componentPackage = fs.existsSync(outputDirectory + 'package.json' ) |
|||
? require(outputDirectory + 'package.json') |
|||
: false, |
|||
|
|||
isNewVersion = (version && componentPackage.version != version), |
|||
|
|||
commitMessage = (isNewVersion) |
|||
? 'Updated component 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 }, |
|||
usernameOptions = { args : 'config user.name "' + oAuth.name + '"', cwd: outputDirectory }, |
|||
emailOptions = { args : 'config user.email "' + oAuth.email + '"', cwd: outputDirectory }, |
|||
|
|||
localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git')), |
|||
canProceed = true |
|||
; |
|||
|
|||
|
|||
console.info('Processing repository:' + outputDirectory); |
|||
|
|||
function setUser() { |
|||
git.exec(usernameOptions, function () { |
|||
git.exec(emailOptions, function () { |
|||
commitFiles(); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
// standard path
|
|||
function commitFiles() { |
|||
// commit files
|
|||
console.info('Committing ' + component + ' 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 changess to remote
|
|||
function pushFiles() { |
|||
console.info('Pushing files for ' + component); |
|||
git.push('origin', 'master', { args: '-f', cwd: outputDirectory }, function(error) { |
|||
console.info('Push completed successfully'); |
|||
createRelease(); |
|||
}); |
|||
} |
|||
|
|||
// create release on GitHub.com
|
|||
function createRelease() { |
|||
console.log('Tagging release as ', version); |
|||
github.releases.createRelease(releaseOptions, function() { |
|||
nextRepo(); |
|||
tagFiles(); |
|||
}); |
|||
tagFiles(); |
|||
} |
|||
|
|||
// Tags files locally
|
|||
function tagFiles() { |
|||
console.info('Tagging new version ' + component, version); |
|||
git.tag(version, 'Updated version from semantic-ui (automatic)', function (err) { |
|||
nextRepo(); |
|||
}); |
|||
} |
|||
|
|||
// Steps to next repository
|
|||
function nextRepo() { |
|||
console.log('Sleeping for 1 second...'); |
|||
// avoid rate throttling
|
|||
global.clearTimeout(timer); |
|||
return stepRepo() |
|||
} |
|||
|
|||
|
|||
if(localRepoSetup) { |
|||
commitFiles(); |
|||
} |
|||
else { |
|||
console.error('Repository must be setup before running update components'); |
|||
} |
|||
|
|||
}; |
|||
|
|||
stepRepo(); |
|||
|
|||
}; |
@ -1,64 +0,0 @@ |
|||
/******************************* |
|||
Register PM |
|||
*******************************/ |
|||
|
|||
/* |
|||
Task to register component repos with Package Managers |
|||
* Registers component with bower |
|||
* Registers component with NPM |
|||
*/ |
|||
|
|||
var |
|||
// node dependencies
|
|||
process = require('child_process'), |
|||
|
|||
// config
|
|||
release = require('../config/admin/release'), |
|||
|
|||
total = release.components.length, |
|||
index = -1, |
|||
stream, |
|||
stepRepo |
|||
; |
|||
|
|||
module.exports = function(callback) { |
|||
|
|||
console.log('Registering repos with package managers'); |
|||
|
|||
// Do Git commands synchronously per component, to avoid issues
|
|||
stepRepo = function() { |
|||
index = index + 1; |
|||
if(index >= total) { |
|||
return; |
|||
} |
|||
var |
|||
component = release.components[index], |
|||
outputDirectory = release.outputRoot + component + '/', |
|||
capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1), |
|||
packageName = release.packageRoot + component, |
|||
repoName = release.repoRoot + capitalizedComponent, |
|||
gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git', |
|||
exec = process.exec, |
|||
execSettings = {cwd: outputDirectory}, |
|||
registerBower = 'bower register ' + packageName + ' ' + gitURL, |
|||
updateNPM = 'npm publish' |
|||
|
|||
; |
|||
|
|||
/* Register with Bower */ |
|||
/* One Time |
|||
exec(registerBower, execSettings, function(err, stdout, stderr) { |
|||
stepRepo(); |
|||
}); |
|||
*/ |
|||
|
|||
/* Register with NPM */ |
|||
exec(updateNPM, execSettings, function(err, stdout, stderr) { |
|||
console.log(err, stdout, stderr); |
|||
stepRepo(); |
|||
}); |
|||
|
|||
}; |
|||
stepRepo(); |
|||
}; |
|||
|
Write
Preview
Loading…
Cancel
Save