webhook: add file status to push event (#3897)

This commit is contained in:
Unknwon
2017-03-16 17:33:04 -04:00
parent 0ccd7c97ab
commit 9e8ffa14cb
10 changed files with 116 additions and 23 deletions

View File

@@ -6,8 +6,10 @@ package git
import (
"bufio"
"bytes"
"container/list"
"fmt"
"io"
"net/http"
"strconv"
"strings"
@@ -252,3 +254,55 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
}
return nil, nil
}
// CommitFileStatus represents status of files in a commit.
type CommitFileStatus struct {
Added []string
Removed []string
Modified []string
}
func NewCommitFileStatus() *CommitFileStatus {
return &CommitFileStatus{
[]string{}, []string{}, []string{},
}
}
// GetCommitFileStatus returns file status of commit in given repository.
func GetCommitFileStatus(repoPath, commitID string) (*CommitFileStatus, error) {
stdout, w := io.Pipe()
defer stdout.Close()
stderr := new(bytes.Buffer)
fileStatus := NewCommitFileStatus()
go func() {
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
fields := strings.Fields(scanner.Text())
if len(fields) < 2 {
continue
}
switch fields[0][0] {
case 'A':
fileStatus.Added = append(fileStatus.Added, fields[1])
case 'D':
fileStatus.Removed = append(fileStatus.Removed, fields[1])
case 'M':
fileStatus.Modified = append(fileStatus.Modified, fields[1])
}
}
}()
if err := NewCommand("log", "-1", "--name-status", "--pretty=format:''", commitID).RunInDirPipeline(repoPath, w, stderr); err != nil {
return nil, concatenateError(err, stderr.String())
}
return fileStatus, nil
}
// FileStatus returns file status of commit.
func (c *Commit) FileStatus() (*CommitFileStatus, error) {
return GetCommitFileStatus(c.repo.Path, c.ID.String())
}