Latest revision |
Your text |
Line 1: |
Line 1: |
− | Number of patches from OpenVZ team | + | Number of patches from OpenVZ team, |
− | == Description ==
| + | per week, accepted from mainline |
− | | + | QEMU + KVM unit tests + KVM guest drivers |
− | This graph shows how many patches from OpenVZ developers were merged into mainstream QEMU + KVM, per each version.
| |
− | | |
− | It is drawn by gnuplot using the data set obtained from git repository.
| |
− | | |
− | == Source code ==
| |
− | === Collect data ===
| |
− | Here is the script to produce the data for the graph, called <code>count</code>:
| |
− | | |
− | <small><source lang="bash">
| |
− | #!/bin/sh
| |
− | | |
− | # Whose patches to count
| |
− | #PAT='@openvz.org|@parallels.com|@sw.ru|@swsoft.com|@sw.com.sg|kuznet@'
| |
− | #PAT='@openvz.org|@parallels.com|@sw.ru|@swsoft.com|@sw.com.sg|adobriyan@|kuznet@|gorcunov@'
| |
− | PAT='@openvz.org|@parallels.com|@sw.ru|@swsoft.com|@sw.com.sg|virtuozzo.com|kuznet@|gorcunov@'
| |
− | | |
− | # Return the date of the given tag, in a format usable by gnuplot
| |
− | get_tag_date() {
| |
− | echo $(git show $1 | egrep ^Date: | head -n1) |
| |
− | sed 's/^Date: ... \(.*\) [-+]....$/\1/' |
| |
− | sed 's/ ..:..:..//' | sed 's/ /-/g'
| |
− | }
| |
− | | |
− | # Count the number of patches whose authors match $PAT,
| |
− | # for the period between two given git tags
| |
− | count_patches() {
| |
− | git log --pretty=short --no-merges $1..$2 |
| |
− | egrep '^Author: ' | egrep $PAT | wc -l
| |
− | }
| |
− | | |
− | count_total_patches() {
| |
− | git log --pretty=short --no-merges $1..$2 | grep -c '^commit '
| |
− | }
| |
− | | |
− | # Latest kernel
| |
− | latest=$(git tag | grep -v -- -rc | grep -F 'v1.' | \
| |
− | awk -F . '{print $2}' | sort -n | tail -n1)
| |
− | | |
− | # Find out if number of patches for HEAD is much more
| |
− | # than for latest -rc. If yes, use HEAD, otherwise -rc.:
| |
− | last_rc=$(git describe --abbrev=0)
| |
− | HEAD=$last_rc
| |
− | if ! test -z "$last_rc"; then
| |
− | much_more=10
| |
− | count_head=$(count_patches v1.$latest.0 HEAD)
| |
− | count_rc=$(count_patches v1.$latest.0 $last_rc)
| |
− | if test $count_head -gt $((count_rc+much_more)); then
| |
− | HEAD="HEAD "
| |
− | fi
| |
− | fi
| |
− | | |
− | pv=''
| |
− | for v in $(git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags |\
| |
− | grep -v -E -- '-rc|-tree|v2.6.11|\.[1-9]$') HEAD; do
| |
− | if [ -z "$pv" ]; then
| |
− | pv=$v
| |
− | continue
| |
− | fi
| |
− | | |
− | pd=$(get_tag_date $pv)
| |
− | d=$(get_tag_date $v)
| |
− | count_ours=$(count_patches $pv $v)
| |
− | count_total=$(count_total_patches $pv $v)
| |
− | if test "$count_ours" -gt 0; then
| |
− | echo $d $v " " $count_ours $count_total
| |
− | fi
| |
− | pv=$v
| |
− | done | sed 's/ /\t/g'
| |
− | </source></small>
| |
− | | |
− | === Draw the graph ===
| |
− | | |
− | Here is the script to produce the graph. Note it calls the previous script under the name 'count'.
| |
− | <small><source lang="bash">
| |
− | #!/bin/sh
| |
− | | |
− | REPO=~/src/qemu/.git
| |
− | COUNT=$(pwd)/count
| |
− | OUT=$(pwd)/time.dat
| |
− | export GDFONTPATH=/usr/share/fonts/microsoft
| |
− | export GIT_DIR=$REPO
| |
− | | |
− | if test "$1" != "-f"; then
| |
− | echo "== Previous (old) stats =="
| |
− | tail -n 2 $OUT
| |
− | # Update the repo and count new stats
| |
− | (cd $REPO && cd .. && git pull) && sh $COUNT > $OUT
| |
− | echo "== New stats =="
| |
− | tail -n 2 $OUT
| |
− | fi
| |
− | | |
− | DATE=$(tail -n 1 $OUT | cut -f 1 | awk -F- '{print $2,$1,$3}')
| |
− | MAXY=$(awk 'BEGIN {max=0}; ($3 > max) {max=$3}; END {print max+80}' < time.dat)
| |
− | # GNU date is powerful!
| |
− | MAXX=$(date +%b-1-%Y --date='+2 months')
| |
− | | |
− | cat << EOF | gnuplot > plot.png
| |
− | set terminal png enhanced font "verdana,13" size 1600,1200
| |
− | | |
− | | |
− | set title "OpenVZ team QEMU patches progress as of ${DATE}"
| |
− | | |
− | unset xlabel
| |
− | set xdata time
| |
− | set timefmt "%b-%d-%Y"
| |
− | set format x "%b\n%Y"
| |
− | set grid xtics mxtics noytics
| |
− | | |
− | set xrange [ : "${MAXX}" ]
| |
− | set yrange [ 0 : ${MAXY} ]
| |
− | set ylabel "Number of patches from OpenVZ team,\n per QEMU release, accepted into mainstream"
| |
− | | |
− | set border 3 # no lines at right and top
| |
− | set xtics nomirror # no tics at top
| |
− | set ytics nomirror # no tics at right
| |
− | | |
− | plot '${OUT}' using 1:3 with linespoints pt 6 ps 1 lw 2 lt 2 notitle, \
| |
− | '' using 1:3:2 with labels left offset 0,5.5 rotate notitle, \
| |
− | '' using 1:3:3 with labels left offset 0.7,0 notitle
| |
− | | |
− | EOF
| |
− | </source></small>
| |