Skip to content

Commit f9c2e67

Browse files
committed
commit: add CommitFileStatus
1 parent b667877 commit f9c2e67

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

commit.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ package git
66

77
import (
88
"bufio"
9+
"bytes"
910
"container/list"
1011
"fmt"
12+
"io"
1113
"net/http"
1214
"strconv"
1315
"strings"
@@ -252,3 +254,55 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
252254
}
253255
return nil, nil
254256
}
257+
258+
// CommitFileStatus represents status of files in a commit.
259+
type CommitFileStatus struct {
260+
Added []string
261+
Removed []string
262+
Modified []string
263+
}
264+
265+
func NewCommitFileStatus() *CommitFileStatus {
266+
return &CommitFileStatus{
267+
[]string{}, []string{}, []string{},
268+
}
269+
}
270+
271+
// GetCommitFileStatus returns file status of commit in given repository.
272+
func GetCommitFileStatus(repoPath, commitID string) (*CommitFileStatus, error) {
273+
stdout, w := io.Pipe()
274+
defer stdout.Close()
275+
276+
stderr := new(bytes.Buffer)
277+
278+
fileStatus := NewCommitFileStatus()
279+
go func() {
280+
scanner := bufio.NewScanner(stdout)
281+
for scanner.Scan() {
282+
fields := strings.Fields(scanner.Text())
283+
if len(fields) < 2 {
284+
continue
285+
}
286+
287+
switch fields[0][0] {
288+
case 'A':
289+
fileStatus.Added = append(fileStatus.Added, fields[1])
290+
case 'D':
291+
fileStatus.Removed = append(fileStatus.Removed, fields[1])
292+
case 'M':
293+
fileStatus.Modified = append(fileStatus.Modified, fields[1])
294+
}
295+
}
296+
}()
297+
298+
if err := NewCommand("log", "-1", "--name-status", "--pretty=format:''", commitID).RunInDirPipeline(repoPath, w, stderr); err != nil {
299+
return nil, concatenateError(err, stderr.String())
300+
}
301+
302+
return fileStatus, nil
303+
}
304+
305+
// FileStatus returns file status of commit.
306+
func (c *Commit) FileStatus() (*CommitFileStatus, error) {
307+
return GetCommitFileStatus(c.repo.Path, c.ID.String())
308+
}

git.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"time"
1111
)
1212

13-
const _VERSION = "0.5.0"
13+
const _VERSION = "0.5.1"
1414

1515
func Version() string {
1616
return _VERSION

0 commit comments

Comments
 (0)