2018-01-27 23:46:39 +03:00
#!/usr/bin/env python3
2018-03-20 22:00:02 +03:00
#
2018-04-04 16:35:41 +03:00
# This work is licensed under the GNU GPLv2 or later.
2018-03-20 22:00:02 +03:00
# See the COPYING file in the top-level directory.
2013-03-17 05:32:29 +04:00
2019-06-14 23:34:00 +03:00
import sys
if sys . version_info . major < 3 :
print ( " virt-manager is python3 only. Run this as ./setup.py " )
sys . exit ( 1 )
2013-03-17 05:32:29 +04:00
import glob
import os
2020-07-08 17:54:13 +03:00
from pathlib import Path
2013-03-18 02:18:22 +04:00
import unittest
2013-03-17 05:32:29 +04:00
2015-11-03 01:06:46 +03:00
import distutils
import distutils . command . build
import distutils . command . install
2015-11-03 00:19:31 +03:00
import distutils . command . install_data
2015-11-03 01:06:46 +03:00
import distutils . command . install_egg_info
import distutils . command . sdist
2015-11-03 00:19:31 +03:00
import distutils . dist
import distutils . log
2015-11-03 01:06:46 +03:00
import distutils . sysconfig
2013-03-17 05:32:29 +04:00
2018-12-07 11:28:55 +03:00
2019-06-14 23:34:00 +03:00
sysprefix = distutils . sysconfig . get_config_var ( " prefix " )
2018-03-22 01:00:38 +03:00
2013-03-17 05:32:29 +04:00
2019-06-17 18:14:39 +03:00
def _import_buildconfig ( ) :
# A bit of crazyness to import the buildconfig file without importing
# the rest of virtinst, so the build process doesn't require all the
# runtime deps to be installed
import warnings
2019-06-14 23:34:00 +03:00
2019-06-17 18:14:39 +03:00
# 'imp' is deprecated. We use it elsewhere though too. Deal with using
# the modern replacement when we replace all usage
with warnings . catch_warnings ( ) :
warnings . filterwarnings ( " ignore " , category = DeprecationWarning )
import imp
buildconfig = imp . load_source ( ' buildconfig ' , ' virtinst/buildconfig.py ' )
if " libvirt " in sys . modules :
raise RuntimeError ( " Found libvirt in sys.modules. setup.py should "
" not import virtinst. " )
return buildconfig . BuildConfig
2019-06-14 23:34:00 +03:00
2019-06-17 18:14:39 +03:00
BuildConfig = _import_buildconfig ( )
2016-04-18 23:42:12 +03:00
2013-03-17 05:32:29 +04:00
2014-04-03 02:39:43 +04:00
# pylint: disable=attribute-defined-outside-init
2016-06-18 00:31:24 +03:00
_desktop_files = [
( " share/applications " , [ " data/virt-manager.desktop.in " ] ) ,
]
_appdata_files = [
2020-01-06 16:43:17 +03:00
( " share/metainfo " , [ " data/virt-manager.appdata.xml.in " ] ) ,
2016-06-18 00:31:24 +03:00
]
2015-11-03 01:06:46 +03:00
class my_build_i18n ( distutils . command . build . build ) :
2013-03-17 05:32:29 +04:00
"""
Add our desktop files to the list , saves us having to track setup . cfg
"""
2013-04-19 00:51:44 +04:00
user_options = [
( ' merge-po ' , ' m ' , ' merge po files against template ' ) ,
]
2013-03-17 05:32:29 +04:00
2013-04-19 00:51:44 +04:00
def initialize_options ( self ) :
self . merge_po = False
def finalize_options ( self ) :
pass
2013-03-17 05:32:29 +04:00
2013-04-04 03:07:42 +04:00
def run ( self ) :
2013-04-19 00:51:44 +04:00
po_dir = " po "
2020-07-08 17:54:14 +03:00
if self . merge_po :
pot_file = os . path . join ( " po " , " virt-manager.pot " )
for po_file in glob . glob ( " %s /*.po " % po_dir ) :
cmd = [ " msgmerge " , " --previous " , " -o " , po_file , po_file , pot_file ]
self . spawn ( cmd )
2013-04-19 00:51:44 +04:00
max_po_mtime = 0
for po_file in glob . glob ( " %s /*.po " % po_dir ) :
lang = os . path . basename ( po_file [ : - 3 ] )
mo_dir = os . path . join ( " build " , " mo " , lang , " LC_MESSAGES " )
mo_file = os . path . join ( mo_dir , " virt-manager.mo " )
if not os . path . exists ( mo_dir ) :
os . makedirs ( mo_dir )
cmd = [ " msgfmt " , po_file , " -o " , mo_file ]
po_mtime = os . path . getmtime ( po_file )
mo_mtime = ( os . path . exists ( mo_file ) and
os . path . getmtime ( mo_file ) ) or 0
if po_mtime > max_po_mtime :
max_po_mtime = po_mtime
if po_mtime > mo_mtime :
self . spawn ( cmd )
targetpath = os . path . join ( " share/locale " , lang , " LC_MESSAGES " )
self . distribution . data_files . append ( ( targetpath , ( mo_file , ) ) )
2020-07-08 17:54:16 +03:00
# Merge .in with translations using gettext
2020-07-08 17:54:17 +03:00
for ( file_set , switch ) in [ ( _appdata_files , " --xml " ) ,
( _desktop_files , " --desktop " ) ] :
2020-07-08 17:54:16 +03:00
for ( target , files ) in file_set :
build_target = os . path . join ( " build " , target )
if not os . path . exists ( build_target ) :
os . makedirs ( build_target )
files_merged = [ ]
for f in files :
if f . endswith ( " .in " ) :
file_merged = os . path . basename ( f [ : - 3 ] )
else :
file_merged = os . path . basename ( f )
file_merged = os . path . join ( build_target , file_merged )
cmd = [ " msgfmt " , switch , " --template " , f , " -d " , po_dir ,
" -o " , file_merged ]
mtime_merged = ( os . path . exists ( file_merged ) and
os . path . getmtime ( file_merged ) ) or 0
mtime_file = os . path . getmtime ( f )
if ( mtime_merged < max_po_mtime or
mtime_merged < mtime_file ) :
# Only build if output is older than input (.po,.in)
self . spawn ( cmd )
files_merged . append ( file_merged )
self . distribution . data_files . append ( ( target , files_merged ) )
2013-04-19 00:51:44 +04:00
2015-11-03 01:06:46 +03:00
class my_build ( distutils . command . build . build ) :
2013-03-17 05:32:29 +04:00
"""
Create simple shell wrappers for / usr / bin / tools to point to / usr / share
Compile . pod file
"""
2013-03-18 03:32:19 +04:00
def _make_bin_wrappers ( self ) :
2020-01-27 01:12:09 +03:00
template = """ #!/usr/bin/env python3
import os
import sys
sys . path . insert ( 0 , " %(sharepath)s " )
from % ( pkgname ) s import % ( filename ) s
% ( filename ) s . runcli ( )
"""
2013-03-18 03:32:19 +04:00
if not os . path . exists ( " build " ) :
os . mkdir ( " build " )
2020-01-27 01:12:09 +03:00
sharepath = os . path . join ( BuildConfig . prefix , " share " , " virt-manager " )
2013-03-18 03:32:19 +04:00
2020-01-27 01:12:09 +03:00
def make_script ( pkgname , filename , toolname ) :
assert os . path . exists ( pkgname + " / " + filename + " .py " )
content = template % {
" sharepath " : sharepath ,
" pkgname " : pkgname ,
" filename " : filename }
2013-03-18 03:32:19 +04:00
2020-01-27 01:12:09 +03:00
newpath = os . path . abspath ( os . path . join ( " build " , toolname ) )
2017-05-05 21:16:59 +03:00
print ( " Generating %s " % newpath )
2020-01-27 01:12:09 +03:00
open ( newpath , " w " ) . write ( content )
make_script ( " virtinst " , " virtinstall " , " virt-install " )
make_script ( " virtinst " , " virtclone " , " virt-clone " )
make_script ( " virtinst " , " virtxml " , " virt-xml " )
make_script ( " virtManager " , " virtmanager " , " virt-manager " )
2013-03-18 03:32:19 +04:00
def _make_man_pages ( self ) :
for path in glob . glob ( " man/*.pod " ) :
base = os . path . basename ( path )
2014-09-07 02:05:43 +04:00
appname = os . path . splitext ( base ) [ 0 ]
2013-03-18 03:32:19 +04:00
newpath = os . path . join ( os . path . dirname ( path ) ,
2014-09-07 02:05:43 +04:00
appname + " .1 " )
2013-03-18 03:32:19 +04:00
2017-05-05 21:16:59 +03:00
print ( " Generating %s " % newpath )
2013-08-19 00:04:54 +04:00
ret = os . system ( ' pod2man '
2013-03-18 03:32:19 +04:00
' --center " Virtual Machine Manager " '
2013-08-19 00:04:54 +04:00
' --release %s --name %s '
2019-06-14 23:34:00 +03:00
' < %s > %s ' % ( BuildConfig . version ,
2013-08-19 00:04:54 +04:00
appname . upper ( ) ,
path , newpath ) )
2013-03-18 03:32:19 +04:00
if ret != 0 :
raise RuntimeError ( " Generating ' %s ' failed. " % newpath )
if os . system ( " grep -IRq ' Hey! ' man/ " ) == 0 :
raise RuntimeError ( " man pages have errors in them! "
" (grep for ' Hey! ' ) " )
2013-04-19 00:51:44 +04:00
def _build_icons ( self ) :
for size in glob . glob ( os . path . join ( " data/icons " , " * " ) ) :
2013-03-17 05:32:29 +04:00
for category in glob . glob ( os . path . join ( size , " * " ) ) :
icons = [ ]
2013-04-13 22:34:52 +04:00
for icon in glob . glob ( os . path . join ( category , " * " ) ) :
2013-04-19 00:51:44 +04:00
icons . append ( icon )
2013-03-17 05:32:29 +04:00
if not icons :
continue
category = os . path . basename ( category )
dest = ( " share/icons/hicolor/ %s / %s " %
( os . path . basename ( size ) , category ) )
if category != " apps " :
dest = dest . replace ( " share/ " , " share/virt-manager/ " )
2013-04-19 00:51:44 +04:00
self . distribution . data_files . append ( ( dest , icons ) )
2018-12-07 11:28:55 +03:00
def _make_bash_completion_files ( self ) :
2020-01-25 00:18:00 +03:00
scripts = [ " virt-install " , " virt-clone " , " virt-xml " ]
2018-12-18 19:58:52 +03:00
srcfile = " data/bash-completion.sh.in "
builddir = " build/bash-completion/ "
if not os . path . exists ( builddir ) :
os . makedirs ( builddir )
instpaths = [ ]
2018-12-07 11:28:55 +03:00
for script in scripts :
2018-12-18 19:58:52 +03:00
genfile = os . path . join ( builddir , script )
print ( " Generating %s " % genfile )
src = open ( srcfile , " r " )
dst = open ( genfile , " w " )
dst . write ( src . read ( ) . replace ( " ::SCRIPTNAME:: " , script ) )
dst . close ( )
instpaths . append ( genfile )
2018-12-07 11:28:55 +03:00
2018-12-18 19:58:52 +03:00
bashdir = " share/bash-completion/completions/ "
self . distribution . data_files . append ( ( bashdir , instpaths ) )
2018-12-07 11:28:55 +03:00
2013-04-19 00:51:44 +04:00
def run ( self ) :
self . _make_bin_wrappers ( )
self . _make_man_pages ( )
self . _build_icons ( )
2018-12-07 11:28:55 +03:00
self . _make_bash_completion_files ( )
2013-04-19 00:51:44 +04:00
self . run_command ( " build_i18n " )
2015-11-03 01:06:46 +03:00
distutils . command . build . build . run ( self )
2013-03-17 05:32:29 +04:00
2015-11-03 01:06:46 +03:00
class my_egg_info ( distutils . command . install_egg_info . install_egg_info ) :
2013-03-17 05:32:29 +04:00
"""
Disable egg_info installation , seems pointless for a non - library
"""
def run ( self ) :
pass
2015-11-03 01:06:46 +03:00
class my_install ( distutils . command . install . install ) :
2013-04-11 01:25:39 +04:00
"""
Error if we weren ' t ' configure ' d with the correct install prefix
"""
def finalize_options ( self ) :
if self . prefix is None :
2019-06-14 23:34:00 +03:00
if BuildConfig . prefix != sysprefix :
2017-05-05 21:16:59 +03:00
print ( " Using configured prefix= %s instead of sysprefix= %s " % (
2019-06-14 23:34:00 +03:00
BuildConfig . prefix , sysprefix ) )
self . prefix = BuildConfig . prefix
2015-09-24 02:29:13 +03:00
else :
2017-05-05 21:16:59 +03:00
print ( " Using sysprefix= %s " % sysprefix )
2015-09-24 02:29:13 +03:00
self . prefix = sysprefix
2019-06-14 23:34:00 +03:00
elif self . prefix != BuildConfig . prefix :
2014-02-12 19:30:48 +04:00
print ( " Install prefix= %s doesn ' t match configure prefix= %s \n "
" Pass matching --prefix to ' setup.py configure ' " %
2019-06-14 23:34:00 +03:00
( self . prefix , BuildConfig . prefix ) )
2013-04-11 01:25:39 +04:00
sys . exit ( 1 )
2015-11-03 01:06:46 +03:00
distutils . command . install . install . finalize_options ( self )
2013-04-11 01:25:39 +04:00
2013-04-17 04:44:16 +04:00
2015-11-03 00:19:31 +03:00
class my_install_data ( distutils . command . install_data . install_data ) :
def run ( self ) :
distutils . command . install_data . install_data . run ( self )
if not self . distribution . no_update_icon_cache :
distutils . log . info ( " running gtk-update-icon-cache " )
icon_path = os . path . join ( self . install_dir , " share/icons/hicolor " )
self . spawn ( [ " gtk-update-icon-cache " , " -q " , " -t " , icon_path ] )
if not self . distribution . no_compile_schemas :
distutils . log . info ( " compiling gsettings schemas " )
gschema_install = os . path . join ( self . install_dir ,
" share/glib-2.0/schemas " )
self . spawn ( [ " glib-compile-schemas " , gschema_install ] )
2015-11-03 01:06:46 +03:00
class my_sdist ( distutils . command . sdist . sdist ) :
2013-04-17 16:25:07 +04:00
description = " Update virt-manager.spec; build sdist-tarball. "
def run ( self ) :
f1 = open ( ' virt-manager.spec.in ' , ' r ' )
f2 = open ( ' virt-manager.spec ' , ' w ' )
for line in f1 :
2019-06-14 23:34:00 +03:00
f2 . write ( line . replace ( ' @VERSION@ ' , BuildConfig . version ) )
2013-04-17 16:25:07 +04:00
f1 . close ( )
f2 . close ( )
2013-04-17 23:14:52 +04:00
2015-11-03 01:06:46 +03:00
distutils . command . sdist . sdist . run ( self )
2013-04-17 16:25:07 +04:00
2013-04-11 01:25:39 +04:00
2013-03-17 05:32:29 +04:00
###################
# Custom commands #
###################
2015-11-03 01:06:46 +03:00
class my_rpm ( distutils . core . Command ) :
2015-04-06 21:51:14 +03:00
user_options = [ ]
2013-04-17 04:44:16 +04:00
description = " Build src and noarch rpms. "
2013-03-17 05:32:29 +04:00
def initialize_options ( self ) :
2015-04-06 21:51:14 +03:00
pass
2013-03-17 05:32:29 +04:00
def finalize_options ( self ) :
2015-04-06 21:51:14 +03:00
pass
2013-03-17 05:32:29 +04:00
def run ( self ) :
"""
Run sdist , then ' rpmbuild ' the tar . gz
"""
self . run_command ( ' sdist ' )
2013-04-17 04:44:16 +04:00
os . system ( ' rpmbuild -ta --clean dist/virt-manager- %s .tar.gz ' %
2019-06-14 23:34:00 +03:00
BuildConfig . version )
2013-03-17 05:32:29 +04:00
2015-11-03 01:06:46 +03:00
class configure ( distutils . core . Command ) :
2013-03-17 05:32:29 +04:00
user_options = [
2013-04-11 01:25:39 +04:00
( " prefix= " , None , " installation prefix " ) ,
2013-03-17 05:32:29 +04:00
( " default-graphics= " , None ,
2013-05-28 02:51:12 +04:00
" Default graphics type (spice or vnc) (default=spice) " ) ,
2015-04-06 23:29:28 +03:00
( " default-hvs= " , None ,
" Comma separated list of hypervisors shown in ' Open Connection ' "
" wizard. (default=all hvs) " ) ,
2013-03-17 05:32:29 +04:00
]
description = " Configure the build, similar to ./configure "
def finalize_options ( self ) :
pass
def initialize_options ( self ) :
2013-04-11 01:25:39 +04:00
self . prefix = sysprefix
2013-10-03 02:50:01 +04:00
self . default_graphics = None
2015-04-06 23:29:28 +03:00
self . default_hvs = None
2013-03-17 05:32:29 +04:00
def run ( self ) :
template = " "
template + = " [config] \n "
2013-04-11 01:25:39 +04:00
template + = " prefix = %s \n " % self . prefix
2013-10-03 02:50:01 +04:00
if self . default_graphics is not None :
template + = " default_graphics = %s \n " % self . default_graphics
2015-04-06 23:29:28 +03:00
if self . default_hvs is not None :
template + = " default_hvs = %s \n " % self . default_hvs
2013-03-17 05:32:29 +04:00
2019-06-14 23:34:00 +03:00
open ( BuildConfig . cfgpath , " w " ) . write ( template )
print ( " Generated %s " % BuildConfig . cfgpath )
2013-03-17 05:32:29 +04:00
2015-11-03 01:06:46 +03:00
class TestBaseCommand ( distutils . core . Command ) :
2013-07-03 01:37:45 +04:00
user_options = [
( ' debug ' , ' d ' , ' Show debug output ' ) ,
2018-02-22 22:18:18 +03:00
( ' testverbose ' , None , ' Show verbose output ' ) ,
2013-07-14 00:32:46 +04:00
( ' coverage ' , ' c ' , ' Show coverage report ' ) ,
2014-02-04 00:53:54 +04:00
( ' regenerate-output ' , None , ' Regenerate test output ' ) ,
2013-07-14 00:32:46 +04:00
( " only= " , None ,
" Run only testcases whose name contains the passed string " ) ,
2015-09-07 01:37:49 +03:00
( " testfile= " , None , " Specific test file to run (e.g "
" validation, storage, ...) " ) ,
2013-07-03 01:37:45 +04:00
]
2013-03-18 02:18:22 +04:00
def initialize_options ( self ) :
self . debug = 0
2018-02-22 22:18:18 +03:00
self . testverbose = 0
2014-02-04 00:53:54 +04:00
self . regenerate_output = 0
2013-07-03 01:37:45 +04:00
self . coverage = 0
2013-07-14 00:32:46 +04:00
self . only = None
2013-03-18 02:18:22 +04:00
self . _testfiles = [ ]
2019-06-16 21:24:31 +03:00
self . _clistate = { }
2013-03-18 02:18:22 +04:00
self . _dir = os . getcwd ( )
2015-09-07 01:37:49 +03:00
self . testfile = None
2018-01-08 15:07:55 +03:00
self . _force_verbose = False
2018-01-09 02:00:14 +03:00
self . _external_coverage = False
2020-01-27 18:44:09 +03:00
self . _urlfetcher_mock = False
2013-03-18 02:18:22 +04:00
def finalize_options ( self ) :
2016-06-11 22:52:08 +03:00
if self . only :
# Can do --only many-devices to match on the cli testcase
# for "virt-install-many-devices", despite the actual test
# function name not containing any '-'
self . only = self . only . replace ( " - " , " _ " )
2013-03-18 02:18:22 +04:00
2015-09-07 01:37:49 +03:00
def _find_tests_in_dir ( self , dirname , excludes ) :
testfiles = [ ]
for t in sorted ( glob . glob ( os . path . join ( self . _dir , dirname , ' *.py ' ) ) ) :
base = os . path . basename ( t )
if base in excludes + [ " __init__.py " ] :
continue
if self . testfile :
check = os . path . basename ( self . testfile )
if base != check and base != ( check + " .py " ) :
continue
testfiles . append ( ' . ' . join (
dirname . split ( " / " ) + [ os . path . splitext ( base ) [ 0 ] ] ) )
if not testfiles :
raise RuntimeError ( " --testfile didn ' t catch anything " )
return testfiles
2013-03-18 02:18:22 +04:00
def run ( self ) :
2018-01-08 15:03:25 +03:00
cov = None
if self . coverage :
2013-03-18 02:18:22 +04:00
import coverage
2019-06-09 18:36:07 +03:00
omit = [ " /usr/* " , " /*/tests/* " , " *progress.py " ]
2020-07-05 15:30:14 +03:00
cov = coverage . coverage ( )
2013-07-03 01:37:45 +04:00
cov . erase ( )
2018-01-09 02:00:14 +03:00
if not self . _external_coverage :
cov . start ( )
2013-07-03 01:37:45 +04:00
import tests as testsmodule
2018-01-09 01:05:55 +03:00
testsmodule . utils . clistate . regenerate_output = bool (
self . regenerate_output )
2018-01-09 02:00:14 +03:00
testsmodule . utils . clistate . use_coverage = bool ( cov )
2018-02-22 21:46:24 +03:00
testsmodule . utils . clistate . debug = bool ( self . debug )
2019-06-16 21:24:31 +03:00
for key , val in self . _clistate . items ( ) :
setattr ( testsmodule . utils . clistate , key , val )
2018-02-22 21:46:24 +03:00
testsmodule . setup_logging ( )
2020-01-27 18:44:09 +03:00
if self . _urlfetcher_mock :
import tests . urlfetcher_mock
tests . urlfetcher_mock . setup_mock ( )
2013-03-18 02:18:22 +04:00
2018-01-08 16:44:54 +03:00
# This makes the test runner report results before exiting from ctrl-c
unittest . installHandler ( )
2013-03-18 02:18:22 +04:00
2013-07-14 00:32:46 +04:00
tests = unittest . TestLoader ( ) . loadTestsFromNames ( self . _testfiles )
if self . only :
newtests = [ ]
for suite1 in tests :
for suite2 in suite1 :
for testcase in suite2 :
if self . only in str ( testcase ) :
newtests . append ( testcase )
if not newtests :
2017-05-05 21:16:59 +03:00
print ( " --only didn ' t find any tests " )
2013-07-14 00:32:46 +04:00
sys . exit ( 1 )
tests = unittest . TestSuite ( newtests )
2017-05-05 21:16:59 +03:00
print ( " Running only: " )
2013-07-14 00:32:46 +04:00
for test in newtests :
2017-05-05 21:16:59 +03:00
print ( " %s " % test )
2017-07-10 14:48:30 +03:00
print ( " " )
2013-07-14 00:32:46 +04:00
2018-01-08 15:07:55 +03:00
verbosity = 1
2018-02-22 22:18:18 +03:00
if self . debug or self . testverbose or self . _force_verbose :
2018-01-08 15:07:55 +03:00
verbosity = 2
t = unittest . TextTestRunner ( verbosity = verbosity )
2013-07-14 00:32:46 +04:00
2013-03-18 02:18:22 +04:00
try :
result = t . run ( tests )
except KeyboardInterrupt :
sys . exit ( 1 )
2018-01-08 15:03:25 +03:00
if cov :
2018-01-09 02:00:14 +03:00
if self . _external_coverage :
cov . load ( )
else :
cov . stop ( )
cov . save ( )
2013-07-03 01:37:45 +04:00
err = int ( bool ( len ( result . failures ) > 0 or
len ( result . errors ) > 0 ) )
2020-01-27 14:16:32 +03:00
if getattr ( result , " shouldStop " , False ) :
# Test was aborted with ctrl-c
err = True
2018-01-08 15:03:25 +03:00
if cov and not err :
2020-01-27 14:16:32 +03:00
if len ( result . skipped ) :
print ( " Skipping coverage report because tests were skipped. " )
else :
cov . report ( show_missing = False , skip_covered = True )
2013-07-03 01:37:45 +04:00
sys . exit ( err )
2013-03-18 02:18:22 +04:00
class TestCommand ( TestBaseCommand ) :
description = " Runs a quick unit test suite "
def run ( self ) :
'''
Finds all the tests modules in tests / , and runs them .
'''
2020-01-27 18:44:09 +03:00
self . _urlfetcher_mock = True
2020-01-27 02:29:39 +03:00
excludes = [ " test_dist.py " , " test_urls.py " , " test_inject.py " ]
2015-09-07 01:37:49 +03:00
testfiles = self . _find_tests_in_dir ( " tests " , excludes )
2013-03-18 02:18:22 +04:00
2020-01-27 02:29:39 +03:00
# Put test_cli at the end, since it takes the longest
2015-04-22 03:12:37 +03:00
for f in testfiles [ : ] :
2020-01-27 02:29:39 +03:00
if " test_cli " in f :
2015-04-22 03:12:37 +03:00
testfiles . remove ( f )
testfiles . append ( f )
2020-01-27 02:29:39 +03:00
# Always want to put test_checkprops at the end to get accurate results
2015-04-22 03:12:37 +03:00
for f in testfiles [ : ] :
2020-01-27 02:29:39 +03:00
if " test_checkprops " in f :
2015-04-22 03:12:37 +03:00
testfiles . remove ( f )
2018-01-06 02:14:23 +03:00
if not self . testfile :
2015-04-22 03:12:37 +03:00
testfiles . append ( f )
2013-03-18 02:18:22 +04:00
self . _testfiles = testfiles
TestBaseCommand . run ( self )
2015-09-07 01:37:49 +03:00
class TestUI ( TestBaseCommand ) :
description = " Run UI dogtails tests "
def run ( self ) :
self . _testfiles = self . _find_tests_in_dir ( " tests/uitests " , [ ] )
2018-01-08 15:07:55 +03:00
self . _force_verbose = True
2018-01-09 02:00:14 +03:00
self . _external_coverage = True
2015-09-07 01:37:49 +03:00
TestBaseCommand . run ( self )
2013-03-18 02:18:22 +04:00
class TestURLFetch ( TestBaseCommand ) :
description = " Test fetching kernels and isos from various distro trees "
2019-03-24 18:22:50 +03:00
user_options = TestBaseCommand . user_options + [
( ' skip-libosinfo ' , None ,
" Don ' t use libosinfo for media/tree detection, "
" Use our internal detection logic. " ) ,
( ' force-libosinfo ' , None ,
" Only use libosinfo for media/tree detection. This will skip "
" some cases that are known not to work, like debian/ubuntu "
" tree detection. " ) ,
( ' iso-only ' , None , " Only run iso tests " ) ,
( ' url-only ' , None , " Only run url tests " ) ,
]
def initialize_options ( self ) :
TestBaseCommand . initialize_options ( self )
self . skip_libosinfo = 0
self . force_libosinfo = 0
self . iso_only = 0
self . url_only = 0
def finalize_options ( self ) :
TestBaseCommand . finalize_options ( self )
2013-03-18 02:18:22 +04:00
def run ( self ) :
2013-09-26 02:52:41 +04:00
self . _testfiles = [ " tests.test_urls " ]
2019-06-16 21:24:31 +03:00
self . _clistate = {
" url_iso_only " : bool ( self . iso_only ) ,
" url_only " : bool ( self . url_only ) ,
" url_skip_libosinfo " : bool ( self . skip_libosinfo ) ,
" url_force_libosinfo " : bool ( self . force_libosinfo ) ,
}
2013-03-18 02:18:22 +04:00
TestBaseCommand . run ( self )
2013-09-28 22:42:37 +04:00
class TestInitrdInject ( TestBaseCommand ) :
description = " Test initrd inject with real kernels, fetched from URLs "
def run ( self ) :
self . _testfiles = [ " tests.test_inject " ]
TestBaseCommand . run ( self )
2018-02-20 20:33:57 +03:00
class TestDist ( TestBaseCommand ) :
description = " Tests to run before cutting a release "
def run ( self ) :
2020-01-27 02:29:39 +03:00
self . _testfiles = [ " tests.test_dist " ]
2018-02-20 20:33:57 +03:00
TestBaseCommand . run ( self )
2015-11-03 01:06:46 +03:00
class CheckPylint ( distutils . core . Command ) :
2017-09-09 12:08:31 +03:00
user_options = [
( " jobs= " , " j " , " use multiple processes to speed up Pylint " ) ,
]
2017-07-24 11:26:47 +03:00
description = " Check code using pylint and pycodestyle "
2013-04-11 00:02:28 +04:00
def initialize_options ( self ) :
2017-09-09 12:08:31 +03:00
self . jobs = None
2013-04-11 00:02:28 +04:00
def finalize_options ( self ) :
2017-09-09 12:08:31 +03:00
if self . jobs :
self . jobs = int ( self . jobs )
2013-04-11 00:02:28 +04:00
def run ( self ) :
2018-03-02 11:01:21 +03:00
import pylint . lint
2018-03-02 11:01:25 +03:00
import pycodestyle
2018-03-02 11:01:21 +03:00
2020-01-28 22:31:28 +03:00
lintfiles = [ " setup.py " , " virtinst " , " virtManager " , " tests " ]
spellfiles = lintfiles [ : ]
spellfiles + = list ( glob . glob ( " *.md " ) )
spellfiles + = list ( glob . glob ( " man/*.pod " ) )
spellfiles + = [ " data/virt-manager.appdata.xml.in " ,
" data/virt-manager.desktop.in " ,
" data/org.virt-manager.virt-manager.gschema.xml " ,
" virt-manager.spec.in " ]
spellfiles . remove ( " NEWS.md " )
2013-04-11 00:02:28 +04:00
2019-05-16 14:19:17 +03:00
try :
import codespell_lib
# pylint: disable=protected-access
print ( " running codespell " )
codespell_lib . _codespell . main (
2020-01-27 02:11:43 +03:00
' -I ' , ' tests/data/codespell_dict.txt ' ,
2020-01-28 22:31:28 +03:00
' --skip ' , ' *.pyc,*.iso,*.xml ' , * spellfiles )
2019-05-16 14:19:17 +03:00
except ImportError :
print ( " codespell is not installed. skipping... " )
except Exception as e :
print ( " Error running codespell: %s " % e )
2013-04-11 00:02:28 +04:00
output_format = sys . stdout . isatty ( ) and " colorized " or " text "
2017-07-24 11:26:47 +03:00
print ( " running pycodestyle " )
2018-03-02 11:01:25 +03:00
style_guide = pycodestyle . StyleGuide (
2019-01-27 01:56:23 +03:00
config_file = ' setup.cfg ' ,
2019-01-27 02:04:26 +03:00
format = " pylint " ,
2020-01-28 22:31:28 +03:00
paths = lintfiles ,
2018-03-02 11:01:25 +03:00
)
report = style_guide . check_files ( )
if style_guide . options . count :
sys . stderr . write ( str ( report . total_errors ) + ' \n ' )
2013-04-13 22:34:52 +04:00
2017-05-05 21:16:59 +03:00
print ( " running pylint " )
2018-03-02 11:01:21 +03:00
pylint_opts = [
2019-01-27 01:53:10 +03:00
" --rcfile " , " pylintrc " ,
2018-03-02 11:01:21 +03:00
" --output-format= %s " % output_format ,
2018-10-25 15:37:42 +03:00
]
2017-09-09 12:08:31 +03:00
if self . jobs :
2018-03-02 11:01:21 +03:00
pylint_opts + = [ " --jobs= %d " % self . jobs ]
2020-01-28 22:31:28 +03:00
pylint . lint . Run ( lintfiles + pylint_opts )
2015-09-13 22:07:23 +03:00
2013-04-11 00:02:28 +04:00
2015-11-03 00:19:31 +03:00
class VMMDistribution ( distutils . dist . Distribution ) :
global_options = distutils . dist . Distribution . global_options + [
( " no-update-icon-cache " , None , " Don ' t run gtk-update-icon-cache " ) ,
( " no-compile-schemas " , None , " Don ' t compile gsettings schemas " ) ,
]
def __init__ ( self , * args , * * kwargs ) :
self . no_update_icon_cache = False
self . no_compile_schemas = False
distutils . dist . Distribution . __init__ ( self , * args , * * kwargs )
2020-07-08 17:54:13 +03:00
class ExtractMessages ( distutils . core . Command ) :
user_options = [
]
description = " Extract the translation messages "
def initialize_options ( self ) :
pass
def finalize_options ( self ) :
pass
def run ( self ) :
bug_address = " https://github.com/virt-manager/virt-manager/issues "
2020-07-12 01:30:31 +03:00
potfile = " po/virt-manager.pot "
2020-07-08 17:54:13 +03:00
xgettext_args = [
" xgettext " ,
2020-07-12 01:46:33 +03:00
" --add-comments=translators " ,
2020-07-08 17:54:13 +03:00
" --msgid-bugs-address= " + bug_address ,
" --package-name=virt-manager " ,
2020-07-12 01:30:31 +03:00
" --output= " + potfile ,
" --sort-by-file " ,
" --join-existing " ,
2020-07-08 17:54:13 +03:00
]
2020-07-12 01:30:31 +03:00
# Truncate .pot file to ensure it exists
open ( potfile , " w " ) . write ( " " )
2020-07-08 17:54:17 +03:00
# First extract the messages from the AppStream sources,
# creating the template
appdata_files = [ f for sublist in _appdata_files for f in sublist [ 1 ] ]
cmd = xgettext_args + appdata_files
self . spawn ( cmd )
2020-07-08 17:54:13 +03:00
2020-07-08 17:54:16 +03:00
# Extract the messages from the desktop files
desktop_files = [ f for sublist in _desktop_files for f in sublist [ 1 ] ]
2020-07-12 01:30:31 +03:00
cmd = xgettext_args + [ " --language=Desktop " ] + desktop_files
2020-07-08 17:54:16 +03:00
self . spawn ( cmd )
2020-07-08 17:54:13 +03:00
# Extract the messages from the Python sources
py_sources = list ( Path ( " virtManager " ) . rglob ( " *.py " ) )
py_sources + = list ( Path ( " virtinst " ) . rglob ( " *.py " ) )
py_sources = [ str ( src ) for src in py_sources ]
2020-07-12 01:30:31 +03:00
cmd = xgettext_args + [ " --language=Python " ] + py_sources
2020-07-08 17:54:13 +03:00
self . spawn ( cmd )
# Extract the messages from the Glade UI files
ui_files = list ( Path ( " . " ) . rglob ( " *.ui " ) )
ui_files = [ str ( src ) for src in ui_files ]
2020-07-12 01:30:31 +03:00
cmd = xgettext_args + [ " --language=Glade " ] + ui_files
2020-07-08 17:54:13 +03:00
self . spawn ( cmd )
2015-11-03 01:06:46 +03:00
distutils . core . setup (
2013-04-13 22:34:52 +04:00
name = " virt-manager " ,
2019-06-17 18:14:39 +03:00
version = BuildConfig . version ,
2013-04-13 22:34:52 +04:00
author = " Cole Robinson " ,
author_email = " virt-tools-list@redhat.com " ,
url = " http://virt-manager.org " ,
license = " GPLv2+ " ,
2013-03-17 05:32:29 +04:00
2013-03-18 03:32:19 +04:00
# These wrappers are generated in our custom build command
2013-04-13 22:34:52 +04:00
scripts = ( [
2013-03-18 03:32:19 +04:00
" build/virt-manager " ,
" build/virt-clone " ,
" build/virt-install " ,
2014-01-19 19:37:14 +04:00
" build/virt-xml " ] ) ,
2013-03-17 05:32:29 +04:00
2013-04-13 22:34:52 +04:00
data_files = [
2013-04-18 01:39:25 +04:00
( " share/glib-2.0/schemas " ,
[ " data/org.virt-manager.virt-manager.gschema.xml " ] ) ,
2013-03-17 05:32:29 +04:00
( " share/virt-manager/ui " , glob . glob ( " ui/*.ui " ) ) ,
2013-03-18 03:32:19 +04:00
( " share/man/man1 " , [
" man/virt-manager.1 " ,
" man/virt-install.1 " ,
" man/virt-clone.1 " ,
2014-01-19 19:37:14 +04:00
" man/virt-xml.1 "
2013-03-18 03:32:19 +04:00
] ) ,
2013-03-17 05:32:29 +04:00
2019-06-17 08:27:08 +03:00
( " share/virt-manager/virtManager " , glob . glob ( " virtManager/*.py " ) ) ,
( " share/virt-manager/virtManager/details " ,
glob . glob ( " virtManager/details/*.py " ) ) ,
( " share/virt-manager/virtManager/device " ,
glob . glob ( " virtManager/device/*.py " ) ) ,
( " share/virt-manager/virtManager/lib " ,
glob . glob ( " virtManager/lib/*.py " ) ) ,
( " share/virt-manager/virtManager/object " ,
glob . glob ( " virtManager/object/*.py " ) ) ,
2019-06-14 23:34:00 +03:00
( " share/virt-manager/virtinst " ,
2019-06-17 08:27:08 +03:00
glob . glob ( " virtinst/*.py " ) + glob . glob ( " virtinst/build.cfg " ) ) ,
( " share/virt-manager/virtinst/devices " ,
glob . glob ( " virtinst/devices/*.py " ) ) ,
( " share/virt-manager/virtinst/domain " ,
glob . glob ( " virtinst/domain/*.py " ) ) ,
( " share/virt-manager/virtinst/install " ,
glob . glob ( " virtinst/install/*.py " ) ) ,
2013-04-19 00:03:43 +04:00
] ,
2013-03-17 05:32:29 +04:00
2013-04-13 22:34:52 +04:00
cmdclass = {
2013-03-17 05:32:29 +04:00
' build ' : my_build ,
' build_i18n ' : my_build_i18n ,
2013-04-11 01:25:39 +04:00
2013-04-17 16:25:07 +04:00
' sdist ' : my_sdist ,
2013-04-11 01:25:39 +04:00
' install ' : my_install ,
2015-11-03 00:19:31 +03:00
' install_data ' : my_install_data ,
2013-03-17 05:32:29 +04:00
' install_egg_info ' : my_egg_info ,
' configure ' : configure ,
2013-04-11 00:02:28 +04:00
' pylint ' : CheckPylint ,
2013-03-17 05:32:29 +04:00
' rpm ' : my_rpm ,
2013-03-18 02:18:22 +04:00
' test ' : TestCommand ,
2015-09-07 01:37:49 +03:00
' test_ui ' : TestUI ,
2017-08-05 09:39:32 +03:00
' test_urls ' : TestURLFetch ,
' test_initrd_inject ' : TestInitrdInject ,
2018-02-20 20:33:57 +03:00
' test_dist ' : TestDist ,
2020-07-08 17:54:13 +03:00
' extract_messages ' : ExtractMessages ,
2015-11-03 00:19:31 +03:00
} ,
distclass = VMMDistribution ,
2013-03-17 05:32:29 +04:00
)