diff options
Diffstat (limited to 'src/wwwroot/libraries/fomantic/tasks/admin/distributions')
3 files changed, 553 insertions, 0 deletions
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/distributions/create.js b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/create.js new file mode 100644 index 0000000..6fe6921 --- /dev/null +++ b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/create.js @@ -0,0 +1,208 @@ +/******************************* + 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 + fs = require('fs'), + path = require('path'), + mergeStream = require('merge-stream'), + + // admin dependencies + flatten = require('gulp-flatten'), + jsonEditor = require('gulp-json-editor'), + plumber = require('gulp-plumber'), + rename = require('gulp-rename'), + replace = require('gulp-replace'), + + // 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 + distLowerCase = distribution.toLowerCase(), + outputDirectory = path.join(release.outputRoot, distLowerCase), + packageFile = path.join(outputDirectory, release.files.npm), + repoName = release.distRepoRoot + distribution, + regExp = { + match : { + files : '{files}', + version : '{version}' + } + }, + task = { + all : distribution + ' copying files', + repo : distribution + ' create repo', + meteor : distribution + ' create meteor package.js', + package : distribution + ' create package.json' + }, + gatherFiles, + createList + ; + + // get files for meteor + gatherFiles = function(dir) { + var + dir = dir || path.resolve('.'), + list = fs.readdirSync(dir), + omitted = [ + '.git', + 'node_modules', + 'package.js', + 'LICENSE', + 'README.md', + 'package.json', + 'bower.json', + '.gitignore' + ], + files = [] + ; + list.forEach(function(file) { + var + isOmitted = (omitted.indexOf(file) > -1), + filePath = path.join(dir, file), + stat = fs.statSync(filePath) + ; + if(!isOmitted) { + if(stat && stat.isDirectory()) { + files = files.concat(gatherFiles(filePath)); + } + else { + files.push(filePath.replace(outputDirectory + path.sep, '')); + } + } + }); + return files; + }; + + // spaces out list correctly + createList = function(files) { + var filenames = ''; + for(var file in files) { + if(file == (files.length - 1) ) { + filenames += "'" + files[file] + "'"; + } + else { + filenames += "'" + files[file] + "',\n "; + } + } + return filenames; + }; + + tasks.push(function() { + var + files = gatherFiles(outputDirectory), + filenames = createList(files) + ; + gulp.src(release.templates.meteor[distLowerCase]) + .pipe(plumber()) + .pipe(flatten()) + .pipe(replace(regExp.match.version, version)) + .pipe(replace(regExp.match.files, filenames)) + .pipe(rename(release.files.meteor)) + .pipe(gulp.dest(outputDirectory)) + ; + }); + + if(distribution == 'CSS') { + tasks.push(function() { + var + themes, + components, + releases + ; + themes = gulp.src('dist/themes/default/**/*', { base: 'dist/' }) + .pipe(gulp.dest(outputDirectory)) + ; + components = gulp.src('dist/components/*', { base: 'dist/' }) + .pipe(gulp.dest(outputDirectory)) + ; + releases = gulp.src('dist/*', { base: 'dist/' }) + .pipe(gulp.dest(outputDirectory)) + ; + return mergeStream(themes, components, releases); + }); + } + else if(distribution == 'LESS') { + tasks.push(function() { + var + definitions, + themeImport, + themeConfig, + siteTheme, + themes + ; + definitions = gulp.src('src/definitions/**/*', { base: 'src/' }) + .pipe(gulp.dest(outputDirectory)) + ; + themeImport = gulp.src('src/semantic.less', { base: 'src/' }) + .pipe(gulp.dest(outputDirectory)) + ; + themeImport = gulp.src('src/theme.less', { base: 'src/' }) + .pipe(gulp.dest(outputDirectory)) + ; + themeConfig = gulp.src('src/theme.config.example', { base: 'src/' }) + .pipe(gulp.dest(outputDirectory)) + ; + siteTheme = gulp.src('src/_site/**/*', { base: 'src/' }) + .pipe(gulp.dest(outputDirectory)) + ; + themes = gulp.src('src/themes/**/*', { base: 'src/' }) + .pipe(gulp.dest(outputDirectory)) + ; + return mergeStream(definitions, themeImport, themeConfig, siteTheme, themes); + }); + } + + // extend package.json + tasks.push(function() { + return gulp.src(packageFile) + .pipe(plumber()) + .pipe(jsonEditor(function(package) { + if(version) { + package.version = version; + } + return package; + })) + .pipe(gulp.dest(outputDirectory)) + ; + }); + + })(distribution); + } + + gulp.series(...tasks)(callback); +};
\ No newline at end of file diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/distributions/init.js b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/init.js new file mode 100644 index 0000000..124e131 --- /dev/null +++ b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/init.js @@ -0,0 +1,168 @@ +/******************************* + 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'), + 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(); + + +}; diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/distributions/update.js b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/update.js new file mode 100644 index 0000000..bc3614b --- /dev/null +++ b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/update.js @@ -0,0 +1,177 @@ +/******************************* + 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'), + + // 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.repos.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, 100); + } + + + if(localRepoSetup) { + setConfig(); + } + else { + console.error('Repository must be setup before running update distributions'); + } + + }; + + stepRepo(); + +}; |
