Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
9c284b1
Just: introduce scaffolding for common verbs, and apply to rust
redsun82 Jul 4, 2025
1202af1
Just: fix for windows
redsun82 Jul 4, 2025
2dea9da
Just: add `codegen`
redsun82 Jul 4, 2025
9e31fb5
Just: fix and add windows
redsun82 Jul 4, 2025
4768eba
Merge branch 'main' into redsun82/just2
redsun82 Jul 4, 2025
5b9436a
Just: fix swift tests
redsun82 Jul 4, 2025
812fc23
Merge branch 'main' into redsun82/just2
redsun82 Jul 7, 2025
a4acf08
Just: fix ram option for `codeql test run`
redsun82 Jul 7, 2025
d7d7cf9
Just: format `ts` files
redsun82 Jul 7, 2025
6e14111
Just: use `--all-checks` and `--codeql` special flags, and relativize…
redsun82 Jul 7, 2025
cb652f3
Just: add `format` to just directory
redsun82 Jul 7, 2025
fba96c4
Just: add root `lib.just`
redsun82 Jul 7, 2025
c430515
Just: simplify forwarder using `--justfile`
redsun82 Jul 8, 2025
acc7e3f
Just: add `generate` prerequisite to rust ql tests
redsun82 Jul 8, 2025
e8bcbbd
Just: add `language-tests.ts` helper
redsun82 Jul 8, 2025
d987aa6
Merge branch 'main' into redsun82/just2
redsun82 Jul 8, 2025
bb467d4
Just: fix CI build for rust
redsun82 Jul 8, 2025
8ba7efd
Just: fix mono-argument case for argumentless recipes
redsun82 Jul 8, 2025
aa09288
Just: introduce aliases
redsun82 Jul 8, 2025
7f72f87
Just: fix `just rust format` and similar
redsun82 Jul 8, 2025
b8b01ce
Just: rename `_build` to `_build_dist`
redsun82 Jul 8, 2025
0809715
Merge branch 'main' into redsun82/just2
redsun82 Jul 8, 2025
bd003c5
Just: add `_if_not_on_ci_just` helper, and add generation prerequisites
redsun82 Jul 8, 2025
c9cda74
Just: allow mixing different verb implementations
redsun82 Jul 9, 2025
c51f2f8
Merge branch 'main' into redsun82/just2
redsun82 Jul 9, 2025
9267283
Merge branch 'main' into redsun82/just2
redsun82 Jul 10, 2025
103745b
Just: group just invocations in forwarder and improve logging
redsun82 Jul 10, 2025
7e7afba
Merge branch 'main' into redsun82/just2
redsun82 Jul 17, 2025
f2a6503
Just: use bazel directly for dist building
redsun82 Jul 18, 2025
365b2eb
Merge branch 'main' into redsun82/just2
redsun82 Jul 18, 2025
0e3ee6e
Just: reorganize code and revamp formatting
redsun82 Jul 18, 2025
4284d66
Merge branch 'main' into redsun82/just2
redsun82 Jul 18, 2025
f1febac
Merge branch 'main' into redsun82/just2
redsun82 Aug 11, 2025
c67e123
Just: add `README.md`
redsun82 Aug 12, 2025
15e8e48
Just: run prettier on `.ts` files
redsun82 Aug 12, 2025
db83285
Merge branch 'main' into redsun82/just2
redsun82 Aug 12, 2025
9d52a08
Just: add some docs in source
redsun82 Aug 12, 2025
469d09c
Merge branch 'main' into redsun82/just2
redsun82 Aug 14, 2025
0f28502
Merge branch 'main' into redsun82/just2
redsun82 Nov 14, 2025
994e551
Merge branch 'main' into redsun82/just2
redsun82 Mar 10, 2026
fd97208
Just: use bazel test with -as-test targets for dist building
redsun82 Apr 2, 2026
85b89d2
Just: port helper scripts from TypeScript to Python
redsun82 Apr 2, 2026
72d9afe
Just: port csharp, go, javascript and ruby to new language test defin…
redsun82 Apr 2, 2026
5125835
C++: Port to new just-based language test definition
redsun82 Apr 2, 2026
d358cf3
C++: Add conditional import for coding-standards recipe
redsun82 Apr 2, 2026
d3b6590
Just: port python to new language test definition
redsun82 Apr 2, 2026
9915142
Just: port kotlin tests to new language test definition
redsun82 Apr 2, 2026
5c41b1d
Just: port actions to new language test definition
redsun82 Apr 2, 2026
4d4bb14
Just: read python_version from env for nested just propagation
redsun82 Apr 2, 2026
8a896ef
Merge remote-tracking branch 'origin/main' into redsun82/just2
redsun82 Apr 2, 2026
b4dac99
Just: add integration-tests justfiles for all languages
redsun82 Apr 2, 2026
cf317ed
Just: modernize justfiles for just 1.48.1
redsun82 Apr 2, 2026
223487a
Merge remote-tracking branch 'origin/main' into redsun82/just2
redsun82 Apr 2, 2026
543c31f
Merge remote-tracking branch 'origin/main' into redsun82/just2
redsun82 Apr 10, 2026
d59be76
Merge remote-tracking branch 'origin/main' into redsun82/just2
redsun82 Apr 13, 2026
1d31394
Just: fix MSYS2 path conversion for bazel targets on Windows
redsun82 Apr 14, 2026
95cb1f6
Just: fix Windows issues in codeql_test_run.py
redsun82 Apr 14, 2026
97e1862
Just: run Swift extra-tests sequentially
redsun82 Apr 15, 2026
b31be52
Merge remote-tracking branch 'origin/main' into redsun82/just2
redsun82 Apr 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Just: introduce scaffolding for common verbs, and apply to rust
  • Loading branch information
redsun82 committed Jul 4, 2025
commit 9c284b1778e93a396085c2fe07527e91784dc5e5
2 changes: 2 additions & 0 deletions justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import 'misc/just/lib.just'
import 'misc/just/forward.just'
5 changes: 5 additions & 0 deletions misc/bazel/justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import '../just/lib.just'

[no-cd, positional-arguments, no-exit-message]
hello +ARGS:
@echo "hello from bzl" "$@"
39 changes: 39 additions & 0 deletions misc/just/codeql-test-run.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import * as child_process from "child_process";
import * as path from "path";

function codeqlTestRun(argv: string[]): number {
const [language, args, ...plus] = argv;
let codeql =
process.env["SEMMLE_CODE"] ?
path.join(process.env["SEMMLE_CODE"], "target", "intree", `codeql-${language}`, "codeql")
:
"codeql"
;
process.env["CODEQL_CONFIG_FILE"] ||= "." // disable the default implicit config file, but keep an explicit one
let plus_options = plus.map(option => option.trim().split("\n").filter(option => option !== ""));
let testing_level = 0;
let parsed_args = args.split(" ").filter(arg => {
if (arg === "") return false;
if (/^\++$/.test(arg)) {
testing_level = Math.max(testing_level, arg.length);
return false;
}
return true;
});
if (parsed_args.every(arg => arg.startsWith("-"))) {
parsed_args.push(".");
}
let invocation = [codeql, "test", "run", "-j0", ...parsed_args];
for (let i = 0; i < Math.min(plus_options.length, testing_level); i++) {
invocation.push(...plus_options[i]);
}
console.log(`${process.env["CMD_BEGIN"] || ""}${invocation.join(" ")}${process.env["CMD_END"] || ""}`);
try {
child_process.execFileSync(invocation[0], invocation.slice(1), { stdio: "inherit" });
} catch (error) {
return 1;
}
return 0;
}

process.exit(codeqlTestRun(process.argv.slice(2)));
64 changes: 64 additions & 0 deletions misc/just/forward-command.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import * as child_process from "child_process";
import * as path from "path";
import * as fs from "fs";

function commonDir(paths: string[]): string {
if (paths.length === 0) return "";
const splitPaths = paths.map(p => p.split(path.sep));
let i;
for (i = 0; i < splitPaths[0].length; i++) {
if (!splitPaths.every(parts => parts[i] === splitPaths[0][i])) {
break;
}
}
const commonParts = splitPaths[0].slice(0, i);
let ret = commonParts.join(path.sep);
if (!fs.existsSync(ret)) {
throw new Error(`Common directory does not exist: ${ret}`);
}
if (!fs.lstatSync(ret).isDirectory()) {
ret = path.dirname(ret);
}
return ret;
}

function forwardCommand(args: string[]): number {
// Avoid infinite recursion
if (args.length == 0) {
console.error("No command provided");
return 1;
}
const cmd = args[0];
const envVariable = `__JUST_FORWARD_${cmd}`;
if (process.env[envVariable]) {
console.error(`No common ${cmd} handler found`);
return 1;
}
process.env[envVariable] = "true";
const cmdArgs = args.slice(1);
const is_flag = /^(-.*|\++)$/; // + is used for testing level in some langauge tests
const flags = cmdArgs.filter(arg => is_flag.test(arg));
const positionalArgs = cmdArgs.filter(arg => !is_flag.test(arg));

if (positionalArgs.length === 0) {
console.error("No positional arguments provided");
return 1;
}

const commonPath = commonDir(positionalArgs);
let relativeArgs = positionalArgs.map(arg => path.relative(commonPath, arg) || ".");
if (relativeArgs.length === 1 && relativeArgs[0] === ".") {
relativeArgs = [];
}

const invocation = [process.env["JUST_EXECUTABLE"] || "just", cmd, ...flags, ...relativeArgs];
console.log(`-> ${commonPath}: just ${invocation.slice(1).join(" ")}`);
try {
child_process.execFileSync(invocation[0], invocation.slice(1), { stdio: "inherit", cwd: commonPath });
} catch (error) {
return 1;
}
return 0;
}

process.exit(forwardCommand(process.argv.slice(2)));
28 changes: 28 additions & 0 deletions misc/just/forward.just
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import "lib.just"

# copy&paste necessary for each command until proper forwarding of multiple args is implemented
# see https://github.com/casey/just/issues/1988

_forward := tsx + source_dir() + "/forward-command.ts"


[no-cd, positional-arguments, no-exit-message]
@test *ARGS=".":
{{ _forward }} test "$@"


[no-cd, positional-arguments, no-exit-message]
@build *ARGS=".":
{{ _forward }} build "$@"

[no-cd, positional-arguments, no-exit-message]
@generate *ARGS=".":
{{ _forward }} generate "$@"

[no-cd, positional-arguments, no-exit-message]
@lint *ARGS=".":
{{ _forward }} lint "$@"

[no-cd, positional-arguments, no-exit-message]
@format *ARGS=".":
{{ _forward }} format "$@"
63 changes: 63 additions & 0 deletions misc/just/lib.just
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
set fallback
set allow-duplicate-recipes
set allow-duplicate-variables
set unstable

export PATH_SEP := if os() == "windows" { ";" } else { ":" }
export JUST_EXECUTABLE := just_executable()

error := style("error") + "error" + NORMAL + ": "
cmd_sep := "\n#--------------------------------------------------------\n"
export CMD_BEGIN := style("command") + cmd_sep
export CMD_END := cmd_sep + NORMAL

tsx := "npx tsx@4.19.0 "

import? '../../../semmle-code.just' # internal repo just file, if present
import 'semmle-code-stub.just'


[no-exit-message]
@_require_semmle_code:
{{ if SEMMLE_CODE == "" { '''
echo "''' + error + ''' running this recipe requires doing so from an internal repository checkout" >&2
exit 1
''' } else { "" } }}

_build LANGUAGE: _require_semmle_code (_maybe_build LANGUAGE)

[no-exit-message]
_maybe_build LANGUAGE:
{{ cmd_sep }}{{ if SEMMLE_CODE == "" { '# using codeql from PATH, if any' } else { 'cd $SEMMLE_CODE; ./build target/intree/codeql-' + LANGUAGE } }}{{ cmd_sep }}

[no-cd, positional-arguments, no-exit-message]
@_codeql_test LANGUAGE +ARGS: (_maybe_build LANGUAGE)
{{ tsx + source_dir() }}/codeql-test-run.ts "$@"

[no-cd, positional-arguments, no-exit-message]
@_codeql_test_run_only LANGUAGE +ARGS:
{{ tsx + source_dir() }}/codeql-test-run.ts "$@"


[no-cd, no-exit-message]
_ql_format +ARGS: (_maybe_build "nolang")
{{ cmd_sep }}{{ if SEMMLE_CODE != "" { '$SEMMLE_CODE/target/intree/codeql-nolang/' } else { '' } }}codeql query format --in-place $(find {{ ARGS }} -type f -name '*.ql' -or -name '*.qll'){{ cmd_sep }}


[no-cd, no-exit-message]
_bazel COMMAND *ARGS:
{{ cmd_sep }}{{ if SEMMLE_CODE != "" { '$SEMMLE_CODE/tools/' } else { '' } }}bazel {{ COMMAND }} {{ ARGS }}{{ cmd_sep }}

[no-cd, no-exit-message]
_integration_test *ARGS: _require_semmle_code (_run "$SEMMLE_CODE/tools/pytest" ARGS)

[no-cd]
_run +ARGS:
{{ cmd_sep }}{{ ARGS }}{{ cmd_sep }}

[no-cd, positional-arguments, no-exit-message]
_just +ARGS:
{{ JUST_EXECUTABLE }} "$@"

[no-cd]
_black *ARGS=".": (_run "uv" "run" "black" ARGS)
1 change: 1 addition & 0 deletions misc/just/semmle-code-stub.just
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export SEMMLE_CODE := ""
11 changes: 11 additions & 0 deletions rust/justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import '../misc/just/lib.just'

install: (_bazel "run" "@codeql//rust:install")

build: generate (_build "rust")

generate: (_bazel "run" "@codeql//rust/codegen")

lint: (_run "python3" "lint.py")

format: (_run "python3" "lint.py" "--format-only")
48 changes: 32 additions & 16 deletions rust/lint.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
import pathlib
import shutil
import sys
import argparse


def options():
parser = argparse.ArgumentParser(description="lint rust language pack code")
parser.add_argument("--format-only", action="store_true", help="Only apply formatting")
return parser.parse_args()



def tool(name):
Expand All @@ -12,27 +20,35 @@ def tool(name):
return ret


this_dir = pathlib.Path(__file__).resolve().parent
def main():
args = options()
this_dir = pathlib.Path(__file__).resolve().parent


cargo = tool("cargo")
bazel = tool("bazel")

runs = []

cargo = tool("cargo")
bazel = tool("bazel")

runs = []
def run(tool, args, *, cwd=this_dir):
print("+", tool, args)
runs.append(subprocess.run([tool] + args.split(), cwd=cwd))


def run(tool, args, *, cwd=this_dir):
print("+", tool, args)
runs.append(subprocess.run([tool] + args.split(), cwd=cwd))
# make sure bazel-provided sources are put in tree for `cargo` to work with them
run(bazel, "run ast-generator:inject-sources")
run(cargo, "fmt --all --quiet")

if not args.format_only:
for manifest in this_dir.rglob("Cargo.toml"):
if not manifest.is_relative_to(this_dir / "ql") and not manifest.is_relative_to(this_dir / "integration-tests"):
run(cargo,
"clippy --fix --allow-dirty --allow-staged --quiet -- -D warnings",
cwd=manifest.parent)

# make sure bazel-provided sources are put in tree for `cargo` to work with them
run(bazel, "run ast-generator:inject-sources")
run(cargo, "fmt --all --quiet")
return max(r.returncode for r in runs)

for manifest in this_dir.rglob("Cargo.toml"):
if not manifest.is_relative_to(this_dir / "ql") and not manifest.is_relative_to(this_dir / "integration-tests"):
run(cargo,
"clippy --fix --allow-dirty --allow-staged --quiet -- -D warnings",
cwd=manifest.parent)

sys.exit(max(r.returncode for r in runs))
if __name__ == "__main__":
sys.exit(main())
9 changes: 9 additions & 0 deletions rust/ql/integration-tests/justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import "../../../misc/just/lib.just"


[no-cd]
test *ARGS=".": (_just "generate") (_integration_test ARGS)

# TODO in separate PR
# [no-cd]
# format *ARGS=".": (_ql_format ARGS) (_black ARGS)
4 changes: 4 additions & 0 deletions rust/ql/justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import "../../misc/just/lib.just"

[no-cd]
format *ARGS=".": (_ql_format ARGS)
17 changes: 17 additions & 0 deletions rust/ql/test/justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import '../../../misc/just/lib.just'

plus := """
--check-databases
--check-diff-informed
--fail-on-trap-errors
--check-undefined-labels
--check-unused-labels
--check-repeated-labels
--check-redefined-labels
--check-use-before-definition
"""

plusplus := "--consistency-queries=" + source_dir() + "/../consistency-queries"

[no-cd]
test *ARGS=".": (_codeql_test "rust" ARGS plus plusplus)