110 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
	
		
			2.4 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 gitgraph
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 
 | |
| 	"code.gitea.io/gitea/modules/git"
 | |
| 	"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) {
 | |
| 
 | |
| 	var CommitGraph []GraphItem
 | |
| 
 | |
| 	format := "DATA:|%d|%H|%ad|%an|%ae|%h|%s"
 | |
| 
 | |
| 	graphCmd := git.NewCommand("log")
 | |
| 	graphCmd.AddArguments("--graph",
 | |
| 		"--date-order",
 | |
| 		"--all",
 | |
| 		"-C",
 | |
| 		"-M",
 | |
| 		fmt.Sprintf("-n %d", setting.UI.GraphMaxCommitNum),
 | |
| 		fmt.Sprintf("--skip=%d", setting.UI.GraphMaxCommitNum*(page-1)),
 | |
| 		"--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.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 gi, nil
 | |
| }
 | 
