aboutsummaryrefslogtreecommitdiffstats
path: root/modules/gitgraph/graph.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gitgraph/graph.go')
-rw-r--r--modules/gitgraph/graph.go108
1 files changed, 31 insertions, 77 deletions
diff --git a/modules/gitgraph/graph.go b/modules/gitgraph/graph.go
index 4ba110c706..257e4f3af0 100644
--- a/modules/gitgraph/graph.go
+++ b/modules/gitgraph/graph.go
@@ -16,26 +16,9 @@ import (
"code.gitea.io/gitea/modules/setting"
)
-// GraphItem represent one commit, or one relation in timeline
-type GraphItem struct {
- GraphAcii string
- Relation string
- Branch string
- Rev string
- Date string
- Author string
- AuthorEmail string
- ShortRev string
- Subject string
- OnlyRelation bool
-}
-
-// GraphItems is a list of commits from all branches
-type GraphItems []GraphItem
-
// GetCommitGraph return a list of commit (GraphItems) from all branches
-func GetCommitGraph(r *git.Repository, page int) (GraphItems, error) {
- format := "DATA:|%d|%H|%ad|%an|%ae|%h|%s"
+func GetCommitGraph(r *git.Repository, page int, maxAllowedColors int) (*Graph, error) {
+ format := "DATA:%d|%H|%ad|%an|%ae|%h|%s"
if page == 0 {
page = 1
@@ -51,7 +34,8 @@ func GetCommitGraph(r *git.Repository, page int) (GraphItems, error) {
"--date=iso",
fmt.Sprintf("--pretty=format:%s", format),
)
- commitGraph := make([]GraphItem, 0, 100)
+ graph := NewGraph()
+
stderr := new(strings.Builder)
stdoutReader, stdoutWriter, err := os.Pipe()
if err != nil {
@@ -64,86 +48,56 @@ func GetCommitGraph(r *git.Repository, page int) (GraphItems, error) {
if err := graphCmd.RunInDirTimeoutEnvFullPipelineFunc(nil, -1, r.Path, stdoutWriter, stderr, nil, 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() {
- if bytes.IndexByte(scanner.Bytes(), '*') >= 0 {
- line := scanner.Text()
- graphItem, err := graphItemFromString(line, r)
- if err != nil {
+ line := scanner.Bytes()
+ if bytes.IndexByte(line, '*') >= 0 {
+ if err := parser.AddLineToGraph(graph, row, line); err != nil {
cancel()
return err
}
- commitGraph = append(commitGraph, graphItem)
break
}
+ parser.ParseGlyphs(line)
}
for scanner.Scan() {
- line := scanner.Text()
- graphItem, err := graphItemFromString(line, r)
- if err != nil {
+ row++
+ line := scanner.Bytes()
+ if err := parser.AddLineToGraph(graph, row, line); err != nil {
cancel()
return err
}
- commitGraph = append(commitGraph, graphItem)
}
return scanner.Err()
}); err != nil {
- return commitGraph, err
- }
-
- return commitGraph, nil
-}
-
-func graphItemFromString(s string, r *git.Repository) (GraphItem, error) {
-
- var ascii string
- var data = "|||||||"
- lines := strings.SplitN(s, "DATA:", 2)
-
- switch len(lines) {
- case 1:
- ascii = lines[0]
- case 2:
- ascii = lines[0]
- data = lines[1]
- default:
- return GraphItem{}, fmt.Errorf("Failed parsing grap line:%s. Expect 1 or two fields", s)
- }
-
- rows := strings.SplitN(data, "|", 8)
- if len(rows) < 8 {
- return GraphItem{}, fmt.Errorf("Failed parsing grap line:%s - Should containt 8 datafields", s)
- }
-
- /* // see format in getCommitGraph()
- 0 Relation string
- 1 Branch string
- 2 Rev string
- 3 Date string
- 4 Author string
- 5 AuthorEmail string
- 6 ShortRev string
- 7 Subject string
- */
- gi := GraphItem{ascii,
- rows[0],
- rows[1],
- rows[2],
- rows[3],
- rows[4],
- rows[5],
- rows[6],
- rows[7],
- len(rows[2]) == 0, // no commits referred to, only relation in current line.
+ return graph, err
}
- return gi, nil
+ return graph, nil
}