Added Tcl program to show commits graphicaly.
Used to generate http://antirez.com/news/98.
This commit is contained in:
parent
4b0b28b469
commit
4d625bb4c8
16
utils/graphs/commits-over-time/README.md
Normal file
16
utils/graphs/commits-over-time/README.md
Normal file
@ -0,0 +1,16 @@
|
||||
This Tcl script is what I used in order to generate the graph you
|
||||
can find at http://antirez.com/news/98. It's really quick & dirty, more
|
||||
a trow away program than anything else, but probably could be reused or
|
||||
modified in the future in order to visualize other similar data or an
|
||||
updated version of the same data.
|
||||
|
||||
The usage is trivial:
|
||||
|
||||
./genhtml.tcl > output.html
|
||||
|
||||
The generated HTML is quite broken but good enough to grab a screenshot
|
||||
from the browser. Feel free to improve it if you got time / interest.
|
||||
|
||||
Note that the code filtering the tags, and the hardcoded branch name, does
|
||||
not make the script, as it is, able to analyze a different repository.
|
||||
However the changes needed are trivial.
|
96
utils/graphs/commits-over-time/genhtml.tcl
Executable file
96
utils/graphs/commits-over-time/genhtml.tcl
Executable file
@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env tclsh
|
||||
|
||||
# Load commits history as "sha1 unixtime".
|
||||
set commits [exec git log unstable {--pretty="%H %at"}]
|
||||
set raw_tags [exec git tag]
|
||||
|
||||
# Load all the tags that are about stable releases.
|
||||
foreach tag $raw_tags {
|
||||
if {[string match v*-stable $tag]} {
|
||||
set tag [string range $tag 1 end-7]
|
||||
puts $tag
|
||||
}
|
||||
if {[regexp {^[0-9]+.[0-9]+.[0-9]+$} $tag]} {
|
||||
lappend tags $tag
|
||||
}
|
||||
}
|
||||
|
||||
# For each tag, create a list of "name unixtime"
|
||||
foreach tag $tags {
|
||||
set taginfo [exec git log $tag -n 1 "--pretty=\"$tag %at\""]
|
||||
set taginfo [string trim $taginfo {"}]
|
||||
lappend labels $taginfo
|
||||
}
|
||||
|
||||
# For each commit, check the amount of code changed and create an array
|
||||
# mapping the commit to the number of lines affected.
|
||||
foreach c $commits {
|
||||
set stat [exec git show --oneline --numstat [lindex $c 0]]
|
||||
set linenum 0
|
||||
set affected 0
|
||||
foreach line [split $stat "\n"] {
|
||||
incr linenum
|
||||
if {$linenum == 1 || [string match *deps/* $line]} continue
|
||||
if {[catch {llength $line} numfields]} continue
|
||||
if {$numfields == 0} continue
|
||||
catch {
|
||||
incr affected [lindex $line 0]
|
||||
incr affected [lindex $line 1]
|
||||
}
|
||||
}
|
||||
set commit_to_affected([lindex $c 0]) $affected
|
||||
}
|
||||
|
||||
set base_time [lindex [lindex $commits end] 1]
|
||||
puts [clock format $base_time]
|
||||
|
||||
# Generate a graph made of HTML DIVs.
|
||||
puts {<html>
|
||||
<style>
|
||||
.box {
|
||||
position:absolute;
|
||||
width:10px;
|
||||
height:5px;
|
||||
border:1px black solid;
|
||||
background-color:#44aa33;
|
||||
opacity: 0.04;
|
||||
}
|
||||
.label {
|
||||
position:absolute;
|
||||
background-color:#dddddd;
|
||||
font-family:helvetica;
|
||||
font-size:12px;
|
||||
padding:2px;
|
||||
color:#666;
|
||||
border:1px #aaa solid;
|
||||
border-radius: 5px;
|
||||
}
|
||||
#outer {
|
||||
position:relative;
|
||||
width:1500;
|
||||
height:500;
|
||||
border:1px #aaa solid;
|
||||
}
|
||||
</style>
|
||||
<div id="outer">
|
||||
}
|
||||
foreach c $commits {
|
||||
set sha [lindex $c 0]
|
||||
set t [expr {([lindex $c 1]-$base_time)/(3600*24*2)}]
|
||||
set affected [expr $commit_to_affected($sha)]
|
||||
set left $t
|
||||
set height [expr {log($affected)*20}]
|
||||
puts "<div class=\"box\" style=\"left:$left; bottom:0; height:$height\"></div>"
|
||||
}
|
||||
|
||||
set bottom -30
|
||||
foreach l $labels {
|
||||
set name [lindex $l 0]
|
||||
set t [expr {([lindex $l 1]-$base_time)/(3600*24*2)}]
|
||||
set left $t
|
||||
if {$left < 0} continue
|
||||
incr bottom -20
|
||||
if {$bottom == -210} {set bottom -30}
|
||||
puts "<div class=\"label\" style=\"left:$left; bottom:$bottom\">$name</div>"
|
||||
}
|
||||
puts {</div></html>}
|
Loading…
Reference in New Issue
Block a user