repl: Add arguments depending on Nix version

This commit is contained in:
Zhaofeng Li 2022-08-17 11:56:30 -06:00
parent 741d5c4fbb
commit 3fbc5eeb11
2 changed files with 26 additions and 7 deletions

View file

@ -5,6 +5,7 @@ use tempfile::Builder as TempFileBuilder;
use tokio::process::Command;
use crate::error::ColmenaError;
use crate::nix::info::NixCheck;
use crate::util;
pub fn subcommand() -> ClapCommand<'static> {
@ -20,6 +21,9 @@ attribute set."#,
}
pub async fn run(_global_args: &ArgMatches, local_args: &ArgMatches) -> Result<(), ColmenaError> {
let nix_check = NixCheck::detect().await;
let nix_version = nix_check.version().expect("Could not detect Nix version");
let hive = util::hive_from_args(local_args).await?;
let expr = hive.get_repl_expression();
@ -31,14 +35,21 @@ pub async fn run(_global_args: &ArgMatches, local_args: &ArgMatches) -> Result<(
expr_file.write_all(expr.as_bytes())?;
let status = Command::new("nix")
.arg("repl")
let mut repl_cmd = Command::new("nix");
repl_cmd.arg("repl");
if nix_version.at_least(2, 4) {
// `nix repl` is expected to be marked as experimental:
// <https://github.com/NixOS/nix/issues/5604>
.args(&["--experimental-features", "nix-command flakes"])
.arg(expr_file.path())
.status()
.await?;
repl_cmd.args(&["--experimental-features", "nix-command flakes"]);
}
if nix_version.at_least(2, 10) {
repl_cmd.arg("--file");
}
let status = repl_cmd.arg(expr_file.path()).status().await?;
if !status.success() {
return Err(status.into());

View file

@ -7,7 +7,7 @@ use tokio::process::Command;
use super::{ColmenaError, ColmenaResult};
struct NixVersion {
pub struct NixVersion {
major: usize,
minor: usize,
string: String,
@ -37,6 +37,10 @@ impl NixVersion {
fn has_flakes(&self) -> bool {
self.major > 2 || (self.major == 2 && self.minor >= 4)
}
pub fn at_least(&self, major: usize, minor: usize) -> bool {
self.major >= major && self.minor >= minor
}
}
impl fmt::Display for NixVersion {
@ -147,4 +151,8 @@ impl NixCheck {
pub fn flakes_supported(&self) -> bool {
self.flakes_supported
}
pub fn version(&self) -> Option<&NixVersion> {
self.version.as_ref()
}
}