blob: 5db9db1a2f2c14a70bf3369834da5e4599f962a7 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright 2020 Google LLC.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Create the asset."""
import argparse
import subprocess
import os
import shutil
REPO_URL = "https://github.com/vektra/mockery.git"
REPO_DIR = "mockery_repo"
BINARY_NAME = "mockery"
def create_asset(target_dir):
"""Create the asset."""
os.chdir(target_dir)
# We build mockery 2.4.0 from source to fix an issue with Go 1.18. Read the
# comments below for details.
output = subprocess.check_output(["git", "clone", REPO_URL, REPO_DIR])
print(output)
os.chdir(os.path.join(target_dir, REPO_DIR))
output = subprocess.check_output(["git", "checkout", "v2.4.0"])
# Under Go 1.18, mockery v2.4.0 through v2.10.0 fails with errors such as:
#
# internal error: package "fmt" without types was imported from ...
#
# This can be fixed by updating golang.org/x/tools to a more recent version.
# For more details, please see https://github.com/vektra/mockery/issues/434
# and https://github.com/golang/go/issues/49608.
output = subprocess.check_output(["go", "get", "golang.org/x/tools@v0.1.10"])
print(output)
output = subprocess.check_output(["go", "mod", "tidy"])
print(output)
# Build mockery with the same flags as in release builds.
#
# If we don't specify a SemVer value, mockery will generate files with a
# "Code generated by mockery v0.0.0-dev. DO NOT EDIT." comment at the top,
# which causes diffs due to the changed version. Thus, it is important to set
# the SemVer value to the correct version.
#
# See
# https://github.com/vektra/mockery/blob/271c74610ef710a4c30e19a42733796c50e7ea3f/.goreleaser.yml#L9.
ldflags = "-s -w -X github.com/vektra/mockery/v2/pkg/config.SemVer=2.4.0"
build_command = ["go", "build", "-ldflags=\"%s\"" % ldflags]
print("Building with command:", build_command)
output = subprocess.check_output(["go", "build", "-ldflags=" + ldflags])
print(output)
# Copy binary outside of the cloned repository directory and clean up.
output = subprocess.check_output(["cp", BINARY_NAME, ".."])
shutil.copy(os.path.join(target_dir, REPO_DIR, BINARY_NAME), target_dir)
shutil.rmtree(os.path.join(target_dir, REPO_DIR))
os.chdir(target_dir)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--target_dir', '-t', required=True)
args = parser.parse_args()
create_asset(args.target_dir)
if __name__ == '__main__':
main()