sapling/eden/scm/gen_version.py
Saul Gutierrez 4ab483da0e buckify Windows build
Summary:
Lately we have experienced some issues with the cargo version of our build due to some curl issues. D50680070 fixes the curl issues, but only on the buck side of things.

Since our Buck build on Windows is now mature enough and can solve our curl issue, let's switch to it.

Reviewed By: quark-zju

Differential Revision: D50704305

fbshipit-source-id: 9de86162fdbc6b97eeae074f1c0fbb2bab7ce1d6
2023-10-27 14:45:13 -07:00

77 lines
2.4 KiB
Python
Executable File

#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2.
import argparse
import errno
import hashlib
import os
import struct
MAIN_VERSION = "4.4.2"
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("--version", required=True)
ap.add_argument("--release", required=True)
ap.add_argument("--revision", required=True)
ap.add_argument("output_path")
args = ap.parse_args()
# On POSIX single quotes are interpreted as empty strings, but on Windows
# they are interpreted as literal single quotes so we have to get rid of
# them. It's not possible to just use double quotes instead.
# On Buck this script is called with arguments like
# --version '%s' --release '%s' --revision '%s' <OUTPUT_PATH>
# It's not possible to change the single quotes with double ones, because
# otherwise buck interprets it as if we were empty and <OUTPUT_PATH> gets
# parsed as a value for revision
args.version = args.version.replace("'", "")
args.release = args.release.replace("'", "")
args.revision = args.revision.replace("'", "")
if args.version and args.release:
sub_version = "%s_%s_%s" % (args.version, args.release, args.revision[:8])
elif args.revision:
sub_version = args.revision[:8]
else:
# Buck does not pass in any build data info in dev builds
sub_version = "dev"
version = "%s_%s" % (MAIN_VERSION, sub_version)
versionb = version.encode("ascii")
versionhash = struct.unpack(">Q", hashlib.sha1(versionb).digest()[:8])[0]
if args.output_path.endswith("py"):
contents = (
"# auto-generated by the build\n" 'version = "%s"\n' "versionhash = %s\n"
) % (version, versionhash)
elif args.output_path.endswith("rs"):
contents = (
(
r"""// auto-generated by the build
pub static VERSION: &'static str = "%s";
pub static VERSION_HASH: &'static str = "%s";
"""
)
% (version, versionhash)
)
try:
output_dir = os.path.dirname(args.output_path)
os.makedirs(output_dir)
except OSError as ex:
if ex.errno != errno.EEXIST:
raise
with open(args.output_path, "w") as f:
# pyre-fixme[61]: `contents` is undefined, or not always defined.
f.write(contents)
main()