Browse Source

Fix zombie

pull/228/head
Unknown 11 years ago
parent
commit
6696610aea
  1. 2
      CONTRIBUTING.md
  2. 35
      models/git_diff.go

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

35
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() cmd = exec.Command("git", "show", commitid)
go func() { } else {
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)
}
rd, wr := io.Pipe()
go func() {
c, _ := commit.Parent(0) c, _ := commit.Parent(0)
cmd := exec.Command("git", "diff", c.Id.String(), commitid) cmd = exec.Command("git", "diff", c.Id.String(), commitid)
}
cmd.Dir = repoPath cmd.Dir = repoPath
cmd.Stdout = wr cmd.Stdout = wr
cmd.Stdin = os.Stdin cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
go func() {
cmd.Run() cmd.Run()
wr.Close() wr.Close()
}() }()
defer rd.Close() defer rd.Close()
return ParsePatch(rd) return ParsePatch(cmd, rd)
} }

Loading…
Cancel
Save