QEMU is 15 this year
From: https://www.winehq.org/pipermail/wine-devel/2003-March/015577.html
Hi, The first release of the QEMU x86 emulator is available at http://bellard.org/qemu/. QEMU achieves a fast user space Linux x86 emulation on x86 and PowerPC Linux hosts by using dynamic translation. Its main goal is to be able to run the Wine project on non-x86 architectures. Fabrice.
- April 2003 Savanah goes live
- June 2003 0.4 initial system emulation
- April 2005 0.7 cross-compile with linux-user
- May 2006 0.8 ARM sysemu, MIPS linux-user
- 1.3 million lines of code
- 64k commits
- 1448 contributors
- 400 person-years
- $54 million
use warnings;
use strict;
my $sha;
my ($sob, $tb, $rb);
my $unreviewed = 0;
open(my $fh, "-|", "git log --no-merges master $base..") or die "Cannot fork command: $!";
while (<$fh>) {
chomp;
if (/^commit (\w+)$/) {
my $commit = substr $sha, 0, 10;
if (defined($sha) && ($sob == 1 && !$rb && !$tb)) {
$unreviewed++;
}
$sha = $1;
$sob = $rb = $tb = 0;
} elsif (/^\s*Signed-off-by/) {
$sob++;
} elsif (/^\s*Reviewed-by/) {
$rb++;
} elsif (/^\s*Tested-by/) {
$tb++;
}
}
close($fh);
print "$unreviewed";
- 6908 Commits (8% un-reviewed)
- 635 merges
- 77 maintainers (of 123)
- 351 authors
from datetime import datetime
import sys
import os
import time
from launchpadlib.launchpad import Launchpad
lp = Launchpad.login_anonymously('kvmf18', 'production', version='devel')
pillar = lp.projects["qemu"]
new_bugs = pillar.searchTasks(created_since=SINCE)
bug_data = []
for bid in new_bugs:
bug = bid.bug
tags = " ".join(bug.tags)
bug_data.append([bug.id, bid.status, bid.importance,
bug.users_affected_count, bug.message_count,
bug.heat, tags])
cat data/qemu-cves-2017to2018 | sed 's/\\t//g'
https://www.qemu.org/contribute/report-a-bug/
:header-args+: :var graph=presentation-filepath(subdir=”generated/graphs”, file=”cves.png”)25 CVEs
2.11 | 13th December 2017 |
2.12 | 24th April 2018 |
3.0 | 14th August 2018 |
2.10.2 | 18th December 2017 |
2.11.1 | 14th February 2018 |
2.11.2 | 26th June 2018 |
2.12.1 | 2nd August 2018 |
- HVF (MacOS)
- WHPX (Windows)
- RDMA (Remote RAM)
- EDID
- SMMUv3 (arm)
- RISC-V
- aarch64 BE (linux-user)
- MTTCG (hppa, i386/x86_64, s390x, xtensa)
- multi-threaded translation
- SoftFloat TNG
- decodetree.py
- RISC-V (SiFive U, Spike, Virt)
- Raspberry Pi 3
- i.MX6 UltraLite 14x14 EVK
- BBC Microbit
- ARM MPS2 & MPS2 TZ (ARM IOT Kit)
- SiFive E
- BBC Microbit/cortex-m0
- Julia Suvorova (Outreachy)
- Steffen Görtz (GSoC)
- Patchew REST API improvements
- Shubham Jain
- Qtest Driver Framework
- Emanuele Esposito
- Vulkan-ize VirGL
- Nathan Gauër
- –enable-sanitizers
- Avocado Acceptance
- TCG Tests
- QEMU’s Synchronization Profiler (QSP)
- GTK 2/SDL 1
- Hosts
- AIX
- Backends
- Itanium (ia64), PARisc (hppa)
- ppcemb
git shortlog -s --no-merges $base.. | sort -rn
This takes a while to run over every author
import os
import re
from subprocess import check_output
from datetime import datetime, timezone
from dateutil import parser as date
now = datetime.now(timezone.utc)
for a in names:
cmd = "git log --pretty=\"%%ad\" --author=\"%s\" | tail -n 1" % (a)
first_time = check_output(cmd, shell=True).rstrip()
first_date = date.parse(first_time)
# convert to days from now
xp = (now - first_date).days
cmd = "git log --pretty=oneline --author=\"%s\" | wc -l" % (a)
total_commits = int(check_output(cmd, shell=True).rstrip())
print("%s,%d,%d" % (a, xp, total_commits))
<<setup-matplotlib>>
# Start with the top authors
top_n = 5
y_pos = np.arange(top_n)
plt.barh(y_pos, counts[:top_n], 0.75, color=bar_colors)
plt.xlim(left=0)
plt.xlabel(xlabel)
plt.yticks(y_pos, names[:top_n])
ax = plt.gca()
ax.invert_yaxis()
# add numbers to each bar
txt_off = counts[0] * 0.1
for i,v in enumerate(y_pos):
ax.text(counts[i] - txt_off, i + 0.125, str(counts[i]), fontweight='bold')
print("Top 3 are: %s with %s" % (names[:3], counts[:3]))
plt.tight_layout()
plt.savefig(graph, transparent=True)
print("Saved graph as %s" % (graph))
:header-args+: :var graph=presentation-filepath(subdir=”generated/graphs”, file=”top-reviewers.png”) :header-args+: :var graph=presentation-filepath(subdir=”generated/graphs”, file=”top-testers.png”)
- stsquad on #qemu
https://plus.google.com/u/0/+AlexBennée- [email protected]
- [email protected]
60 | kraxel |
40 | pmaydell |
32 | rth |
30 | dgibson |
29 | kevin |
27 | ehabkost |
26 | armbru |
25 | stefanha |
23 | ericb |
22 | cohuck |
18 | dgilbert |
17 | mst |
13 | vivier |
13 | stefanberger |
13 | mcayland |
13 | cody |
13 | berrange |
12 | jasowang |
12 | famz |
10 | juanquintela |
10 | jnsnow |
9 | xtensa |
9 | awilliam |
8 | gkurz |
6 | elmarco |
5 | thibault |
5 | riscv |
5 | mdroth |
4 | otubo |
4 | maxreitz |
4 | marcel |
4 | edgar |
3 | xanclic |
3 | mjt |
3 | amarkovic |
3 | alistair |
2 | sstabellini-http |
2 | sstabellini |
2 | huth-gitlab |
2 | huth |
2 | borntraeger |
git log --no-merges --pretty="%b" $base.. |
grep -v "Message-Id" |
grep -v "Cc: " |
grep "<[^@>]*@[^@>]*>" |
sed 's/.*@//' |
sed 's/>//' |
sort |
uniq -c |
sort -rn |
head -n 20
(concat default-directory subdir "/" file)
import numpy as np
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
years = mdates.YearLocator() # every year
twoyears = mdates.YearLocator(2) # every other year
threeyears = mdates.YearLocator(3) # every 3rd year
months = mdates.MonthLocator() # every month
threemonths = mdates.MonthLocator() # every 3rd month
yearsFmt = mdates.DateFormatter('%Y')