Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

commithgraph / timeline #428

Merged
merged 4 commits into from
Dec 28, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/web.go
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,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|[email protected]|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