You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
4.2 KiB

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