Browse Source

修复了子模块clone和checkout的bug (#28)

1.修复了子模块在克隆时不完整的bug
2.修复了checkout时,子模块没有一并checkout的bug
sun5etop 1 year ago
parent
commit
b856f1ecd1
1 changed files with 45 additions and 0 deletions
  1. 45 0
      src/executor/source.rs

+ 45 - 0
src/executor/source.rs

@@ -215,6 +215,25 @@ impl GitSource {
                     String::from_utf8_lossy(&output.stdout)
                 ));
             }
+
+            let mut subcmd = Command::new("git");
+            subcmd.current_dir(&target_dir.path);
+            subcmd.arg("submodule").arg("update").arg("--remote");
+
+            //当checkout仓库的子进程结束后,启动checkout子模块的子进程
+            let subproc: std::process::Child = subcmd
+                .stderr(Stdio::piped())
+                .spawn()
+                .map_err(|e| e.to_string())?;
+            let suboutput = subproc.wait_with_output().map_err(|e| e.to_string())?;
+
+            if !suboutput.status.success() {
+                return Err(format!(
+                    "Failed to checkout submodule {}, message: {}",
+                    target_dir.path.display(),
+                    String::from_utf8_lossy(&suboutput.stdout)
+                ));
+            }
             return Ok(());
         };
 
@@ -261,6 +280,32 @@ impl GitSource {
                 StdioUtils::tail_n_str(StdioUtils::stderr_to_lines(&output.stderr), 5)
             ));
         }
+
+        let mut subcmd = Command::new("git");
+        subcmd
+            .arg("submodule")
+            .arg("update")
+            .arg("--init")
+            .arg("--recursive")
+            .arg("--force");
+
+        subcmd.current_dir(path);
+
+        //当克隆仓库的子进程结束后,启动保证克隆子模块的子进程
+        let subproc: std::process::Child = subcmd
+            .stderr(Stdio::piped())
+            .stdout(Stdio::inherit())
+            .spawn()
+            .map_err(|e| e.to_string())?;
+        let suboutput = subproc.wait_with_output().map_err(|e| e.to_string())?;
+
+        if !suboutput.status.success() {
+            return Err(format!(
+                "clone submodule failed, status: {:?},  stderr: {:?}",
+                suboutput.status,
+                StdioUtils::tail_n_str(StdioUtils::stderr_to_lines(&suboutput.stderr), 5)
+            ));
+        }
         return Ok(());
     }