Skip to content

Commit

Permalink
commithgraph / timeline (go-gitea#428)
Browse files Browse the repository at this point in the history
* Add model and tests for graph

* Add route and router for graph

* Add assets for graph

* Add template for graph
  • Loading branch information
kjellkvinge authored and lunny committed Dec 28, 2016
1 parent 35d9378 commit 22e1bd3
Show file tree
Hide file tree
Showing 10 changed files with 673 additions and 2 deletions.
1 change: 1 addition & 0 deletions cmd/web.go
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ func runWeb(ctx *cli.Context) error {
m.Get("/src/*", repo.SetEditorconfigIfExists, repo.Home)
m.Get("/raw/*", repo.SingleDownload)
m.Get("/commits/*", repo.RefCommits)
m.Get("/graph", repo.Graph)
m.Get("/commit/:sha([a-f0-9]{7,40})$", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.Diff)
m.Get("/forks", repo.Forks)
}, context.RepoRef())
Expand Down
108 changes: 108 additions & 0 deletions models/graph.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// 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.Split(data, "|")
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 refered to, only relation in current line.
}
return gi, nil
}
41 changes: 41 additions & 0 deletions models/graph_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// 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 (
"testing"

"code.gitea.io/git"
)

func BenchmarkGetCommitGraph(b *testing.B) {

currentRepo, err := git.OpenRepository(".")
if err != nil {
b.Error("Could not open repository")
}

graph, err := GetCommitGraph(currentRepo)
if err != nil {
b.Error("Could get commit graph")
}

if len(graph) < 100 {
b.Error("Should get 100 log lines.")
}
}

func BenchmarkParseCommitString(b *testing.B) {
testString := "* DATA:||4e61bacab44e9b4730e44a6615d04098dd3a8eaf|2016-12-20 21:10:41 +0100|Kjell Kvinge|kjell@kvinge.biz|4e61bac|Add route for graph"

graphItem, err := graphItemFromString(testString, nil)
if err != nil {
b.Error("could not parse teststring")
}

if graphItem.Author != "Kjell Kvinge" {
b.Error("Did not get expected data")
}
}
15 changes: 15 additions & 0 deletions public/css/gitgraph.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
body {font:13.34px/1.4 helvetica,arial,freesans,clean,sans-serif;}
em {font-style:normal;}

#git-graph-container, #rel-container {float:left;}
#git-graph-container {}
#git-graph-container li {list-style-type:none;height:20px;line-height:20px;overflow:hidden;}
#git-graph-container li .node-relation {font-family:'Bitstream Vera Sans Mono', 'Courier', monospace;}
#git-graph-container li .author {color:#666666;}
#git-graph-container li .time {color:#999999;font-size:80%}
#git-graph-container li a {color:#000000;}
#git-graph-container li a:hover {text-decoration:underline;}
#git-graph-container li a em {color:#BB0000;border-bottom:1px dotted #BBBBBB;text-decoration:none;font-style:normal;}
#rev-container {width:80%}
#rev-list {margin:0;padding:0 5px 0 0;width:80%}
#graph-raw-list {margin:0px;}
17 changes: 17 additions & 0 deletions public/js/draw.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
$(document).ready(function () {
var graphList = [];

if (!document.getElementById('graph-canvas')) {
return;
}

$("#graph-raw-list li span.node-relation").each(function () {
graphList.push($(this).text());
})

gitGraph(document.getElementById('graph-canvas'), graphList);

if ($("#rev-container")) {
$("#rev-container").css("width", document.body.clientWidth - document.getElementById('graph-canvas').width);
}
})
Loading

0 comments on commit 22e1bd3

Please sign in to comment.