Ensure that git commit tree continues properly over the page (#12142)
* Ensure that git commit tree continues properly over the page Signed-off-by: Andrew Thornton <art27@cantab.net> * Avoid generating strings when skipping Signed-off-by: Andrew Thornton <art27@cantab.net> * skip initial non-commit-lines Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
parent
07c4ed4cda
commit
3bcc6e7a9e
1 changed files with 53 additions and 14 deletions
|
@ -5,7 +5,11 @@
|
||||||
package gitgraph
|
package gitgraph
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
|
@ -31,37 +35,72 @@ type GraphItems []GraphItem
|
||||||
|
|
||||||
// GetCommitGraph return a list of commit (GraphItems) from all branches
|
// GetCommitGraph return a list of commit (GraphItems) from all branches
|
||||||
func GetCommitGraph(r *git.Repository, page int) (GraphItems, error) {
|
func GetCommitGraph(r *git.Repository, page int) (GraphItems, error) {
|
||||||
|
|
||||||
var CommitGraph []GraphItem
|
|
||||||
|
|
||||||
format := "DATA:|%d|%H|%ad|%an|%ae|%h|%s"
|
format := "DATA:|%d|%H|%ad|%an|%ae|%h|%s"
|
||||||
|
|
||||||
|
if page == 0 {
|
||||||
|
page = 1
|
||||||
|
}
|
||||||
|
|
||||||
graphCmd := git.NewCommand("log")
|
graphCmd := git.NewCommand("log")
|
||||||
graphCmd.AddArguments("--graph",
|
graphCmd.AddArguments("--graph",
|
||||||
"--date-order",
|
"--date-order",
|
||||||
"--all",
|
"--all",
|
||||||
"-C",
|
"-C",
|
||||||
"-M",
|
"-M",
|
||||||
fmt.Sprintf("-n %d", setting.UI.GraphMaxCommitNum),
|
fmt.Sprintf("-n %d", setting.UI.GraphMaxCommitNum*page),
|
||||||
fmt.Sprintf("--skip=%d", setting.UI.GraphMaxCommitNum*(page-1)),
|
|
||||||
"--date=iso",
|
"--date=iso",
|
||||||
fmt.Sprintf("--pretty=format:%s", format),
|
fmt.Sprintf("--pretty=format:%s", format),
|
||||||
)
|
)
|
||||||
graph, err := graphCmd.RunInDir(r.Path)
|
commitGraph := make([]GraphItem, 0, 100)
|
||||||
|
stderr := new(strings.Builder)
|
||||||
|
stdoutReader, stdoutWriter, err := os.Pipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return CommitGraph, err
|
return nil, err
|
||||||
|
}
|
||||||
|
commitsToSkip := setting.UI.GraphMaxCommitNum * (page - 1)
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(stdoutReader)
|
||||||
|
|
||||||
|
if err := graphCmd.RunInDirTimeoutEnvFullPipelineFunc(nil, -1, r.Path, stdoutWriter, stderr, nil, func(ctx context.Context, cancel context.CancelFunc) error {
|
||||||
|
_ = stdoutWriter.Close()
|
||||||
|
defer stdoutReader.Close()
|
||||||
|
for commitsToSkip > 0 && scanner.Scan() {
|
||||||
|
line := scanner.Bytes()
|
||||||
|
dataIdx := bytes.Index(line, []byte("DATA:"))
|
||||||
|
starIdx := bytes.IndexByte(line, '*')
|
||||||
|
if starIdx >= 0 && starIdx < dataIdx {
|
||||||
|
commitsToSkip--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Skip initial non-commit lines
|
||||||
|
for scanner.Scan() {
|
||||||
|
if bytes.IndexByte(scanner.Bytes(), '*') >= 0 {
|
||||||
|
line := scanner.Text()
|
||||||
|
graphItem, err := graphItemFromString(line, r)
|
||||||
|
if err != nil {
|
||||||
|
cancel()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
commitGraph = append(commitGraph, graphItem)
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CommitGraph = make([]GraphItem, 0, 100)
|
for scanner.Scan() {
|
||||||
for _, s := range strings.Split(graph, "\n") {
|
line := scanner.Text()
|
||||||
GraphItem, err := graphItemFromString(s, r)
|
graphItem, err := graphItemFromString(line, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return CommitGraph, err
|
cancel()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
CommitGraph = append(CommitGraph, GraphItem)
|
commitGraph = append(commitGraph, graphItem)
|
||||||
|
}
|
||||||
|
return scanner.Err()
|
||||||
|
}); err != nil {
|
||||||
|
return commitGraph, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommitGraph, nil
|
return commitGraph, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func graphItemFromString(s string, r *git.Repository) (GraphItem, error) {
|
func graphItemFromString(s string, r *git.Repository) (GraphItem, error) {
|
||||||
|
|
Reference in a new issue