verify_release_tag.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env python3
  2. """Verify a git tag matches the built wheel's version before publishing.
  3. Usage: verify_release_tag.py <git-ref-or-tag> <wheel>
  4. Normalizes the tag (strips a leading 'v' and PEP 440-normalizes it, so v4.7.0-beta1
  5. becomes 4.7.0b1) and asserts it equals the wheel's Version metadata.
  6. """
  7. import sys
  8. import zipfile
  9. from email.parser import Parser
  10. from packaging.version import Version
  11. def wheel_version(wheel_path):
  12. with zipfile.ZipFile(wheel_path) as archive:
  13. meta_name = next(name for name in archive.namelist() if name.endswith('.dist-info/METADATA'))
  14. metadata = Parser().parsestr(archive.read(meta_name).decode())
  15. return metadata['Version']
  16. def normalize_tag(ref):
  17. tag = ref.rsplit('/', 1)[-1]
  18. if tag.startswith('v'):
  19. tag = tag[1:]
  20. return str(Version(tag))
  21. def main(argv):
  22. if len(argv) != 3:
  23. print('usage: verify_release_tag.py <git-ref-or-tag> <wheel>')
  24. return 2
  25. tag_version = normalize_tag(argv[1])
  26. built_version = str(Version(wheel_version(argv[2])))
  27. if tag_version != built_version:
  28. print(f'Tag/version mismatch: tag -> {tag_version}, wheel -> {built_version}')
  29. return 1
  30. print(f'OK: tag matches wheel version ({built_version})')
  31. return 0
  32. if __name__ == '__main__':
  33. sys.exit(main(sys.argv))