From b157c5a8a4472cff68de3a9be66e220dc4b80a9f Mon Sep 17 00:00:00 2001
From: Michael Davis <mcarsondavis@gmail.com>
Date: Mon, 21 Feb 2022 06:39:23 -0600
Subject: [PATCH] fetch and compile tree-sitter grammars in helix-term build

This restores much of the behavior that existed before this PR:
helix will build the grammars when compiling. The difference is that
now fetching is also done during the build phase and is done much
more quickly - both shallow and in parallel.
---
 .github/workflows/build.yml   | 21 ++++-----------------
 .github/workflows/release.yml | 14 --------------
 flake.nix                     |  2 ++
 helix-term/Cargo.toml         |  7 +++----
 helix-term/build.rs           |  8 ++++++++
 5 files changed, 17 insertions(+), 35 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index e0eb5322..776c8651 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -77,27 +77,14 @@ jobs:
           path: target
           key: ${{ runner.os }}-v2-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
 
+      - name: Copy minimal languages config
+        run: cp .github/workflows/languages.toml ./languages.toml
+
       - name: Cache test tree-sitter grammar
         uses: actions/cache@v2.1.7
         with:
           path: runtime/grammars
-          key: ${{ runner.os }}-v2-tree-sitter-grammars-${{ hashFiles('**/Cargo.lock') }}
-
-      - run: cp .github/workflows/languages.toml ./languages.toml
-
-      - name: Download test tree-sitter grammar
-        uses: actions-rs/cargo@v1
-        with:
-          use-cross: ${{ matrix.cross }}
-          command: run
-          args: -- --fetch-grammars
-
-      - name: Build test tree-sitter grammar
-        uses: actions-rs/cargo@v1
-        with:
-          use-cross: ${{ matrix.cross }}
-          command: run
-          args: -- --build-grammars
+          key: ${{ runner.os }}-v2-tree-sitter-grammars-${{ hashFiles('languages.toml') }}
 
       - name: Run cargo test
         uses: actions-rs/cargo@v1
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 2a9ea80e..2d0b86e2 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -62,20 +62,6 @@ jobs:
           target: ${{ matrix.target }}
           override: true
 
-      - name: Fetch tree-sitter grammars
-        uses: actions-rs/cargo@v1
-        with:
-          use-cross: ${{ matrix.cross }}
-          command: run
-          args: --release --locked --target ${{ matrix.target }} -- --fetch-grammars
-
-      - name: Build tree-sitter grammars
-        uses: actions-rs/cargo@v1
-        with:
-          use-cross: ${{ matrix.cross }}
-          command: run
-          args: --release --locked --target ${{ matrix.target }} -- --build-grammars
-
       - name: Run cargo test
         uses: actions-rs/cargo@v1
         with:
diff --git a/flake.nix b/flake.nix
index 71825431..c4838ffd 100644
--- a/flake.nix
+++ b/flake.nix
@@ -35,6 +35,8 @@
       overrides = {
         crateOverrides = common: _: rec {
           helix-term = prev: {
+            # disable fetching and building of tree-sitter grammars in the helix-term build.rs
+            HELIX_DISABLE_AUTO_GRAMMAR_BUILD = "1";
             buildInputs = (prev.buildInputs or [ ]) ++ [ common.cCompiler.cc.lib ];
             nativeBuildInputs = (prev.nativeBuildInputs or [ ]) ++ [ common.pkgs.makeWrapper ];
             preConfigure = ''
diff --git a/helix-term/Cargo.toml b/helix-term/Cargo.toml
index 86d72561..48365743 100644
--- a/helix-term/Cargo.toml
+++ b/helix-term/Cargo.toml
@@ -67,9 +67,8 @@ grep-searcher = "0.1.8"
 # Remove once retain_mut lands in stable rust
 retain_mut = "0.1.7"
 
-# compiling grammars
-cc = { version = "1" }
-threadpool = { version = "1.0" }
-
 [target.'cfg(not(windows))'.dependencies]  # https://github.com/vorner/signal-hook/issues/100
 signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] }
+
+[build-dependencies]
+helix-loader = { version = "0.6", path = "../helix-loader" }
diff --git a/helix-term/build.rs b/helix-term/build.rs
index b5d62b28..526cdc41 100644
--- a/helix-term/build.rs
+++ b/helix-term/build.rs
@@ -1,3 +1,4 @@
+use helix_loader::grammar::{build_grammars, fetch_grammars};
 use std::borrow::Cow;
 use std::process::Command;
 
@@ -14,5 +15,12 @@ fn main() {
         None => env!("CARGO_PKG_VERSION").into(),
     };
 
+    if std::env::var("HELIX_DISABLE_AUTO_GRAMMAR_BUILD").is_err() {
+        fetch_grammars().expect("Failed to fetch tree-sitter grammars");
+        build_grammars().expect("Failed to compile tree-sitter grammars");
+    }
+
+    println!("cargo:rerun-if-changed=../runtime/grammars/");
+
     println!("cargo:rustc-env=VERSION_AND_GIT_HASH={}", version);
 }