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.

119 lines
2.5 KiB

  1. const path = require('path');
  2. const semver = require('semver');
  3. const { spawn } = require('child_process');
  4. const fs = require('fs');
  5. const root = path.resolve(__dirname, '..');
  6. const pjsPath = path.resolve(root, 'package.json');
  7. const pjs = require(pjsPath);
  8. function parseVersion(tag) {
  9. const { major, minor, prerelease, patch } = semver.parse(tag);
  10. // Describe will give is commits since last tag
  11. const [ commitsSinceTag, hash ] = prerelease[0] ? prerelease[0].split('-') : [
  12. 1,
  13. process.env.TRAVIS_COMMIT || ''
  14. ];
  15. return {
  16. major,
  17. minor,
  18. prerelease,
  19. patch,
  20. commit: commitsSinceTag - 1,
  21. hash
  22. };
  23. }
  24. function getCommandOutput(command, args, cb) {
  25. let output = '';
  26. const cmd = spawn(command, args);
  27. cmd.stdout.on('data', (data) => {
  28. output += data;
  29. });
  30. cmd.on('close', (code) => {
  31. if (code != 0) {
  32. cb(new Error(`Command returned unsuccessful code: ${code}`));
  33. return;
  34. }
  35. cb(null, output.trim());
  36. });
  37. }
  38. function getVersion(cb) {
  39. // https://docs.travis-ci.com/user/environment-variables/
  40. if (process.env.TRAVIS_TAG) {
  41. setImmediate(() => cb(null, parseVersion(process.env.TRAVIS_TAG.trim())));
  42. return;
  43. }
  44. getCommandOutput('git', ['describe', '--tags'], (err, result) => {
  45. if (err) {
  46. cb(err);
  47. return;
  48. }
  49. cb(null, parseVersion(result.trim()));
  50. });
  51. }
  52. function getBranch(cb) {
  53. if (process.env.TRAVIS_TAG) {
  54. // TRAVIS_BRANCH matches TRAVIS_TAG when TRAVIS_TAG is set
  55. // "git branch --contains tags/TRAVIS_TAG" doesn't work on travis so we have to assume 'master'
  56. setImmediate(() => cb(null, 'master'));
  57. return;
  58. } else if (process.env.TRAVIS_BRANCH) {
  59. setImmediate(() => cb(null, process.env.TRAVIS_BRANCH.trim()));
  60. return;
  61. }
  62. getCommandOutput('git', ['rev-parse', '--abbrev-ref', 'HEAD'], (err, result) => {
  63. if (err) {
  64. cb(err);
  65. return;
  66. }
  67. cb(null, result.trim());
  68. });
  69. }
  70. function getPackageVersion(tag, branch) {
  71. let baseVersion = `v${tag.major}.${tag.minor}.${tag.patch}`;
  72. if (tag.commit === 0 && branch === 'master') {
  73. return baseVersion;
  74. }
  75. baseVersion += '-';
  76. if (branch !== 'master') {
  77. baseVersion += (tag.commit + 1 + '.' + branch);
  78. } else {
  79. baseVersion += (tag.commit + 1);
  80. }
  81. return baseVersion;
  82. }
  83. getVersion((err, tag) => {
  84. if (err) {
  85. throw err;
  86. }
  87. getBranch((err, branch) => {
  88. if (err) {
  89. throw err;
  90. }
  91. pjs.version = getPackageVersion(tag, branch);
  92. fs.writeFileSync(pjsPath, JSON.stringify(pjs, null, 2));
  93. })
  94. });