瀏覽代碼

Fix zombie

Unknown 11 年之前
父節點
當前提交
6696610aea
共有 2 個文件被更改,包括 19 次插入24 次删除
  1. 0 2
      CONTRIBUTING.md
  2. 19 22
      models/git_diff.go

+ 0 - 2
CONTRIBUTING.md

@@ -2,8 +2,6 @@
 
 
 > Thanks [drone](https://github.com/drone/drone) because this guidelines sheet is forked from its [CONTRIBUTING.md](https://github.com/drone/drone/blob/master/CONTRIBUTING.md).
 > Thanks [drone](https://github.com/drone/drone) because this guidelines sheet is forked from its [CONTRIBUTING.md](https://github.com/drone/drone/blob/master/CONTRIBUTING.md).
 
 
-**This document is pre^2 release, we're not ready for receiving contribution until v0.5.0 release.**
-
 Want to hack on Gogs? Awesome! Here are instructions to get you started. They are probably not perfect, please let us know if anything feels wrong or incomplete.
 Want to hack on Gogs? Awesome! Here are instructions to get you started. They are probably not perfect, please let us know if anything feels wrong or incomplete.
 
 
 ## Contribution guidelines
 ## Contribution guidelines

+ 19 - 22
models/git_diff.go

@@ -67,7 +67,7 @@ func (diff *Diff) NumFiles() int {
 
 
 const DIFF_HEAD = "diff --git "
 const DIFF_HEAD = "diff --git "
 
 
-func ParsePatch(reader io.Reader) (*Diff, error) {
+func ParsePatch(cmd *exec.Cmd, reader io.Reader) (*Diff, error) {
 	scanner := bufio.NewScanner(reader)
 	scanner := bufio.NewScanner(reader)
 	var (
 	var (
 		curFile    *DiffFile
 		curFile    *DiffFile
@@ -168,6 +168,13 @@ func ParsePatch(reader io.Reader) (*Diff, error) {
 		}
 		}
 	}
 	}
 
 
+	// In case process became zombie.
+	if !cmd.ProcessState.Exited() {
+		log.Debug("git_diff.ParsePatch: process doesn't exit and now will be killed")
+		if err := cmd.Process.Kill(); err != nil {
+			log.Error("git_diff.ParsePatch: fail to kill zombie process: %v", err)
+		}
+	}
 	return diff, nil
 	return diff, nil
 }
 }
 
 
@@ -182,33 +189,23 @@ func GetDiff(repoPath, commitid string) (*Diff, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
+	rd, wr := io.Pipe()
+	var cmd *exec.Cmd
 	// First commit of repository.
 	// First commit of repository.
 	if commit.ParentCount() == 0 {
 	if commit.ParentCount() == 0 {
-		rd, wr := io.Pipe()
-		go func() {
-			cmd := exec.Command("git", "show", commitid)
-			cmd.Dir = repoPath
-			cmd.Stdout = wr
-			cmd.Stdin = os.Stdin
-			cmd.Stderr = os.Stderr
-			cmd.Run()
-			wr.Close()
-		}()
-		defer rd.Close()
-		return ParsePatch(rd)
+		cmd = exec.Command("git", "show", commitid)
+	} else {
+		c, _ := commit.Parent(0)
+		cmd = exec.Command("git", "diff", c.Id.String(), commitid)
 	}
 	}
-
-	rd, wr := io.Pipe()
+	cmd.Dir = repoPath
+	cmd.Stdout = wr
+	cmd.Stdin = os.Stdin
+	cmd.Stderr = os.Stderr
 	go func() {
 	go func() {
-		c, _ := commit.Parent(0)
-		cmd := exec.Command("git", "diff", c.Id.String(), commitid)
-		cmd.Dir = repoPath
-		cmd.Stdout = wr
-		cmd.Stdin = os.Stdin
-		cmd.Stderr = os.Stderr
 		cmd.Run()
 		cmd.Run()
 		wr.Close()
 		wr.Close()
 	}()
 	}()
 	defer rd.Close()
 	defer rd.Close()
-	return ParsePatch(rd)
+	return ParsePatch(cmd, rd)
 }
 }