mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 21:16:26 +01:00 
			
		
		
		
	Backport #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> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		
							parent
							
								
									7e85cba3e5
								
							
						
					
					
						commit
						e663f7459a
					
				@ -9,6 +9,8 @@ import (
 | 
				
			|||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"container/list"
 | 
						"container/list"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -327,8 +329,41 @@ 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 {
 | 
				
			||||||
 | 
								if stderr.Len() > 0 {
 | 
				
			||||||
 | 
									err = fmt.Errorf("%v - %s", err, stderr.String())
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								_ = stdoutWriter.CloseWithError(err)
 | 
				
			||||||
 | 
							} 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
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user