108 lines
2.4 KiB
Ruby
108 lines
2.4 KiB
Ruby
|
|
||
|
module TimeCost
|
||
|
class Range
|
||
|
attr_accessor :time_start, :time_stop, :commits
|
||
|
|
||
|
def initialize config, commit
|
||
|
@config = config
|
||
|
@time_stop = DateTime.parse(commit.date)
|
||
|
@time_start = @time_stop - (@config[:range_granularity] * 3 / 24.0)
|
||
|
@commits = [commit]
|
||
|
self
|
||
|
end
|
||
|
|
||
|
def merge range
|
||
|
# B -----[----]----
|
||
|
# A --[----]------
|
||
|
# = ---[------]----
|
||
|
|
||
|
# minimum of both
|
||
|
new_start = if range.time_start < @time_start then range.time_start
|
||
|
else @time_start
|
||
|
end
|
||
|
|
||
|
new_end = if range.time_stop >= @time_stop then range.time_stop
|
||
|
else @time_stop
|
||
|
end
|
||
|
|
||
|
@time_start = new_start
|
||
|
@time_stop = new_end
|
||
|
@commits.concat range.commits
|
||
|
end
|
||
|
|
||
|
def overlap? range
|
||
|
result = false
|
||
|
|
||
|
# Ref ----[----]-----
|
||
|
# overlapping :
|
||
|
# A -[----]--------
|
||
|
# B -------[----]--
|
||
|
# C -[----------]--
|
||
|
# D ------[]-------
|
||
|
# non-overlapping :
|
||
|
# E -[]------------
|
||
|
# F -----------[]--
|
||
|
|
||
|
start_before_start = (range.time_start < @time_start)
|
||
|
start_after_start = (range.time_start >= @time_start)
|
||
|
start_after_stop = (range.time_start >= @time_stop)
|
||
|
start_before_stop = (range.time_start < @time_stop)
|
||
|
|
||
|
stop_before_stop = (range.time_stop < @time_stop)
|
||
|
stop_after_stop = (range.time_stop >= @time_stop)
|
||
|
stop_before_start = (range.time_stop < @time_start)
|
||
|
stop_after_start = (range.time_stop >= @time_start)
|
||
|
|
||
|
|
||
|
# A case
|
||
|
if start_before_start and start_before_stop and
|
||
|
stop_after_start and stop_before_stop then
|
||
|
result = true
|
||
|
end
|
||
|
|
||
|
# B case
|
||
|
if start_after_start and start_before_stop and
|
||
|
stop_after_start and stop_after_stop then
|
||
|
result = true
|
||
|
end
|
||
|
|
||
|
# C case
|
||
|
if start_before_start and start_before_stop and
|
||
|
stop_after_start and stop_after_stop then
|
||
|
result = true
|
||
|
end
|
||
|
|
||
|
# D case
|
||
|
if start_after_start and start_before_stop and
|
||
|
stop_after_start and stop_before_stop then
|
||
|
result = true
|
||
|
end
|
||
|
|
||
|
return result
|
||
|
end
|
||
|
|
||
|
def fixed_start
|
||
|
return @time_start + (@config[:range_granularity]/24.0)
|
||
|
end
|
||
|
|
||
|
def diff
|
||
|
return ("%.2f" % ((@time_stop - fixed_start).to_f * 24)).to_f
|
||
|
end
|
||
|
|
||
|
def to_s
|
||
|
val = "(%s) %s - %s\n" % [diff, fixed_start, @time_stop]
|
||
|
@commits.each do |commit|
|
||
|
lines = []
|
||
|
unless @config[:author_filter_enable] then
|
||
|
lines.push commit.author
|
||
|
end
|
||
|
lines.concat commit.note.split(/\n/)
|
||
|
r = lines.map{ |s| "\t %s" % s }.join "\n"
|
||
|
r[1] = '*'
|
||
|
val += r + "\n"
|
||
|
end
|
||
|
return val
|
||
|
end
|
||
|
end
|
||
|
end
|