98 lines
No EOL
3 KiB
CoffeeScript
98 lines
No EOL
3 KiB
CoffeeScript
window.ContributorsStatGraphUtil =
|
|
parse_log: (log) ->
|
|
total = {}
|
|
by_author = {}
|
|
by_email = {}
|
|
for entry in log
|
|
@add_date(entry.date, total) unless total[entry.date]?
|
|
|
|
data = by_author[entry.author_name] || by_email[entry.author_email]
|
|
data ?= @add_author(entry, by_author, by_email)
|
|
|
|
@add_date(entry.date, data) unless data[entry.date]
|
|
@store_data(entry, total[entry.date], data[entry.date])
|
|
total = _.toArray(total)
|
|
by_author = _.toArray(by_author)
|
|
total: total, by_author: by_author
|
|
|
|
add_date: (date, collection) ->
|
|
collection[date] = {}
|
|
collection[date].date = date
|
|
|
|
add_author: (author, by_author, by_email) ->
|
|
data = {}
|
|
data.author_name = author.author_name
|
|
data.author_email = author.author_email
|
|
by_author[author.author_name] = data
|
|
by_email[author.author_email] = data
|
|
|
|
store_data: (entry, total, by_author) ->
|
|
@store_commits(total, by_author)
|
|
@store_additions(entry, total, by_author)
|
|
@store_deletions(entry, total, by_author)
|
|
|
|
store_commits: (total, by_author) ->
|
|
@add(total, "commits", 1)
|
|
@add(by_author, "commits", 1)
|
|
|
|
add: (collection, field, value) ->
|
|
collection[field] ?= 0
|
|
collection[field] += value
|
|
|
|
store_additions: (entry, total, by_author) ->
|
|
entry.additions ?= 0
|
|
@add(total, "additions", entry.additions)
|
|
@add(by_author, "additions", entry.additions)
|
|
|
|
store_deletions: (entry, total, by_author) ->
|
|
entry.deletions ?= 0
|
|
@add(total, "deletions", entry.deletions)
|
|
@add(by_author, "deletions", entry.deletions)
|
|
|
|
get_total_data: (parsed_log, field) ->
|
|
log = parsed_log.total
|
|
total_data = @pick_field(log, field)
|
|
_.sortBy(total_data, (d) ->
|
|
d.date
|
|
)
|
|
pick_field: (log, field) ->
|
|
total_data = []
|
|
_.each(log, (d) ->
|
|
total_data.push(_.pick(d, [field, 'date']))
|
|
)
|
|
total_data
|
|
|
|
get_author_data: (parsed_log, field, date_range = null) ->
|
|
log = parsed_log.by_author
|
|
author_data = []
|
|
|
|
_.each(log, (log_entry) =>
|
|
parsed_log_entry = @parse_log_entry(log_entry, field, date_range)
|
|
if not _.isEmpty(parsed_log_entry.dates)
|
|
author_data.push(parsed_log_entry)
|
|
)
|
|
|
|
_.sortBy(author_data, (d) ->
|
|
d[field]
|
|
).reverse()
|
|
|
|
parse_log_entry: (log_entry, field, date_range) ->
|
|
parsed_entry = {}
|
|
parsed_entry.author_name = log_entry.author_name
|
|
parsed_entry.author_email = log_entry.author_email
|
|
parsed_entry.dates = {}
|
|
parsed_entry.commits = parsed_entry.additions = parsed_entry.deletions = 0
|
|
_.each(_.omit(log_entry, 'author_name', 'author_email'), (value, key) =>
|
|
if @in_range(value.date, date_range)
|
|
parsed_entry.dates[value.date] = value[field]
|
|
parsed_entry.commits += value.commits
|
|
parsed_entry.additions += value.additions
|
|
parsed_entry.deletions += value.deletions
|
|
)
|
|
return parsed_entry
|
|
|
|
in_range: (date, date_range) ->
|
|
if date_range is null || date_range[0] <= new Date(date) <= date_range[1]
|
|
true
|
|
else
|
|
false |