mgit 0.4.1 → 0.4.2
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 +4 -4
- data/lib/mgit/cli.rb +3 -0
- data/lib/mgit/command.rb +9 -0
- data/lib/mgit/configuration.rb +11 -10
- data/lib/mgit/output.rb +7 -5
- data/lib/mgit/version.rb +1 -1
- data/lib/mgit.rb +0 -1
- metadata +2 -3
- data/lib/mgit/commands/statistics.rb +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bb3bdcd576ecd50f3d7d8a184f5bc58d8834562
|
4
|
+
data.tar.gz: 22d8aac580b7b69cf884120b9005c9bff8e8135b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6a82916b544e654920d4c63da49bff65ceaa88bbbf40330499a97d1b8e1fbca7cb8654ae67a365a42a03661801fa81be05ef1df5c0a48092df7b26b05352df2
|
7
|
+
data.tar.gz: e9d9dbb58cd51a1cab081e07637c19c299ab714ecab5feab47faec7889366b397dcc2126b80267bd330b1d5b551b6c57f9e6116078364e4581e98a4645cd9128
|
data/lib/mgit/cli.rb
CHANGED
@@ -8,6 +8,9 @@ module MGit
|
|
8
8
|
# Initialize AppData and migrate if necessary.
|
9
9
|
AppData.update
|
10
10
|
|
11
|
+
# Initialize Commands.
|
12
|
+
Command.load_commands
|
13
|
+
|
11
14
|
# Run command, consuming its name from the list of arguments.
|
12
15
|
command = Command.execute(ARGV.shift, ARGV)
|
13
16
|
rescue UsageError => e
|
data/lib/mgit/command.rb
CHANGED
@@ -5,6 +5,11 @@ module MGit
|
|
5
5
|
@@commands = {}
|
6
6
|
@@aliases = {}
|
7
7
|
|
8
|
+
def self.load_commands
|
9
|
+
require_commands_from_directory File.expand_path('../commands', __FILE__)
|
10
|
+
require_commands_from_directory Configuration.plugindir
|
11
|
+
end
|
12
|
+
|
8
13
|
def self.execute(name, args)
|
9
14
|
cmd = self.create(name)
|
10
15
|
cmd.check_arity(args)
|
@@ -52,5 +57,9 @@ module MGit
|
|
52
57
|
raise UnknownCommandError.new(cmd)
|
53
58
|
end
|
54
59
|
end
|
60
|
+
|
61
|
+
def self.require_commands_from_directory(dir)
|
62
|
+
Dir["#{dir}/*.rb"].each { |file| require file }
|
63
|
+
end
|
55
64
|
end
|
56
65
|
end
|
data/lib/mgit/configuration.rb
CHANGED
@@ -4,6 +4,11 @@ module MGit
|
|
4
4
|
:threads => {
|
5
5
|
:default => true,
|
6
6
|
:description => 'set to true if you want the fetch command to be threaded'
|
7
|
+
},
|
8
|
+
|
9
|
+
:plugindir => {
|
10
|
+
:default => File.join(AppData::AppDataVersion.latest.send(:config_dir), 'plugins'),
|
11
|
+
:description => 'directory from where plugin commands are loaded'
|
7
12
|
}
|
8
13
|
}
|
9
14
|
|
@@ -12,6 +17,12 @@ module MGit
|
|
12
17
|
define_method(k.to_s) do
|
13
18
|
AppData.load(k, v[:default])
|
14
19
|
end
|
20
|
+
|
21
|
+
define_method("#{k.to_s}=") do |value|
|
22
|
+
AppData.save!(k, value)
|
23
|
+
end
|
24
|
+
|
25
|
+
private "#{k.to_s}="
|
15
26
|
end
|
16
27
|
end
|
17
28
|
|
@@ -31,15 +42,5 @@ module MGit
|
|
31
42
|
raise ConfigurationError.new("Unknown key: #{key}.")
|
32
43
|
end
|
33
44
|
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
class << self
|
38
|
-
KEYS.each do |k, v|
|
39
|
-
define_method("#{k.to_s}=") do |value|
|
40
|
-
AppData.save!(k, value)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
45
|
end
|
45
46
|
end
|
data/lib/mgit/output.rb
CHANGED
@@ -24,6 +24,7 @@ module MGit
|
|
24
24
|
def initialize(table, options)
|
25
25
|
@table = table
|
26
26
|
@options = options
|
27
|
+
@options[:columns] = []
|
27
28
|
raise ImplementationError.new('ptable called with invalid table') unless valid_table?
|
28
29
|
end
|
29
30
|
|
@@ -31,11 +32,6 @@ module MGit
|
|
31
32
|
return '' if table.empty?
|
32
33
|
|
33
34
|
cw = column_widths
|
34
|
-
if options[:columns]
|
35
|
-
options[:columns].each_with_index do |c, i|
|
36
|
-
cw[i] = c if c
|
37
|
-
end
|
38
|
-
end
|
39
35
|
|
40
36
|
table.map do |row|
|
41
37
|
row.map.with_index do |cell, i|
|
@@ -65,6 +61,12 @@ module MGit
|
|
65
61
|
end
|
66
62
|
|
67
63
|
def column_widths
|
64
|
+
column_max_widths.each_with_index.map do |c, i|
|
65
|
+
(options[:columns].size > i && options[:columns][i]) ? options[:columns][i] : c
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def column_max_widths
|
68
70
|
transpose.map do |col|
|
69
71
|
col.map { |cell| cell.size }.max
|
70
72
|
end
|
data/lib/mgit/version.rb
CHANGED
data/lib/mgit.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mgit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- FlavourSys Technology GmbH
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -85,7 +85,6 @@ files:
|
|
85
85
|
- lib/mgit/commands/grep.rb
|
86
86
|
- lib/mgit/commands/config.rb
|
87
87
|
- lib/mgit/commands/remove_all.rb
|
88
|
-
- lib/mgit/commands/statistics.rb
|
89
88
|
- lib/mgit/commands/version.rb
|
90
89
|
- lib/mgit/commands/fetch.rb
|
91
90
|
- lib/mgit/commands/head.rb
|
@@ -1,100 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
|
-
module MGit
|
4
|
-
class StatisticsCommand < Command
|
5
|
-
def execute(args)
|
6
|
-
total_authors = {}
|
7
|
-
total_punchcard = {}
|
8
|
-
Registry.chdir_each do |repo|
|
9
|
-
current_authors = {}
|
10
|
-
current_punchcard = {}
|
11
|
-
|
12
|
-
collect do |author, time, changes|
|
13
|
-
current_authors[author] ||= 0
|
14
|
-
current_authors[author] += changes
|
15
|
-
|
16
|
-
total_punchcard[time.wday] ||= {}
|
17
|
-
total_punchcard[time.wday][time.hour / 4] ||= 0
|
18
|
-
total_punchcard[time.wday][time.hour / 4] += changes
|
19
|
-
end
|
20
|
-
|
21
|
-
print_authors current_authors, repo.name
|
22
|
-
puts
|
23
|
-
|
24
|
-
current_authors.each do |author, changes|
|
25
|
-
total_authors[author] ||= 0
|
26
|
-
total_authors[author] += changes
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
print_authors total_authors, 'TOTAL'
|
31
|
-
puts
|
32
|
-
print_punchcard total_punchcard, 'TOTAL'
|
33
|
-
end
|
34
|
-
|
35
|
-
def arity
|
36
|
-
[nil, 0]
|
37
|
-
end
|
38
|
-
|
39
|
-
def usage
|
40
|
-
'statistics'
|
41
|
-
end
|
42
|
-
|
43
|
-
def description
|
44
|
-
'display authorship statistics for each repository and in total'
|
45
|
-
end
|
46
|
-
|
47
|
-
register_command :statistics
|
48
|
-
|
49
|
-
# Too close to :status?
|
50
|
-
#register_alias :stats
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def collect
|
55
|
-
log = `git log --format='<><>%ct %aN' --shortstat --all`.strip
|
56
|
-
commits = log.split('<><>').drop(1)
|
57
|
-
|
58
|
-
commits.each do |c|
|
59
|
-
lines = c.split("\n")
|
60
|
-
|
61
|
-
time = lines[0].split(' ')[0]
|
62
|
-
author = lines[0].split(' ')[1..-1].join(' ')
|
63
|
-
|
64
|
-
if lines.size >= 3
|
65
|
-
m = /changed(?:, (\d+) insertion(?:s)?\(\+\))?(?:, (\d+) deletion(?:s)?\(\-\))?/.match(lines[2])
|
66
|
-
changes = (m.captures[0] || 0).to_i + (m.captures[1] || 0).to_i
|
67
|
-
else
|
68
|
-
changes = 0
|
69
|
-
end
|
70
|
-
|
71
|
-
yield author, Time.at(time.to_i), changes
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def print_authors(data, name)
|
76
|
-
pinfo "Authorship statistics (#{name}):"
|
77
|
-
ptable (data.to_a.sort_by { |v| v[1] }.reverse), :columns => [24, nil]
|
78
|
-
end
|
79
|
-
|
80
|
-
def print_punchcard(data, name)
|
81
|
-
pinfo "Punchcard (#{name}):"
|
82
|
-
|
83
|
-
t = []
|
84
|
-
t << ['', '0-4', '4-8', '8-12', '12-16', '16-20', '20-24']
|
85
|
-
['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].each_with_index do |day, wday|
|
86
|
-
l = [day]
|
87
|
-
6.times do |h|
|
88
|
-
if (data[wday] && data[wday][h])
|
89
|
-
l << data[wday][h].to_s
|
90
|
-
else
|
91
|
-
l << '0'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
t << l
|
95
|
-
end
|
96
|
-
|
97
|
-
ptable t
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|