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) |
---|