mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	Fix paging of file commit logs (#14831)
Unfortunately `git log revision ... --skip=x -- path` skips the number of commits not the number of commits relating to the path. This PR changes the function to have a reader that reads and skips the necessary number of commits by hand instead. Fix #8716 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		| @@ -8,6 +8,8 @@ package git | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"container/list" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| ) | ||||
| @@ -232,8 +234,38 @@ func (repo *Repository) FileCommitsCount(revision, file string) (int64, error) { | ||||
|  | ||||
| // CommitsByFileAndRange return the commits according revison file and the page | ||||
| func (repo *Repository) CommitsByFileAndRange(revision, file string, page int) (*list.List, error) { | ||||
| 	stdout, err := NewCommand("log", revision, "--follow", "--skip="+strconv.Itoa((page-1)*50), | ||||
| 		"--max-count="+strconv.Itoa(CommitsRangeSize), prettyLogFormat, "--", file).RunInDirBytes(repo.Path) | ||||
| 	skip := (page - 1) * CommitsRangeSize | ||||
|  | ||||
| 	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 { | ||||
| 		return nil, err | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user