diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml index 7c93504..bef91f5 100644 --- a/.forgejo/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -49,12 +49,17 @@ jobs: if: steps.version.outputs.SKIP != 'true' run: nix build .#streamd-musl -o result-musl + - name: Build Windows binary + if: steps.version.outputs.SKIP != 'true' + run: nix build .#streamd-windows -o result-windows + - name: Prepare release artifacts if: steps.version.outputs.SKIP != 'true' run: | mkdir -p release cp result-deb release/streamd_${{ steps.version.outputs.VERSION }}_amd64.deb cp result-musl/bin/streamd release/streamd-${{ steps.version.outputs.VERSION }}-linux-x86_64 + cp result-windows/bin/streamd.exe release/streamd-${{ steps.version.outputs.VERSION }}-windows-x86_64.exe - name: Create release if: steps.version.outputs.SKIP != 'true' diff --git a/flake.nix b/flake.nix index 38723ae..12cdf69 100644 --- a/flake.nix +++ b/flake.nix @@ -132,6 +132,38 @@ in craneLib.buildPackage (commonArgs // { inherit cargoArtifacts; }); + mkWindowsCraneLib = + system: + let + pkgs = mkPkgs system; + toolchain = pkgs.rust-bin.stable.latest.default.override { + targets = [ "x86_64-pc-windows-gnu" ]; + }; + in + (crane.mkLib pkgs).overrideToolchain toolchain; + + mkStreamdWindows = + system: + let + pkgs = mkPkgs system; + pkgsCross = pkgs.pkgsCross.mingwW64; + craneLib = mkWindowsCraneLib system; + commonArgs = { + src = craneLib.path ./.; + pname = "streamd"; + inherit version; + strictDeps = true; + CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu"; + CC_x86_64_pc_windows_gnu = "${pkgsCross.stdenv.cc}/bin/x86_64-w64-mingw32-gcc"; + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER = "${pkgsCross.stdenv.cc}/bin/x86_64-w64-mingw32-gcc"; + nativeBuildInputs = [ pkgsCross.stdenv.cc ]; + buildInputs = [ pkgsCross.windows.pthreads ]; + doCheck = false; + }; + cargoArtifacts = craneLib.buildDepsOnly commonArgs; + in + craneLib.buildPackage (commonArgs // { inherit cargoArtifacts; }); + mkStreamdDeb = system: let @@ -181,9 +213,10 @@ streamd = mkStreamd system; streamd-musl = mkStreamdMusl system; streamd-deb = mkStreamdDeb system; + streamd-windows = mkStreamdWindows system; in { - inherit streamd streamd-musl streamd-deb; + inherit streamd streamd-musl streamd-deb streamd-windows; default = streamd; } ); diff --git a/src/cli/commands/edit.rs b/src/cli/commands/edit.rs index cfc28c1..a5feeee 100644 --- a/src/cli/commands/edit.rs +++ b/src/cli/commands/edit.rs @@ -44,7 +44,13 @@ pub fn run(number: i32) -> Result<(), StreamdError> { }; if let Some(file_path) = sorted_shards[selected_index].location.get("file") { - let editor = std::env::var("EDITOR").unwrap_or_else(|_| "vi".to_string()); + let editor = std::env::var("EDITOR").unwrap_or_else(|_| { + if cfg!(windows) { + "notepad".to_string() + } else { + "vi".to_string() + } + }); Command::new(&editor).arg(file_path).status()?; } diff --git a/src/cli/commands/new.rs b/src/cli/commands/new.rs index de7d351..5c3eecb 100644 --- a/src/cli/commands/new.rs +++ b/src/cli/commands/new.rs @@ -24,7 +24,13 @@ pub fn run() -> Result<(), StreamdError> { drop(file); // Open in editor - let editor = std::env::var("EDITOR").unwrap_or_else(|_| "vi".to_string()); + let editor = std::env::var("EDITOR").unwrap_or_else(|_| { + if cfg!(windows) { + "notepad".to_string() + } else { + "vi".to_string() + } + }); let status = Command::new(&editor).arg(&preliminary_path).status()?; if !status.success() { diff --git a/src/cli/commands/todo.rs b/src/cli/commands/todo.rs index 9f25289..66176cf 100644 --- a/src/cli/commands/todo.rs +++ b/src/cli/commands/todo.rs @@ -72,13 +72,19 @@ pub fn run_edit(number: usize) -> Result<(), StreamdError> { .get("file") .ok_or(StreamdError::MissingFilePath)?; - let editor = std::env::var("EDITOR").unwrap_or_else(|_| "vi".to_string()); - let line_arg = format!("+{}", task.start_line); + let editor = std::env::var("EDITOR").unwrap_or_else(|_| { + if cfg!(windows) { + "notepad".to_string() + } else { + "vi".to_string() + } + }); - let status = Command::new(&editor) - .arg(&line_arg) - .arg(file_path) - .status()?; + let mut cmd = Command::new(&editor); + if !editor.to_lowercase().contains("notepad") { + cmd.arg(format!("+{}", task.start_line)); + } + let status = cmd.arg(file_path).status()?; if !status.success() { return Err(StreamdError::IoError(std::io::Error::other( diff --git a/src/config.rs b/src/config.rs index c828ba9..417e8f0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -37,8 +37,10 @@ impl Settings { fn config_path() -> PathBuf { if let Some(proj_dirs) = ProjectDirs::from("", "", "streamd") { proj_dirs.config_dir().join("config.toml") + } else if let Some(base_dirs) = directories::BaseDirs::new() { + base_dirs.config_dir().join("streamd").join("config.toml") } else { - PathBuf::from("~/.config/streamd/config.toml") + PathBuf::from("streamd_config.toml") } } }