]> git.r.bdr.sh - rbdr/blog/commitdiff
Add an actual remote check to git. rbdr-add-tests-and-gema-texto
authorRuben Beltran del Rio <redacted>
Thu, 9 Jan 2025 17:47:42 +0000 (18:47 +0100)
committerRuben Beltran del Rio <redacted>
Thu, 9 Jan 2025 17:47:42 +0000 (18:47 +0100)
src/remote/git.rs

index f74af42e09837dbf96f48228c7b3ebbc94b4c63c..75e6292b19324e7edd5a2266fcd959e94f12a83f 100644 (file)
@@ -12,9 +12,18 @@ impl Git {
 }
 
 impl super::Remote for Git {
-    fn can_handle(&self, _: &str) -> bool {
-        // If we ever implement another remote we will want a check strategy
-        true
+    fn can_handle(&self, remote: &str) -> bool {
+        let command = format!("git ls-remote {remote}");
+        match Command::new("sh")
+            .arg("-c")
+            .arg(&command)
+            .stdout(Stdio::null())
+            .stderr(Stdio::null())
+            .status()
+        {
+            Ok(status) => status.success(),
+            _ => false,
+        }
     }
 
     fn sync_up(&self, remote: &str, directory: &Path) -> Result<()> {
@@ -141,10 +150,38 @@ mod tests {
     }
 
     #[test]
-    fn test_dummy_handle() {
+    fn test_can_handle_git_remotes() {
+        let git = Git::new();
+
+        let test_dir = setup_test_dir();
+        let remote_dir = test_dir.join("remote");
+        let remote_dir_as_string = remote_dir.display().to_string();
+
+        create_dir_all(&remote_dir).expect("Could not create remote test directory");
+        create_remote(&remote_dir);
+        assert!(git.can_handle(&remote_dir_as_string));
+        cleanup_test_dir(&test_dir);
+    }
+
+    #[test]
+    fn test_can_not_handle_not_git_remotes() {
         let git = Git::new();
-        let can_handle = git.can_handle("anything");
-        assert!(can_handle);
+
+        let test_dir = setup_test_dir();
+        let remote_dir = test_dir.join("remote");
+        let remote_dir_as_string = remote_dir.display().to_string();
+
+        create_dir_all(&remote_dir).expect("Could not create remote test directory");
+        assert!(!git.can_handle(&remote_dir_as_string));
+        cleanup_test_dir(&test_dir);
+    }
+
+    #[test]
+    fn test_can_not_handle_invalid_paths() {
+        let git = Git::new();
+
+        let invalid_remote = String::from("test\0");
+        assert!(!git.can_handle(&invalid_remote));
     }
 
     #[test]