init.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*******************************
  2. Init Repos
  3. *******************************/
  4. /*
  5. This task pulls the latest version of each component from GitHub
  6. * Creates new repo if doesnt exist (locally & GitHub)
  7. * Adds remote it doesnt exists
  8. * Pulls latest changes from repo
  9. */
  10. var
  11. gulp = require('gulp'),
  12. // node dependencies
  13. console = require('better-console'),
  14. del = require('del'),
  15. fs = require('fs'),
  16. path = require('path'),
  17. git = require('gulp-git'),
  18. mkdirp = require('mkdirp'),
  19. // admin files
  20. github = require('../../config/admin/github.js'),
  21. release = require('../../config/admin/release'),
  22. project = require('../../config/project/release'),
  23. // oAuth configuration for GitHub
  24. oAuth = fs.existsSync(__dirname + '/../../config/admin/oauth.js')
  25. ? require('../../config/admin/oauth')
  26. : false,
  27. // shorthand
  28. version = project.version
  29. ;
  30. module.exports = function(callback) {
  31. var
  32. index = -1,
  33. total = release.components.length,
  34. timer,
  35. stream,
  36. stepRepo
  37. ;
  38. if(!oAuth) {
  39. console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');
  40. return;
  41. }
  42. // Do Git commands synchronously per component, to avoid issues
  43. stepRepo = function() {
  44. index = index + 1;
  45. if(index >= total) {
  46. callback();
  47. return;
  48. }
  49. var
  50. component = release.components[index],
  51. outputDirectory = path.resolve(release.outputRoot + component),
  52. capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),
  53. repoName = release.componentRepoRoot + capitalizedComponent,
  54. gitOptions = { cwd: outputDirectory },
  55. pullOptions = { args: '-q', cwd: outputDirectory, quiet: true },
  56. resetOptions = { args: '-q --hard', cwd: outputDirectory, quiet: true },
  57. gitURL = '[email protected]:' + release.org + '/' + repoName + '.git',
  58. repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
  59. localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git'))
  60. ;
  61. console.log('Processing repository: ' + outputDirectory);
  62. // create folder if doesn't exist
  63. if( !fs.existsSync(outputDirectory) ) {
  64. mkdirp.sync(outputDirectory);
  65. }
  66. // clean folder
  67. if(release.outputRoot.search('../repos') == 0) {
  68. console.info('Cleaning dir', outputDirectory);
  69. del.sync([outputDirectory + '**/*'], {silent: true, force: true});
  70. }
  71. // set-up local repo
  72. function setupRepo() {
  73. if(localRepoSetup) {
  74. addRemote();
  75. }
  76. else {
  77. initRepo();
  78. }
  79. }
  80. function initRepo() {
  81. console.info('Initializing repository for ' + component);
  82. git.init(gitOptions, function(error) {
  83. if(error) {
  84. console.error('Error initializing repo', error);
  85. }
  86. addRemote();
  87. });
  88. }
  89. function createRepo() {
  90. console.info('Creating GitHub repo ' + repoURL);
  91. github.repos.createFromOrg({
  92. org : release.org,
  93. name : repoName,
  94. homepage : release.homepage
  95. }, function() {
  96. setupRepo();
  97. });
  98. }
  99. function addRemote() {
  100. console.info('Adding remote origin as ' + gitURL);
  101. git.addRemote('origin', gitURL, gitOptions, function(){
  102. pullFiles();
  103. });
  104. }
  105. function pullFiles() {
  106. console.info('Pulling ' + component + ' files');
  107. git.pull('origin', 'master', pullOptions, function(error) {
  108. resetFiles();
  109. });
  110. }
  111. function resetFiles() {
  112. console.info('Resetting files to head');
  113. git.reset('HEAD', resetOptions, function(error) {
  114. nextRepo();
  115. });
  116. }
  117. function nextRepo() {
  118. //console.log('Sleeping for 1 second...');
  119. // avoid rate throttling
  120. global.clearTimeout(timer);
  121. timer = global.setTimeout(function() {
  122. stepRepo()
  123. }, 0);
  124. }
  125. if(localRepoSetup) {
  126. pullFiles();
  127. }
  128. else {
  129. setupRepo();
  130. // createRepo() only use to create remote repo (easier to do manually)
  131. }
  132. };
  133. stepRepo();
  134. };