git-visualiser 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTU1YTFlNmRmZjg1ZDVlZjViODI3Nzk5YzM5NzAyZjFiYzY3YWMzNA==
4
+ ZmQ3NGYzMDhmMTZiYThiMWE0NWQ0ZTliNjRlMDQxZDRjYmQ2OWNhMA==
5
5
  data.tar.gz: !binary |-
6
- NTliMWUzMTZkM2FhNzIwZTE1ZDUzZTI1ZDhkYjQ3ZDFkMmY2NzhjYw==
6
+ NzhlNmEyZjVlMzk5M2YwYWUyYWYxODI4YTFlOTI0YTBjNDAyZDYwYg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NDdiMWJjMzI4M2FkM2YzYmQxM2YxM2VjYmI0MTYxMGJhZTc1NDNkODY4NTg5
10
- ZGE1ODA1NTY3NDQ0N2ZlNTlhNGY5ZGQ5NmVlMzZhOWNlMzA0Y2E0YjQ4MzQ4
11
- NzhjMGY5ZjI1YzU3YzVmZDJmNGYwYjFlMmJiMzQzOWMwZWU4ZGQ=
9
+ MzEyMTlhYWIyYzhlNzU0ZjdmZGE5NjAzYzEyZTliZjg2OGViYTU1MTRmYzU3
10
+ ODEzNmUzNzAzNWMzZjk3OTljMmRjMTMzZjc3YTE2OTE4Y2Y3YWQ0NzI1NDJj
11
+ N2NjMGRmZmVkYzQ4N2U5ZjhiOGM4OTgxNjkxZTRlMTViZTRiNTk=
12
12
  data.tar.gz: !binary |-
13
- N2Q4ZTlkNDc4NDJhYjQxNTBlZGU3ODViMTE3NjczNzI5ZDk5Mzk1NTFhZTFm
14
- NjcyYzIzMzE0YzRjZWQxZTMzZDE2M2RkZWYzODRlN2UzNjQ3MmQzNjA3ZTBi
15
- NzU1NmFmMjhjMmQzZmZmMGY5MjZkZDRmODNhMDJmYzRkZTU2MzE=
13
+ Mzg3ZjA2MDdiM2EzYjIwODY3MzcxYTJjNTA1OTQzZGZhZDFlOTU3MGQ3MDhl
14
+ OTFiYWFhYmRhYjY4MDFlM2ZmZjA4N2U3NzU5YzA0NDk3NGZhNDRlZDhmMDg5
15
+ MjhkYTRmMmY2Nzc3YTAxYTlhYjU3OTU4OWI1OTEzMDc2N2QyZDk=
@@ -46,10 +46,9 @@ class GitVisualiser < Sinatra::Base
46
46
  get '/author_stats.json' do
47
47
  ref = params[:ref]
48
48
 
49
- @authors = Visualisation.branch_author_stats(ref)
50
- @authors = @authors.slice(0, 3) #show a max of 3 authors
51
-
52
- haml :'/authors_list' if @authors.length > 0
49
+ authors = Visualisation.branch_author_stats(ref)
50
+ content_type :json
51
+ authors.to_json
53
52
  end
54
53
 
55
54
  get '/commits.json' do
@@ -67,15 +66,7 @@ class GitVisualiser < Sinatra::Base
67
66
  content_type :json
68
67
  file_diff_stats.to_json
69
68
  end
70
-
71
- helpers do
72
-
73
- def gravatar_image(email)
74
- hash = Digest::MD5.hexdigest(email).to_s
75
- "<img src=\"http://www.gravatar.com/avatar/#{hash}?s=48\" />"
76
- end
77
-
78
- end
69
+
79
70
  end
80
71
 
81
72
  puts "Running GitVisualiser"
@@ -411,12 +411,85 @@ class BranchGraph
411
411
  @linked_nodes[other_id + ", " + node_id] == 1 ||
412
412
  node_id == other_id
413
413
 
414
+ initAuthorStats: (data) ->
415
+ margin = {top: 10, right: 20, bottom: 30, left: 25}
416
+ width = $("#sidebar-branches").width() - 20 - margin.left - margin.right
417
+ height = 300 - margin.top - margin.bottom
418
+
419
+ x = d3.scale.ordinal().rangeRoundBands([0, width], .1)
420
+ y = d3.scale.linear().rangeRound([height, 0])
421
+
422
+ colors = d3.scale.category10()
423
+
424
+ xAxis = d3.svg.axis().scale(x).orient("bottom")
425
+ yAxis = d3.svg.axis()
426
+ .scale(y)
427
+ .orient("left")
428
+ .ticks(4)
429
+ .tickFormat(d3.format("d"))
430
+
431
+ @author_svg = d3.select("#authors-graph-chart")
432
+ .append("svg")
433
+ .style("background", d3.rgb("#EFEFEF"))
434
+ .attr("width", width + margin.left + margin.right)
435
+ .attr("height", height + margin.top + margin.bottom)
436
+ .append("g")
437
+ .attr("transform", "translate(" + margin.left + ", " + margin.top + ")")
438
+
439
+ @y = y
440
+ data.sort (a, b) -> b.commits - a.commits
441
+
442
+ y.domain([0, d3.sum data, (d) -> d.commits])
443
+ y.nice()
444
+ ypos = 0
445
+
446
+ data.forEach((d) ->
447
+ d.coords = { y0: ypos, y1: ypos += d.commits }
448
+ d.color = colors(d.commits)
449
+ )
450
+
451
+ @author_svg.append("g")
452
+ .attr("class", "x axis")
453
+ .attr("transform", "translate(0, " + height + ")")
454
+ .call(xAxis)
455
+
456
+ @author_svg.append("g")
457
+ .attr("class", "y axis")
458
+ .call(yAxis)
459
+
460
+ g = @author_svg.selectAll("rect").data(data)
461
+ .enter()
462
+ .append("g")
463
+ g.append("rect")
464
+ .attr("width", 30)
465
+ .attr("x", 5)
466
+ .attr("y", (d) -> height - y(d.coords.y0))
467
+ .attr("height", (d) -> y(d.coords.y0) - y(d.coords.y1))
468
+ .attr("fill", (d) -> d.color)
469
+ g.append("text")
470
+ .attr("x", 90)
471
+ .attr("y", (d) -> height - y(d.coords.y0) + 15)
472
+ .text((d) -> d.name)
473
+ g.append("text")
474
+ .attr("x", 90)
475
+ .attr("y", (d) -> height - y(d.coords.y0) + 30)
476
+ .text((d) -> "#{d.commits} commits")
477
+ g.append("svg:image")
478
+ .attr("xlink:href", (d) -> d.gravatar_url)
479
+ .attr("x", 40)
480
+ .attr("y", (d) -> height - y(d.coords.y0))
481
+ .attr("width", "40")
482
+ .attr("height", "40")
483
+
414
484
  getAuthorStats: (branch_name) ->
415
- $.get "/author_stats.json", {ref: branch_name}, (data) ->
416
- $("#authors-list").html(data)
485
+ vis = @
486
+ $.get "/author_stats.json", {ref: branch_name}, (author_data) ->
487
+ $("#authors-graph").show()
488
+ vis.initAuthorStats(author_data)
417
489
 
418
490
  clearAuthorStats: ->
419
- $("#authors-list").empty()
491
+ $("#authors-graph").hide()
492
+ $("#authors-graph-chart").empty()
420
493
 
421
494
 
422
495
 
@@ -29,7 +29,7 @@ body,html { height: 100%; margin: 0px; }
29
29
  margin-top: 20px;
30
30
  }
31
31
 
32
- #authors-list {
32
+ #authors-graph {
33
33
  padding: 10px;
34
34
 
35
35
  p {
@@ -115,6 +115,16 @@ body,html { height: 100%; margin: 0px; }
115
115
  img { float: left }
116
116
  }
117
117
 
118
+ #authors-graph {
119
+ .axis path, .axis line {
120
+ fill: none;
121
+ stroke: #000;
122
+ shape-rendering: crispEdges;
123
+ }
124
+
125
+ .x.axis path { display:none; }
126
+ }
127
+
118
128
  svg {
119
129
  background-color: #FFF;
120
130
  cursor: default;
@@ -19,7 +19,9 @@
19
19
  %input#exclude_commit_input.commit_filters_input{:name => "exclude_commit", :placeholder => "Exclude commit", :type => "text"}
20
20
  %a#apply-filters-btn.btn.btn-large.btn-block.apply-btn{:href => "#"}
21
21
  Apply Filters
22
- #authors-list
22
+ #authors-graph{style: "display: none"}
23
+ %h4 Top Authors By Commits
24
+ #authors-graph-chart
23
25
  #branches-display
24
26
  #vis-loading
25
27
  %h4 Loading Repository Data...
@@ -7,7 +7,6 @@ module Visualisation
7
7
  total_additions = total_deletions = 0
8
8
  remotes_arr = Visualisation.remotes
9
9
  Visualisation.branches_with_remotes.each do |branch|
10
- puts "#{branch}"
11
10
  diff = Visualisation.branch_diff_size(branch)
12
11
  head_commit = Visualisation.head_commit_sha(branch)
13
12
  merged_with_master = Visualisation.branch_contains_commit("master", head_commit)
@@ -68,7 +67,6 @@ module Visualisation
68
67
  next if b1 == b2 || b2.split("/").last == b1 ||
69
68
  (merged_branches.has_key?(b2.to_sym) && merged_branches[b2.to_sym].has_key?(b1.to_sym))
70
69
  directions = {}
71
- puts "comparing #{b1} with #{b2}"
72
70
  directions.merge!(:left => true) if branch_merged_with_base?(b1, b2, remotes)
73
71
  directions.merge!(:right => true) if right = branch_merged_with_base?(b2, b1, remotes)
74
72
  b1_merges.merge!(b2.to_sym => directions)
@@ -153,9 +151,20 @@ module Visualisation
153
151
  end
154
152
 
155
153
  def self.branch_author_stats(branch)
156
- `git log master..#{branch} --pretty=format:%an,%ae \
154
+ authors = []
155
+ raw_authors = `git log master..#{branch} --pretty=format:%an,%ae \
157
156
  | awk '{ ++c[$0]; } END { for(cc in c) printf "%5d,%s\\n",c[cc],cc; }'\
158
- | sort -r`.split(/\n/).each { |c| c.strip! }
157
+ | sort -r`.split(/\n/).each { |c| c.strip! }.slice(0, 3)
158
+ raw_authors.each do |author|
159
+ author = author.split(/,/)
160
+ authors << {:name => author[1], :commits => author[0], :gravatar_url => gravatar_url(author[2])}
161
+ end
162
+ authors
163
+ end
164
+
165
+ def self.gravatar_url(email)
166
+ hash = Digest::MD5.hexdigest(email).to_s
167
+ "http://www.gravatar.com/avatar/#{hash}?s=40"
159
168
  end
160
169
 
161
170
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-visualiser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - James McCann
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thin
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: coffee-script
29
43
  requirement: !ruby/object:Gem::Requirement