Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
 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()
Пример #4
0
    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
Пример #5
0
    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']])
Пример #6
0
    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