git-visualiser 0.0.1

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.
Files changed (46) hide show
  1. checksums.yaml +15 -0
  2. data/bin/git_vis +19 -0
  3. data/lib/application/application.rb +82 -0
  4. data/lib/application/coffee_engine.rb +20 -0
  5. data/lib/application/images/ajax-loader.gif +0 -0
  6. data/lib/application/javascripts/branch_graph.coffee +424 -0
  7. data/lib/application/javascripts/commit_graph.coffee +442 -0
  8. data/lib/application/javascripts/common.coffee +50 -0
  9. data/lib/application/javascripts/d3.min.js +5 -0
  10. data/lib/application/javascripts/data_convert.coffee +56 -0
  11. data/lib/application/javascripts/jquery.min.js +6 -0
  12. data/lib/application/javascripts/moment.min.js +6 -0
  13. data/lib/application/javascripts/namespace.coffee +2 -0
  14. data/lib/application/sass_engine.rb +14 -0
  15. data/lib/application/stylesheets/scss/app.scss +172 -0
  16. data/lib/application/stylesheets/scss/flat_ui/_config.sass +16 -0
  17. data/lib/application/stylesheets/scss/flat_ui/_icon-font-24.sass +91 -0
  18. data/lib/application/stylesheets/scss/flat_ui/_icon-font.sass +91 -0
  19. data/lib/application/stylesheets/scss/flat_ui/_mixins.sass +96 -0
  20. data/lib/application/stylesheets/scss/flat_ui/_spaces.sass +129 -0
  21. data/lib/application/stylesheets/scss/flat_ui/flat-ui.sass +39 -0
  22. data/lib/application/stylesheets/scss/flat_ui/modules/_btn.sass +73 -0
  23. data/lib/application/stylesheets/scss/flat_ui/modules/_checkbox-and-radio.sass +86 -0
  24. data/lib/application/stylesheets/scss/flat_ui/modules/_demo.sass +228 -0
  25. data/lib/application/stylesheets/scss/flat_ui/modules/_footer.sass +57 -0
  26. data/lib/application/stylesheets/scss/flat_ui/modules/_input.sass +66 -0
  27. data/lib/application/stylesheets/scss/flat_ui/modules/_login.sass +95 -0
  28. data/lib/application/stylesheets/scss/flat_ui/modules/_navbar.sass +152 -0
  29. data/lib/application/stylesheets/scss/flat_ui/modules/_pager.sass +56 -0
  30. data/lib/application/stylesheets/scss/flat_ui/modules/_pagination.sass +75 -0
  31. data/lib/application/stylesheets/scss/flat_ui/modules/_palette.sass +88 -0
  32. data/lib/application/stylesheets/scss/flat_ui/modules/_progress.sass +29 -0
  33. data/lib/application/stylesheets/scss/flat_ui/modules/_select.sass +163 -0
  34. data/lib/application/stylesheets/scss/flat_ui/modules/_share.sass +34 -0
  35. data/lib/application/stylesheets/scss/flat_ui/modules/_tagsinput.sass +91 -0
  36. data/lib/application/stylesheets/scss/flat_ui/modules/_tile.sass +42 -0
  37. data/lib/application/stylesheets/scss/flat_ui/modules/_todo.sass +77 -0
  38. data/lib/application/stylesheets/scss/flat_ui/modules/_toggle.sass +85 -0
  39. data/lib/application/stylesheets/scss/flat_ui/modules/_tooltip.sass +45 -0
  40. data/lib/application/stylesheets/scss/flat_ui/modules/_type.sass +43 -0
  41. data/lib/application/stylesheets/scss/flat_ui/modules/_ui-slider.sass +44 -0
  42. data/lib/application/stylesheets/scss/flat_ui/modules/_video.sass +358 -0
  43. data/lib/application/views/authors_list.haml +11 -0
  44. data/lib/application/views/index.haml +48 -0
  45. data/lib/application/visualisation.rb +156 -0
  46. metadata +87 -0
@@ -0,0 +1,11 @@
1
+ #author-list
2
+ %h4 Top Authors
3
+ - @authors.each do |author|
4
+ - author = author.split(',')
5
+ .author-row.clearfix
6
+ .author-gravatar
7
+ =gravatar_image(author[2])
8
+ .author_details
9
+ %p.author-name= author[1]
10
+ %p.author-email= author[2]
11
+ %p.author-commits= "#{author[0]} commits"
@@ -0,0 +1,48 @@
1
+ !!! 5
2
+ %head
3
+ %link(rel="stylesheet" type="text/css" href="stylesheets/app.css")
4
+ %link(rel="stylesheet" type="text/css" href="stylesheets/flat_ui.css")
5
+
6
+ %body
7
+ #sidebar-branches.sidebar
8
+ %h1 Branches
9
+ #branches-controls
10
+ %label{:for => "filter_merged"}
11
+ %input#filter_merged_checkbox{:name => "filter_merged", :type => "checkbox"}
12
+ Filter merged with master
13
+ %br
14
+ %label{:for => "filter_remotes"}
15
+ %input#filter_merged_checkbox{:name => "filter_remotes", :type => "checkbox"}
16
+ Filter remote branches
17
+ %input#filter_names_input{:name => "filter_names", :placeholder => "Filter branch names", :type => "text"}
18
+ %input#show_commit_input.commit_filters_input{:name => "show_commit", :placeholder => "Show commit", :type => "text"}
19
+ %input#exclude_commit_input.commit_filters_input{:name => "exclude_commit", :placeholder => "Exclude commit", :type => "text"}
20
+ %a#apply-filters-btn.btn.btn-large.btn-block.apply-btn{:href => "#"}
21
+ Apply Filters
22
+ #authors-list
23
+ #branches-display
24
+ #vis-loading
25
+ %h4 Loading Repository Data...
26
+ %img{:alt => "Ajax-loader", :src => "images/ajax-loader.gif"}
27
+ #commits-toolbar{:style => "display: none"}
28
+ #commit-details
29
+ %h3{:id => "branch_name"}
30
+ %a#back-to-branches-btn{:href => "#"}
31
+ Back to branches
32
+ %p{:id => "commit_sha"}
33
+ %p{:class => "small"}
34
+ %span{:id => "commit_author"}
35
+ %br
36
+ %span{:id => "commit_message"}
37
+ #history-graph
38
+ %a{:id => "clear_history_filters", :href => '#'} Clear filter
39
+ #commits-display
40
+
41
+ %script(src="javascripts/jquery.min.js" type="text/javascript")
42
+ %script(src="javascripts/d3.min.js" type="text/javascript")
43
+ %script(src="javascripts/moment.min.js" type="text/javascript")
44
+ %script(src="javascripts/namespace.js" type="text/javascript")
45
+ %script(src="javascripts/common.js" type="text/javascript")
46
+ %script(src="javascripts/data_convert.js" type="text/javascript")
47
+ %script(src="javascripts/commit_graph.js" type="text/javascript")
48
+ %script(src="javascripts/branch_graph.js" type="text/javascript")
@@ -0,0 +1,156 @@
1
+ module Visualisation
2
+ require 'csv'
3
+
4
+ def self.branches
5
+ branches_arr = []
6
+ total_additions = total_deletions = 0
7
+ remotes_arr = Visualisation.remotes
8
+ Visualisation.branches_with_remotes.each do |branch|
9
+ diff = Visualisation.branch_diff_size(branch)
10
+ head_commit = Visualisation.head_commit_sha(branch)
11
+ merged_with_master = Visualisation.branch_contains_commit("master", head_commit)
12
+ total_additions += diff.first
13
+ total_deletions += diff.last
14
+ remote = remotes_arr.include?(branch)
15
+ branches_arr << {:name => branch, :diff => {:add => diff.first, :del => diff.last},
16
+ :merged_with_master => merged_with_master, :hidden => false, :remote => remote}
17
+ end
18
+ result = {:branches => branches_arr, :diff => {:add => total_additions, :del => total_deletions}}
19
+ result
20
+ end
21
+
22
+ def self.branches_with_remotes
23
+ `git branch -a`.split("\n").each { |b| b.gsub!(/[*]?\s/, '') and b.gsub!(/remotes\//, '') }
24
+ end
25
+
26
+ def self.remotes
27
+ `git branch -r`.split("\n").each { |b| b.gsub!(/[*]?\s/, '') }
28
+ end
29
+
30
+ def self.head_commit_sha(branch)
31
+ `git rev-parse #{branch}`
32
+ end
33
+
34
+ def self.branch_contains_commit(branch, commit_sha)
35
+ `git branch --contains #{commit_sha}`.split("\n").each {|b| b.gsub!(/[*]?\s/, '')}.include?(branch)
36
+ end
37
+
38
+ def self.branches_containing_commit(commit_sha, remotes = true)
39
+ if remotes
40
+ return `git branch -a --contains #{commit_sha}`.split("\n").each { |b| b.gsub!(/[*]?\s/, '') and b.gsub!(/remotes\//, '') }
41
+ else
42
+ return `git branch --contains #{commit_sha}`.split("\n").each { |b| b.gsub!(/[*]?\s/, '') }
43
+ end
44
+ end
45
+
46
+ def self.branches_excluding_commit(commit_sha, remotes = true)
47
+ if remotes
48
+ return branches_with_remotes - `git branch --contains #{commit_sha}`.split("\n").each { |b| b.gsub!(/[*]?\s/, '') }
49
+ else
50
+ # TODO fix this
51
+ # return branches - `git branch --contains #{commit_sha}`.split("\n").each { |b| b.gsub!(/[*]?\s/, '') }
52
+ end
53
+ end
54
+
55
+ def self.branch_diff_number_commits(branch)
56
+ `git cherry master #{branch}`.split("\n").size
57
+ end
58
+
59
+ def self.repo_branches_merged(show_remotes = true)
60
+ merged_branches = {}
61
+ compare_branches = branches_with_remotes
62
+ compare_branches.each do |b1|
63
+ b1_merges = {}
64
+ compare_branches.each do |b2|
65
+ next if b1 == b2 || b2.split("/").last == b1 ||
66
+ (merged_branches.has_key?(b2.to_sym) && merged_branches[b2.to_sym].has_key?(b1.to_sym))
67
+ directions = {}
68
+ directions.merge!(:left => true) if branch_merged_with_base?(b1, b2, remotes)
69
+ directions.merge!(:right => true) if right = branch_merged_with_base?(b2, b1, remotes)
70
+ b1_merges.merge!(b2.to_sym => directions)
71
+ end
72
+ merged_branches.merge!(b1.to_sym => b1_merges)
73
+ end
74
+ merged_branches
75
+ end
76
+
77
+ def self.branch_merged_with_base?(base, branch, remotes)
78
+ if remotes
79
+ `git branch -a --merged #{base} #{branch}`.length > 0
80
+ else
81
+ `git branch --merged #{base} #{branch}`.length > 0
82
+ end
83
+ end
84
+
85
+ #printout merge commits between base and topic branch
86
+ #`git log #{branch} #{base} --oneline --date-order --merges --reverse -1`
87
+
88
+ def self.branch_diff_size(branch)
89
+ merge_base_commit = `git merge-base master #{branch}`.gsub("/\n/", '').strip!
90
+ raw_diff_stats = `git diff --numstat #{merge_base_commit} #{branch}`
91
+ diff_stats = raw_diff_stats.split(/\n/)
92
+ additions = deletions = 0
93
+ diff_stats.each do |line|
94
+ cols = line.split
95
+ additions += cols[0].to_i
96
+ deletions += cols[1].to_i
97
+ end
98
+
99
+ return additions, deletions
100
+ end
101
+
102
+ def self.commits_for_branch(branch_name)
103
+ commits = []
104
+ raw_log = `git log master..#{branch_name} --max-count 15 --date=short --pretty="%H, %an, %ad, %s"`
105
+ commit_lines = CSV.parse(raw_log)
106
+ i = 1
107
+ last_date = nil
108
+ commit_lines.each_with_index do |commit, id|
109
+ sha1 = commit[0]
110
+ author = commit[1].strip!
111
+ commit_date = commit[2].strip!
112
+ message = commit.slice(3..commit.length-1).join(",").strip!
113
+ if !last_date.nil? && commit_date.to_date == last_date.to_date
114
+ i += 1
115
+ else
116
+ i = 1
117
+ end
118
+ last_date = commit_date
119
+ commit_stats = {:id => id, :date => commit_date, :num => i, :sha => sha1,
120
+ :author => author, :message => message}
121
+ commits << commit_stats
122
+ puts commits
123
+ end
124
+ commits
125
+ end
126
+
127
+ def self.merge_base_file_stats(branch_name)
128
+ `git log master..#{branch_name} --numstat --no-merges --format="%n"`
129
+ end
130
+
131
+ def self.commit_diff_stats(commit_sha)
132
+ `git show #{commit_sha} --numstat --no-merges --pretty="%n"`.strip!
133
+ end
134
+
135
+
136
+ def self.branch_diff_commit_files(commit_sha = nil)
137
+ merge_base_commit = `git merge-base master #{commit_sha}`.gsub("/\n/", '').strip!
138
+ diff_stats = `git diff --numstat #{merge_base_commit} #{commit_sha}`.split(/\n/)
139
+ files = {}
140
+ additions = deletions = 0
141
+ diff_stats.each do |line|
142
+ cols = line.split
143
+ additions += cols[0].to_i
144
+ deletions += cols[1].to_i
145
+ files.merge!(cols[2].to_sym => { :add => additions, :del => deletions })
146
+ end
147
+ files.merge!(:total => { :add => additions, :del => deletions })
148
+ end
149
+
150
+ def self.branch_author_stats(branch)
151
+ `git log master..#{branch} --pretty=format:%an,%ae \
152
+ | awk '{ ++c[$0]; } END { for(cc in c) printf "%5d,%s\\n",c[cc],cc; }'\
153
+ | sort -r`.split(/\n/).each { |c| c.strip! }
154
+ end
155
+
156
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-visualiser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - James McCann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A Sinatra app for loading D3-based visualisations of a local Git repository
14
+ email: jmccnz@gmail.com
15
+ executables:
16
+ - git_vis
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/git_vis
21
+ - lib/application/application.rb
22
+ - lib/application/coffee_engine.rb
23
+ - lib/application/images/ajax-loader.gif
24
+ - lib/application/javascripts/branch_graph.coffee
25
+ - lib/application/javascripts/commit_graph.coffee
26
+ - lib/application/javascripts/common.coffee
27
+ - lib/application/javascripts/d3.min.js
28
+ - lib/application/javascripts/data_convert.coffee
29
+ - lib/application/javascripts/jquery.min.js
30
+ - lib/application/javascripts/moment.min.js
31
+ - lib/application/javascripts/namespace.coffee
32
+ - lib/application/sass_engine.rb
33
+ - lib/application/stylesheets/scss/app.scss
34
+ - lib/application/stylesheets/scss/flat_ui/_config.sass
35
+ - lib/application/stylesheets/scss/flat_ui/_icon-font-24.sass
36
+ - lib/application/stylesheets/scss/flat_ui/_icon-font.sass
37
+ - lib/application/stylesheets/scss/flat_ui/_mixins.sass
38
+ - lib/application/stylesheets/scss/flat_ui/_spaces.sass
39
+ - lib/application/stylesheets/scss/flat_ui/flat-ui.sass
40
+ - lib/application/stylesheets/scss/flat_ui/modules/_btn.sass
41
+ - lib/application/stylesheets/scss/flat_ui/modules/_checkbox-and-radio.sass
42
+ - lib/application/stylesheets/scss/flat_ui/modules/_demo.sass
43
+ - lib/application/stylesheets/scss/flat_ui/modules/_footer.sass
44
+ - lib/application/stylesheets/scss/flat_ui/modules/_input.sass
45
+ - lib/application/stylesheets/scss/flat_ui/modules/_login.sass
46
+ - lib/application/stylesheets/scss/flat_ui/modules/_navbar.sass
47
+ - lib/application/stylesheets/scss/flat_ui/modules/_pager.sass
48
+ - lib/application/stylesheets/scss/flat_ui/modules/_pagination.sass
49
+ - lib/application/stylesheets/scss/flat_ui/modules/_palette.sass
50
+ - lib/application/stylesheets/scss/flat_ui/modules/_progress.sass
51
+ - lib/application/stylesheets/scss/flat_ui/modules/_select.sass
52
+ - lib/application/stylesheets/scss/flat_ui/modules/_share.sass
53
+ - lib/application/stylesheets/scss/flat_ui/modules/_tagsinput.sass
54
+ - lib/application/stylesheets/scss/flat_ui/modules/_tile.sass
55
+ - lib/application/stylesheets/scss/flat_ui/modules/_todo.sass
56
+ - lib/application/stylesheets/scss/flat_ui/modules/_toggle.sass
57
+ - lib/application/stylesheets/scss/flat_ui/modules/_tooltip.sass
58
+ - lib/application/stylesheets/scss/flat_ui/modules/_type.sass
59
+ - lib/application/stylesheets/scss/flat_ui/modules/_ui-slider.sass
60
+ - lib/application/stylesheets/scss/flat_ui/modules/_video.sass
61
+ - lib/application/views/authors_list.haml
62
+ - lib/application/views/index.haml
63
+ - lib/application/visualisation.rb
64
+ homepage: http://rubygems.org/gems/git-visualiser
65
+ licenses: []
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.0.3
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: Sinatra app for Git Visualisation
87
+ test_files: []