Git alias:
chart = "!f() { \
git log \
--format=oneline \
--format=\"%aE %at\" \
--since=6-weeks-ago \
$* | \
awk ' \
function time_to_slot(t) { return strftime(\"%Y-%m-%d\", t, true) } \
function count_to_char(i) { return (i > 0) ? ((i < 10) ? i : \"X\") : \".\" } \
BEGIN { \
time_min = systime(); time_max = 0; \
SECONDS_PER_DAY=86400; \
} \
{ \
item = $1; \
time = 0 + $2; \
if (time > time_max){ \
time_max = time \
} else if (time < time_min){ \
time_min = time \
}; \
slot = time_to_slot(time); \
items[item]++; \
slots[slot]++; \
views[item, slot]++; \
} \
END{ \
printf( \
\"Chart time range %s to %s.\\n\", \
time_to_slot(time_min), \
time_to_slot(time_max) \
); \
time_max_add = time_max += SECONDS_PER_DAY; \
for(item in items){ \
row = \"\"; \
for(time = time_min; time < time_max_add; time += SECONDS_PER_DAY) { \
slot = time_to_slot(time); \
count = views[item, slot]; \
row = row count_to_char(count); \
} \
print row, item; \
} \
}'; \
}; f"
Example:
git chart
..X..........X...2..12 [email protected]
....2..2..13.......... [email protected]
2.....1....11......... [email protected]
..1............1..1... [email protected]
....1.......1.3.3.22.2 [email protected]
The chart rows are the authors.
The chart columns are the days.
The chart column prints one character per day:
-
For 1-9 commits, show the number.
-
For 10 or more commits, show "X" as a visual indicator.
-
For no commits, show "." as a visual placeholder.
The chart timeline adjusts the date range automatically:
-
The timeline starts with the date of the earliest commit.
-
The timeline stops with the date of the latest commit.
-
The intent is to show the most relevant information.
The chart default is to look at the past 6 weeks; this gives a good balance of recency and speed for a team that's currently working on a repo, and also gives a good balance of fitting within one terminal window 80 character width.
You can adjust how far back the chart looks,
by providing your own --since
parameter.
For example if you want to chart an older repo,
that does not have any recent commits, then you
you must provide a longer --since
parameter.
TODO: sort the rows meaningfully, such as alphabetically, or by count.