Changeset 630
- Timestamp:
- 04/12/08 12:58:59 (9 months ago)
- Files:
-
- buildbot/process/base.py (modified) (3 diffs)
- buildbot/process/buildstep.py (modified) (2 diffs)
- buildbot/process/properties.py (added)
- buildbot/status/builder.py (modified) (6 diffs)
- buildbot/steps/python.py (modified) (1 diff)
- buildbot/steps/shell.py (modified) (6 diffs)
- buildbot/steps/source.py (modified) (1 diff)
- buildbot/steps/transfer.py (modified) (4 diffs)
- buildbot/test/test_properties.py (modified) (4 diffs)
- buildbot/test/test_steps.py (modified) (2 diffs)
- buildbot/test/test_vc.py (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
buildbot/process/base.py
r625 r630 208 208 return self.source 209 209 210 def setProperty(self, propname, value ):210 def setProperty(self, propname, value, source): 211 211 """Set a property on this build. This may only be called after the 212 212 build has started, so that it has a BuildStatus object where the 213 213 properties can live.""" 214 self.build_status.setProperty(propname, value )214 self.build_status.setProperty(propname, value, source) 215 215 216 216 def getCustomProperties(self): 217 217 return self.custom_properties 218 219 def getProperties(self): 220 return self.build_status.getProperties() 218 221 219 222 def getProperty(self, propname): … … 278 281 def setupStatus(self, build_status): 279 282 self.build_status = build_status 280 self.setProperty("buildername", self.builder.name )281 self.setProperty("buildnumber", self.build_status.number )282 self.setProperty("branch", self.source.branch )283 self.setProperty("revision", self.source.revision )283 self.setProperty("buildername", self.builder.name, "build") 284 self.setProperty("buildnumber", self.build_status.number, "build") 285 self.setProperty("branch", self.source.branch, "build") 286 self.setProperty("revision", self.source.revision, "build") 284 287 if self.scheduler is None: 285 self.setProperty("scheduler", "none" )288 self.setProperty("scheduler", "none", "build") 286 289 else: 287 self.setProperty("scheduler", self.scheduler.name )290 self.setProperty("scheduler", self.scheduler.name, "build") 288 291 for key, userProp in self.custom_properties.items(): 289 self.setProperty(key, userProp )292 self.setProperty(key, userProp, "custom_props") 290 293 291 294 def setupSlaveBuilder(self, slavebuilder): … … 293 296 self.slavename = slavebuilder.slave.slavename 294 297 self.build_status.setSlavename(self.slavename) 295 self.setProperty("slavename", self.slavename )298 self.setProperty("slavename", self.slavename, "build") 296 299 297 300 def startBuild(self, build_status, expectations, slavebuilder): buildbot/process/buildstep.py
r580 r630 633 633 return self.build.getProperty(propname) 634 634 635 def setProperty(self, propname, value ):636 self.build.setProperty(propname, value )635 def setProperty(self, propname, value, source): 636 self.build.setProperty(propname, value, source) 637 637 638 638 def startStep(self, remote): … … 1093 1093 self.step_status.setText2(self.maybeGetText2(cmd, results)) 1094 1094 1095 class _BuildPropertyMapping: 1096 def __init__(self, build): 1097 self.build = build 1098 def __getitem__(self, name): 1099 p = self.build.getProperty(name) 1100 if p is None: 1101 p = "" 1102 return p 1103 1104 class WithProperties(util.ComparableMixin): 1105 """This is a marker class, used in ShellCommand's command= argument to 1106 indicate that we want to interpolate a build property. 1107 """ 1108 1109 compare_attrs = ('fmtstring', 'args') 1110 1111 def __init__(self, fmtstring, *args): 1112 self.fmtstring = fmtstring 1113 self.args = args 1114 1115 def render(self, build): 1116 pmap = _BuildPropertyMapping(build) 1117 if self.args: 1118 strings = [] 1119 for name in self.args: 1120 strings.append(pmap[name]) 1121 s = self.fmtstring % tuple(strings) 1122 else: 1123 s = self.fmtstring % pmap 1124 return s 1125 1126 def render_properties(s, build): 1127 """Return a string based on s and build that is suitable for use 1128 in a running BuildStep. If s is a string, return s. If s is a 1129 WithProperties object, return the result of s.render(build). 1130 Otherwise, return str(s). 1131 """ 1132 if isinstance(s, (str, unicode)): 1133 return s 1134 elif isinstance(s, WithProperties): 1135 return s.render(build) 1136 else: 1137 return str(s) 1095 # (WithProeprties used to be available in this module) 1096 from buildbot.process.properties import WithProperties buildbot/status/builder.py
r629 r630 6 6 from twisted.internet import reactor, defer 7 7 from twisted.protocols import basic 8 from buildbot.process.properties import Properties 8 9 9 10 import os, shutil, sys, re, urllib, itertools … … 889 890 class BuildStatus(styles.Versioned): 890 891 implements(interfaces.IBuildStatus, interfaces.IStatusEvent) 891 persistenceVersion = 2892 persistenceVersion = 3 892 893 893 894 source = None … … 925 926 self.steps = [] 926 927 self.testResults = {} 927 self.properties = {}928 self.properties = Properties() 928 929 929 930 # IBuildStatus … … 937 938 def getProperty(self, propname): 938 939 return self.properties[propname] 940 941 def getProperties(self): 942 return self.properties 939 943 940 944 def getNumber(self): … … 1075 1079 return s 1076 1080 1077 def setProperty(self, propname, value ):1078 self.properties [propname] = value1081 def setProperty(self, propname, value, source): 1082 self.properties.setProperty(propname, value, source) 1079 1083 1080 1084 def addTestResult(self, result): … … 1229 1233 def upgradeToVersion2(self): 1230 1234 self.properties = {} 1235 1236 def upgradeToVersion3(self): 1237 # in version 3, self.properties became a Properties object 1238 propdict = self.properties 1239 self.properties = Properties() 1240 self.properties.update(propdict) 1231 1241 1232 1242 def upgradeLogfiles(self): buildbot/steps/python.py
r241 r630 97 97 self.descriptionDone.append("%s=%d" % (m, counts[m])) 98 98 self.addCompleteLog(m, "".join(summaries[m])) 99 self.setProperty("pyflakes-%s" % m, counts[m] )100 self.setProperty("pyflakes-total", sum(counts.values()) )99 self.setProperty("pyflakes-%s" % m, counts[m], "pyflakes") 100 self.setProperty("pyflakes-total", sum(counts.values()), "pyflakes") 101 101 102 102 buildbot/steps/shell.py
r628 r630 3 3 import re 4 4 from twisted.python import log 5 from buildbot.process.buildstep import LoggingBuildStep, RemoteShellCommand, \ 6 render_properties 5 from buildbot.process.buildstep import LoggingBuildStep, RemoteShellCommand 7 6 from buildbot.status.builder import SUCCESS, WARNINGS, FAILURE 8 7 9 # for existing configurations that import WithProperties from here 10 from buildbot.process.buildstep import WithProperties 8 # for existing configurations that import WithProperties from here. We like 9 # to move this class around just to keep our readers guessing. 10 from buildbot.process.properties import WithProperties 11 11 12 12 class ShellCommand(LoggingBuildStep): … … 119 119 return self.description 120 120 121 properties = self.build.getProperties() 121 122 words = self.command 122 123 if isinstance(words, (str, unicode)): 123 124 words = words.split() 124 125 # render() each word to handle WithProperties objects 125 words = [ render_properties(word, self.build) for word in words]126 words = [properties.render(word) for word in words] 126 127 if len(words) < 1: 127 128 return ["???"] … … 132 133 return ["'%s" % words[0], "%s" % words[1], "...'"] 133 134 134 def _interpolateProperties(self, value):135 """136 Expand the L{WithProperties} objects in L{value}137 """138 if isinstance(value, (str, unicode, bool, int, float, type(None))):139 return value140 141 if isinstance(value, list):142 return [self._interpolateProperties(val) for val in value]143 144 if isinstance(value, tuple):145 return tuple([self._interpolateProperties(val) for val in value])146 147 if isinstance(value, dict):148 new_dict = { }149 for key, val in value.iteritems():150 new_key = self._interpolateProperties(key)151 new_dict[new_key] = self._interpolateProperties(val)152 return new_dict153 154 # To make sure we catch anything we forgot155 assert isinstance(value, WithProperties), \156 "%s (%s) is not a WithProperties" % (value, type(value))157 158 return value.render(self.build)159 160 def _interpolateWorkdir(self, workdir):161 return render_properties(workdir, self.build)162 163 135 def setupEnvironment(self, cmd): 136 # XXX is this used? documented? replaced by properties? 164 137 # merge in anything from Build.slaveEnvironment . Earlier steps 165 138 # (perhaps ones which compile libraries or sub-projects that need to 166 139 # be referenced by later steps) can add keys to 167 140 # self.build.slaveEnvironment to affect later steps. 141 properties = self.build.getProperties() 168 142 slaveEnv = self.build.slaveEnvironment 169 143 if slaveEnv: 170 144 if cmd.args['env'] is None: 171 145 cmd.args['env'] = {} 172 cmd.args['env'].update( self._interpolateProperties(slaveEnv))146 cmd.args['env'].update(properties.render(slaveEnv)) 173 147 # note that each RemoteShellCommand gets its own copy of the 174 148 # dictionary, so we shouldn't be affecting anyone but ourselves. … … 200 174 # to set up an argv array, an environment, or extra logfiles= (like 201 175 # the Source subclasses) can just skip straight to startCommand() 202 command = self._interpolateProperties(self.command)203 assert isinstance(command, (list, tuple, str)) 176 properties = self.build.getProperties() 177 204 178 # create the actual RemoteShellCommand instance now 205 kwargs = self._interpolateProperties(self.remote_kwargs) 206 kwargs['workdir'] = self._interpolateWorkdir(kwargs['workdir']) 207 kwargs['command'] = command 179 kwargs = properties.render(self.remote_kwargs) 180 kwargs['command'] = properties.render(self.command) 208 181 kwargs['logfiles'] = self.logfiles 209 182 cmd = RemoteShellCommand(**kwargs) … … 225 198 if m: 226 199 self.kib = int(m.group(1)) 227 self.setProperty("tree-size-KiB", self.kib )200 self.setProperty("tree-size-KiB", self.kib, "treesize") 228 201 229 202 def evaluateCommand(self, cmd): … … 299 272 except KeyError: 300 273 old_count = 0 301 self.setProperty("warnings-count", old_count + self.warnCount )274 self.setProperty("warnings-count", old_count + self.warnCount, "WarningCountingShellCommand") 302 275 303 276 buildbot/steps/source.py
r612 r630 188 188 if cmd.updates.has_key("got_revision"): 189 189 got_revision = str(cmd.updates["got_revision"][-1]) 190 self.setProperty("got_revision", got_revision )190 self.setProperty("got_revision", got_revision, "source") 191 191 192 192 buildbot/steps/transfer.py
r568 r630 5 5 from twisted.spread import pb 6 6 from twisted.python import log 7 from buildbot.process.buildstep import RemoteCommand, BuildStep, \ 8 render_properties 7 from buildbot.process.buildstep import RemoteCommand, BuildStep 9 8 from buildbot.process.buildstep import SUCCESS, FAILURE 10 9 from buildbot.interfaces import BuildSlaveTooOldError … … 112 111 def start(self): 113 112 version = self.slaveVersion("uploadFile") 113 properties = self.build.getProperties() 114 114 115 if not version: 115 116 m = "slave is too old, does not know about uploadFile" 116 117 raise BuildSlaveTooOldError(m) 117 118 118 source = render_properties(self.slavesrc, self.build)119 masterdest = render_properties(self.masterdest, self.build)119 source = properties.render(self.slavesrc) 120 masterdest = properties.render(self.masterdest) 120 121 # we rely upon the fact that the buildmaster runs chdir'ed into its 121 122 # basedir to make sure that relative paths in masterdest are expanded … … 238 239 239 240 def start(self): 241 properties = self.build.getProperties() 242 240 243 version = self.slaveVersion("downloadFile") 241 244 if not version: … … 245 248 # we are currently in the buildmaster's basedir, so any non-absolute 246 249 # paths will be interpreted relative to that 247 source = os.path.expanduser(render_properties(self.mastersrc, 248 self.build)) 249 slavedest = render_properties(self.slavedest, self.build) 250 source = os.path.expanduser(properties.render(self.mastersrc)) 251 slavedest = properties.render(self.slavedest) 250 252 log.msg("FileDownload started, from master %r to slave %r" % 251 253 (source, slavedest)) buildbot/test/test_properties.py
r615 r630 7 7 from buildbot.sourcestamp import SourceStamp 8 8 from buildbot.process import base 9 from buildbot.steps.shell import ShellCommand, WithProperties 9 from buildbot.process.properties import WithProperties, Properties 10 from buildbot.steps.shell import ShellCommand 10 11 from buildbot.status import builder 11 12 from buildbot.slave.commands import rmdirRecursive … … 27 28 name = "fakescheduler" 28 29 29 class Interpolate(unittest.TestCase): 30 class TestProperties(unittest.TestCase): 31 def setUp(self): 32 self.props = Properties() 33 34 def testDictBehavior(self): 35 self.props.setProperty("do-tests", 1, "scheduler") 36 self.props.setProperty("do-install", 2, "scheduler") 37 38 self.assert_(self.props.has_key('do-tests')) 39 self.failUnlessEqual(self.props['do-tests'], 1) 40 self.failUnlessEqual(self.props['do-install'], 2) 41 self.assertRaises(KeyError, lambda : self.props['do-nothing']) 42 self.failUnlessEqual(self.props.getProperty('do-install'), (2, 'scheduler')) 43 44 def testEmpty(self): 45 # test the special case for Null 46 self.props.setProperty("x", None, "hi") 47 self.failUnlessEqual(self.props.getProperty('x'), (None, 'hi')) 48 self.failUnlessEqual(self.props['x'], '') 49 50 def testUpdate(self): 51 self.props.setProperty("x", 24, "old") 52 newprops = { 'a' : 1, 'b' : 2 } 53 self.props.update(newprops, "new") 54 55 self.failUnlessEqual(self.props.getProperty('x'), (24, 'old')) 56 self.failUnlessEqual(self.props.getProperty('a'), (1, 'new')) 57 58 def testUpdateFromProperties(self): 59 self.props.setProperty("x", 24, "old") 60 newprops = Properties() 61 newprops.setProperty('a', 1, "new") 62 newprops.setProperty('b', 2, "new") 63 self.props.updateFromProperties(newprops) 64 65 self.failUnlessEqual(self.props.getProperty('x'), (24, 'old')) 66 self.failUnlessEqual(self.props.getProperty('a'), (1, 'new')) 67 68 # render() is pretty well tested by TestWithProperties 69 70 class TestWithProperties(unittest.TestCase): 71 def setUp(self): 72 self.props = Properties() 73 74 def testBasic(self): 75 # test basic substitution with WithProperties 76 self.props.setProperty("revision", "47", "test") 77 command = WithProperties("build-%s.tar.gz", "revision") 78 self.failUnlessEqual(self.props.render(command), 79 "build-47.tar.gz") 80 81 def testDict(self): 82 # test dict-style substitution with WithProperties 83 self.props.setProperty("other", "foo", "test") 84 command = WithProperties("build-%(other)s.tar.gz") 85 self.failUnlessEqual(self.props.render(command), 86 "build-foo.tar.gz") 87 88 def testEmpty(self): 89 # None should render as '' 90 self.props.setProperty("empty", None, "test") 91 command = WithProperties("build-%(empty)s.tar.gz") 92 self.failUnlessEqual(self.props.render(command), 93 "build-.tar.gz") 94 95 def testRecursiveList(self): 96 self.props.setProperty("x", 10, "test") 97 self.props.setProperty("y", 20, "test") 98 command = [ WithProperties("%(x)s %(y)s"), "and", 99 WithProperties("%(y)s %(x)s") ] 100 self.failUnlessEqual(self.props.render(command), 101 ["10 20", "and", "20 10"]) 102 103 def testRecursiveTuple(self): 104 self.props.setProperty("x", 10, "test") 105 self.props.setProperty("y", 20, "test") 106 command = ( WithProperties("%(x)s %(y)s"), "and", 107 WithProperties("%(y)s %(x)s") ) 108 self.failUnlessEqual(self.props.render(command), 109 ("10 20", "and", "20 10")) 110 111 def testRecursiveDict(self): 112 self.props.setProperty("x", 10, "test") 113 self.props.setProperty("y", 20, "test") 114 command = { WithProperties("%(x)s %(y)s") : 115 WithProperties("%(y)s %(x)s") } 116 self.failUnlessEqual(self.props.render(command), 117 {"10 20" : "20 10"}) 118 119 class BuildProperties(unittest.TestCase): 120 """Test the properties that a build should have.""" 30 121 def setUp(self): 31 122 self.builder = FakeBuilder() … … 37 128 self.build_status = self.builder_status.newBuild() 38 129 req = base.BuildRequest("reason", SourceStamp(branch="branch2", 39 revision= 1234))130 revision="1234")) 40 131 self.build = base.Build([req]) 41 132 self.build.setBuilder(self.builder) … … 43 134 self.build.setupSlaveBuilder(FakeSlaveBuilder()) 44 135 45 def testWithProperties(self): 46 self.build.setProperty("revision", 47) 47 self.failUnlessEqual(self.build_status.getProperty("revision"), 47) 48 c = ShellCommand(workdir=dir, 49 command=["tar", "czf", 50 WithProperties("build-%s.tar.gz", 51 "revision"), 52 "source"]) 53 c.setBuild(self.build) 54 cmd = c._interpolateProperties(c.command) 55 self.failUnlessEqual(cmd, 56 ["tar", "czf", "build-47.tar.gz", "source"]) 136 def testProperties(self): 137 # if not started from a scheduler, the 'scheduler' property 138 # should be 'none' 57 139 self.failUnlessEqual(self.build.getProperty("scheduler"), "none") 58 59 def testWorkdir(self): 60 self.build.setProperty("revision", 47) 61 self.failUnlessEqual(self.build_status.getProperty("revision"), 47) 62 c = ShellCommand(command=["tar", "czf", "foo.tar.gz", "source"]) 63 c.setBuild(self.build) 64 workdir = WithProperties("workdir-%d", "revision") 65 workdir = c._interpolateWorkdir(workdir) 66 self.failUnlessEqual(workdir, "workdir-47") 67 68 def testWithPropertiesDict(self): 69 self.build.setProperty("other", "foo") 70 self.build.setProperty("missing", None) 71 c = ShellCommand(workdir=dir, 72 command=["tar", "czf", 73 WithProperties("build-%(other)s.tar.gz"), 74 "source"]) 75 c.setBuild(self.build) 76 cmd = c._interpolateProperties(c.command) 77 self.failUnlessEqual(cmd, 78 ["tar", "czf", "build-foo.tar.gz", "source"]) 79 80 def testWithPropertiesEmpty(self): 81 self.build.setProperty("empty", None) 82 c = ShellCommand(workdir=dir, 83 command=["tar", "czf", 84 WithProperties("build-%(empty)s.tar.gz"), 85 "source"]) 86 c.setBuild(self.build) 87 cmd = c._interpolateProperties(c.command) 88 self.failUnlessEqual(cmd, 89 ["tar", "czf", "build-.tar.gz", "source"]) 90 91 def testSourceStamp(self): 92 c = ShellCommand(workdir=dir, 93 command=["touch", 94 WithProperties("%s-dir", "branch"), 95 WithProperties("%s-rev", "revision"), 96 ]) 97 c.setBuild(self.build) 98 cmd = c._interpolateProperties(c.command) 99 self.failUnlessEqual(cmd, 100 ["touch", "branch2-dir", "1234-rev"]) 101 102 def testSlaveName(self): 103 c = ShellCommand(workdir=dir, 104 command=["touch", 105 WithProperties("%s-slave", "slavename"), 106 ]) 107 c.setBuild(self.build) 108 cmd = c._interpolateProperties(c.command) 109 self.failUnlessEqual(cmd, 110 ["touch", "bot12-slave"]) 111 112 def testBuildNumber(self): 113 c = ShellCommand(workdir=dir, 114 command=["touch", 115 WithProperties("build-%d", "buildnumber"), 116 WithProperties("builder-%s", "buildername"), 117 ]) 118 c.setBuild(self.build) 119 cmd = c._interpolateProperties(c.command) 120 self.failUnlessEqual(cmd, 121 ["touch", "build-5", "builder-fakebuilder"]) 140 self.failUnlessEqual(self.build.getProperty("branch"), "branch2") 141 self.failUnlessEqual(self.build.getProperty("revision"), "1234") 142 self.failUnlessEqual(self.build.getProperty("slavename"), "bot12") 143 self.failUnlessEqual(self.build.getProperty("buildnumber"), 5) 144 self.failUnlessEqual(self.build.getProperty("buildername"), "fakebuilder") 122 145 123 146 class SchedulerTest(unittest.TestCase): buildbot/test/test_steps.py
r532 r630 237 237 bs = s.step_status.getBuild() 238 238 239 s.setProperty("prop1", "value1" )240 s.setProperty("prop2", "value2" )239 s.setProperty("prop1", "value1", "test") 240 s.setProperty("prop2", "value2", "test") 241 241 self.failUnlessEqual(s.getProperty("prop1"), "value1") 242 242 self.failUnlessEqual(bs.getProperty("prop1"), "value1") 243 243 self.failUnlessEqual(s.getProperty("prop2"), "value2") 244 244 self.failUnlessEqual(bs.getProperty("prop2"), "value2") 245 s.setProperty("prop1", "value1a" )245 s.setProperty("prop1", "value1a", "test") 246 246 self.failUnlessEqual(s.getProperty("prop1"), "value1a") 247 247 self.failUnlessEqual(bs.getProperty("prop1"), "value1a") … … 602 602 ending line 603 603 """ 604 step.setProperty("warnings-count", 10 )604 step.setProperty("warnings-count", 10, "test") 605 605 log = step.addLog("stdio") 606 606 log.addStdout(output) buildbot/test/test_vc.py
r588 r630 542 542 if self.metadir: 543 543 self.shouldExist(self.workdir, self.metadir) 544 self.failUnlessEqual(bs.getProperty("revision"), None)545 self.failUnlessEqual(bs.getProperty("branch"), None)544 self.failUnlessEqual(bs.getProperty("revision"), '') 545 self.failUnlessEqual(bs.getProperty("branch"), '') 546 546 self.checkGotRevisionIsLatest(bs) 547 547 … … 566 566 if self.metadir: 567 567 self.shouldExist(self.workdir, self.metadir) 568 self.failUnlessEqual(bs.getProperty("revision"), self.helper.trunk[0] )569 self.failUnlessEqual(bs.getProperty("branch"), None)568 self.failUnlessEqual(bs.getProperty("revision"), self.helper.trunk[0] or '') 569 self.failUnlessEqual(bs.getProperty("branch"), '') 570 570 self.checkGotRevision(bs, self.helper.trunk[0]) 571 571 # leave the tree at HEAD … … 586 586 if self.metadir: 587 587 self.shouldExist(self.workdir, self.metadir) 588 self.failUnlessEqual(bs.getProperty("revision"), None)588 self.failUnlessEqual(bs.getProperty("revision"), '') 589 589 self.checkGotRevisionIsLatest(bs) 590 590 … … 610 610 "version=%d" % self.helper.version) 611 611 self.shouldExist(self.workdir, "newfile") 612 self.failUnlessEqual(bs.getProperty("revision"), None)612 self.failUnlessEqual(bs.getProperty("revision"), '') 613 613 self.checkGotRevisionIsLatest(bs) 614 614 … … 624 624 "version=%d" % (self.helper.version-1)) 625 625 self.failUnlessEqual(bs.getProperty("revision"), 626 self.helper.trunk[-2] )626 self.helper.trunk[-2] or '') 627 627 self.checkGotRevision(bs, self.helper.trunk[-2]) 628 628 … … 638 638 "version=%d" % self.helper.version) 639 639 self.failUnlessEqual(bs.getProperty("revision"), 640 self.helper.trunk[-1] )640 self.helper.trunk[-1] or '') 641 641 self.checkGotRevision(bs, self.helper.trunk[-1]) 642 642 … … 675 675 self.touch(self.workdir, "newfile") 676 676 self.touch(self.vcdir, "newvcfile") 677 self.failUnlessEqual(bs.getProperty("revision"), None)677 self.failUnlessEqual(bs.getProperty("revision"), '') 678 678 self.checkGotRevisionIsLatest(bs) 679 679 … … 688 688 self.shouldExist(self.vcdir, "newvcfile") 689 689 self.shouldExist(self.workdir, "newvcfile") 690 self.failUnlessEqual(bs.getProperty("revision"), None)690 self.failUnlessEqual(bs.getProperty("revision"), '') 691 691 self.checkGotRevisionIsLatest(bs) 692 692 self.touch(self.workdir, "newfile") … … 699 699 self.shouldNotExist(self.workdir, self.metadir) 700 700 self.shouldNotExist(self.workdir, "newfile") 701 self.failUnlessEqual(bs.getProperty("revision"), None)701 self.failUnlessEqual(bs.getProperty("revision"), '') 702 702 #self.checkGotRevisionIsLatest(bs) 703 703 # VC 'export' is not required to have a got_revision … … 710 710 self.shouldNotExist(self.workdir, self.metadir) 711 711 self.shouldNotExist(self.workdir, "newfile") 712 self.failUnlessEqual(bs.getProperty("revision"), None)712 self.failUnlessEqual(bs.getProperty("revision"), '') 713 713 #self.checkGotRevisionIsLatest(bs) 714 714 # VC 'export' is not required to have a got_revision … … 745 745 self.failUnlessIn("Hello patched subdir.\\n", data) 746 746 self.failUnlessEqual(bs.getProperty("revision"), 747 self.helper.trunk[-1] )747 self.helper.trunk[-1] or '') 748 748 self.checkGotRevision(bs, self.helper.trunk[-1]) 749 749 … … 759 759 data = open(subdir_c, "r").read() 760 760 self.failUnlessIn("Hello subdir.\\n", data) 761 self.failUnlessEqual(bs.getProperty("revision"), None)761 self.failUnlessEqual(bs.getProperty("revision"), '') 762 762 self.checkGotRevisionIsLatest(bs) 763 763 … … 784 784 self.failUnlessIn("Hello patched subdir.\\n", data) 785 785 self.failUnlessEqual(bs.getProperty("revision"), 786 self.helper.trunk[-2] )786 self.helper.trunk[-2] or '') 787 787 self.checkGotRevision(bs, self.helper.trunk[-2]) 788 788 … … 803 803 self.failUnlessIn("Hello patched subdir.\\n", data) 804 804 self.failUnlessEqual(bs.getProperty("revision"), 805 self.helper.branch[-1] )806 self.failUnlessEqual(bs.getProperty("branch"), self.helper.branchname )805 self.helper.branch[-1] or '') 806 self.failUnlessEqual(bs.getProperty("branch"), self.helper.branchname or '') 807 807 self.checkGotRevision(bs, self.helper.branch[-1]) 808 808
![[Buildbot Logo]](/trac/chrome/site/header-text-transparent.png)