Skip to content

Commit 183a825

Browse files
committed
Kotlin: expose kotlin version picker for internal packaging
1 parent f441c68 commit 183a825

File tree

5 files changed

+71
-50
lines changed

5 files changed

+71
-50
lines changed

java/kotlin-extractor/BUILD.bazel

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,18 @@ kt_javac_options(
178178
) for variant in ("standalone", "embeddable") for version in VERSIONS],
179179
visibility = ["//visibility:public"],
180180
),
181-
sh_binary(
182-
name = "print-default-version",
183-
srcs = ["//java/kotlin-extractor/defaults:default-version-printer"],
181+
genrule(
182+
name = "versions-list",
183+
outs = ["kotlin-versions.list"],
184+
cmd = "\n".join(["cat > $@ << EOF"] + VERSIONS + ["EOF"]),
185+
),
186+
# these are packed in the extractor pack for running QL tests
187+
filegroup(
188+
name = "version-picker",
189+
srcs = [
190+
"pick-kotlin-version.py",
191+
":versions-list",
192+
],
193+
visibility = ["//visibility:public"],
184194
),
185195
) if not _for_embeddable else None

java/kotlin-extractor/current_kotlin_version.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

java/kotlin-extractor/defaults/BUILD.bazel

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,3 @@ alias(
2828
kotlin_extractor_defaults.extractor_version,
2929
),
3030
)
31-
32-
genrule(
33-
name = "default-version-printer",
34-
outs = ["print-default-version.sh"],
35-
cmd = "echo echo %s > $@" % kotlin_extractor_defaults.version,
36-
)

java/kotlin-extractor/deps.bzl

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("//java/kotlin-extractor:versions.bzl", "VERSIONS", "version_less")
1+
load("//java/kotlin-extractor:versions.bzl", "VERSIONS")
22
load("//misc/bazel:lfs.bzl", "lfs_smudge")
33

44
_kotlin_dep_build = """
@@ -69,42 +69,34 @@ def _embeddable_source_impl(repository_ctx):
6969

7070
_embeddable_source = repository_rule(implementation = _embeddable_source_impl)
7171

72-
def _get_default_version(repository_ctx):
72+
def _get_version(repository_ctx, available = []):
7373
default_version = repository_ctx.getenv("CODEQL_KOTLIN_SINGLE_VERSION")
7474
if default_version:
7575
return default_version
76-
kotlin_plugin_versions = repository_ctx.path(Label("//java/kotlin-extractor:current_kotlin_version.py"))
77-
python = repository_ctx.which("python3") or repository_ctx.which("python")
78-
env = {}
7976
repository_ctx.watch(Label("//java/kotlin-extractor:dev/.kotlinc_version"))
80-
if not repository_ctx.which("kotlinc"):
81-
# take default from the kotlinc wrapper
82-
path = repository_ctx.getenv("PATH")
83-
path_to_add = repository_ctx.path(Label("//java/kotlin-extractor:dev"))
84-
if not path:
85-
path = str(path_to_add)
86-
elif repository_ctx.os.name == "windows":
87-
path = "%s;%s" % (path, path_to_add)
88-
else:
89-
path = "%s:%s" % (path, path_to_add)
90-
env["PATH"] = path
91-
res = repository_ctx.execute([python, kotlin_plugin_versions], environment = env)
77+
version_picker = repository_ctx.path(Label("//java/kotlin-extractor:pick-kotlin-version.py"))
78+
python = repository_ctx.which("python3") or repository_ctx.which("python")
79+
80+
# use the kotlinc wrapper as fallback
81+
path = repository_ctx.getenv("PATH")
82+
path_to_add = repository_ctx.path(Label("//java/kotlin-extractor:dev"))
83+
if not path:
84+
path = str(path_to_add)
85+
elif repository_ctx.os.name == "windows":
86+
path = "%s;%s" % (path, path_to_add)
87+
else:
88+
path = "%s:%s" % (path, path_to_add)
89+
res = repository_ctx.execute([python, version_picker] + available, environment = {"PATH": path})
9290
if res.return_code != 0:
9391
fail(res.stderr)
9492
return res.stdout.strip()
9593

96-
def _get_available_version(version):
97-
for available_version in reversed(VERSIONS):
98-
if not version_less(version, available_version):
99-
return available_version
100-
fail("no available version found for version %s among:\n %s" % (version, " ".join(VERSIONS)))
101-
10294
def _defaults_impl(repository_ctx):
103-
default_version = _get_default_version(repository_ctx)
95+
default_version = _get_version(repository_ctx)
10496
default_variant = "standalone"
10597
if repository_ctx.getenv("CODEQL_KOTLIN_SINGLE_VERSION_EMBEDDABLE") in ("true", "1"):
10698
default_variant = "embeddable"
107-
available_version = _get_available_version(default_version)
99+
available_version = _get_version(repository_ctx, VERSIONS)
108100
info = struct(
109101
version = default_version,
110102
variant = default_variant,
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Script to get currently installed kotlinc version. If a list of available versions is provided as input,
4+
the last version of those lower or equal to the kotlinc version is printed.
5+
"""
6+
7+
import subprocess
8+
import re
9+
import shutil
10+
import argparse
11+
import sys
12+
13+
14+
def version_tuple(v):
15+
v, _, _ = v.partition('-')
16+
return tuple(int(x) for x in v.split(".", 2))
17+
18+
19+
p = argparse.ArgumentParser(description=__doc__, fromfile_prefix_chars='@')
20+
p.add_argument("available_versions", nargs="*", metavar="X.Y.Z")
21+
opts = p.parse_args()
22+
23+
kotlinc = shutil.which('kotlinc')
24+
if kotlinc is None:
25+
raise Exception("kotlinc not found")
26+
res = subprocess.run([kotlinc, "-version"], text=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
27+
if res.returncode != 0:
28+
raise Exception(f"kotlinc -version failed: {res.stderr}")
29+
m = re.match(r'.* kotlinc-jvm ([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z][a-zA-Z0-9]*)?) .*', res.stderr)
30+
if m is None:
31+
raise Exception(f'Cannot detect version of kotlinc (got {res.stderr})')
32+
version = m[1]
33+
if opts.available_versions:
34+
vt = version_tuple(version)
35+
available = sorted(opts.available_versions, key=version_tuple, reverse=True)
36+
for v in available:
37+
if version_tuple(v) <= vt:
38+
print(v)
39+
sys.exit(0)
40+
raise Exception(f'Cannot find an available version for {version}')
41+
print(version)

0 commit comments

Comments
 (0)