Advertisement
Guest User

Untitled

a guest
Jan 7th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. // --------------------------------------------------------------
  2. // Parameters
  3. // --------------------------------------------------------------
  4. const CONSTRAINTS_FILENAME = 'bower-constraints.json';
  5. const DATE = new Date('2016-10-08T00:00:00Z');
  6. const GITHUB_PASSWORD = '';
  7. const GITHUB_USERNAME = '';
  8. // --------------------------------------------------------------
  9.  
  10. const bluebird = require('bluebird');
  11. const bower = require('bower');
  12. const fs = require('fs');
  13. const github = new require('github')({
  14. Promise: bluebird
  15. });
  16. const semver = require('semver');
  17.  
  18. const constraints = readConstraints(CONSTRAINTS_FILENAME);
  19.  
  20. getDependencies(constraints)
  21. .then(dependencies => {
  22. authenticate(GITHUB_USERNAME, GITHUB_PASSWORD);
  23. return getReleases(dependencies, DATE);
  24. })
  25. .then(getResults)
  26. .then(printResults)
  27. .catch(error => {
  28. console.log();
  29. console.log(error);
  30. });
  31.  
  32. function readConstraints(filename) {
  33. console.log();
  34. console.log(`Reading constraints from ${filename}...`);
  35.  
  36. const json = fs.readFileSync(filename, 'utf8');
  37. return JSON.parse(json);
  38. }
  39.  
  40. function getDependencies(constraints) {
  41. const names = Object.keys(constraints);
  42.  
  43. return bluebird.mapSeries(names, name => {
  44. console.log();
  45. console.log(`Getting dependency ${name}...`);
  46.  
  47. return new Promise(resolve => {
  48. bower.commands.info(name).on('end', firstResult => {
  49. bower.commands.lookup(name).on('end', secondResult => {
  50. const constraint = constraints[name];
  51.  
  52. console.log(`Applying constraint ${constraint}...`);
  53.  
  54. const filter = version => semver.satisfies(version, constraint);
  55. const versions = firstResult.versions.filter(filter);
  56.  
  57. console.log(`Matching versions: ${versions.length}`);
  58.  
  59. resolve({
  60. name: name,
  61. versions: versions,
  62. url: secondResult.url
  63. });
  64. });
  65. });
  66. });
  67. });
  68. }
  69.  
  70. function authenticate(username, password) {
  71. console.log();
  72. console.log(`Authenticating as ${username}...`);
  73.  
  74. github.authenticate({
  75. type: 'basic',
  76. username: username,
  77. password: password
  78. });
  79. }
  80.  
  81. function getReleases(dependencies, date) {
  82. return bluebird.mapSeries(dependencies, dependency => {
  83. console.log();
  84. console.log(`Getting releases of ${dependency.name}...`);
  85.  
  86. return bluebird.mapSeries(dependency.versions, version => {
  87. const parts = dependency.url.substring(19, dependency.url.length - 4).split('/');
  88. const owner = parts[0];
  89. const repo = parts[1];
  90.  
  91. const getTag = reference => {
  92. return new Promise(resolve => {
  93. switch (reference.object.type) {
  94. case 'commit': {
  95. resolve(reference);
  96. break;
  97. }
  98. case 'tag': {
  99. return github.gitdata.getTag({
  100. owner: owner,
  101. repo: repo,
  102. sha: reference.object.sha
  103. })
  104. .then(getTag)
  105. .then(resolve);
  106. }
  107. }
  108. });
  109. };
  110.  
  111. return new Promise(resolve => {
  112. github.gitdata.getReference({
  113. owner: owner,
  114. repo: repo,
  115. ref: `tags/${version}`
  116. })
  117. .then(resolve)
  118. .catch(() => {
  119. console.log(`Path repos/${owner}/${repo}/git/refs/tags/${version} not found`);
  120. console.log(`Trying with repos/${owner}/${repo}/git/refs/tags/v${version}...`);
  121.  
  122. github.gitdata.getReference({
  123. owner: owner,
  124. repo: repo,
  125. ref: `tags/v${version}`
  126. })
  127. .then(resolve);
  128. });
  129. })
  130. .then(getTag)
  131. .then(tag => {
  132. return github.repos.getCommit({
  133. owner: owner,
  134. repo: repo,
  135. sha: tag.object.sha
  136. });
  137. })
  138. .then(commit => {
  139. return {
  140. name: dependency.name,
  141. version: version,
  142. date: new Date(commit.commit.committer.date)
  143. };
  144. });
  145. })
  146. .then(releases => {
  147. console.log(`Discarding versions released after ${date}...`);
  148.  
  149. const filter = release => release.date < date;
  150. releases = releases.filter(filter);
  151.  
  152. console.log(`Matching versions: ${releases.length}`);
  153.  
  154. return releases;
  155. });
  156. })
  157. .then(releaseSets => {
  158. return [].concat.apply([], releaseSets);
  159. });
  160. }
  161.  
  162. function getResults(releases) {
  163. const results = {};
  164. const dates = {};
  165.  
  166. console.log();
  167. console.log('Getting results...');
  168.  
  169. for (let release of releases) {
  170. const date = dates[release.name];
  171.  
  172. if (!date || release.date > date) {
  173. results[release.name] = release.version;
  174. dates[release.name] = release.date;
  175. }
  176. }
  177.  
  178. return results;
  179. }
  180.  
  181. function printResults(results) {
  182. const names = Object.keys(results);
  183.  
  184. console.log();
  185. console.log('Results:');
  186.  
  187. for (let name of names) {
  188. const version = results[name];
  189. console.log(`${name}#${version}`);
  190. }
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement