diff options
Diffstat (limited to 'vendor/github.com/gogits/git-module/commit.go')
-rw-r--r-- | vendor/github.com/gogits/git-module/commit.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/vendor/github.com/gogits/git-module/commit.go b/vendor/github.com/gogits/git-module/commit.go index b68a6b97..6cc6b5fd 100644 --- a/vendor/github.com/gogits/git-module/commit.go +++ b/vendor/github.com/gogits/git-module/commit.go @@ -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()) +} |