@@ -6,8 +6,10 @@ package git
6
6
7
7
import (
8
8
"bufio"
9
+ "bytes"
9
10
"container/list"
10
11
"fmt"
12
+ "io"
11
13
"net/http"
12
14
"strconv"
13
15
"strings"
@@ -252,3 +254,55 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
252
254
}
253
255
return nil , nil
254
256
}
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
+ }
0 commit comments