r534 - trunk/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-10 15:46:43 +0000 (Thu, 10 Jun 2010)
New Revision: 534
Modified:
trunk/v7/documentbase.py
Log:
568526 - FEAT: add a reboot test
Modified: trunk/v7/documentbase.py
===================================================================
--- trunk/v7/documentbase.py 2010-06-10 15:44:54 UTC (rev 533)
+++ trunk/v7/documentbase.py 2010-06-10 15:46:43 UTC (rev 534)
@@ -92,10 +92,13 @@
def timeToString(self, theTime):
return time.strftime(Constants.DATETIMEFORMAT, theTime)
- def duration(self, startTime, stopTime):
+ def durationData(self, startTime, stopTime):
start = datetime.datetime.strptime(startTime, Constants.DATETIMEFORMAT)
stop = datetime.datetime.strptime(stopTime, Constants.DATETIMEFORMAT)
- duration = stop - start
+ return stop - start
+
+ def duration(self, startTime, stopTime):
+ duration = self.durationData(startTime, stopTime)
if duration.days > 0:
durationString = "u% days, " % duration.days
else:
13 years, 11 months
r533 - trunk
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-10 15:44:54 +0000 (Thu, 10 Jun 2010)
New Revision: 533
Modified:
trunk/Makefile
Log:
R5
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2010-06-08 18:12:50 UTC (rev 532)
+++ trunk/Makefile 2010-06-10 15:44:54 UTC (rev 533)
@@ -14,7 +14,7 @@
# Author: Greg Nichols
V7_VERSION := 1.2
-V7_RELEASE := 4
+V7_RELEASE := 5
V7_VERSION_RELEASE := $(V7_VERSION)-$(V7_RELEASE)
V7_VERSION_PY := v7/version.py
V7_SVN_MODULE := svn+ssh://svn.fedorahosted.org/svn/v7
@@ -60,6 +60,7 @@
rm -f v7.spec
rm -f v7.spec.el4
$(MAKE) -C docs clean
+ rm -rf rpm
package: install v7-$(V7_VERSION_RELEASE).el$(V7_RHEL_VERSION).tar.bz2
13 years, 11 months
r532 - in tags: . v7-V1-2R4/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-08 18:12:50 +0000 (Tue, 08 Jun 2010)
New Revision: 532
Added:
tags/v7-V1-2R4/
tags/v7-V1-2R4/v7/version.py
Log:
tag version
Copied: tags/v7-V1-2R4 (from rev 531, trunk)
Copied: tags/v7-V1-2R4/v7/version.py (from rev 335, trunk/v7/version.py)
===================================================================
--- tags/v7-V1-2R4/v7/version.py (rev 0)
+++ tags/v7-V1-2R4/v7/version.py 2010-06-08 18:12:50 UTC (rev 532)
@@ -0,0 +1,5 @@
+
+# v7/version.py is automatically-generated - DO NOT EDIT
+version = '1.2'
+release = '4'
+rhel_version = '5'
13 years, 11 months
r531 - trunk
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-08 18:08:09 +0000 (Tue, 08 Jun 2010)
New Revision: 531
Modified:
trunk/v7.spec.in
Log:
568526 - FEAT: add a reboot test
Modified: trunk/v7.spec.in
===================================================================
--- trunk/v7.spec.in 2010-06-08 18:06:43 UTC (rev 530)
+++ trunk/v7.spec.in 2010-06-08 18:08:09 UTC (rev 531)
@@ -66,8 +66,17 @@
/var/v7/
/etc/httpd/conf.d/v7.conf
/usr/share/man/man8/v7.8.gz
+/etc/init.d/v7
%changelog
+* Tue Jun 01 2010 Greg Nichols <gnichols(a)redhat.com>
+
+V7 1.2 R4
+
+ 598544 - Control-C interrupt of v7 often results in broken results.xml
+ 599108 - FEAT: v7 should provide a way to continue a test run
+ 568526 - FEAT: add a reboot test
+
* Wed May 26 2010 Greg Nichols <gnichols(a)redhat.com>
V7 1.2 R3
13 years, 11 months
r530 - trunk/test-env
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-08 18:06:43 +0000 (Tue, 08 Jun 2010)
New Revision: 530
Modified:
trunk/test-env/Makefile
Log:
568526 - FEAT: add a reboot test
Modified: trunk/test-env/Makefile
===================================================================
--- trunk/test-env/Makefile 2010-06-08 18:06:34 UTC (rev 529)
+++ trunk/test-env/Makefile 2010-06-08 18:06:43 UTC (rev 530)
@@ -17,13 +17,13 @@
-SUBDIRS := bin lib www kickstart
+SUBDIRS := bin lib www kickstart init
all:
- for i in $(SUBDIRS); do $(MAKE) -C $$i; done
+ for i in $(SUBDIRS); do $(MAKE) -C $$i DESTDIR=$(DESTDIR); done
install:
- for i in $(SUBDIRS); do $(MAKE) -C $$i install; done
+ for i in $(SUBDIRS); do $(MAKE) -C $$i DESTDIR=$(DESTDIR) install; done
clean:
- for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done
+ for i in $(SUBDIRS); do $(MAKE) -C $$i DESTDIR=$(DESTDIR) clean; done
13 years, 11 months
r529 - in trunk/test-env: . init
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-08 18:06:34 +0000 (Tue, 08 Jun 2010)
New Revision: 529
Added:
trunk/test-env/init/
trunk/test-env/init/Makefile
trunk/test-env/init/v7
Log:
568526 - FEAT: add a reboot test
Added: trunk/test-env/init/Makefile
===================================================================
--- trunk/test-env/init/Makefile (rev 0)
+++ trunk/test-env/init/Makefile 2010-06-08 18:06:34 UTC (rev 529)
@@ -0,0 +1,26 @@
+# Copyright (c) 2006 Red Hat, Inc. All rights reserved. This copyrighted material
+# is made available to anyone wishing to use, modify, copy, or
+# redistribute it subject to the terms and conditions of the GNU General
+# Public License v.2.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Author: Greg Nichols
+.PHONY: clean
+
+
+FILES := v7
+
+all install:
+ mkdir -p $(DESTDIR)/etc/init.d
+ for file in $(FILES); do install -m 755 $$file $(DESTDIR)/etc/init.d; done
+
+clean:
+ for file in $(FILES); do rm -f $(DESTDIR)/etc/init.d/$$file; done
+
\ No newline at end of file
Added: trunk/test-env/init/v7
===================================================================
--- trunk/test-env/init/v7 (rev 0)
+++ trunk/test-env/init/v7 2010-06-08 18:06:34 UTC (rev 529)
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# v7: Red Hat Hardware Test Suite
+#
+# chkconfig: 2345 35 98
+# description: Red Hat Hardware Test Suite
+
+. /etc/rc.d/init.d/functions
+RETVAL=0
+V7=/usr/bin
+
+start() {
+ $V7/v7 continue &>/dev/null &
+}
+
+stop() {
+ killall v7
+}
+
+reload() {
+ stop
+ start
+}
+
+v7_status() {
+ if ps ax | fgrep v7 &>/dev/null; then
+ echo $"v7 is running"
+ return 0
+ else
+ echo $"v7 is not running"
+ return 3
+ fi
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ status)
+ v7_status
+ RETVAL=$?
+ ;;
+ restart)
+ stop
+ start
+ ;;
+ condrestart)
+ if qemu_status &>/dev/null; then
+ stop
+ start
+ fi
+ ;;
+ *)
+ echo $"Usage: $prog {start|stop|status|restart|condrestart}"
+ exit 1
+esac
+exit $RETVAL
+
Property changes on: trunk/test-env/init/v7
___________________________________________________________________
Name: svn:executable
+ *
13 years, 11 months
r528 - trunk/tests
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-08 18:05:17 +0000 (Tue, 08 Jun 2010)
New Revision: 528
Modified:
trunk/tests/Makefile
Log:
568526 - FEAT: add a reboot test
Modified: trunk/tests/Makefile
===================================================================
--- trunk/tests/Makefile 2010-06-08 18:05:01 UTC (rev 527)
+++ trunk/tests/Makefile 2010-06-08 18:05:17 UTC (rev 528)
@@ -15,7 +15,7 @@
.PHONY: clean install
-SUBDIRS := audio bluray cdrom dvd core floppy info memory network pccard storage tape usb video battery suspend lid expresscard cpuscaling profiler fv_core fv_memory fv_network fv_storage rteval hwlatdetect
+SUBDIRS := audio bluray cdrom dvd core floppy info memory network pccard storage tape usb video battery suspend lid expresscard cpuscaling profiler fv_core fv_memory fv_network fv_storage rteval hwlatdetect reboot
clean:
for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done
13 years, 11 months
r527 - in trunk/tests: . reboot
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-08 18:05:01 +0000 (Tue, 08 Jun 2010)
New Revision: 527
Added:
trunk/tests/reboot/
trunk/tests/reboot/Makefile
trunk/tests/reboot/reboot.py
trunk/tests/reboot/runtest.sh
Log:
568526 - FEAT: add a reboot test
Added: trunk/tests/reboot/Makefile
===================================================================
--- trunk/tests/reboot/Makefile (rev 0)
+++ trunk/tests/reboot/Makefile 2010-06-08 18:05:01 UTC (rev 527)
@@ -0,0 +1,44 @@
+# V7
+TOPLEVEL_NAMESPACE=/V7
+
+# The name of the package under test:
+PACKAGE_NAME=v7
+
+# The path of the test below the package:
+RELATIVE_PATH=reboot
+
+# Version of the Test. Used with make tag.
+export TESTVERSION=1.0
+
+# The compiled namespace of the test.
+export TEST=$(TOPLEVEL_NAMESPACE)/$(PACKAGE_NAME)/$(RELATIVE_PATH)
+
+.PHONY: all install download clean
+
+FILES=$(METADATA) runtest.sh reboot.py
+
+run: $(FILES) build
+ ./runtest.sh
+
+build: $(BUILT_FILES)
+ chmod a+x ./runtest.sh ./reboot.py
+
+clean:
+ rm -f $(BUILT_FILES) $(METADATA)
+
+# Include Common Makefile
+include $(DESTDIR)/usr/share/v7/lib/v7-make.include
+
+# Generate the testinfo.desc here:
+$(METADATA): Makefile
+ @touch $(METADATA)
+ @echo "Owner: Greg Nichols <gnichols(a)redhat.com>" > $(METADATA)
+ @echo "Name: $(TEST)" >> $(METADATA)
+ @echo "Path: $(TEST_DIR)" >> $(METADATA)
+ @echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
+ @echo "Description: HW Cert Reboot test ">> $(METADATA)
+ @echo "TestTime: 5m" >> $(METADATA)
+ @echo "RunFor: $(PACKAGE_NAME)" >> $(METADATA)
+ @echo "Requires: $(PACKAGE_NAME)" >> $(METADATA)
+ @echo "X-RunForDevice: info.product == 'Computer' " >> $(METADATA)
+ @echo "X-Interactive: yes" >> $(METADATA)
Added: trunk/tests/reboot/reboot.py
===================================================================
--- trunk/tests/reboot/reboot.py (rev 0)
+++ trunk/tests/reboot/reboot.py 2010-06-08 18:05:01 UTC (rev 527)
@@ -0,0 +1,143 @@
+#!/usr/bin/python
+# Copyright (c) 2008 Red Hat, Inc. All rights reserved. This copyrighted material
+# is made available to anyone wishing to use, modify, copy, or
+# redistribute it subject to the terms and conditions of the GNU General
+# Public License v.2.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Author: Greg Nichols <gnichols(a)redhat.com>
+
+import os, string, sys, time, syslog
+
+from v7.tags import Constants, DeviceClass
+from v7.test import Test
+from v7.command import Command, V7CommandException
+from v7.controller import Controller
+from v7.environment import Environment
+
+
+class RebootTest(Test):
+
+ def __init__(self):
+ Test.__init__(self, name="reboot")
+ self.interactive = True
+ self.deviceClass = DeviceClass.system
+ self.v7Controller = Controller()
+ self.environment = Environment()
+
+ def setInitConfig(self):
+ chkconfig = Command("chkconfig --add v7")
+ chkconfig.echo()
+ # get a timestamo, save it
+ theTime = time.gmtime(time.time())
+ runTimeStamp = time.strftime(Constants.DATETIMEFORMAT, theTime)
+ # save it off to the side
+ timestamp = open(os.path.join(self.environment.getDataDirectory(), "bootprint"), "w")
+ timestamp.write(runTimeStamp + "\n")
+ timestamp.close()
+ # mark the log with this run time
+ markerName = "%s-%s" % (self.Name(), runTimeStamp)
+ syslog.syslog(self.v7Controller.getSystemLogMarker(markerName, "begin", pid=False))
+
+ def removeInitConfig(self):
+ chkconfig = Command("chkconfig --del v7")
+ chkconfig.echo()
+
+ def reboot(self):
+ # if kdump is set up, use it
+ kernelBootParams = Command("cat /proc/cmdline")
+ kdump = None
+ try:
+ kdump = kernelBootParams.getString(regex="crashkernel=(?P<kdump>[^\ ]+", regexGroup="kdump")
+ if kdump:
+ print "Found crashkernel=%s boot parameter - using kdump" % kdump
+ try:
+ Command("chkconfig kdump on").echo()
+ Command("service kdump start").echo()
+ except V7Exception, e:
+ print "Error: could not start kdump service"
+ print e
+ return False
+
+ except:
+ print "Note: kdump not configured"
+
+ if kdump:
+ print "The test will now cause a kernel panic to exercise kdump"
+ if self.getMode() != Constants.auto:
+ if not self.promptConfirm("Ready to restart?"):
+ return False
+ try:
+ Command("echo 1 > /proc/sys/kernel/sysrq").echo()
+ Command("echo \"c\" > /proc/sysrq-trigger").echo()
+ except V7Exception, e:
+ print "Error: could not cause kernel panic"
+ print e
+ return False
+ else: # reboot
+ print "The system must be restarted for this test"
+ if self.getMode() != Constants.auto:
+ if not self.promptConfirm("Ready to restart?"):
+ return False
+ rebootCommand = Command("shutdown -r 0")
+ try:
+ rebootCommand.echo()
+ except Exception, e:
+ print "Error: reboot failed"
+ print e
+ return False
+
+ # wait here for reboot
+ waitTime = 60 #sec
+ print "Waiting for shutdown..."
+ time.sleep(waitTime)
+ print "Error: Shutdown took too long"
+ return False
+
+ def verifyContinuation(self):
+ # get the log, verify rboot happened
+ runTimeStamp = None
+ try:
+ timestamp = open(os.path.join(self.environment.getDataDirectory(), "bootprint"))
+ runTimeStamp = timestamp.readline()
+ timestamp.close()
+ log = self.v7Controller.getSystemLog("%s-%s" % (self.Name(), runTimeStamp.strip()), pid=False)
+ print "Reboot log:\n---------------------------------------------------------"
+ print log
+ except Exception, e:
+ print "Could not verify reboot"
+ print e
+ return False
+
+ return True
+
+
+
+ def run(self):
+ PASSED = 0
+ FAILED = 1
+
+ if self.incomplete:
+ result = self.verifyContinuation()
+ self.removeInitConfig()
+ else:
+ self.setInitConfig()
+ result = self.reboot()
+
+ if result: return PASSED
+
+ # otherwise
+ return FAILED
+
+
+if __name__ == "__main__":
+ test = RebootTest()
+ returnValue = test.do(sys.argv)
+ sys.exit(returnValue)
Added: trunk/tests/reboot/runtest.sh
===================================================================
--- trunk/tests/reboot/runtest.sh (rev 0)
+++ trunk/tests/reboot/runtest.sh 2010-06-08 18:05:01 UTC (rev 527)
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+v7-run-simple-test ${TEST:-$(basename $PWD)} ./reboot.py
Property changes on: trunk/tests/reboot/runtest.sh
___________________________________________________________________
Name: svn:executable
+ *
13 years, 11 months
r526 - trunk/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-08 18:04:25 +0000 (Tue, 08 Jun 2010)
New Revision: 526
Modified:
trunk/v7/controller.py
trunk/v7/documentbase.py
trunk/v7/hardwaretest.py
trunk/v7/test.py
Log:
568526 - FEAT: add a reboot test
Modified: trunk/v7/controller.py
===================================================================
--- trunk/v7/controller.py 2010-06-07 09:54:52 UTC (rev 525)
+++ trunk/v7/controller.py 2010-06-08 18:04:25 UTC (rev 526)
@@ -31,8 +31,7 @@
def __init__(self):
self.ui = CommandLineUI()
- self.systemLogMarker = "v7/runtests[%s]" % os.getpid()
-
+ self.systemLogMarker = "v7/runtests"
def removeDirectory(self, dir):
"Remove a directory (and all its contents)"
@@ -58,16 +57,20 @@
goodList = pattern.findall(value)
return "".join(goodList)
- def getSystemLogMarker(self, markerName, mark):
- return self.systemLogMarker+": %s: %s" % (markerName, mark)
+ def getSystemLogMarker(self, markerName, mark, pid=True):
+ if pid:
+ return self.systemLogMarker+"[%s]: %s: %s" % (os.getpid(), markerName, mark)
+ #otherwise
+ return self.systemLogMarker+": %s: %s" % (markerName, mark)
+
+ def getSystemLogOpen(self):
+ return self.systemLogMarker+"[%s]" % os.getpid()
-
- def getSystemLog(self, markerName):
+ def getSystemLog(self, markerName, pid=True):
"Get a named section of the system log"
# It feels a bit wrong to have this stuff hardcoded, but it works.
- beginMark = self.getSystemLogMarker(markerName, "begin")
- endMark = self.getSystemLogMarker(markerName, "end")
- marker_str=self.systemLogMarker+": %s: " % markerName
+ beginMark = self.getSystemLogMarker(markerName, "begin", pid)
+ endMark = self.getSystemLogMarker(markerName, "end", pid)
syslog='/var/log/messages'
log=open(syslog)
contents = ""
Modified: trunk/v7/documentbase.py
===================================================================
--- trunk/v7/documentbase.py 2010-06-07 09:54:52 UTC (rev 525)
+++ trunk/v7/documentbase.py 2010-06-08 18:04:25 UTC (rev 526)
@@ -61,23 +61,14 @@
return child
def setTextNode(self, element, value):
+ value = self.removeBadCharacters(value)
if value:
- if type(value) == unicode:
- value = value.encode('ascii')
value = self.removeBadCharacters(value)
# is there an existing child text node?
textNode = self.getTextNode(element)
if textNode:
textNode.data = value
return
-
- if type(value) != type(unicode):
- value = self.removeBadCharacters(value)
- # is there an existing child text node?
- textNode = self.getTextNode(element)
- if textNode:
- textNode.data = value
- return
# else no existing text child note, create it
textNode = self.document.createTextNode(value)
@@ -120,6 +111,14 @@
return theTimeString.replace(" ", "").replace(":", "").replace("-", "")
def removeBadCharacters(self, value):
+ if type(value) == unicode:
+ badUnicode = [u'\xae']
+ goodValue = u""
+ for uc in value:
+ if uc not in badUnicode:
+ goodValue += uc
+ value = goodValue.encode('ascii')
+
try:
# badnumbers = [0,8,27,246]
badnumbers = range(9) # various non-printing characters
Modified: trunk/v7/hardwaretest.py
===================================================================
--- trunk/v7/hardwaretest.py 2010-06-07 09:54:52 UTC (rev 525)
+++ trunk/v7/hardwaretest.py 2010-06-08 18:04:25 UTC (rev 526)
@@ -58,6 +58,7 @@
self.debugLevel = self.options.debug # "off", "low", "medium", or 'high'
self.certification = None
self.runMode = self.options.mode
+ self.command = None
self.commands = {'plan': self.doPlan,
'certify': self.doCertify,
@@ -164,8 +165,8 @@
def do(self, args):
#server doesn't lock
- command = args[0]
- if (command == "server"):
+ self.command = args[0]
+ if (self.command == "server"):
return self.doServer(args)
if not self.getLock():
@@ -175,9 +176,9 @@
result = False
# do the command
try:
- self.commands[command]()
+ self.commands[self.command]()
except KeyError:
- print "unknown command: " + command
+ print "unknown command: " + self.command
self.releaseLock()
return result
@@ -611,7 +612,7 @@
# Set up our system logging stuff
- syslog.openlog(self.systemLogMarker)
+ syslog.openlog(self.getSystemLogOpen())
syslog.syslog("Beginning test run.")
# Make a log dir for this testrun
runDirectory=self.makeTestRunDirectory()
@@ -621,13 +622,16 @@
runNumber = self.certification.getNumberOfTestRuns()
else:
runNumber = None
- for test in tests:
- if not test.isDisabled():
- if not runNumber:
- runNumber = self.certification.addTestRun()
+
+ for test in tests:
+ if not test.isDisabled():
+ if not runNumber:
+ runNumber = self.certification.addTestRun()
+ run = test.getRun(runNumber)
+ if not run:
run = test.newTestRun()
run.setNumber(runNumber)
- self.certification.save(self.environment.getResultsPath())
+ self.certification.save(self.environment.getResultsPath())
# Start testin'!
for test in tests:
@@ -934,6 +938,9 @@
if not server or server == "unknown":
server = self.testServer
runCommand = runCommand + "%s=%s " % (Constants.TESTSERVER, server)
+
+ if self.command == "continue":
+ runCommand = runCommand + "%s=%s " % (Constants.INCOMPLETE, "1")
runCommand = runCommand + "run"
print runCommand
Modified: trunk/v7/test.py
===================================================================
--- trunk/v7/test.py 2010-06-07 09:54:52 UTC (rev 525)
+++ trunk/v7/test.py 2010-06-08 18:04:25 UTC (rev 526)
@@ -76,6 +76,11 @@
except KeyError:
self.logicalDeviceName = ""
+ try:
+ self.incomplete = os.environ[Constants.INCOMPLETE]
+ except KeyError:
+ self.incomplete = False
+
def __cmp__(self, other):
if self.interactive and not other.interactive:
return -1
13 years, 11 months
r525 - trunk
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-06-07 09:54:52 +0000 (Mon, 07 Jun 2010)
New Revision: 525
Modified:
trunk/Makefile
Log:
R4
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2010-06-07 09:52:50 UTC (rev 524)
+++ trunk/Makefile 2010-06-07 09:54:52 UTC (rev 525)
@@ -14,7 +14,7 @@
# Author: Greg Nichols
V7_VERSION := 1.2
-V7_RELEASE := 3
+V7_RELEASE := 4
V7_VERSION_RELEASE := $(V7_VERSION)-$(V7_RELEASE)
V7_VERSION_PY := v7/version.py
V7_SVN_MODULE := svn+ssh://svn.fedorahosted.org/svn/v7
13 years, 11 months