mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2016 The Gitea Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a MIT-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package models
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"code.gitea.io/git"
 | 
						|
)
 | 
						|
 | 
						|
// 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) (GraphItems, error) {
 | 
						|
 | 
						|
	var CommitGraph []GraphItem
 | 
						|
 | 
						|
	format := "DATA:|%d|%H|%ad|%an|%ae|%h|%s"
 | 
						|
 | 
						|
	graphCmd := git.NewCommand("log")
 | 
						|
	graphCmd.AddArguments("--graph",
 | 
						|
		"--date-order",
 | 
						|
		"--all",
 | 
						|
		"-C",
 | 
						|
		"-M",
 | 
						|
		"-n 100",
 | 
						|
		"--date=iso",
 | 
						|
		fmt.Sprintf("--pretty=format:%s", format),
 | 
						|
	)
 | 
						|
	graph, err := graphCmd.RunInDir(r.Path)
 | 
						|
	if err != nil {
 | 
						|
		return CommitGraph, err
 | 
						|
	}
 | 
						|
 | 
						|
	CommitGraph = make([]GraphItem, 0, 100)
 | 
						|
	for _, s := range strings.Split(graph, "\n") {
 | 
						|
		GraphItem, err := graphItemFromString(s, r)
 | 
						|
		if err != nil {
 | 
						|
			return CommitGraph, err
 | 
						|
		}
 | 
						|
		CommitGraph = append(CommitGraph, GraphItem)
 | 
						|
	}
 | 
						|
 | 
						|
	return CommitGraph, nil
 | 
						|
}
 | 
						|
 | 
						|
func graphItemFromString(s string, r *git.Repository) (GraphItem, error) {
 | 
						|
 | 
						|
	var ascii string
 | 
						|
	var data = "|||||||"
 | 
						|
	lines := strings.Split(s, "DATA:")
 | 
						|
 | 
						|
	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 gi, nil
 | 
						|
}
 |