1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16  import os, re 
 17   
 18  from twisted.python import log 
 19   
 20  from buildslave.commands.base import SourceBaseCommand 
 21  from buildslave import runprocess 
 22  from buildslave.util import Obfuscated 
 23   
 24   
 25 -class P4Base(SourceBaseCommand): 
  26      """Base class for P4 source-updaters 
 27   
 28      ['p4port'] (required): host:port for server to access 
 29      ['p4user'] (optional): user to use for access 
 30      ['p4passwd'] (optional): passwd to try for the user 
 31      ['p4client'] (optional): client spec to use 
 32      """ 
 34          SourceBaseCommand.setup(self, args) 
 35          self.p4port = args['p4port'] 
 36          self.p4client = args['p4client'] 
 37          self.p4user = args['p4user'] 
 38          self.p4passwd = args['p4passwd'] 
  39   
 41           
 42           
 43          command = ['p4'] 
 44          if self.p4port: 
 45              command.extend(['-p', self.p4port]) 
 46          if self.p4user: 
 47              command.extend(['-u', self.p4user]) 
 48          if self.p4passwd: 
 49              command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) 
 50          if self.p4client: 
 51              command.extend(['-c', self.p4client]) 
 52           
 53          command.extend(['changes', '-s', 'submitted', '-m', '1', '#have']) 
 54          c = runprocess.RunProcess(self.builder, command, self.builder.basedir, 
 55                           environ=self.env, timeout=self.timeout, 
 56                           maxTime=self.maxTime, sendStdout=True, 
 57                           sendRC=False, keepStdout=True, 
 58                           usePTY=False) 
 59          self.command = c 
 60          d = c.start() 
 61   
 62          def _parse(res): 
 63               
 64               
 65               
 66              m = re.match('Change\s+(\d+)\s+', c.stdout) 
 67              if m: 
 68                  return m.group(1) 
 69              return None 
  70          d.addCallback(_parse) 
 71          return d 
  72   
 73   
 75      """A P4 source-updater. 
 76   
 77      ['p4port'] (required): host:port for server to access 
 78      ['p4user'] (required): user to use for access 
 79      ['p4passwd'] (required): passwd to try for the user 
 80      ['p4client'] (required): client spec to use 
 81      ['p4extra_views'] (required): additional client views to use 
 82      ['p4base'] (required): view into the Perforce depot without branch name or trailing "..." 
 83      ['p4line_end'] (optional): value of the LineEnd client specification property 
 84      """ 
 85   
 86      header = "p4" 
 87   
 89          P4Base.setup(self, args) 
 90          self.p4base = args['p4base'] 
 91          self.p4extra_views = args['p4extra_views'] 
 92          self.p4line_end = args.get('p4line_end', None) 
 93          self.p4mode = args['mode'] 
 94          self.p4branch = args['branch'] 
 95   
 96          self.sourcedata = str([ 
 97               
 98              self.p4port, 
 99   
100               
101              self.p4client, 
102   
103               
104              self.p4base, 
105              self.p4branch, 
106              self.p4extra_views, 
107              self.p4line_end, 
108   
109               
110              self.builder.basedir, 
111              self.mode, 
112              self.workdir 
113          ]) 
 114   
115   
123   
125          return self._doP4Sync(force=False) 
 126   
128          command = ['p4'] 
129   
130          if self.p4port: 
131              command.extend(['-p', self.p4port]) 
132          if self.p4user: 
133              command.extend(['-u', self.p4user]) 
134          if self.p4passwd: 
135              command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) 
136          if self.p4client: 
137              command.extend(['-c', self.p4client]) 
138          command.extend(['sync']) 
139          if force: 
140              command.extend(['-f']) 
141          if self.revision: 
142              command.extend(['@' + str(self.revision)]) 
143          env = {} 
144          c = runprocess.RunProcess(self.builder, command, self.builder.basedir, 
145                           environ=env, sendRC=False, timeout=self.timeout, 
146                           maxTime=self.maxTime, usePTY=False) 
147          self.command = c 
148          d = c.start() 
149          d.addCallback(self._abandonOnFailure) 
150          return d 
 151   
152   
154          env = {} 
155          command = ['p4'] 
156          client_spec = '' 
157          client_spec += "Client: %s\n\n" % self.p4client 
158          client_spec += "Owner: %s\n\n" % self.p4user 
159          client_spec += "Description:\n\tCreated by %s\n\n" % self.p4user 
160          client_spec += "Root:\t%s\n\n" % self.builder.basedir 
161          client_spec += "Options:\tallwrite rmdir\n\n" 
162          if self.p4line_end: 
163              client_spec += "LineEnd:\t%s\n\n" % self.p4line_end 
164          else: 
165              client_spec += "LineEnd:\tlocal\n\n" 
166   
167           
168          client_spec += "View:\n\t%s" % (self.p4base) 
169          if self.p4branch: 
170              client_spec += "%s/" % (self.p4branch) 
171          client_spec += "... //%s/%s/...\n" % (self.p4client, self.srcdir) 
172          if self.p4extra_views: 
173              for k, v in self.p4extra_views: 
174                  client_spec += "\t%s/... //%s/%s%s/...\n" % (k, self.p4client, 
175                                                               self.srcdir, v) 
176          if self.p4port: 
177              command.extend(['-p', self.p4port]) 
178          if self.p4user: 
179              command.extend(['-u', self.p4user]) 
180          if self.p4passwd: 
181              command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) 
182          command.extend(['client', '-i']) 
183          log.msg(client_spec) 
184   
185           
186           
187           
188           
189           
190           
191           
192           
193   
194           
195          client_spec=client_spec.encode('ascii','ignore') 
196   
197          c = runprocess.RunProcess(self.builder, command, self.builder.basedir, 
198                           environ=env, sendRC=False, timeout=self.timeout, 
199                           maxTime=self.maxTime, initialStdin=client_spec, 
200                           usePTY=False) 
201          self.command = c 
202          d = c.start() 
203          d.addCallback(self._abandonOnFailure) 
204          d.addCallback(lambda _: self._doP4Sync(force=True)) 
205          return d 
 206   
 212   
213   
215      """A partial P4 source-updater. Requires manual setup of a per-slave P4 
216      environment. The only thing which comes from the master is P4PORT. 
217      'mode' is required to be 'copy'. 
218   
219      ['p4port'] (required): host:port for server to access 
220      ['p4user'] (optional): user to use for access 
221      ['p4passwd'] (optional): passwd to try for the user 
222      ['p4client'] (optional): client spec to use 
223      """ 
224   
225      header = "p4 sync" 
226   
229   
232   
234          d = os.path.join(self.builder.basedir, self.srcdir) 
235          command = [self.getCommand('p4')] 
236          if self.p4port: 
237              command.extend(['-p', self.p4port]) 
238          if self.p4user: 
239              command.extend(['-u', self.p4user]) 
240          if self.p4passwd: 
241              command.extend(['-P', Obfuscated(self.p4passwd, "XXXXXXXX")]) 
242          if self.p4client: 
243              command.extend(['-c', self.p4client]) 
244          command.extend(['sync']) 
245          if force: 
246              command.extend(['-f']) 
247          if self.revision: 
248              command.extend(['@' + self.revision]) 
249          env = {} 
250          c = runprocess.RunProcess(self.builder, command, d, environ=env, 
251                           sendRC=False, timeout=self.timeout, 
252                           maxTime=self.maxTime, usePTY=False) 
253          self.command = c 
254          return c.start() 
 255   
257          return self._doVC(force=False) 
 258   
260          return self._doVC(force=True) 
 261   
 267