@ -8,6 +8,8 @@ package git
import (
import (
"bytes"
"bytes"
"container/list"
"container/list"
"io"
"io/ioutil"
"strconv"
"strconv"
"strings"
"strings"
)
)
@ -232,8 +234,38 @@ func (repo *Repository) FileCommitsCount(revision, file string) (int64, error) {
// CommitsByFileAndRange return the commits according revison file and the page
// CommitsByFileAndRange return the commits according revison file and the page
func ( repo * Repository ) CommitsByFileAndRange ( revision , file string , page int ) ( * list . List , error ) {
func ( repo * Repository ) CommitsByFileAndRange ( revision , file string , page int ) ( * list . List , error ) {
stdout , err := NewCommand ( "log" , revision , "--follow" , "--skip=" + strconv . Itoa ( ( page - 1 ) * 50 ) ,
skip := ( page - 1 ) * CommitsRangeSize
"--max-count=" + strconv . Itoa ( CommitsRangeSize ) , prettyLogFormat , "--" , file ) . RunInDirBytes ( repo . Path )
stdoutReader , stdoutWriter := io . Pipe ( )
defer func ( ) {
_ = stdoutReader . Close ( )
_ = stdoutWriter . Close ( )
} ( )
go func ( ) {
stderr := strings . Builder { }
err := NewCommand ( "log" , revision , "--follow" ,
"--max-count=" + strconv . Itoa ( CommitsRangeSize * page ) ,
prettyLogFormat , "--" , file ) .
RunInDirPipeline ( repo . Path , stdoutWriter , & stderr )
if err != nil {
_ = stdoutWriter . CloseWithError ( ConcatenateError ( err , ( & stderr ) . String ( ) ) )
} else {
_ = stdoutWriter . Close ( )
}
} ( )
if skip > 0 {
_ , err := io . CopyN ( ioutil . Discard , stdoutReader , int64 ( skip * 41 ) )
if err != nil {
if err == io . EOF {
return list . New ( ) , nil
}
_ = stdoutReader . CloseWithError ( err )
return nil , err
}
}
stdout , err := ioutil . ReadAll ( stdoutReader )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}