00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 """
00011 Class PackageVersions launches subprocesses for slow command "psvn tags <pkg-name>"
00012 in background mode and saves results in log-files for list of package names.
00013 Access methods parse log-files and quickly extract the package version when needed.
00014
00015 This software was developed for the SIT project.
00016 If you use all or part of it, please give an appropriate acknowledgment.
00017
00018 @see
00019
00020 @version $Id: PackageVersions.py 9895 2015-04-10 00:59:28Z dubrovin@SLAC.STANFORD.EDU $
00021
00022 @author Mikhail S. Dubrovin
00023 """
00024
00025
00026
00027
00028 __version__ = "$Revision: 9895 $"
00029
00030
00031
00032
00033
00034
00035 import sys
00036 import os
00037 import subprocess
00038 from commands import getoutput
00039 import tempfile
00040 from time import time, sleep
00041
00042 from CalibManager.SvnProps import svnprops as spcm
00043 from ImgAlgos.SvnProps import svnprops as spia
00044 from PSCalib.SvnProps import svnprops as spps
00045 from pdscalibdata.SvnProps import svnprops as spcd
00046 from CSPadPixCoords.SvnProps import svnprops as sppc
00047
00048 from CalibManager.SvnPropsViewer import SvnPropsViewer
00049
00050 from CalibManager.GlobalUtils import ready_to_start
00051
00052
00053
00054
00055
00056 def subproc_submit(command_seq, logname=None, env=None, shell=False) :
00057
00058 log = subprocess.PIPE if logname is None else open(logname, 'w')
00059 p = subprocess.Popen(command_seq, stdout=log, stderr=subprocess.PIPE, env=env, shell=shell)
00060
00061
00062
00063
00064 def get_text_from_file(path) :
00065 f=open(path,'r')
00066 text = f.read()
00067 f.close()
00068 return text
00069
00070 def get_tempfname(mode='w+b',prefix='calibman-',suffix='.txt') :
00071 return tempfile.NamedTemporaryFile(mode=mode,prefix=prefix,suffix=suffix).name
00072
00073
00074
00075 class PackageVersions :
00076 """Get info about tags of packages involved in the project
00077 """
00078 def __init__(self, list_of_pkgs = ['CalibManager', 'ImgAlgos', 'PSCalib', 'pdscalibdata', 'CSPadPixCoords'], print_bits=0) :
00079 t0_sec = time()
00080 self.list_of_pkgs = list_of_pkgs
00081 self.print_bits = print_bits
00082 self.delete_old_tmp_files()
00083 if self.print_bits & 1 : print 'PackageVersions: Old temporary files are deleted'
00084 self.make_logfiles_in_background_mode()
00085 if self.print_bits & 2 : print 'PackageVersions: make_logfiles_in_background_mode() is started'
00086
00087
00088
00089
00090
00091 def delete_old_tmp_files(self) :
00092 cmd = 'rm -f /tmp/calibman-*txt'
00093 try :
00094
00095 output = getoutput(cmd)
00096 if self.print_bits & 4 : print 'delete_old_tmp_files(...):\n', output
00097
00098
00099 except :
00100 if self.print_bits & 4 : print 'delete_old_tmp_files(...):\nSome problem with cleanup tmp files "%s"' % cmd
00101
00102
00103 def make_logfiles_in_background_mode(self) :
00104 """Returns dictionary with temporary file names for packages as keys"""
00105
00106 self.dict_pkg_fname = {pkg:get_tempfname() for pkg in self.list_of_pkgs}
00107 for pkg, fname in self.dict_pkg_fname.iteritems() :
00108 cmd = 'psvn tags %s' % pkg
00109 subproc_submit(cmd.split(), fname)
00110
00111
00112 def print_list_of_packages(self) :
00113 for pkg, fname in self.dict_pkg_fname.iteritems() :
00114 print pkg, fname
00115
00116
00117 def get_text_from_log_for_pkg(self, pkg) :
00118 fname = self.dict_pkg_fname[pkg]
00119 return get_text_from_file(fname)
00120
00121
00122 def print_log_for_pkg(self, pkg) :
00123 print self.get_text_from_log_for_pkg(pkg)
00124
00125
00126 def get_revision_str(self, props) :
00127 spv = SvnPropsViewer(props)
00128 return spv.get_pkg_revision()
00129
00130
00131 def get_revision_msg(self, props) :
00132 spv = SvnPropsViewer(props)
00133 return 'RN-%s' % spv.get_pkg_revision()
00134
00135
00136 def get_pkg_revision(self, pkg='CalibManager') :
00137 """Returns package revision number"""
00138 if pkg=='CalibManager' : return self.get_revision_str(spcm)
00139 elif pkg=='ImgAlgos' : return self.get_revision_str(spia)
00140 elif pkg=='PSCalib' : return self.get_revision_str(spps)
00141 elif pkg=='pdscalibdata' : return self.get_revision_str(spcd)
00142 elif pkg=='CSPadPixCoords' : return self.get_revision_str(sppc)
00143
00144
00145
00146
00147
00148
00149
00150 else : return 'N/A'
00151
00152
00153 def get_pkg_tag(self, pkg='CalibManager') :
00154 """Returns the latest version of the package"""
00155 try :
00156 output = self.get_text_from_log_for_pkg(pkg).rstrip('\n')
00157 lines = output.split('\n')
00158 last_line = lines[-1]
00159 fields = last_line.split()
00160 version = fields[-1].rstrip('/')
00161
00162
00163
00164 return version
00165 except :
00166 return 'V-is-N/A'
00167
00168
00169 def get_pkg_version(self, pkg='CalibManager') :
00170 """Returns the latest version of the package"""
00171 return self.get_pkg_revision(pkg)
00172
00173
00174
00175 def get_tag_for_rev(self, pkg='CalibManager', rev_inq='8050') :
00176 """Returns the package tag for """
00177 try :
00178 rev_num = int(rev_inq)
00179
00180 output = self.get_text_from_log_for_pkg(pkg).rstrip('\n')
00181 lines = output.split('\n')
00182 for line in lines[1:] :
00183
00184 fields = line.split()
00185 rev = fields[0]
00186 tag = fields[-1].rstrip('/')
00187
00188 if int(rev) >= rev_num :
00189 return tag
00190
00191 except :
00192 return 'V-is-N/A'
00193
00194
00195 def text_version_for_all_packages(self) :
00196 txt = 'Version of packages'
00197 for pkg in self.list_of_pkgs :
00198 txt += '\n %s %s' % (self.get_pkg_version(pkg), pkg)
00199 return txt
00200
00201
00202 def text_rev_and_tag_for_all_packages(self) :
00203 txt = 'Revision and tag of packages'
00204 for pkg in self.list_of_pkgs :
00205 rev = self.get_pkg_revision(pkg)
00206 tag = self.get_tag_for_rev(pkg,rev)
00207 txt += '\n %s %s %s' % (rev, tag, pkg)
00208
00209 return txt
00210
00211
00212
00213
00214 def test_packege_version(test_num):
00215
00216 print 'Test: %d' % test_num
00217
00218 if not ready_to_start(check_bits=02, fatal_bits=02) :
00219 sys.exit('Not ready to start aplication yet...')
00220
00221 pv = PackageVersions(print_bits=0377)
00222
00223 t0_sec = time()
00224
00225 if test_num == 0 :
00226 pv.print_list_of_packages()
00227 else :
00228 sleep(4)
00229 t0_sec = time()
00230
00231 if test_num == 1 :
00232 pv.print_log_for_pkg('CalibManager')
00233
00234 elif test_num == 2 :
00235 pkg = 'CalibManager'
00236 print 'Package %s, version: %s' % (pkg, pv.get_pkg_version(pkg))
00237
00238 elif test_num == 3 :
00239 print pv.text_version_for_all_packages()
00240
00241 elif test_num == 4 :
00242 pkg = 'CalibManager'
00243 rev = pv.get_pkg_revision(pkg)
00244 tag = pv.get_tag_for_rev(pkg,rev)
00245 print 'Package %s, revision: %s, tag: %s' % (pkg, rev, tag)
00246
00247 elif test_num == 5 :
00248 pkg = 'pdscalibdata'
00249 rev = pv.get_pkg_revision(pkg)
00250 tag = pv.get_tag_for_rev(pkg,rev)
00251 print 'Package %s, revision: %s, tag: %s' % (pkg, rev, tag)
00252
00253 elif test_num == 6 :
00254 pkg = 'CalibManager'
00255 print 'Package %s latest tag: %s' % (pkg, pv.get_pkg_tag(pkg))
00256
00257 elif test_num == 7 :
00258 txt = pv.text_rev_and_tag_for_all_packages()
00259 print txt
00260
00261
00262 msg = 'Consumed time to test method = %7.3f sec' % (time()-t0_sec)
00263 print msg
00264
00265
00266
00267 if __name__ == "__main__" :
00268
00269 if len(sys.argv)!=2 or sys.argv[1] == '-h' :
00270 msg = 'NOTE!!! psvn command needs in Kerberos ticket !!!'
00271 msg += '\nUse %s with a single parameter, <test number=0,1,2,...>' % sys.argv[0]
00272 msg += '\n 0 - print_list_of_packages() and associated tmp files'
00273 msg += '\n 1 - print_log_for_pkg("CalibManager")'
00274 msg += '\n 2 - get_pkg_version("CalibManager")'
00275 msg += '\n 3 - text_version_for_all_packages()'
00276 msg += '\n 4 - get_pkg_revision("CalibManager")'
00277 msg += '\n 5 - get_pkg_revision("pdscalibdata")'
00278 msg += '\n 6 - get_pkg_tag("CalibManager")'
00279 msg += '\n 7 - text_rev_and_tag_for_all_packages()'
00280 msg += '\n -h - this help'
00281 print msg
00282
00283 else :
00284
00285 try :
00286 test_num = int(sys.argv[1])
00287 test_packege_version(test_num)
00288 except :
00289 test_packege_version(0)
00290
00291 sys.exit ( 'End of test.' )
00292
00293