xref: /aosp_15_r20/external/skia/infra/bots/assets/mockery/create.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python
2*c8dee2aaSAndroid Build Coastguard Worker#
3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2020 Google LLC.
4*c8dee2aaSAndroid Build Coastguard Worker#
5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file.
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker"""Create the asset."""
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Workerimport argparse
13*c8dee2aaSAndroid Build Coastguard Workerimport subprocess
14*c8dee2aaSAndroid Build Coastguard Workerimport os
15*c8dee2aaSAndroid Build Coastguard Workerimport shutil
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard WorkerREPO_URL = "https://github.com/vektra/mockery.git"
19*c8dee2aaSAndroid Build Coastguard WorkerREPO_DIR = "mockery_repo"
20*c8dee2aaSAndroid Build Coastguard WorkerBINARY_NAME = "mockery"
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Workerdef create_asset(target_dir):
24*c8dee2aaSAndroid Build Coastguard Worker  """Create the asset."""
25*c8dee2aaSAndroid Build Coastguard Worker  os.chdir(target_dir)
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker  # We build mockery 2.4.0 from source to fix an issue with Go 1.18. Read the
28*c8dee2aaSAndroid Build Coastguard Worker  # comments below for details.
29*c8dee2aaSAndroid Build Coastguard Worker  output = subprocess.check_output(["git", "clone", REPO_URL, REPO_DIR])
30*c8dee2aaSAndroid Build Coastguard Worker  print(output)
31*c8dee2aaSAndroid Build Coastguard Worker  os.chdir(os.path.join(target_dir, REPO_DIR))
32*c8dee2aaSAndroid Build Coastguard Worker  output = subprocess.check_output(["git", "checkout", "v2.4.0"])
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker  # Under Go 1.18, mockery v2.4.0 through v2.10.0 fails with errors such as:
35*c8dee2aaSAndroid Build Coastguard Worker  #
36*c8dee2aaSAndroid Build Coastguard Worker  #     internal error: package "fmt" without types was imported from ...
37*c8dee2aaSAndroid Build Coastguard Worker  #
38*c8dee2aaSAndroid Build Coastguard Worker  # This can be fixed by updating golang.org/x/tools to a more recent version.
39*c8dee2aaSAndroid Build Coastguard Worker  # For more details, please see https://github.com/vektra/mockery/issues/434
40*c8dee2aaSAndroid Build Coastguard Worker  # and https://github.com/golang/go/issues/49608.
41*c8dee2aaSAndroid Build Coastguard Worker  output = subprocess.check_output(["go", "get", "golang.org/x/tools@v0.1.10"])
42*c8dee2aaSAndroid Build Coastguard Worker  print(output)
43*c8dee2aaSAndroid Build Coastguard Worker  output = subprocess.check_output(["go", "mod", "tidy"])
44*c8dee2aaSAndroid Build Coastguard Worker  print(output)
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker  # Build mockery with the same flags as in release builds.
47*c8dee2aaSAndroid Build Coastguard Worker  #
48*c8dee2aaSAndroid Build Coastguard Worker  # If we don't specify a SemVer value, mockery will generate files with a
49*c8dee2aaSAndroid Build Coastguard Worker  # "Code generated by mockery v0.0.0-dev. DO NOT EDIT." comment at the top,
50*c8dee2aaSAndroid Build Coastguard Worker  # which causes diffs due to the changed version. Thus, it is important to set
51*c8dee2aaSAndroid Build Coastguard Worker  # the SemVer value to the correct version.
52*c8dee2aaSAndroid Build Coastguard Worker  #
53*c8dee2aaSAndroid Build Coastguard Worker  # See
54*c8dee2aaSAndroid Build Coastguard Worker  # https://github.com/vektra/mockery/blob/271c74610ef710a4c30e19a42733796c50e7ea3f/.goreleaser.yml#L9.
55*c8dee2aaSAndroid Build Coastguard Worker  ldflags = "-s -w -X github.com/vektra/mockery/v2/pkg/config.SemVer=2.4.0"
56*c8dee2aaSAndroid Build Coastguard Worker  build_command = ["go", "build", "-ldflags=\"%s\"" % ldflags]
57*c8dee2aaSAndroid Build Coastguard Worker  print("Building with command:", build_command)
58*c8dee2aaSAndroid Build Coastguard Worker  output = subprocess.check_output(["go", "build", "-ldflags=" + ldflags])
59*c8dee2aaSAndroid Build Coastguard Worker  print(output)
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker  # Copy binary outside of the cloned repository directory and clean up.
62*c8dee2aaSAndroid Build Coastguard Worker  output = subprocess.check_output(["cp", BINARY_NAME, ".."])
63*c8dee2aaSAndroid Build Coastguard Worker  shutil.copy(os.path.join(target_dir, REPO_DIR, BINARY_NAME), target_dir)
64*c8dee2aaSAndroid Build Coastguard Worker  shutil.rmtree(os.path.join(target_dir, REPO_DIR))
65*c8dee2aaSAndroid Build Coastguard Worker  os.chdir(target_dir)
66*c8dee2aaSAndroid Build Coastguard Worker
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Workerdef main():
69*c8dee2aaSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
70*c8dee2aaSAndroid Build Coastguard Worker  parser.add_argument('--target_dir', '-t', required=True)
71*c8dee2aaSAndroid Build Coastguard Worker  args = parser.parse_args()
72*c8dee2aaSAndroid Build Coastguard Worker  create_asset(args.target_dir)
73*c8dee2aaSAndroid Build Coastguard Worker
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Workerif __name__ == '__main__':
76*c8dee2aaSAndroid Build Coastguard Worker  main()
77