def parseGotRevision(self): # Executes a p4 command that will give us the latest changelist number # of any file under the current (or default) client: command = ['p4'] if self.p4port: command.extend(['-p', self.p4port]) if self.p4user: command.extend(['-u', self.p4user]) if self.p4passwd: command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) if self.p4client: command.extend(['-c', self.p4client]) # add '-s submitted' for bug #626 command.extend(['changes', '-s', 'submitted', '-m', '1', '#have']) c = runprocess.RunProcess(self.builder, command, self.builder.basedir, environ=self.env, timeout=self.timeout, maxTime=self.maxTime, sendStdout=True, sendRC=False, keepStdout=True, usePTY=False, logEnviron=self.logEnviron) self.command = c d = c.start() def _parse(res): # 'p4 -c clien-name change -m 1 "#have"' will produce an output like: # "Change 28147 on 2008/04/07 by p4user@hostname..." # The number after "Change" is the one we want. m = re.match('Change\s+(\d+)\s+', c.stdout) if m: return m.group(1) return None d.addCallback(_parse) return d
def _doP4Sync(self, force): command = ['p4'] if self.p4port: command.extend(['-p', self.p4port]) if self.p4user: command.extend(['-u', self.p4user]) if self.p4passwd: command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) if self.p4client: command.extend(['-c', self.p4client]) command.extend(['sync']) if force: command.extend(['-f']) if self.revision: command.extend(['@' + str(self.revision)]) env = {} c = runprocess.RunProcess(self.builder, command, self.builder.basedir, environ=env, sendRC=False, timeout=self.timeout, maxTime=self.maxTime, usePTY=False, logEnviron=self.logEnviron) self.command = c d = c.start() d.addCallback(self._abandonOnFailure) return d
def _doVC(self, force): d = os.path.join(self.builder.basedir, self.srcdir) command = [self.getCommand('p4')] if self.p4port: command.extend(['-p', self.p4port]) if self.p4user: command.extend(['-u', self.p4user]) if self.p4passwd: command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) if self.p4client: command.extend(['-c', self.p4client]) command.extend(['sync']) if force: command.extend(['-f']) if self.revision: command.extend(['@' + self.revision]) env = {} c = runprocess.RunProcess(self.builder, command, d, environ=env, sendRC=False, timeout=self.timeout, maxTime=self.maxTime, usePTY=False, logEnviron=self.logEnviron) self.command = c return c.start()
def doVCFull(self): env = {} command = ['p4'] client_spec = '' client_spec += "Client: %s\n\n" % self.p4client client_spec += "Owner: %s\n\n" % self.p4user client_spec += "Description:\n\tCreated by %s\n\n" % self.p4user client_spec += "Root:\t%s\n\n" % self.builder.basedir client_spec += "Options:\tallwrite rmdir\n\n" if self.p4line_end: client_spec += "LineEnd:\t%s\n\n" % self.p4line_end else: client_spec += "LineEnd:\tlocal\n\n" # Setup a view client_spec += "View:\n\t%s" % (self.p4base) if self.p4branch: client_spec += "%s/" % (self.p4branch) client_spec += "... //%s/%s/...\n" % (self.p4client, self.srcdir) if self.p4extra_views: for k, v in self.p4extra_views: client_spec += "\t%s/... //%s/%s%s/...\n" % (k, self.p4client, self.srcdir, v) if self.p4port: command.extend(['-p', self.p4port]) if self.p4user: command.extend(['-u', self.p4user]) if self.p4passwd: command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) command.extend(['client', '-i']) log.msg(client_spec) # from bdbaddog in github comments: # I'm pretty sure the issue is that perforce client specs can't be # non-ascii (unless you configure at initial config to be unicode). I # floated a question to perforce mailing list. From reading the # internationalization notes.. # http://www.perforce.com/perforce/doc.092/user/i18nnotes.txt # I'm 90% sure that's the case. # (http://github.com/bdbaddog/buildbot/commit/8420149b2b804efcf5f81a13e18aa62da0424d21) # Clean client spec to plain ascii client_spec = client_spec.encode('ascii', 'ignore') c = runprocess.RunProcess(self.builder, command, self.builder.basedir, environ=env, sendRC=False, timeout=self.timeout, maxTime=self.maxTime, initialStdin=client_spec, usePTY=False, logEnviron=self.logEnviron) self.command = c d = c.start() d.addCallback(self._abandonOnFailure) d.addCallback(lambda _: self._doP4Sync(force=True)) return d
def setup(self, args): SourceBaseCommand.setup(self, args) self.svnurl = args['svnurl'] self.sourcedata = "%s\n" % self.svnurl self.keep_on_purge = args.get('keep_on_purge', []) self.keep_on_purge.append(".buildbot-sourcedata") self.ignore_ignores = args.get('ignore_ignores', True) self.always_purge = args.get('always_purge', False) self.exported_rev = 'HEAD' self.svn_args = [] if "username" in args: self.svn_args.extend(["--username", args['username']]) if "password" in args: self.svn_args.extend(["--password", Obfuscated(args['password'], "XXXX")]) if args.get('extra_args', None) is not None: self.svn_args.extend(args['extra_args']) if "depth" in args: self.svn_args.extend(["--depth", args['depth']])
def test_simple(self): self.patch_getCommand('p4', 'path/to/p4') self.clean_environ() self.make_command( p4.P4, dict( workdir='workdir', mode='copy', revision=None, p4port='p4dserv:1666', p4client='buildbot_test_10', p4user='******', p4passwd='hushnow', p4base='//mydepot/myproj/', branch='mytrunk', p4extra_views=[], )) exp_environ = dict(PWD='.', LC_MESSAGES='C') # can't use textwrap.dedent here, because in 2.4 it converts \t to 8x' ' client_spec = """\ Client: buildbot_test_10 Owner: jimmy Description: \tCreated by jimmy Root:\t%s Options:\tallwrite rmdir LineEnd:\tlocal View: \t//mydepot/myproj/mytrunk/... //buildbot_test_10/source/... """ % self.basedir expects = [ Expect(['clobber', 'workdir'], self.basedir) + 0, Expect(['clobber', 'source'], self.basedir) + 0, Expect( [ 'p4', '-p', 'p4dserv:1666', '-u', 'jimmy', '-P', Obfuscated('hushnow', 'XXXXXXXX'), 'client', '-i' ], self.basedir, # TODO: empty env? sendRC=False, timeout=120, usePTY=False, environ={}, initialStdin=client_spec) + 0, Expect( [ 'p4', '-p', 'p4dserv:1666', '-u', 'jimmy', '-P', Obfuscated('hushnow', 'XXXXXXXX'), '-c', 'buildbot_test_10', 'sync', '-f' ], self.basedir, # TODO: empty env? sendRC=False, timeout=120, usePTY=False, environ={}) + 0, Expect([ 'p4', '-p', 'p4dserv:1666', '-u', 'jimmy', '-P', Obfuscated('hushnow', 'XXXXXXXX'), '-c', 'buildbot_test_10', 'changes', '-s', 'submitted', '-m', '1', '#have' ], self.basedir, sendRC=False, timeout=120, usePTY=False, environ=exp_environ, keepStdout=True) + { 'stdout': 'Change 28147 on 2008/04/07 by p4user@hostname\n' } + 0, Expect(['copy', 'source', 'workdir'], self.basedir) + 0, ] self.patch_runprocess(*expects) d = self.run_command() d.addCallback( self.check_sourcedata, "['p4dserv:1666', 'buildbot_test_10', " + "'//mydepot/myproj/', 'mytrunk', [], None, %s, 'copy', 'workdir']" % repr(self.basedir)) return d