proj-flow 0.15.1__tar.gz → 0.15.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. {proj_flow-0.15.1 → proj_flow-0.15.3}/CHANGELOG.rst +16 -0
  2. {proj_flow-0.15.1 → proj_flow-0.15.3}/PKG-INFO +1 -1
  3. {proj_flow-0.15.1 → proj_flow-0.15.3}/ROADMAP.md +1 -1
  4. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/__init__.py +1 -1
  5. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/flow/layer.py +19 -2
  6. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/commit.py +5 -1
  7. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/release.py +13 -7
  8. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/minimal/base.py +15 -0
  9. proj_flow-0.15.3/src/proj_flow/minimal/ext/bug_report.py +75 -0
  10. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/minimal/init.py +3 -0
  11. proj_flow-0.15.3/src/proj_flow/template/layers/base.json +3 -0
  12. proj_flow-0.15.1/src/proj_flow/minimal/ext/bug_report.py +0 -33
  13. proj_flow-0.15.1/src/proj_flow/template/layers/base.json +0 -2
  14. {proj_flow-0.15.1 → proj_flow-0.15.3}/.flow/config.yaml +0 -0
  15. {proj_flow-0.15.1 → proj_flow-0.15.3}/.gitignore +0 -0
  16. {proj_flow-0.15.1 → proj_flow-0.15.3}/.readthedocs.yaml +0 -0
  17. {proj_flow-0.15.1 → proj_flow-0.15.3}/LICENSE +0 -0
  18. {proj_flow-0.15.1 → proj_flow-0.15.3}/README.md +0 -0
  19. {proj_flow-0.15.1 → proj_flow-0.15.3}/pyproject.toml +0 -0
  20. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/__main__.py +0 -0
  21. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/__init__.py +0 -0
  22. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/arg.py +0 -0
  23. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/completers.py +0 -0
  24. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/ctx.py +0 -0
  25. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/env.py +0 -0
  26. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/init.py +0 -0
  27. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/makefile.py +0 -0
  28. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/release.py +0 -0
  29. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/api/step.py +0 -0
  30. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/__cmake_version__.py +0 -0
  31. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/__init__.py +0 -0
  32. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/cmd.py +0 -0
  33. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/inspect.py +0 -0
  34. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/matrix.py +0 -0
  35. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/name_list.py +0 -0
  36. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/plugins.py +0 -0
  37. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/registry.py +0 -0
  38. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/base/uname.py +0 -0
  39. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/cli/__init__.py +0 -0
  40. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/cli/argument.py +0 -0
  41. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/cli/finder.py +0 -0
  42. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/dependency.py +0 -0
  43. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/__init__.py +0 -0
  44. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/cplusplus/__init__.py +0 -0
  45. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/cplusplus/cmake/__init__.py +0 -0
  46. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/cplusplus/cmake/parser.py +0 -0
  47. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/cplusplus/cmake/project.py +0 -0
  48. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/cplusplus/cmake/steps.py +0 -0
  49. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/cplusplus/conan/__init__.py +0 -0
  50. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/cplusplus/conan/_conan.py +0 -0
  51. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/github/__init__.py +0 -0
  52. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/github/cli.py +0 -0
  53. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/github/hosting.py +0 -0
  54. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/github/publishing.py +0 -0
  55. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/github/switches.py +0 -0
  56. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/markdown_changelog.py +0 -0
  57. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/python/__init__.py +0 -0
  58. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/python/rtdocs.py +0 -0
  59. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/python/steps.py +0 -0
  60. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/python/version.py +0 -0
  61. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/re_structured_changelog.py +0 -0
  62. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/sign/__init__.py +0 -0
  63. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/sign/api.py +0 -0
  64. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/sign/win32.py +0 -0
  65. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/ext/store.py +0 -0
  66. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/flow/__init__.py +0 -0
  67. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/flow/configs.py +0 -0
  68. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/flow/steps.py +0 -0
  69. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/__init__.py +0 -0
  70. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/error.py +0 -0
  71. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/fmt.py +0 -0
  72. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/format.py +0 -0
  73. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/hosting/__init__.py +0 -0
  74. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/hosting/github.py +0 -0
  75. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/msg.py +0 -0
  76. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/rich_text/__init__.py +0 -0
  77. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/rich_text/api.py +0 -0
  78. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/rich_text/markdown.py +0 -0
  79. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/log/rich_text/re_structured_text.py +0 -0
  80. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/minimal/__init__.py +0 -0
  81. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/minimal/bootstrap.py +0 -0
  82. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/minimal/list.py +0 -0
  83. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/minimal/run.py +0 -0
  84. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/minimal/system.py +0 -0
  85. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/__init__.py +0 -0
  86. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/api.py +0 -0
  87. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/cplusplus/__init__.py +0 -0
  88. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/cplusplus/cmake_context.py +0 -0
  89. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/cplusplus/conan_context.py +0 -0
  90. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/cplusplus/project.py +0 -0
  91. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/data.py +0 -0
  92. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/project/interact.py +0 -0
  93. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/.clang-format +0 -0
  94. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/.flow/config.yml +0 -0
  95. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/.flow/flow.py.mustache +0 -0
  96. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/.flow/matrix.yml +0 -0
  97. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/.flow/official.yml +0 -0
  98. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/.gitignore +0 -0
  99. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/README.md.mustache +0 -0
  100. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/flow +0 -0
  101. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/base/flow.cmd +0 -0
  102. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/cmake/common.cmake.mustache +0 -0
  103. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/__init__.py.mustache +0 -0
  104. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/__init__.py.mustache +0 -0
  105. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/magick.py.mustache +0 -0
  106. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/packages/base.cmake.mustache +0 -0
  107. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/packages/config.cmake +0 -0
  108. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/packages/cpack.cmake +0 -0
  109. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/packages/wix/cpack.cmake.mustache +0 -0
  110. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/packages/wix/patches.in.wix +0 -0
  111. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/.flow/packages/wix.cmake.mustache +0 -0
  112. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/CMakeGraphVizOptions.cmake +0 -0
  113. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/CMakeLists.txt.mustache +0 -0
  114. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/CMakePresets.json +0 -0
  115. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/data/assets/appicon.ico +0 -0
  116. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/data/assets/appicon.png +0 -0
  117. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/data/assets/wix_banner.bmp +0 -0
  118. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/data/assets/wix_dialog.bmp +0 -0
  119. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/data/icons/.gitignore +0 -0
  120. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/data/icons/appicon-mask.svg +0 -0
  121. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/data/icons/appicon.svg +0 -0
  122. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/src/main.cc.mustache +0 -0
  123. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/src/version.hpp.in.mustache +0 -0
  124. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake/tests/test.cc.mustache +0 -0
  125. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/cmake.json +0 -0
  126. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/conan/.flow/cmake/libcxx_toolchain.cmake +0 -0
  127. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/conan/.flow/cmake/output_dirs_setup.cmake +0 -0
  128. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/conan/conanfile.txt +0 -0
  129. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/conan.json +0 -0
  130. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_actions/.github/linters/.isort.cfg +0 -0
  131. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_actions/.github/linters/.mypy.ini +0 -0
  132. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.auto-release +0 -0
  133. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.basic +0 -0
  134. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_actions/.github/workflows/linter.yml +0 -0
  135. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_actions/CPPLINT.cfg +0 -0
  136. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_actions.json +0 -0
  137. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/bug_report.md.mustache +0 -0
  138. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/feature_request.md.mustache +0 -0
  139. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_social/CODE_OF_CONDUCT.md.mustache +0 -0
  140. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_social/CONTRIBUTING.md +0 -0
  141. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/layers/github_social.json +0 -0
  142. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/licenses/0BSD.mustache +0 -0
  143. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/licenses/MIT.mustache +0 -0
  144. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/licenses/Unlicense.mustache +0 -0
  145. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/licenses/WTFPL.mustache +0 -0
  146. {proj_flow-0.15.1 → proj_flow-0.15.3}/src/proj_flow/template/licenses/Zlib.mustache +0 -0
@@ -4,6 +4,22 @@ Changelog
4
4
 
5
5
  All notable changes to this project will be documented in this file.
6
6
 
7
+ `0.15.3 <https://github.com/mzdun/proj-flow/compare/v0.15.2...v0.15.3>`_ (2025-02-24)
8
+ =====================================================================================
9
+
10
+ Bug Fixes
11
+ ---------
12
+
13
+ - only use two most-recent minor versions in YAML (`24e4b05 <https://github.com/mzdun/proj-flow/commit/24e4b05c6bb6c3dc2a7db534e49f7ba542d396da>`_)
14
+
15
+ `0.15.2 <https://github.com/mzdun/proj-flow/compare/v0.15.1...v0.15.2>`_ (2025-02-24)
16
+ =====================================================================================
17
+
18
+ Bug Fixes
19
+ ---------
20
+
21
+ - carry +x on Windows (`846f6a1 <https://github.com/mzdun/proj-flow/commit/846f6a1b8d71d682e04dbd12b31ba9a6311b3d0b>`_)
22
+
7
23
  `0.15.1 <https://github.com/mzdun/proj-flow/compare/v0.15.0...v0.15.1>`_ (2025-02-23)
8
24
  =====================================================================================
9
25
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proj-flow
3
- Version: 0.15.1
3
+ Version: 0.15.3
4
4
  Summary: C++ project maintenance, automated
5
5
  Project-URL: Changelog, https://github.com/mzdun/proj-flow/blob/main/CHANGELOG.rst
6
6
  Project-URL: Documentation, https://proj-flow.readthedocs.io/en/latest/
@@ -3,7 +3,7 @@
3
3
  - [x] GitHub setup
4
4
  - [x] Auto-release
5
5
  - [x] Breaking change works
6
- - [ ] `chmod +x`, but on Windows
6
+ - [x] `chmod +x`, but on Windows
7
7
  - [ ] bug_report's `version.options`: change to
8
8
  1. Current (vX.Y.Z)
9
9
  2. Previous (vX.Y-1.Z)
@@ -6,4 +6,4 @@ The **proj_flow** contains only ``__version__`` to be updated, nothing more.
6
6
  This is in an attempt to make this module easy to load initially.
7
7
  """
8
8
 
9
- __version__ = "0.15.1"
9
+ __version__ = "0.15.3"
@@ -22,6 +22,7 @@ class FileInfo:
22
22
  src: str
23
23
  dst: str
24
24
  is_mustache: bool
25
+ is_executable: bool
25
26
  when: Optional[str] = None
26
27
 
27
28
  @classmethod
@@ -32,12 +33,19 @@ class FileInfo:
32
33
  json_file = cast(dict, filelist.get(key, {}))
33
34
  path = cast(Optional[str], json_file.get("path"))
34
35
  when = cast(Optional[str], json_file.get("when"))
36
+ is_executable = cast(bool, json_file.get("executable"))
35
37
  dst = (
36
38
  chevron.render(path, context).replace("/", os.sep)
37
39
  if path is not None
38
40
  else basename if is_mustache else src
39
41
  )
40
- return cls(src=src, dst=dst, is_mustache=is_mustache, when=when)
42
+ return cls(
43
+ src=src,
44
+ dst=dst,
45
+ is_mustache=is_mustache,
46
+ is_executable=is_executable,
47
+ when=when,
48
+ )
41
49
 
42
50
  def template(self):
43
51
  open_mstch = "{{"
@@ -71,6 +79,10 @@ class FileInfo:
71
79
  else:
72
80
  shutil.copy2(src, dst, follow_symlinks=False)
73
81
 
82
+ def get_git_checks(self):
83
+ if self.is_executable:
84
+ yield self
85
+
74
86
 
75
87
  @dataclass
76
88
  class LayerInfo:
@@ -149,6 +161,11 @@ class LayerInfo:
149
161
  if not rt.silent:
150
162
  print()
151
163
 
164
+ def get_git_checks(self):
165
+ for file in self.files:
166
+ for special in file.get_git_checks():
167
+ yield special
168
+
152
169
 
153
170
  def copy_license(rt: env.Runtime, context: ctx.SettingsType):
154
171
  license = path_get(context, "COPY.LICENSE")
@@ -159,7 +176,7 @@ def copy_license(rt: env.Runtime, context: ctx.SettingsType):
159
176
  os.path.join(ctx.package_root, ctx.template_dir, "licenses")
160
177
  )
161
178
  license_file = f"{license}.mustache"
162
- info = FileInfo(license_file, "LICENSE", is_mustache=True)
179
+ info = FileInfo(license_file, "LICENSE", is_mustache=True, is_executable=False)
163
180
  info.run(licenses_dir, rt, context)
164
181
 
165
182
 
@@ -139,7 +139,11 @@ def _get_commit(hash: str, short_hash: str, message: str) -> Optional[Commit]:
139
139
 
140
140
  breaking_change = None
141
141
  body = "\n".join(lines).strip().split("BREAKING CHANGE", 1)
142
- if len(body) > 1:
142
+ if (
143
+ len(body) > 1
144
+ and (len(body[0]) == 0 or body[0][-1:] == "\n")
145
+ and (len(body[1]) == 1 or body[1][:1] == ":")
146
+ ):
143
147
  body = body[1].lstrip(":").strip()
144
148
  breaking_change = [
145
149
  re.sub(r"\s+", " ", para.strip()) for para in body.split("\n\n")
@@ -6,8 +6,7 @@ The **proj_flow.log.release** performs a relase on the hosting service.
6
6
  """
7
7
 
8
8
  import typing
9
- from abc import ABC, abstractmethod
10
- from typing import Iterable, Union
9
+ from typing import Iterable, Optional, Union
11
10
 
12
11
  from proj_flow import api
13
12
  from proj_flow.api import env
@@ -18,9 +17,14 @@ from proj_flow.log.error import NoProjectError, VersionNotAdvancing
18
17
  OneOrMoreStrings = Union[str, Iterable[str]]
19
18
 
20
19
 
21
- class VersionUpdater(ABC):
22
- @abstractmethod
23
- def on_version_change(self, new_version: str) -> OneOrMoreStrings: ...
20
+ class VersionUpdater:
21
+ def on_version_change(self, new_version: str) -> Optional[OneOrMoreStrings]:
22
+ return None
23
+
24
+ def on_version_change_tags(
25
+ self, new_version: str, tags: list[str]
26
+ ) -> Optional[OneOrMoreStrings]:
27
+ return self.on_version_change(new_version)
24
28
 
25
29
 
26
30
  version_updaters = registry.Registry[VersionUpdater]("VersionUpdater")
@@ -114,8 +118,10 @@ def add_release(
114
118
  files_to_commit.append(version_path)
115
119
 
116
120
  for updater in version_updaters.get():
117
- modified = updater.on_version_change(next_version)
118
- if isinstance(modified, str):
121
+ modified = updater.on_version_change_tags(next_version, tags)
122
+ if modified is None:
123
+ continue
124
+ elif isinstance(modified, str):
119
125
  files_to_commit.append(modified)
120
126
  else:
121
127
  files_to_commit.extend(modified)
@@ -7,11 +7,15 @@ new projects.
7
7
  """
8
8
 
9
9
  import sys
10
+ from typing import List
10
11
 
11
12
  from proj_flow import __version__, api
13
+ from proj_flow.flow import layer
12
14
 
13
15
 
14
16
  class GitInit(api.init.InitStep):
17
+ layers: List[layer.LayerInfo] = []
18
+
15
19
  def priority(self):
16
20
  return sys.maxsize
17
21
 
@@ -24,6 +28,17 @@ class GitInit(api.init.InitStep):
24
28
 
25
29
  git("init")
26
30
  git("add", ".")
31
+
32
+ executables: List[str] = []
33
+
34
+ for fs_layer in GitInit.layers:
35
+ for info in fs_layer.get_git_checks():
36
+ if info.is_executable:
37
+ executables.append(info.dst)
38
+
39
+ if len(executables):
40
+ git("update-index", "--chmod=+x", *executables)
41
+
27
42
  git("commit", "-m", "Initial commit")
28
43
 
29
44
 
@@ -0,0 +1,75 @@
1
+ # Copyright (c) 2025 Marcin Zdun
2
+ # This code is licensed under MIT license (see LICENSE for details)
3
+
4
+ """
5
+ The **proj_flow.minimal.ext.bug_report** adds next version to bug_report.yaml
6
+ next to CHANGELOG.rst.
7
+ """
8
+
9
+ import re
10
+ import sys
11
+ from typing import List, Tuple
12
+
13
+ from proj_flow.log import release
14
+
15
+ YAML_PATH = ".github/ISSUE_TEMPLATE/bug_report.yaml"
16
+
17
+
18
+ def _version(ver: str) -> Tuple[int, int, int, str]:
19
+ if ver[:1] == "v":
20
+ ver = ver[1:]
21
+
22
+ m = re.match(r"([0-9]+)\.([0-9]+)\.([0-9]+)(.*)", ver)
23
+ if m is None:
24
+ print(f"fatal error: cannot parse {ver}", file=sys.stderr)
25
+ raise SystemExit(1)
26
+ return (int(m.group(1)), int(m.group(2)), int(m.group(3)), ver)
27
+
28
+ def _prev_version(new_version: str, tags: List[str]):
29
+ current = _version(new_version)
30
+ versions = [_version(tag) for tag in reversed(tags)]
31
+ index = 0
32
+ while index < len(versions):
33
+ comp = versions[index]
34
+ if comp[0] != current[0] or comp[1] != current[1]:
35
+ break
36
+
37
+ index += 1
38
+ if index >= len(versions):
39
+ index = 0
40
+
41
+ return None if index > len(versions) else versions[index][-1]
42
+
43
+ @release.version_updaters.add
44
+ class VersionUpdater(release.VersionUpdater):
45
+ def on_version_change_tags(self, new_version: str, tags: List[str]):
46
+ old_version = _prev_version(new_version, tags)
47
+
48
+ range = [f" - Current (v{new_version})\n"]
49
+ if old_version:
50
+ range.extend(
51
+ [
52
+ f" - Previous (v{old_version})\n",
53
+ f" - Older, than v{old_version}\n",
54
+ ]
55
+ )
56
+
57
+ with open(YAML_PATH, encoding="UTF-8") as inf:
58
+ lines = inf.readlines()
59
+
60
+ try:
61
+ id_index = lines.index(" id: version\n")
62
+ option_index = lines.index(" options:\n", id_index) + 1
63
+ option_index_end = option_index
64
+ while option_index_end < len(lines) and lines[option_index_end].startswith(
65
+ " - "
66
+ ):
67
+ option_index_end += 1
68
+ lines[option_index:option_index_end] = range
69
+ except ValueError as e:
70
+ print(e, file=sys.stderr)
71
+
72
+ with open(YAML_PATH, "w", encoding="UTF-8") as outf:
73
+ outf.writelines(lines)
74
+
75
+ return YAML_PATH
@@ -15,6 +15,7 @@ import yaml
15
15
  from proj_flow import dependency, flow
16
16
  from proj_flow.api import arg, ctx, env, init
17
17
  from proj_flow.base.name_list import name_list
18
+ from proj_flow.minimal import base
18
19
  from proj_flow.project import api, interact
19
20
 
20
21
 
@@ -148,6 +149,8 @@ def main(
148
149
 
149
150
  current_project.append_extensions(context)
150
151
 
152
+ base.GitInit.layers = layers
153
+
151
154
  steps = sorted((step.priority(), i, step) for i, step in enumerate(init.__steps))
152
155
  for _, _, step in steps:
153
156
  step.postprocess(rt, context)
@@ -0,0 +1,3 @@
1
+ {
2
+ "filelist": { "flow": { "executable": true } }
3
+ }
@@ -1,33 +0,0 @@
1
- # Copyright (c) 2025 Marcin Zdun
2
- # This code is licensed under MIT license (see LICENSE for details)
3
-
4
- """
5
- The **proj_flow.minimal.ext.bug_report** adds next version to bug_report.yaml
6
- next to CHANGELOG.rst.
7
- """
8
-
9
- import re
10
- import sys
11
-
12
- from proj_flow.log import release
13
-
14
- YAML_PATH = ".github/ISSUE_TEMPLATE/bug_report.yaml"
15
-
16
-
17
- @release.version_updaters.add
18
- class VersionUpdater(release.VersionUpdater):
19
- def on_version_change(self, new_version: str):
20
- with open(YAML_PATH, encoding="UTF-8") as inf:
21
- lines = inf.readlines()
22
-
23
- try:
24
- id_index = lines.index(" id: version\n")
25
- option_index = lines.index(" options:\n", id_index) + 1
26
- lines[option_index:option_index] = f" - v{new_version}\n"
27
- except ValueError as e:
28
- print(e, file=sys.stderr)
29
-
30
- with open(YAML_PATH, "w", encoding="UTF-8") as outf:
31
- outf.writelines(lines)
32
-
33
- return YAML_PATH
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes