annotate _postprocess-sdist.py @ 285:39a19c008708

Now dynamically the version attribute from setup.cfg
author Franz Glasner <fzglas.hg@dom66.de>
date Sun, 23 Feb 2025 21:40:37 +0100
parents b65d25882e44
children 9518944ed42e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
284
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
2 """Postprogress a .tar-sdist to include tests/data with symlinks as symlinks
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
3
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
4 """
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
5
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
6 from __future__ import print_function, absolute_import
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
7
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
8 try:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
9 from configparser import ConfigParser
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
10 except ImportError:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
11 from ConfigParser import SafeConfigParser as ConfigParser
285
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
12 import importlib
284
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
13 import io
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
14 import os
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
15 import tarfile
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
16
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
17
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
18 def main():
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
19 with io.open("setup.cfg", "rt", encoding="utf-8") as cfgfile:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
20 cp = ConfigParser()
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
21 if hasattr(cp, "read_file"):
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
22 cp.read_file(cfgfile, "setup.cfg")
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
23 else:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
24 cp.readfp(cfgfile, "setup.cfg")
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
25 project_name = cp.get("metadata", "name")
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
26 project_version = cp.get("metadata", "version")
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
27 if project_version.startswith("attr:"):
285
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
28 vermodname, dummy, vermodattr = (project_version[5:]
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
29 .strip()
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
30 .rpartition('.'))
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
31 assert dummy is not None and vermodattr is not None
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
32 vermod = importlib.import_module(vermodname)
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
33 project_version = getattr(vermod, vermodattr)
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
34 else:
39a19c008708 Now dynamically the version attribute from setup.cfg
Franz Glasner <fzglas.hg@dom66.de>
parents: 284
diff changeset
35 assert False
284
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
36 #
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
37 # Compressed tar files cannot be modified by Python: make sure the
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
38 # originally generated archive is uncompressed.
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
39 #
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
40 assert cp.get("sdist", "formats") == "tar"
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
41
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
42 archive_name = "{}-{}.tar".format(project_name, project_version)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
43 archive_path = "dist/" + archive_name
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
44 assert os.path.isfile(archive_path)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
45
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
46 # the directory within the archive
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
47 archive_path_prefix = "{}-{}".format(project_name, project_version)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
48
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
49 egg_directory = "{}.egg-info".format(project_name.replace("-", "_"))
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
50 assert os.path.isdir(egg_directory)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
51 sources_txt_path = "{}/SOURCES.txt".format(egg_directory)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
52 sources_txt_arcname = "{}/{}/SOURCES.txt".format(
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
53 archive_path_prefix,
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
54 egg_directory)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
55
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
56 with tarfile.TarFile(archive_path, "r") as tf:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
57 sf = tf.extractfile(sources_txt_arcname)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
58 try:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
59 sources_txt = sf.read()
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
60 finally:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
61 sf.close()
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
62
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
63 with tarfile.TarFile(archive_path, "a") as tf:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
64 arcname = "{}/tests/data".format(archive_path_prefix)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
65 try:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
66 info = tf.getmember(arcname)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
67 except KeyError:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
68 pass
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
69 else:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
70 raise RuntimeError("already postprocessed")
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
71 pre_names = set(tf.getnames())
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
72 tf.add("tests/data", arcname=arcname, recursive=True)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
73
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
74 #
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
75 # Determine the new files and symlinks that are to be added
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
76 # to SOURCES.txt. Skip directories.
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
77 #
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
78 post_names = set(tf.getnames())
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
79 new_names = list(post_names - pre_names)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
80 new_names.sort()
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
81 new_sources = []
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
82
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
83 for np in new_names:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
84 nn = np[len(archive_path_prefix)+1:]
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
85 info = tf.getmember(np)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
86 if not info.isdir():
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
87 new_sources.append(nn)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
88
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
89 # Augment SOURCES.txt and add it to the archive
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
90 sources_info = tf.gettarinfo(
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
91 sources_txt_path, arcname=sources_txt_arcname)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
92 sf = io.BytesIO()
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
93 sf.write(sources_txt)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
94 if not sources_txt.endswith(b'\n'):
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
95 sf.write(b'\n')
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
96 sf.write(b('\n'.join(new_sources)))
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
97 sources_info.size = len(sf.getvalue())
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
98 sf.seek(0)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
99 tf.addfile(sources_info, sf)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
100
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
101
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
102 def b(buf, encoding="ascii"):
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
103 if isinstance(buf, bytes):
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
104 return buf
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
105 else:
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
106 return buf.encode(encoding)
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
107
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
108
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
109 if __name__ == "__main__":
b65d25882e44 REFACTOR: sdist generation: postprocess an sdist to include symbolic links as symbolic links.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
110 main()