mirror of
https://github.com/go-gitea/gitea
synced 2025-02-26 14:54:19 +00:00
Current git graph is not usable for mirrors of repos having a lot of PRs, as can be seen at https://demo.gitea.com/ericLemanissier/conan-center-index/graph  Manually running `git log --graph --date-order --all` on such a repo indeed shows: ``` * commit c4a34bd39d7977c8630177c5f88507000ea3e943 |\ Merge: a4bbd3ad6b 35a102c77c | | Author: toge <toge.mail@gmail.com> | | Date: Wed Feb 19 08:36:41 2025 +0000 | | | | Merge 35a102c77cbc38d84baca0ca63466fb410336ea8 into a4bbd3ad6bb5a0f8e5117a897d8c55941f533d98 | | | * commit 35a102c77cbc38d84baca0ca63466fb410336ea8 | | Author: toge <toge.mail@gmail.com> | | Date: Wed Feb 19 17:36:35 2025 +0900 | | | | update 4.4.2 | | | | * commit 5d610f4fd3c0428731e402a2f618fad9ce055875 | |/| Merge: a4bbd3ad6b fe916fb70a |/| | Author: Antony Peacock <ant.peacock@gmail.com> | | | Date: Wed Feb 19 08:31:30 2025 +0000 | | | | | | Merge fe916fb70a8bf49503cce70a5c7124bcc4314ddc into a4bbd3ad6bb5a0f8e5117a897d8c55941f533d98 | | | | | * commit fe916fb70a8bf49503cce70a5c7124bcc4314ddc | | | Author: Antony Peacock <ant.peacock@gmail.com> | | | Date: Wed Feb 19 08:31:18 2025 +0000 | | | | | | Remove parquet cmakelist patch | | | | | | * commit 9f6d2759d650ec3c86d01bb940e829e7e14220c2 | |_|/| Merge: a4bbd3ad6b f0963429b0 |/| | | Author: Thomas Sedlmair <thomas.sedlmair@googlemail.com> | | | | Date: Wed Feb 19 08:03:08 2025 +0100 | | | | | | | | Merge f0963429b0952499da0da7e559f8d53387097307 into a4bbd3ad6bb5a0f8e5117a897d8c55941f533d98 | | | | | | | * commit f0963429b0952499da0da7e559f8d53387097307 | |_|/ Author: Thomas Sedlmair <thomas.sedlmair@googlemail.com> |/| | Date: Wed Feb 19 08:01:43 2025 +0100 | | | | | | added cwt-cucumber 2.5 | | | ``` On the other hand, running `git log --graph --date-order --branches --tags` returns the expected: ``` * commit a4bbd3ad6bb5a0f8e5117a897d8c55941f533d98 (HEAD -> master) | Author: Dan <mstr.danila@gmail.com> | Date: Fri Feb 14 18:46:11 2025 +0200 | | grpc: add version 1.69.0 (#26446) | | * grpc: add version 1.69.0 | | * add cmake tool requires | | --------- | | Co-authored-by: Luis Caro Campos <3535649+jcar87@users.noreply.github.com> | * commit a7868807cb2e21206ebf95278cb588f29a3e2205 | Author: Guillaume Egles <gegles@users.noreply.github.com> | Date: Thu Feb 13 05:44:35 2025 -0800 | | openssl: add versions `3.0.16`, `3.1.8`, `3.2.4`, `3.3.3`, `3.4.1`, stop publishing revisions for version `3.0.15` (#26578) | * commit 86057d3e63ac71e2fe48c07bb301f2d54187044d | Author: Luis Caro Campos <3535649+jcar87@users.noreply.github.com> | Date: Thu Feb 13 13:34:41 2025 +0000 | | android-ndk: dont set LD and AS variables (#26581) | | * android-ndk: dont set LD and AS variables | | * android-ndk: refactor test package | * commit 123e382fafd2f5e811e10faac02efc275c45ec2a | Author: Nikita <root.kidik@gmail.com> | Date: Thu Feb 13 12:29:39 2025 +0300 | | libffi: fix conditionals when building on Windows (#26500) | | * fix: add missing or `clang` | | * fix: libffi - always require as tool `automake` ```
117 lines
2.7 KiB
Go
117 lines
2.7 KiB
Go
// Copyright 2016 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package gitgraph
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"context"
|
|
"os"
|
|
"strings"
|
|
|
|
"code.gitea.io/gitea/modules/git"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
)
|
|
|
|
// GetCommitGraph return a list of commit (GraphItems) from all branches
|
|
func GetCommitGraph(r *git.Repository, page, maxAllowedColors int, hidePRRefs bool, branches, files []string) (*Graph, error) {
|
|
format := "DATA:%D|%H|%ad|%h|%s"
|
|
|
|
if page == 0 {
|
|
page = 1
|
|
}
|
|
|
|
graphCmd := git.NewCommand(r.Ctx, "log", "--graph", "--date-order", "--decorate=full")
|
|
|
|
if hidePRRefs {
|
|
graphCmd.AddArguments("--exclude=" + git.PullPrefix + "*")
|
|
}
|
|
|
|
if len(branches) == 0 {
|
|
graphCmd.AddArguments("--tags", "--branches")
|
|
}
|
|
|
|
graphCmd.AddArguments("-C", "-M", "--date=iso-strict").
|
|
AddOptionFormat("-n %d", setting.UI.GraphMaxCommitNum*page).
|
|
AddOptionFormat("--pretty=format:%s", format)
|
|
|
|
if len(branches) > 0 {
|
|
graphCmd.AddDynamicArguments(branches...)
|
|
}
|
|
if len(files) > 0 {
|
|
graphCmd.AddDashesAndList(files...)
|
|
}
|
|
graph := NewGraph()
|
|
|
|
stderr := new(strings.Builder)
|
|
stdoutReader, stdoutWriter, err := os.Pipe()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
commitsToSkip := setting.UI.GraphMaxCommitNum * (page - 1)
|
|
|
|
scanner := bufio.NewScanner(stdoutReader)
|
|
|
|
if err := graphCmd.Run(&git.RunOpts{
|
|
Dir: r.Path,
|
|
Stdout: stdoutWriter,
|
|
Stderr: stderr,
|
|
PipelineFunc: func(ctx context.Context, cancel context.CancelFunc) error {
|
|
_ = stdoutWriter.Close()
|
|
defer stdoutReader.Close()
|
|
parser := &Parser{}
|
|
parser.firstInUse = -1
|
|
parser.maxAllowedColors = maxAllowedColors
|
|
if maxAllowedColors > 0 {
|
|
parser.availableColors = make([]int, maxAllowedColors)
|
|
for i := range parser.availableColors {
|
|
parser.availableColors[i] = i + 1
|
|
}
|
|
} else {
|
|
parser.availableColors = []int{1, 2}
|
|
}
|
|
for commitsToSkip > 0 && scanner.Scan() {
|
|
line := scanner.Bytes()
|
|
dataIdx := bytes.Index(line, []byte("DATA:"))
|
|
if dataIdx < 0 {
|
|
dataIdx = len(line)
|
|
}
|
|
starIdx := bytes.IndexByte(line, '*')
|
|
if starIdx >= 0 && starIdx < dataIdx {
|
|
commitsToSkip--
|
|
}
|
|
parser.ParseGlyphs(line[:dataIdx])
|
|
}
|
|
|
|
row := 0
|
|
|
|
// Skip initial non-commit lines
|
|
for scanner.Scan() {
|
|
line := scanner.Bytes()
|
|
if bytes.IndexByte(line, '*') >= 0 {
|
|
if err := parser.AddLineToGraph(graph, row, line); err != nil {
|
|
cancel()
|
|
return err
|
|
}
|
|
break
|
|
}
|
|
parser.ParseGlyphs(line)
|
|
}
|
|
|
|
for scanner.Scan() {
|
|
row++
|
|
line := scanner.Bytes()
|
|
if err := parser.AddLineToGraph(graph, row, line); err != nil {
|
|
cancel()
|
|
return err
|
|
}
|
|
}
|
|
return scanner.Err()
|
|
},
|
|
}); err != nil {
|
|
return graph, err
|
|
}
|
|
return graph, nil
|
|
}
|