summaryrefslogtreecommitdiff
path: root/cli/tools/registry/mod.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2024-02-28 09:21:12 +0000
committerGitHub <noreply@github.com>2024-02-28 10:21:12 +0100
commitc2c4e745a5db4f2e53aa70bf22b6c828fa1b4040 (patch)
treea63f5933e6082589ddf60ab7b16e97c1a7b7392d /cli/tools/registry/mod.rs
parent96cfe82664c07163930444e835437ea0c44e5332 (diff)
fix(publish): error if there are uncommitted changes (#22613)
Closes https://github.com/denoland/deno/issues/22330
Diffstat (limited to 'cli/tools/registry/mod.rs')
-rw-r--r--cli/tools/registry/mod.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/cli/tools/registry/mod.rs b/cli/tools/registry/mod.rs
index e01c1563b..c14b10b8d 100644
--- a/cli/tools/registry/mod.rs
+++ b/cli/tools/registry/mod.rs
@@ -2,6 +2,8 @@
use std::collections::HashMap;
use std::io::IsTerminal;
+use std::path::Path;
+use std::process::Stdio;
use std::rc::Rc;
use std::sync::Arc;
@@ -24,6 +26,7 @@ use lsp_types::Url;
use serde::Deserialize;
use serde::Serialize;
use sha2::Digest;
+use tokio::process::Command;
use crate::args::jsr_api_url;
use crate::args::jsr_url;
@@ -937,6 +940,12 @@ pub async fn publish(
return Ok(());
}
+ if !publish_flags.allow_dirty
+ && check_if_git_repo_dirty(cli_options.initial_cwd()).await
+ {
+ bail!("Aborting due to uncomitted changes",);
+ }
+
perform_publish(
cli_factory.http_client(),
prepared_data.publish_order_graph,
@@ -1016,6 +1025,34 @@ fn verify_version_manifest(
Ok(())
}
+async fn check_if_git_repo_dirty(cwd: &Path) -> bool {
+ let bin_name = if cfg!(windows) { "git.exe" } else { "git" };
+
+ // Check if git exists
+ let git_exists = Command::new(bin_name)
+ .arg("--version")
+ .stderr(Stdio::null())
+ .stdout(Stdio::null())
+ .status()
+ .await
+ .map_or(false, |status| status.success());
+
+ if !git_exists {
+ return false; // Git is not installed
+ }
+
+ // Check if there are uncommitted changes
+ let output = Command::new(bin_name)
+ .current_dir(cwd)
+ .args(["status", "--porcelain"])
+ .output()
+ .await
+ .expect("Failed to execute command");
+
+ let output_str = String::from_utf8_lossy(&output.stdout);
+ !output_str.trim().is_empty()
+}
+
#[cfg(test)]
mod tests {
use super::tar::PublishableTarball;