This is an automated email from the ASF dual-hosted git repository.
hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks-controller.git
The following commit(s) were added to refs/heads/unstable by this push:
new 105f280 Add the package source script for creating release tarball
(#175)
105f280 is described below
commit 105f280ef6f5ecfe13340a7b0e4cb13790260cdf
Author: hulk <[email protected]>
AuthorDate: Thu May 9 10:26:13 2024 +0800
Add the package source script for creating release tarball (#175)
---
x.py | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 143 insertions(+)
diff --git a/x.py b/x.py
new file mode 100755
index 0000000..4db435e
--- /dev/null
+++ b/x.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python3
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, REMAINDER
+from glob import glob
+from os import makedirs
+from pathlib import Path
+import re
+from subprocess import Popen, PIPE
+import sys
+from typing import List, Any, Optional, TextIO, Tuple
+from shutil import which
+
+SEMVER_REGEX = re.compile(
+ r"""
+ ^
+ (?P<major>0|[1-9]\d*)
+ \.
+ (?P<minor>0|[1-9]\d*)
+ \.
+ (?P<patch>0|[1-9]\d*)
+ (?:-(?P<prerelease>
+ (?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)
+ (?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*
+ ))?
+ (?:\+(?P<build>
+ [0-9a-zA-Z-]+
+ (?:\.[0-9a-zA-Z-]+)*
+ ))?
+ $
+ """,
+ re.VERBOSE,
+)
+
+
+def run(*args: str, msg: Optional[str] = None, verbose: bool = False,
**kwargs: Any) -> Popen:
+ sys.stdout.flush()
+ if verbose:
+ print(f"$ {' '.join(args)}")
+
+ p = Popen(args, **kwargs)
+ code = p.wait()
+ if code != 0:
+ err = f"\nfailed to run: {args}\nexit with code: {code}\n"
+ if msg:
+ err += f"error message: {msg}\n"
+ raise RuntimeError(err)
+
+ return p
+
+
+def run_pipe(*args: str, msg: Optional[str] = None, verbose: bool = False,
**kwargs: Any) -> TextIO:
+ p = run(*args, msg=msg, verbose=verbose, stdout=PIPE,
universal_newlines=True, **kwargs)
+ return p.stdout # type: ignore
+
+
+def find_command(command: str, msg: Optional[str] = None) -> str:
+ return run_pipe("which", command, msg=msg).read().strip()
+
+
+def write_version(release_version: str) -> str:
+ version = release_version.strip()
+ if SEMVER_REGEX.match(version) is None:
+ raise RuntimeError(f"Version should follow semver spec, got:
{version}")
+
+ with open('VERSION.txt', 'w+') as f:
+ f.write(version)
+
+ return version
+
+
+def package_source(release_version: str, release_candidate_number:
Optional[int]) -> None:
+ # 0. Write input version to VERSION file
+ version = write_version(release_version)
+
+ # 1. Git commit and tag
+ git = find_command('git', msg='git is required for source packaging')
+ run(git, 'commit', '-a', '-m', f'[source-release] prepare release
apache-kvrocks-controller-{version}')
+ if release_candidate_number is None:
+ run(git, 'tag', '-a', f'v{version}', '-m', f'[source-release] copy for
tag v{version}')
+ else:
+ run(git, 'tag', '-a', f'v{version}-rc{release_candidate_number}',
'-m', f'[source-release] copy for tag v{version}-rc{release_candidate_number}')
+
+ # 2. Create the source tarball
+ folder = f'apache-kvrocks-controller-src-{version}'
+ tarball = f'apache-kvrocks-controller-src-{version}.tar.gz'
+ run(git, 'archive', '--format=tar.gz', f'--output={tarball}',
f'--prefix={folder}/', 'HEAD')
+
+ # 3. GPG Sign
+ gpg = find_command('gpg', msg='gpg is required for source packaging')
+ run(gpg, '--detach-sign', '--armor', tarball)
+
+ # 4. Generate sha512 checksum
+ shasum = find_command('shasum', msg='shasum is required for source
packaging')
+ with open(f'{tarball}.sha512', 'w+') as f:
+ run(shasum, '-a', '512', tarball, stdout=f)
+
+
+if __name__ == '__main__':
+ parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
+ parser.set_defaults(func=parser.print_help)
+
+ subparsers = parser.add_subparsers()
+
+ parser_package = subparsers.add_parser(
+ 'package',
+ description="Package the source tarball or binary installer",
+ help="Package the source tarball or binary installer",
+ formatter_class=ArgumentDefaultsHelpFormatter,
+ )
+ parser_package.set_defaults(func=parser_package.print_help)
+ parser_package_subparsers = parser_package.add_subparsers()
+ parser_package_source = parser_package_subparsers.add_parser(
+ 'source',
+ description="Package the source tarball",
+ help="Package the source tarball",
+ )
+ parser_package_source.add_argument('-v', '--release-version',
required=True, metavar='VERSION',
+ help='current releasing version')
+ parser_package_source.add_argument('-rc',
'--release-candidate-number',required=False, type=int, help='current releasing
candidate number')
+ parser_package_source.set_defaults(func=package_source)
+
+ args = parser.parse_args()
+
+ arg_dict = dict(vars(args))
+ del arg_dict['func']
+ args.func(**arg_dict)