clockout 0.5.3 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/clock +13 -21
  3. data/lib/clockout.rb +19 -48
  4. data/lib/record.rb +10 -23
  5. metadata +5 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f2b346638c936f5439b5177c3444cb265b655f84
4
- data.tar.gz: c51397600bb9b1d889d54cab6417cccc74862414
3
+ metadata.gz: 154224b857d9ee8cf5c769c4073a6df0f7c91631
4
+ data.tar.gz: 6fe6c7a5ce04129f0427bc1ee9d95cfa7e7f3ebe
5
5
  SHA512:
6
- metadata.gz: 9915d4af55306b0cd997a3ee2bb1e738dad3e439e2ffd2321cdd80d2362584161c5402bf75d30fa0b458d8456326da56e220316b75f09f19d2a980a0f0552269
7
- data.tar.gz: d4f15a5606f2d93a9b925a915f9e041ca27bf2d47a8f1a55a9cd7421d2810343bf29fe15b8815f31ab2ae6502a7dfbe373bf386781e2560a6ad3ad05c877d256
6
+ metadata.gz: f2b4d39a6a10f94e959cd71d42991faffda8bff3770a63790a90c883ff46c26b3a45405ab6ea8d881311d5798d2f75d9fd5ff2f71abaf5e5111a7c9d018b0eda
7
+ data.tar.gz: f13404df40ad6f5098737f145249402d86b6ea21ba84096cc7ba125b85c522a7b4ed76a3b327ed4f034e80f81f33ac65ca49692374779f080187d35f15e1c22c
data/bin/clock CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'clockout'
4
4
 
5
+ VERSION = "0.6"
6
+
5
7
  HELP_BANNER = <<-EOS
6
8
 
7
9
  See hours:
@@ -38,32 +40,15 @@ TEMPLATE_CLOCKFILE = <<-EOF
38
40
 
39
41
  #time_cutoff: 90
40
42
 
41
-
42
- ### Time-estimation options for each first commit of a timeblock ###
43
-
44
- # Diffs of files matched by this regex will be included in commit time estimation.
45
- # With some projects, there are diffs to binaries, images, files modified by an IDE, etc,
46
- # that you don't want to report as your own work. Below is an example regex that will only
47
- # calculate changes made to files with those extensions
48
- # - Default: /.*/ (matches everything)
49
-
50
- #my_files: /\\.(m|h|txt)$/
51
-
52
- # Diffs of files matched by this regex will NOT be included in commit time estimation
53
- # You also have the option of defining a negative regex match, to ignore certain files.
54
- # For example, if you added an external library or something, you should ignore it
55
- # - Default: <nothing>
56
-
57
- #not_my_files: /SomeThirdPartyLibrary/
58
-
59
- # Estimation factor
43
+ # Estimation factor (for each first commit of a timeblock)
60
44
  # Use the -e option to see the estimations Clockout makes, and tweak them using this
61
45
  # value as necessary.
62
46
  # - Default: 1.0
63
47
 
64
48
  #estimation_factor: 0.9
65
49
 
66
- # Put any override times for specific commits here (minutes). (You can use SHA1 hashes of any length)
50
+ # Put any override times for specific commits here (minutes). (You can use SHA1 hashes
51
+ # of any length). Useful for ignoring commits that add 3rd party libraries, say.
67
52
  # Note: keep a space before each hash for the YAML to parse properly.
68
53
 
69
54
  #overrides:
@@ -90,6 +75,8 @@ def parse_options(args)
90
75
  next_arg = args[i+1]
91
76
  if (arg == "-h" || arg == "--help")
92
77
  opts[:help] = true
78
+ elsif (arg == "-v" || arg == "--version")
79
+ opts[:version] = true
93
80
  elsif (arg == "-e" || arg == "--estimations")
94
81
  opts[:estimations] = true
95
82
  elsif (arg == "-c" || arg == "--condensed")
@@ -183,6 +170,11 @@ else
183
170
  exit
184
171
  end
185
172
 
173
+ if opts[:version]
174
+ puts VERSION
175
+ exit
176
+ end
177
+
186
178
  if opts[:generate]
187
179
  root = Clockout.root_path(path)
188
180
  exit if !root
@@ -221,7 +213,7 @@ else
221
213
  puts "Showing hours for #{user}"
222
214
  end
223
215
 
224
- max = 500
216
+ max = 800
225
217
  clock = Clockout.new(path, user, max)
226
218
  printer = Printer.new(clock)
227
219
 
@@ -1,4 +1,4 @@
1
- require 'grit'
1
+ require 'rugged'
2
2
  require 'yaml'
3
3
 
4
4
  require 'printer'
@@ -7,26 +7,12 @@ require 'record'
7
7
  COLS = 80
8
8
  DAY_FORMAT = '%B %e, %Y'
9
9
 
10
- # Grit does not support Ruby 2.0 right now
11
- class String
12
- if ((defined? RUBY_VERSION) && (RUBY_VERSION[0..2] == "1.9" || RUBY_VERSION[0].to_i >= 2))
13
- def getord(offset); self[offset].ord; end
14
- else
15
- alias :getord :[]
16
- end
17
- end
18
-
19
10
  class Clockout
20
11
  attr_accessor :blocks, :time_per_day, :maxed_out
21
12
 
22
- def commits_to_records(grit_commits, commit_stats)
23
- my_files = eval($opts[:my_files])
24
- not_my_files = eval($opts[:not_my_files] || "")
25
- grit_commits.each_with_index.map do |commit, i|
26
- c = Commit.new(commit)
27
- c.stats = commit_stats[i][1]
28
- c.calculate_diffs(my_files, not_my_files)
29
- c
13
+ def commits_to_records(git_commits)
14
+ git_commits.each_with_index.map do |commit, i|
15
+ Commit.new(commit)
30
16
  end
31
17
  end
32
18
 
@@ -164,13 +150,13 @@ class Clockout
164
150
  blocks
165
151
  end
166
152
 
167
- def prepare_blocks(commits_in, commit_stats, author)
153
+ def prepare_blocks(commits_in, author)
168
154
  clockins = $opts[:in] || {}
169
155
  clockouts = $opts[:out] || {}
170
156
 
171
157
  # Convert clock-in/-outs into Clock objs & commits into Commit objs
172
158
  clocks = clocks_to_records(clockins, :in) + clocks_to_records(clockouts, :out)
173
- commits = commits_to_records(commits_in, commit_stats)
159
+ commits = commits_to_records(commits_in)
174
160
 
175
161
  # Merge & sort everything by date
176
162
  data = (commits + clocks).sort { |a,b| a.date <=> b.date }
@@ -185,29 +171,9 @@ class Clockout
185
171
  @blocks.last.last
186
172
  end
187
173
 
188
- def self.get_repo(path, original_path = nil)
189
- begin
190
- return Grit::Repo.new(path), path
191
- rescue Exception => e
192
- if e.class == Grit::NoSuchPathError
193
- puts_error "Path '#{path}' could not be found."
194
- return nil
195
- else
196
- # Must have drilled down to /
197
- if (path.length <= 1)
198
- puts_error "'#{original_path}' is not a Git repository."
199
- return nil
200
- end
201
-
202
- # Could be that we're in a directory inside the repo
203
- # Strip off last directory
204
- one_up = path
205
- while ((one_up = one_up[0..-2])[-1] != '/') do end
206
-
207
- # Recursively try one level higher
208
- return get_repo(one_up[0..-2], path)
209
- end
210
- end
174
+ def self.get_repo(path)
175
+ repo = Rugged::Repository.discover(path)
176
+ return repo, repo.workdir
211
177
  end
212
178
 
213
179
  def self.parse_clockfile(file)
@@ -226,7 +192,7 @@ class Clockout
226
192
 
227
193
  def self.clock_path(path)
228
194
  return nil if !path
229
- path+"/clock.yml"
195
+ File.join(path,"clock.yml")
230
196
  end
231
197
 
232
198
  def self.root_path(path)
@@ -234,11 +200,17 @@ class Clockout
234
200
  root_path
235
201
  end
236
202
 
203
+ def get_commits(repo, num)
204
+ walker = Rugged::Walker.new(repo)
205
+ walker.push(repo.head.target_id)
206
+ walker.each.take(num)
207
+ end
208
+
237
209
  def initialize(path = nil, author = nil, num = 1)
238
210
  @time_per_day = Hash.new(0)
239
211
 
240
212
  # Default options
241
- $opts = {time_cutoff:120, my_files:"/.*/", estimation_factor:1.0}
213
+ $opts = {time_cutoff:120, estimation_factor:1.0}
242
214
 
243
215
  if path
244
216
  repo, root_path = Clockout.get_repo(path) || exit
@@ -249,12 +221,11 @@ class Clockout
249
221
  # Merge with config override options
250
222
  $opts.merge!(clock_opts) if clock_opts
251
223
 
252
- commits = repo.commits('master', num).reverse
253
- commit_stats = repo.commit_stats('master', num).reverse #much faster if retrieved in batch
224
+ commits = get_commits(repo, num)
254
225
 
255
226
  @maxed_out = (commits.size == num)
256
227
 
257
- prepare_blocks(commits, commit_stats, author)
228
+ prepare_blocks(commits, author)
258
229
  end
259
230
  end
260
231
  end
@@ -4,40 +4,27 @@ end
4
4
 
5
5
  class Commit < Record
6
6
  # From Grit::Commit object
7
- attr_accessor :message, :stats, :diffs, :sha
7
+ attr_accessor :message, :diffs, :sha
8
8
  # Time calc
9
9
  attr_accessor :minutes, :addition, :overriden, :estimated
10
10
  # Whether it's been padded by a clock in/out
11
11
  attr_accessor :clocked_in, :clocked_out
12
12
 
13
- def initialize(commit = nil, date = nil)
13
+ def initialize(commit = nil, date = nil, paths = nil)
14
14
  @addition = 0
15
15
  @date = date
16
16
  if commit
17
- @author = commit.author.email
18
- @date = commit.committed_date
17
+ @author = commit.author[:email]
18
+ @date = commit.time
19
19
  @message = commit.message.gsub("\n",' ')
20
- @sha = commit.id
21
- end
22
- end
23
-
24
- def calculate_diffs(my_files, not_my_files)
25
- return @diffs if @diffs
26
-
27
- plus, minus = 0, 0
28
-
29
- @stats.to_diffstat.each do |diff_stat|
30
- should_include = (diff_stat.filename =~ my_files)
31
- should_ignore = not_my_files && (diff_stat.filename =~ not_my_files)
32
- if should_include && !should_ignore
33
- plus += diff_stat.additions
34
- minus += diff_stat.deletions
20
+ @sha = commit.oid
21
+ @diffs = 0
22
+ commit.diff(commit.parents[0]).each_patch do |patch|
23
+ # Weight deletions half as much, since they are typically
24
+ # faster to do & also are 1:1 with additions when changing a line
25
+ @diffs += patch.stat[0] + patch.stat[1]/2
35
26
  end
36
27
  end
37
-
38
- # Weight deletions half as much, since they are typically
39
- # faster to do & also are 1:1 with additions when changing a line
40
- @diffs = plus+minus/2
41
28
  end
42
29
  end
43
30
 
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clockout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: '0.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Hassin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-19 00:00:00.000000000 Z
11
+ date: 2014-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: grit
14
+ name: rugged
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '>='
@@ -51,7 +51,8 @@ files:
51
51
  - lib/printer.rb
52
52
  - bin/clock
53
53
  homepage: http://rubygems.org/gems/clockout
54
- licenses: []
54
+ licenses:
55
+ - license.md
55
56
  metadata: {}
56
57
  post_install_message:
57
58
  rdoc_options: []