git.delta.rocks / jrsonnet / refs/commits / ea44e4495023

difftreelog

ci add pre-commit hook

Yaroslav Bolyukin2024-06-18parent: #8d39c73.patch.diff
in: master

5 files changed

modified.envrcdiffbeforeafterboth
--- a/.envrc
+++ b/.envrc
@@ -1 +1,8 @@
+RED='\033[0;31m'
+RESET='\033[0m'
+
 use flake
+
+if ! diff .github/hooks/pre-commit .git/hooks/pre-commit >/dev/null; then
+echo -e "${RED}Hooks are updated, read .github/hooks/pre-commit, and then install it with cp .github/hooks/pre-commit .git/hooks/pre-commit${RESET}"
+fi
added.github/hooks/pre-commitdiffbeforeafterboth
--- /dev/null
+++ b/.github/hooks/pre-commit
@@ -0,0 +1 @@
+cargo xtask lint
modifiedflake.nixdiffbeforeafterboth
after · flake.nix
1{2  description = "Jrsonnet";3  inputs = {4    nixpkgs.url = "github:nixos/nixpkgs";5    flake-utils.url = "github:numtide/flake-utils";6    rust-overlay = {7      url = "github:oxalica/rust-overlay";8      inputs = {9        nixpkgs.follows = "nixpkgs";10        flake-utils.follows = "flake-utils";11      };12    };13    crane = {14      url = "github:ipetkov/crane";15      inputs.nixpkgs.follows = "nixpkgs";16    };17  };18  outputs = {19    nixpkgs,20    flake-utils,21    rust-overlay,22    crane,23    ...24  }:25    flake-utils.lib.eachDefaultSystem (26      system: let27        pkgs = import nixpkgs {28          inherit system;29          overlays = [rust-overlay.overlays.default];30          config.allowUnsupportedSystem = true;31        };32        rust = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;33        craneLib = (crane.mkLib pkgs).overrideToolchain rust;34      in {35        packages = rec {36          default = jrsonnet;37          go-jsonnet = pkgs.callPackage ./nix/go-jsonnet.nix {};38          sjsonnet = pkgs.callPackage ./nix/sjsonnet.nix {};39          jsonnet = pkgs.callPackage ./nix/jsonnet.nix {};40          # I didn't managed to build it, and nixpkgs version is marked as broken41          # haskell-jsonnet = pkgs.callPackage ./nix/haskell-jsonnet.nix { };42          rsjsonnet = pkgs.callPackage ./nix/rsjsonnet.nix {};4344          jrsonnet = pkgs.callPackage ./nix/jrsonnet.nix {45            inherit craneLib;46          };47          jrsonnet-nightly = pkgs.callPackage ./nix/jrsonnet.nix {48            inherit craneLib;49            withNightlyFeatures = true;50          };51          jrsonnet-experimental = pkgs.callPackage ./nix/jrsonnet.nix {52            inherit craneLib;53            withExperimentalFeatures = true;54          };5556          jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {57            rustPlatform = pkgs.makeRustPlatform {58              rustc = rust;59              cargo = rust;60            };61          };6263          benchmarks = pkgs.callPackage ./nix/benchmarks.nix {64            inherit go-jsonnet sjsonnet jsonnet rsjsonnet;65            jrsonnetVariants = [66              {67                drv = jrsonnet.override {forBenchmarks = true;};68                name = "";69              }70            ];71          };72          benchmarks-quick = pkgs.callPackage ./nix/benchmarks.nix {73            inherit go-jsonnet sjsonnet jsonnet rsjsonnet;74            quick = true;75            jrsonnetVariants = [76              {77                drv = jrsonnet.override {forBenchmarks = true;};78                name = "";79              }80            ];81          };82          benchmarks-against-release = pkgs.callPackage ./nix/benchmarks.nix {83            inherit go-jsonnet sjsonnet jsonnet rsjsonnet;84            jrsonnetVariants = [85              {86                drv = jrsonnet.override {forBenchmarks = true;};87                name = "current";88              }89              {90                drv = jrsonnet-nightly.override {forBenchmarks = true;};91                name = "current-nightly";92              }93              {94                drv = jrsonnet-release.override {forBenchmarks = true;};95                name = "release";96              }97            ];98          };99          benchmarks-quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {100            inherit go-jsonnet sjsonnet jsonnet rsjsonnet;101            quick = true;102            jrsonnetVariants = [103              {104                drv = jrsonnet.override {forBenchmarks = true;};105                name = "current";106              }107              {108                drv = jrsonnet-nightly.override {forBenchmarks = true;};109                name = "current-nightly";110              }111              {112                drv = jrsonnet-release.override {forBenchmarks = true;};113                name = "release";114              }115            ];116          };117        };118        devShells.default = craneLib.devShell {119          packages = with pkgs; [120            alejandra121            cargo-edit122            cargo-asm123            cargo-outdated124            cargo-watch125            cargo-insta126            lld127            hyperfine128            graphviz129          ] ++ lib.optionals (!stdenv.isDarwin) [130            valgrind131            kcachegrind132          ];133        };134      }135    );136}
modifiedxtask/Cargo.tomldiffbeforeafterboth
--- a/xtask/Cargo.toml
+++ b/xtask/Cargo.toml
@@ -15,3 +15,4 @@
 quote.workspace = true
 ungrammar.workspace = true
 xshell.workspace = true
+clap = {workspace = true, features = ["derive"]}
modifiedxtask/src/main.rsdiffbeforeafterboth
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -1,7 +1,77 @@
 use anyhow::Result;
+use clap::Parser;
+use xshell::{cmd, Shell};
 
 mod sourcegen;
 
+#[derive(Parser)]
+enum Opts {
+	/// Generate files for rowan parser
+	Sourcegen,
+	/// Profile file execution
+	Profile {
+		#[arg(long, default_value = "true")]
+		hyperfine: bool,
+		#[arg(long)]
+		callgrind: bool,
+		#[arg(long)]
+		cachegrind: bool,
+		#[arg(long, default_value = "x86_64-unknown-linux-gnu")]
+		target: String,
+		args: Vec<String>,
+	},
+	/// Run all lints enforced by this repo
+	Lint {
+		/// Also fix found issues when possible.
+		#[arg(long)]
+		fix: bool,
+	},
+}
+
 fn main() -> Result<()> {
-	sourcegen::generate_ungrammar()
+	let sh = Shell::new()?;
+	match Opts::parse() {
+		Opts::Sourcegen => sourcegen::generate_ungrammar(),
+		Opts::Profile {
+			hyperfine,
+			callgrind,
+			cachegrind,
+			args,
+			target,
+		} => {
+			let out = sh.create_temp_dir()?;
+
+			// build-std
+			cmd!(
+				sh,
+				"cargo build -Zbuild-std --target={target} --profile releasedebug"
+			)
+			.run()?;
+			let built = format!("./target/{target}/releasedebug/jrsonnet");
+			let bench_cmd = format!("{built} {}", args.join(" "));
+			if hyperfine {
+				cmd!(sh, "hyperfine {bench_cmd}").run()?;
+			}
+			if callgrind {
+				let args = args.clone();
+				let mut callgrind_out = out.path().to_owned();
+				callgrind_out.push("callgrind.out.1");
+				cmd!(sh, "valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes --callgrind-out-file={callgrind_out} {built} {args...}").run()?;
+				cmd!(sh, "kcachegrind {callgrind_out}").run()?;
+			}
+			if cachegrind {
+				let mut cachegrind_out = out.path().to_owned();
+				cachegrind_out.push("cachegrind.out.1");
+				cmd!(sh, "valgrind --tool=cachegrind --cachegrind-out-file={cachegrind_out} {built} {args...}").run()?;
+				cmd!(sh, "kcachegrind {cachegrind_out}").run()?;
+			}
+
+			Ok(())
+		}
+		Opts::Lint { fix } => {
+			let fmt_check = if fix { None } else { Some("--check") };
+			cmd!(sh, "cargo fmt {fmt_check...}").run()?;
+			Ok(())
+		}
+	}
 }