[430] | 1 | #!/usr/bin/python |
---|
| 2 | |
---|
| 3 | import os |
---|
| 4 | import re |
---|
| 5 | |
---|
| 6 | import Notify |
---|
| 7 | |
---|
| 8 | global representative |
---|
| 9 | representative = "madxd.h" |
---|
| 10 | |
---|
| 11 | def byDecreasingReleaseNumber(a,b): # passed to the Python sort list function |
---|
| 12 | aNumbers = a.split('_') |
---|
| 13 | bNumbers = b.split('_') |
---|
| 14 | counter = 0 |
---|
| 15 | result = 0 |
---|
| 16 | for aNumber in aNumbers: |
---|
| 17 | if int(aNumber) < int(bNumbers[counter]): |
---|
| 18 | result = 1 |
---|
| 19 | return result |
---|
| 20 | if int(aNumber) > int(bNumbers[counter]): |
---|
| 21 | result = -1 |
---|
| 22 | return result |
---|
| 23 | counter += 1 |
---|
| 24 | |
---|
| 25 | return result |
---|
| 26 | |
---|
| 27 | class MadTestTrigger: |
---|
| 28 | |
---|
| 29 | def __init__(self): |
---|
| 30 | self.whatToDo = "don't know" |
---|
| 31 | self.release = "don't know" |
---|
| 32 | self.debugMode = False |
---|
| 33 | |
---|
| 34 | def setDebugMode(self,mode): |
---|
| 35 | self.debugMode=mode |
---|
| 36 | |
---|
| 37 | def getWhatToDo(self): |
---|
| 38 | return self.whatToDo |
---|
| 39 | |
---|
| 40 | def getRelease(self): |
---|
| 41 | return self.release |
---|
| 42 | |
---|
| 43 | def run(self,rootDir): |
---|
| 44 | extractDir = self.extractCVS(rootDir) |
---|
| 45 | [ releases, tests ]= self.collectReleases(extractDir) |
---|
| 46 | # sort releases and tests by increasing numbers |
---|
| 47 | |
---|
| 48 | releases.sort(byDecreasingReleaseNumber) # in place sorting, with supplied comparison function |
---|
| 49 | tests.sort(byDecreasingReleaseNumber) |
---|
| 50 | |
---|
| 51 | # debug: |
---|
| 52 | #for release in releases: |
---|
| 53 | # print "release " + release |
---|
| 54 | |
---|
| 55 | lastRelease = releases[0] |
---|
| 56 | beforeLastRelease = releases[1] |
---|
| 57 | |
---|
| 58 | lastTest = tests[0] |
---|
| 59 | |
---|
| 60 | # print "lastTest="+lastTest |
---|
| 61 | # completion |
---|
| 62 | self.release = "madX-"+lastRelease |
---|
| 63 | if lastTest == lastRelease: |
---|
| 64 | self.whatToDo = "do-nothing" |
---|
| 65 | else: |
---|
| 66 | # SHOULD TAG THE CVS HERE (if mode != debug) |
---|
| 67 | # should also record work |
---|
| 68 | global representative |
---|
| 69 | newTestTag = "test-"+lastRelease |
---|
| 70 | command = "cvs tag " + newTestTag + " " + representative |
---|
| 71 | if not self.debugMode: |
---|
| 72 | os.system(command) |
---|
| 73 | else: |
---|
| 74 | print "skip command '"+command+"' in debug-mode" |
---|
| 75 | self.whatToDo = "run-test" |
---|
| 76 | |
---|
| 77 | def extractCVS(self,rootDir): |
---|
| 78 | # do we need to check-out or could we rely on FesaBuild.pl instead? |
---|
| 79 | cvsRootDir = ":gserver:isscvs.cern.ch:/local/reps/madx" |
---|
| 80 | command = "cvs -d "+cvsRootDir+" checkout madX" |
---|
| 81 | os.chdir(rootDir) |
---|
| 82 | extractDir = "MadCvsExtract_trig_test" |
---|
| 83 | try: |
---|
| 84 | os.mkdir(extractDir) |
---|
| 85 | except OSError: |
---|
| 86 | # print "OS error (should be instance errno 17)" |
---|
| 87 | os.system('rm -rf ./'+extractDir) # dangerous |
---|
| 88 | os.mkdir(extractDir) |
---|
| 89 | os.chdir(extractDir) |
---|
| 90 | os.system(command) |
---|
| 91 | os.chdir('./madX') |
---|
| 92 | theDir = os.getcwd() |
---|
| 93 | return theDir |
---|
| 94 | |
---|
| 95 | def collectReleases(self,extractDir): |
---|
| 96 | |
---|
| 97 | releases = [] |
---|
| 98 | tests = [] |
---|
| 99 | |
---|
| 100 | releaseRevision = {} |
---|
| 101 | testRevision = {} |
---|
| 102 | |
---|
| 103 | os.chdir(extractDir) |
---|
| 104 | global representative |
---|
| 105 | log = os.system('cvs log '+representative+' > tempfile') |
---|
| 106 | tempfile = open('tempfile','r') |
---|
| 107 | lines = tempfile.readlines() |
---|
| 108 | |
---|
| 109 | for line in lines: |
---|
| 110 | |
---|
| 111 | pattern = re.compile(r'^[\s\t]*madX\-(\d+)_(\d+)_(\d+)[\s\t]*:[\s\t]*([\d\.]+)[\s\t]*$') |
---|
| 112 | m = pattern.match(line) |
---|
| 113 | if m: |
---|
| 114 | release = m.group(1)+"_"+m.group(2)+"_"+m.group(3) |
---|
| 115 | releaseRevision[release] = m.group(4) |
---|
| 116 | releases.append(release) |
---|
| 117 | |
---|
| 118 | patternTest = re.compile(r'^[\s\t]*test\-(\d+)_(\d+)_(\d+)[\s\t]*:[\s\t]*([\d\.]+)[\s\t]*$') |
---|
| 119 | m = patternTest.match(line) |
---|
| 120 | if m: |
---|
| 121 | test = m.group(1)+"_"+m.group(2)+"_"+m.group(3) |
---|
| 122 | testRevision[test] = m.group(4) |
---|
| 123 | tests.append(test) |
---|
| 124 | |
---|
| 125 | return [ releases, tests ] |
---|
| 126 | |
---|
| 127 | |
---|
| 128 | |
---|
| 129 | if __name__ == "__main__": |
---|
| 130 | print("test program") |
---|
| 131 | testTrigger = MadTestTrigger() |
---|
| 132 | testTrigger.setDebugMode(True) |
---|
| 133 | testTrigger.run("./") # local directory |
---|
| 134 | what = testTrigger.getWhatToDo() |
---|
| 135 | release = testTrigger.getRelease() |
---|
| 136 | print("for release "+release+", "+what) |
---|