difftreelog
ci add pre-commit hook
in: master
5 files changed
.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
.github/hooks/pre-commitdiffbeforeafterboth--- /dev/null
+++ b/.github/hooks/pre-commit
@@ -0,0 +1 @@
+cargo xtask lint
flake.nixdiffbeforeafterboth1{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 nativeBuildInputs = with pkgs; [120 alejandra121 cargo-edit122 cargo-asm123 cargo-outdated124 cargo-watch125 cargo-insta126 lld127 hyperfine128 graphviz129 ];130 };131 }132 );133}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}xtask/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"]}
xtask/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(())
+ }
+ }
}