update-comment.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. #!/usr/bin/env node
  2. const fs = require('fs');
  3. const proc = require('child_process');
  4. const semver = require('semver');
  5. const run = (cmd, ...args) => proc.execFileSync(cmd, args, { encoding: 'utf8' }).trim();
  6. const gitStatus = run('git', 'status', '--porcelain', '-uno', 'contracts/**/*.sol');
  7. if (gitStatus.length > 0) {
  8. console.error('Contracts directory is not clean');
  9. process.exit(1);
  10. }
  11. const { version } = require('../../package.json');
  12. // Get latest tag according to semver.
  13. const [ tag ] = run('git', 'tag')
  14. .split(/\r?\n/)
  15. .filter(v => semver.lt(semver.coerce(v), version)) // only consider older tags, ignore current prereleases
  16. .sort(semver.rcompare);
  17. // Ordering tag → HEAD is important here.
  18. const files = run('git', 'diff', tag, 'HEAD', '--name-only', 'contracts/**/*.sol')
  19. .split(/\r?\n/)
  20. .filter(file => file && !file.match(/mock/i));
  21. for (const file of files) {
  22. const current = fs.readFileSync(file, 'utf8');
  23. const updated = current.replace(
  24. /(\/\/ SPDX-License-Identifier:.*)$(\n\/\/ OpenZeppelin Contracts .*$)?/m,
  25. `$1\n// OpenZeppelin Contracts (last updated v${version}) (${file.replace('contracts/', '')})`,
  26. );
  27. fs.writeFileSync(file, updated);
  28. }
  29. run('git', 'add', '--update', 'contracts');