From 4fb3ba982ad44fed50978fc7a5038f86b582b21e Mon Sep 17 00:00:00 2001 From: eveeifyeve Date: Fri, 31 Jul 2026 05:10:55 +1000 Subject: [PATCH] feat(dune): init --- src/cli.rs | 1 + src/codegen/dune.rs | 13 +++++++++++++ src/codegen/mod.rs | 8 ++++++-- src/main.rs | 16 +++++++++++++--- tests/cmd/dune.out/default.nix | 30 ++++++++++++++++++++++++++++++ tests/cmd/dune.toml | 5 +++++ 6 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 src/codegen/dune.rs create mode 100644 tests/cmd/dune.out/default.nix create mode 100644 tests/cmd/dune.toml diff --git a/src/cli.rs b/src/cli.rs index dc63d2f8..1d8a947c 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -73,6 +73,7 @@ pub struct Opts { #[derive(Clone, ValueEnum)] #[clap(rename_all = "camelCase")] pub enum BuilderFunction { + BuildDunePackage, BuildGoModule, BuildNpmPackage, BuildPythonApplication, diff --git a/src/codegen/dune.rs b/src/codegen/dune.rs new file mode 100644 index 00000000..1f22fb4c --- /dev/null +++ b/src/codegen/dune.rs @@ -0,0 +1,13 @@ +use parse_display::Display; + +use crate::codegen::Builder; + +#[derive(Clone, Copy, Display)] +#[display("buildDunePackage")] +pub struct BuildDunePackage; + +impl Builder for BuildDunePackage { + fn function(&self) -> &'static str { + "buildDunePackage" + } +} diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index ccc11130..35dbc622 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1,4 +1,5 @@ pub mod drv; +pub mod dune; pub mod go; pub mod npm; pub mod python; @@ -26,8 +27,8 @@ use tracing::warn; use crate::{ cli::CargoVendor, codegen::{ - drv::MkDerivation, go::BuildGoModule, npm::BuildNpmPackage, python::BuildPythonPackage, - rust::BuildRustPackage, + drv::MkDerivation, dune::BuildDunePackage, go::BuildGoModule, npm::BuildNpmPackage, + python::BuildPythonPackage, rust::BuildRustPackage, }, frontend::FrontendDispatch, inputs::{AllInputs, write_all_lambda_inputs, write_inputs, write_lambda_input}, @@ -43,6 +44,7 @@ use crate::{ #[derive(Clone, Copy, Display)] #[display("{0}")] pub enum BuilderDispatch { + BuildDunePackage(BuildDunePackage), BuildGoModule(BuildGoModule), BuildNpmPackage(BuildNpmPackage), BuildPythonPackage(BuildPythonPackage), @@ -77,6 +79,7 @@ pub struct Codegen<'a> { pub struct SourceLayout { pub has_cargo: bool, pub has_cargo_lock: bool, + pub has_dune: bool, pub has_cmake: bool, pub has_go: bool, pub has_meson: bool, @@ -473,6 +476,7 @@ impl SourceLayout { has_cargo_lock: src_dir.join("Cargo.lock").is_file(), has_cmake: src_dir.join("CMakeLists.txt").is_file(), has_go: src_dir.join("go.mod").is_file(), + has_dune: src_dir.join("dune-project").is_file(), has_meson: src_dir.join("meson.build").is_file(), has_npm: src_dir.join("package.json").is_file(), has_npm_lock: src_dir.join("package-lock.json").is_file() diff --git a/src/main.rs b/src/main.rs index 9dbbee78..5aa633cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,11 +36,15 @@ use zip::ZipArchive; use crate::{ cfg::load_config, - cli::{BuilderFunction, CargoVendor, Opts}, + cli::{ + BuilderFunction::{self}, + CargoVendor, Opts, + }, cmd::{NIX, NURL}, codegen::{ - BuilderDispatch, Codegen, SourceLayout, drv::MkDerivation, go::BuildGoModule, - npm::BuildNpmPackage, python::BuildPythonPackage, rust::BuildRustPackage, + BuilderDispatch, Codegen, SourceLayout, drv::MkDerivation, dune::BuildDunePackage, + go::BuildGoModule, npm::BuildNpmPackage, python::BuildPythonPackage, + rust::BuildRustPackage, }, fetcher::{Fetcher, FetcherDispatch, PackageInfo, PypiFormat, Revisions, Version}, frontend::{Frontend, headless, readline}, @@ -384,6 +388,7 @@ async fn run() -> Result<()> { let builder = match (opts.builder, opts.cargo_vendor) { (Some(builder), rust @ Some(vendor)) if layout.has_cargo => match builder { + BuilderFunction::BuildDunePackage => BuildDunePackage.into(), BuilderFunction::BuildGoModule => BuildGoModule.into(), BuilderFunction::BuildNpmPackage => BuildNpmPackage.into(), BuilderFunction::BuildPythonApplication => BuildPythonPackage::new(true, rust).into(), @@ -395,6 +400,7 @@ async fn run() -> Result<()> { (Some(builder), _) => { let rust = layout.has_cargo.then_some(CargoVendor::FetchCargoVendor); match builder { + BuilderFunction::BuildDunePackage => BuildDunePackage.into(), BuilderFunction::BuildGoModule => BuildGoModule.into(), BuilderFunction::BuildNpmPackage => BuildNpmPackage.into(), BuilderFunction::BuildPythonApplication => { @@ -438,6 +444,10 @@ async fn run() -> Result<()> { } } + if layout.has_dune { + builders.push(BuildDunePackage.into()); + } + if layout.has_python { for application in [true, false] { builders.push(BuildPythonPackage::new(application, None).into()); diff --git a/tests/cmd/dune.out/default.nix b/tests/cmd/dune.out/default.nix new file mode 100644 index 00000000..eb61d40f --- /dev/null +++ b/tests/cmd/dune.out/default.nix @@ -0,0 +1,30 @@ +{ + lib, + buildDunePackage, + fetchFromGitHub, + nix-update-script, +}: + +buildDunePackage (finalAttrs: { + pname = "ocaml-lsp"; + version = "1.27.0"; + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "ocaml"; + repo = "ocaml-lsp"; + tag = finalAttrs.version; + hash = "sha256-XrNYqNeaJAvkSYU0vha0apbN9uAYiGIuiJJMJMAN5ug="; + }; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "[..]"; + homepage = "https://github.com/ocaml/ocaml-lsp"; + changelog = "https://github.com/ocaml/ocaml-lsp/blob/${finalAttrs.src.rev}/CHANGES.md"; + license = lib.licenses.isc; + maintainers = with lib.maintainers; [ alice ]; + mainProgram = "ocaml-lsp"; + }; +}) diff --git a/tests/cmd/dune.toml b/tests/cmd/dune.toml new file mode 100644 index 00000000..7ab36300 --- /dev/null +++ b/tests/cmd/dune.toml @@ -0,0 +1,5 @@ +args = [ + "--headless", + "--url=https://github.com/ocaml/ocaml-lsp", + "--rev=1.27.0", +]