Browse Source

Fix zombie

Unknown 11 years ago
parent
commit
6696610aea
2 changed files with 19 additions and 24 deletions
  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)
 }
 }