def p4Submit(self, changeList): """ SYNOPSIS: Submit a specified changelist to P4 INPUTS: changeList - Changelist name RETURNS: True/False Example: mP4.p4Submit(changeList) """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Submit --') if self.isInP4: if self.isCheckedOut: logger.debug("\n***Submitting In: '%s'***\n" % self.depotPath) try: change = self.p4i.fetch_change(changeList) result = self.p4i.save_submit(change) except: logger.error('p4 Submit failed') logger.debug('-- Exiting p4Submit --') return result logger.debug('-- Exiting p4Submit --') else: logger.error('Could not create P4 instance') return 0
def isInP4(self): """ **Property, do not use ()** SYNOPSIS: Check if file is in depot INPUTS NONE RETURNS: True/False Example: mP4.isInP4 """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered isInP4 --') try: result = self.p4i.run("files", self.depotPath) if result: result = 1 except: result = 0 logger.debug('- isInP4 Result is -- %s' % result) logger.debug('- Exiting isInP4 --') return result else: logger.error('Could not create P4 instance')
def p4Connect(self): """ SYNOPSIS: Attempts to connect to perforce INPUTS NONE RETURNS: True/None Example: mP4.p4Connect() """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Connect --') if not self.isP4Connected: if self.activeTeam: logger.debug('P4 UserName is - %s' % self.userXMLcore.get('PCSP4userName')) logger.debug('P4 Workspace is - %s' % self.userXMLcore.get('PCSP4workspace')) logger.debug('P4 Server is - %s' % self.globalXMLcore.get('P4_Server')) self.p4i.user = self.userXMLcore.get('PCSP4userName') self.p4i.client = self.userXMLcore.get('PCSP4workspace') self.p4i.port = self.globalXMLcore.get('P4_Server') self.p4i.connect() self.p4Version else: logger.error('No active team set/Team P4 data is missing') logger.debug('-- Exiting p4Connect --') return True else: logger.error('Could not create P4 instance')
def p4Connect(self): """ SYNOPSIS: Attempts to connect to perforce INPUTS NONE RETURNS: True/None Example: mP4.p4Connect() """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Connect --') if not self.isP4Connected: if self.activeTeam: logger.debug('P4 UserName is - %s' % self.userXMLcore.get('PCSP4userName')) logger.debug('P4 Workspace is - %s' % self.userXMLcore.get('PCSP4workspace')) logger.debug('P4 Server is - %s' % self.globalXMLcore.get('P4_Server')) self.p4i.user = self.userXMLcore.get('PCSP4userName') self.p4i.client = self.userXMLcore.get('PCSP4workspace') self.p4i.port = self.globalXMLcore.get('P4_Server') self.p4i.connect() self.p4Version else: logger.error('No active team set/Team P4 data is missing') logger.debug('-- Exiting p4Connect --') return True else: logger.error('Could not create P4 instance')
def p4Submit(self, changeList): """ SYNOPSIS: Submit a specified changelist to P4 INPUTS: changeList - Changelist name RETURNS: True/False Example: mP4.p4Submit(changeList) """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Submit --') if self.isInP4: if self.isCheckedOut: logger.debug("\n***Submitting In: '%s'***\n" % self.depotPath) try: change = self.p4i.fetch_change(changeList) result = self.p4i.save_submit(change) except: logger.error('p4 Submit failed') logger.debug('-- Exiting p4Submit --') return result logger.debug('-- Exiting p4Submit --') else: logger.error('Could not create P4 instance') return 0
def p4Delete(self, desc="Deprecated via python script", stomp=0): """ SYNOPSIS: Delete files in P4 INPUTS: desc* - Changelist name stomp* - Overwrite RETURNS: Changelist Example: mP4.p4Delete("My Del File Changelist Name") """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Delete --') changeListNum = (0, "Doesn't Exist") if self.isInP4: # get latest self.p4Sync(1) if self.isCheckedOut: if not self.isCheckedOut == getuser(): logger.warning('WARNING!: Checked out by %s' % self.isCheckedOut) if not stomp: return '-1%s' % self.isCheckedOut changeListNum = self.p4MakeChangeList(desc) self.p4i.run('delete', '-c%s' % changeListNum, self.depotPath) logger.debug('Marked "%s" for delete' % self.depotPath) return changeListNum else: logger.error('Could not create P4 instance') return 0
def isInP4(self): """ **Property, do not use ()** SYNOPSIS: Check if file is in depot INPUTS NONE RETURNS: True/False Example: mP4.isInP4 """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered isInP4 --') try: result = self.p4i.run("files", self.depotPath) if result: result = 1 except: result = 0 logger.debug('- isInP4 Result is -- %s' % result) logger.debug('- Exiting isInP4 --') return result else: logger.error('Could not create P4 instance')
def p4Delete(self, desc="Deprecated via python script", stomp=0): """ SYNOPSIS: Delete files in P4 INPUTS: desc* - Changelist name stomp* - Overwrite RETURNS: Changelist Example: mP4.p4Delete("My Del File Changelist Name") """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Delete --') changeListNum = (0, "Doesn't Exist") if self.isInP4: # get latest self.p4Sync(1) if self.isCheckedOut: if not self.isCheckedOut == getuser(): logger.warning('WARNING!: Checked out by %s' % self.isCheckedOut) if not stomp: return '-1%s' % self.isCheckedOut changeListNum = self.p4MakeChangeList(desc) self.p4i.run('delete', '-c%s' % changeListNum, self.depotPath) logger.debug('Marked "%s" for delete' % self.depotPath) return changeListNum else: logger.error('Could not create P4 instance') return 0
def isCheckedOut(self): """ **Property, do not use ()** SYNOPSIS: Check if file is checked out INPUTS NONE RETURNS: True/False Example: mP4.isCheckedOut """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered isCheckedOut --') checkedOut = 0 if self.isInP4: logger.debug('%s is in depot' % self.depotPath) stats = self.p4i.run("opened", "-a", self._fileName) if stats: if self.p4Version == 2.4: logger.debug('p4(Python2.4) stats are:%s' % stats) if not stats[0].find(' by ') == -1: checkedOut = stats[0][stats[0].rfind(' ') + 1:] elif self.p4Version == 2.5 or 2.6: logger.debug('P4(Python2.5) stats are:\n%s' % '\n'.join( '%s,%s' % (stat, stats[0][stat]) for stat in stats[0].keys())) if stats[0].has_key('user'): logger.debug('Already checked out by: %s' % stats[0]['user']) checkedOut = stats[0]['user'] logger.debug('Not checked out.') logger.debug('-- Exiting isCheckedOut --') return checkedOut else: logger.error('Could not create P4 instance') return 0
def p4MakeChangeList(self, desc="Updated via python script"): """ SYNOPSIS: Make a new changelist INPUTS: desc* - Changelist name RETURNS: New Changelist Example: mP4.p4MakeChangeList("My New Changelist Name") """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4MakeChangeList --') # check for desc length if len(desc) > 31: logger.warning("WARNING!: '%s' is longer than 31 characters, descriptions will NOT match." % desc) # create new list with: newChangeList = 0 if not self.isP4Connected: logger.error('Could not connect') return False # check if already exists changeLists = self.p4i.run("changes", "-c%s" % self.p4i.client, "-spending") logger.debug("changeLists is '%s'" % changeLists) if changeLists: for cl in changeLists: if self.p4Version == 2.4: logger.debug("Checking p4 (Python 2.4) changelist: '%s'" % cl) if re.search(desc, cl): # list = P4 for Python 2.4 newChangeList = cl[cl.find(' ') + 1:cl.find('on') - 1] logger.debug("Found desc: '%s' for changeList %s" % (desc, newChangeList)) elif self.p4Version == 2.5 or 2.6: # dictionary = P4 for Python 2.5,2.6 logger.debug("Checking P4 (Python 2.5) changelist: '%s'" % cl) if re.search(desc, cl["desc"]): newChangeList = cl['change'] if not newChangeList: change = '' if self.p4Version == 2.4: change = 'Description:%s\nChange: new' % desc elif self.p4Version == 2.5 or 2.6: change = {} change["Description"] = desc change['Change'] = 'new' self.p4i.input = change result = self.p4i.run('change', '-i')[0] newChangeList = result[result.find(' ') + 1:result.rfind(' ')] logger.debug("newChangeList is: '%s'" % newChangeList) logger.debug('-- Exiting p4MakeChangeList --') return newChangeList else: logger.error('Could not create P4 instance')
def p4DescribeChangeList(self, changeListNum): """ NAME: p4DescribeChangList SYNOPSIS Queries changeList and returns files and description INPUTS * = optional (int) changListNum: changeList to lookup ##RETURNS: (list),(string) files, desc RETURNS: (string) description """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4DescribeChangList --') description = '' try: if self.p4Version == 2.4: results = self.p4i.run('describe', '-dc', str(changeListNum)) if not results: logger.info("Changelist %s probably doesn't exist" % changeListNum) return doneWithDesc, doneWithFiles = [0, 0] desc, files = [[], []] for line in results: if 'Affected files ' in line: doneWithDesc = 1 if 'Differences ' in line: doneWithFiles = 1 if not doneWithDesc: desc.append(line) elif not doneWithFiles: files.append(line) text = '\nDescription of change:\n\n' for des in desc: if des[:1] == '\t': des = des[1:] # remove tab text = '%s%s\n' % (text, des) for _file in files: if _file[:2] == '//': _file = _file[:-5] # remove '#edit' text = '%s%s\n' % (text, _file) description = text elif self.p4Version == 2.5 or 2.6: results = self.p4i.run('describe', '-dc', changeListNum)[0] files = results['depotFile'] desc = results['desc'] #description = [desc, files] filesText = '' for _file in files: filesText = '%s%s\n' % (filesText, _file) description = '\nDescription of change:\n\n%s\n\nAffected files ...\n\n%s\n' % (desc, filesText) except: logger.info("Changelist %s probably doesn't exist" % changeListNum) return return description else: logger.error('Could not create P4 instance')
def p4CheckOut(self, desc="Updated via python script", force=0, stomp=0, sync=1, returnTuple=0): """ SYNOPSIS: Check out or add to P4 INPUTS: desc* - Changelist description force* - Force check out stomp* - Overwrite RETURNS: Tuple (Success/Failure, changelist, userCheckedOutBy) Example: mP4.p4CheckOut("My Changelist Name") """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4CheckOut --') if self.isInP4: # get latest if sync: self.p4Sync(force) checkedOut = self.isCheckedOut if checkedOut: if not checkedOut == getuser(): logger.warning("Checked out by %s" % checkedOut) if not stomp: return (0, checkedOut, 0) newChangeList = self.p4MakeChangeList(desc) self.p4i.run('edit', "-c%s" % newChangeList, self.depotPath) # moves file to newChangeList logger.info("***Checking out: '%s'***" % self.depotPath) logger.debug('-- Exiting p4CheckOut --') if checkedOut and stomp: if not checkedOut == getuser(): return (1, newChangeList, checkedOut) else: return (1, newChangeList, 0) else: return (1, newChangeList, 0) else: changeListNum = self.p4MakeChangeList( desc.replace('Updated', 'Added')) try: self.p4i.run("add", "-c%s" % changeListNum, self.depotPath) return (1, changeListNum, 0) except: pass #print p4i.warnings()[0] logger.debug('Added to "%s" changelist' % changeListNum) logger.debug('-- Exiting p4CheckOut --') else: logger.error('Could not create P4 instance')
def isLatest(self): """ **Property, do not use ()** SYNOPSIS: Check if file is latest INPUTS NONE RETURNS: True/False Example: mP4.isLatest """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered isLatest --') if self.isInP4: try: if not pcsPath.Path(self._fileName).isdir(): fileStatDict = self.p4i.run("fstat", self.depotPath) if fileStatDict: if fileStatDict[0]['headRev'] == fileStatDict[0][ 'haveRev']: logger.debug( 'Head revision - %s - same as Have Revision - %s - on file file - %s' % (str(fileStatDict[0]['headRev']), str(fileStatDict[0]['haveRev']), self.depotPath)) return 1 else: logger.debug( 'Head revision - %s - not the same as Have Revision - %s - on file file - %s' % (str(fileStatDict[0]['headRev']), str(fileStatDict[0]['haveRev']), self.depotPath)) return 0 else: logger.debug( 'Empty fstat list returned on file - %s' % self.depotPath) return 0 else: logger.debug('Passed file is a directory - %s' % self.depotPath) return 0 except: logger.debug('Failed on file - %s' % self.depotPath) return 0 else: logger.debug('File not in perforce - %s' % self.depotPath) return 0 else: logger.error('Could not create P4 instance') logger.debug('- Exiting isLatest --')
def p4RevertChangelist(self, changelist): if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4RevertChangelist --') try: self.p4i.run('revert', "-c%s" % changelist, '//...') logger.info("***Reverting: '%s'***" % self.fileName) return 1 except: return 0 logger.debug('-- Exiting p4RevertChangelist --') else: logger.error('Could not create P4 instance') return 0
def p4DeleteChangelist(self, changelist, enforceEmpty=1): if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4DeleteChangelist --') try: self.p4i.run('change', "-d", int(changelist)) logger.info("***Deleting changelist: '%s'***" % changelist) return 1 except: return 0 logger.debug('-- Exiting p4DeleteChangelist --') else: logger.error('Could not create P4 instance') return 0
def p4RevertChangelist(self, changelist): if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4RevertChangelist --') try: self.p4i.run('revert', "-c%s" % changelist, '//...') logger.info("***Reverting: '%s'***" % self.fileName) return 1 except: return 0 logger.debug('-- Exiting p4RevertChangelist --') else: logger.error('Could not create P4 instance') return 0
def p4DeleteChangelist(self, changelist, enforceEmpty=1): if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4DeleteChangelist --') try: self.p4i.run('change', "-d", int(changelist)) logger.info("***Deleting changelist: '%s'***" % changelist) return 1 except: return 0 logger.debug('-- Exiting p4DeleteChangelist --') else: logger.error('Could not create P4 instance') return 0
def p4RevertFile(self): if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Revert --') try: # self.p4i.run('revert', "%s" % self.fileName) self.p4i.run('revert', "%s" % self.depotPath) logger.info("***Reverting: '%s'***" % self.fileName) return 1 except: return 0 logger.debug('-- Exiting p4Revert --') else: logger.error('Could not create P4 instance') return 0
def p4CheckOut(self, desc="Updated via python script", force=0, stomp=0, sync=1, returnTuple=0): """ SYNOPSIS: Check out or add to P4 INPUTS: desc* - Changelist description force* - Force check out stomp* - Overwrite RETURNS: Tuple (Success/Failure, changelist, userCheckedOutBy) Example: mP4.p4CheckOut("My Changelist Name") """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4CheckOut --') if self.isInP4: # get latest if sync: self.p4Sync(force) checkedOut = self.isCheckedOut if checkedOut: if not checkedOut == getuser(): logger.warning("Checked out by %s" % checkedOut) if not stomp: return (0, checkedOut, 0) newChangeList = self.p4MakeChangeList(desc) self.p4i.run('edit', "-c%s" % newChangeList, self.depotPath) # moves file to newChangeList logger.info("***Checking out: '%s'***" % self.depotPath) logger.debug('-- Exiting p4CheckOut --') if checkedOut and stomp: if not checkedOut == getuser(): return (1, newChangeList, checkedOut) else: return (1, newChangeList, 0) else: return (1, newChangeList, 0) else: changeListNum = self.p4MakeChangeList(desc.replace('Updated', 'Added')) try: self.p4i.run("add", "-c%s" % changeListNum, self.depotPath) return (1, changeListNum, 0) except: pass #print p4i.warnings()[0] logger.debug('Added to "%s" changelist' % changeListNum) logger.debug('-- Exiting p4CheckOut --') else: logger.error('Could not create P4 instance')
def p4GetFileType(self): """ SYNOPSIS: fstat info about the file INPUTS: NONE RETURNS: True/False Example: mP4.p4GetFileType() """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4GetFileType --') if self.isInP4: result = self.p4i.run("fstat", self.depotPath) logger.debug('-- Exiting p4GetFileType --') return result[0]['headType'] else: return 0 else: logger.error('Could not create P4 instance')
def p4RevertFile(self): if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4Revert --') try: # self.p4i.run('revert', "%s" % self.fileName) self.p4i.run('revert', "%s" % self.depotPath) logger.info("***Reverting: '%s'***" % self.fileName) return 1 except: return 0 logger.debug('-- Exiting p4Revert --') else: logger.error('Could not create P4 instance') return 0
def p4SetFileType(self, fileType='binary'): """ SYNOPSIS: Set file type INPUTS: fileType - RETURNS: Nothing Example: mP4.p4SetFileType() """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4SetFileType --') if self.isInP4: self.p4i.run("reopen", "-t%s" % fileType, self.depotPath) # result = self.p4i.run("fstat", self.depotPath) logger.debug('-- Exiting p4SetFileType --') return 1 # return result[0]['headType'] else: return 0 else: logger.error('Could not create P4 instance')
def p4Sync(self, force=0): """ SYNOPSIS: Sync file INPUTS: force* - Force sync (0/1) RETURNS: True/False/-1 Example: mP4.p4Sync() """ if not self.p4i: self.createP4Instance() if self.p4i: if not self.isP4Connected: if self.canP4connect: self.p4Connect() logger.debug('-- Entered p4Sync --') # depotPath = depotPath.replace('\\', '/') # test to see whether its a file or a dir # if self.depotPath[-1:] == '/': self.depotPath = self.depotPath[:-1] if pcsPath.Path(self._fileName).isdir(): self.depotPath = self.depotPath + '...' logger.debug('Depot Path is: %s' % self.depotPath) if self.isInP4: if not self.isLatest: result = 0 try: if force: result = self.p4i.run("sync", "-f", self.depotPath) logger.debug("***Syncing (force): '%s'***" % self.depotPath) else: result = self.p4i.run("sync", self.depotPath) logger.debug("***Syncing: '%s'***" % self.depotPath) #if result: result = 1 except: logger.debug("Failed to sync. Already in sync?...") result = 0 logger.debug('-- Exiting p4Sync --') return result else: return True else: logger.error('Could not create P4 instance')
def p4MoveRename(self, newName, desc="Py Rename/Move file(s)", stomp=0): """ SYNOPSIS: Move and rename files in P4 INPUTS: newName - New path name (system or P4 path) desc* - [New change, old change] stomp* - Overwrite RETURNS: Changelist Example: mP4.p4MoveRename(["My New File Changelist Name", "My Old File Changelist Name"]) """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4CheckOut --') if not re.search('//depot/', str(newName)): newDepotPath = pcsPath.Path(newName).toP4Path() else: newDepotPath = newName changeListNum = (0, "doesn't exist") if self.isInP4: # get latest self.p4Sync(1) checkedOut = self.isCheckedOut if checkedOut: if not checkedOut == getuser(): logger.warning('WARNING!: Checked out by %s' % checkedOut) if not stomp: return (0, checkedOut) # copy changeListNum = self.p4MakeChangeList(desc) self.p4i.run('integrate', '-c%s' % changeListNum, self.depotPath, newDepotPath) logger.debug("Copied '%s' to '%s'" % (self._fileName, newName)) # delete changeListNum = self.p4MakeChangeList(desc) self.p4i.run('delete', '-c%s' % changeListNum, self.depotPath) logger.debug('Marked "%s" for delete' % self._fileName) return changeListNum else: logger.error('Could not create P4 instance') return 0
def p4GetFileType(self): """ SYNOPSIS: fstat info about the file INPUTS: NONE RETURNS: True/False Example: mP4.p4GetFileType() """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4GetFileType --') if self.isInP4: result = self.p4i.run("fstat", self.depotPath) logger.debug('-- Exiting p4GetFileType --') return result[0]['headType'] else: return 0 else: logger.error('Could not create P4 instance')
def p4clientDiag(self): """ SYNOPSIS: Diagnose specs about P4 client INPUTS: NONE RETURNS: clientName Example: mP4.p4clientDiag """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4clientDiag --') infoL = self.p4i.run("info") #print "infoL is: '%s'" %infoL info = infoL[0] j = 0 clientName = 0 # perforce diagnostics if self.p4Version == 2.4: # list = P4 for Python 2.4 logger.debug("Client 'info' specs are:\n%s" % '\n'.join(i for i in infoL)) for i in infoL: if not i.find("Client unknown") == -1: clientName = '*unknown*' elif not i.find("Client name") == -1: clientName = i[i.rfind(' ') + 1:] elif self.p4Version == 2.5 or 2.6: logger.debug("Client 'info' specs are:\n%s" % '\n'.join('%s is: %s' % (stat, val) for stat, val in info.iteritems())) keys = info.keys() #@UnusedVariable for i in info: j = j + 1 clientName = info['clientName'] logger.debug('returning %s' % clientName) logger.debug('-- Exiting p4clientDiag --') return clientName else: logger.error('Could not create P4 instance') return 0
def isLatest(self): """ **Property, do not use ()** SYNOPSIS: Check if file is latest INPUTS NONE RETURNS: True/False Example: mP4.isLatest """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered isLatest --') if self.isInP4: try: if not pcsPath.Path(self._fileName).isdir(): fileStatDict = self.p4i.run("fstat", self.depotPath) if fileStatDict: if fileStatDict[0]['headRev'] == fileStatDict[0]['haveRev']: logger.debug('Head revision - %s - same as Have Revision - %s - on file file - %s' % ( str(fileStatDict[0]['headRev']), str(fileStatDict[0]['haveRev']), self.depotPath)) return 1 else: logger.debug( 'Head revision - %s - not the same as Have Revision - %s - on file file - %s' % ( str(fileStatDict[0]['headRev']), str(fileStatDict[0]['haveRev']), self.depotPath)) return 0 else: logger.debug('Empty fstat list returned on file - %s' % self.depotPath) return 0 else: logger.debug('Passed file is a directory - %s' % self.depotPath) return 0 except: logger.debug('Failed on file - %s' % self.depotPath) return 0 else: logger.debug('File not in perforce - %s' % self.depotPath) return 0 else: logger.error('Could not create P4 instance') logger.debug('- Exiting isLatest --')
def p4Sync(self, force=0): """ SYNOPSIS: Sync file INPUTS: force* - Force sync (0/1) RETURNS: True/False/-1 Example: mP4.p4Sync() """ if not self.p4i: self.createP4Instance() if self.p4i: if not self.isP4Connected: if self.canP4connect: self.p4Connect() logger.debug('-- Entered p4Sync --') # depotPath = depotPath.replace('\\', '/') # test to see whether its a file or a dir # if self.depotPath[-1:] == '/': self.depotPath = self.depotPath[:-1] if pcsPath.Path(self._fileName).isdir(): self.depotPath = self.depotPath + '...' logger.debug('Depot Path is: %s' % self.depotPath) if self.isInP4: if not self.isLatest: result = 0 try: if force: result = self.p4i.run("sync", "-f", self.depotPath) logger.debug("***Syncing (force): '%s'***" % self.depotPath) else: result = self.p4i.run("sync", self.depotPath) logger.debug("***Syncing: '%s'***" % self.depotPath) #if result: result = 1 except: logger.debug("Failed to sync. Already in sync?...") result = 0 logger.debug('-- Exiting p4Sync --') return result else: return True else: logger.error('Could not create P4 instance')
def p4MoveRename(self, newName, desc="Py Rename/Move file(s)", stomp=0): """ SYNOPSIS: Move and rename files in P4 INPUTS: newName - New path name (system or P4 path) desc* - [New change, old change] stomp* - Overwrite RETURNS: Changelist Example: mP4.p4MoveRename(["My New File Changelist Name", "My Old File Changelist Name"]) """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4CheckOut --') if not re.search('//depot/', str(newName)): newDepotPath = pcsPath.Path(newName).toP4Path() else: newDepotPath = newName changeListNum = (0, "doesn't exist") if self.isInP4: # get latest self.p4Sync(1) checkedOut = self.isCheckedOut if checkedOut: if not checkedOut == getuser(): logger.warning('WARNING!: Checked out by %s' % checkedOut) if not stomp: return (0, checkedOut) # copy changeListNum = self.p4MakeChangeList(desc) self.p4i.run('integrate', '-c%s' % changeListNum, self.depotPath, newDepotPath) logger.debug("Copied '%s' to '%s'" % (self._fileName, newName)) # delete changeListNum = self.p4MakeChangeList(desc) self.p4i.run('delete', '-c%s' % changeListNum, self.depotPath) logger.debug('Marked "%s" for delete' % self._fileName) return changeListNum else: logger.error('Could not create P4 instance') return 0
def p4SetFileType(self, fileType='binary'): """ SYNOPSIS: Set file type INPUTS: fileType - RETURNS: Nothing Example: mP4.p4SetFileType() """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4SetFileType --') if self.isInP4: self.p4i.run("reopen", "-t%s" % fileType, self.depotPath) # result = self.p4i.run("fstat", self.depotPath) logger.debug('-- Exiting p4SetFileType --') return 1 # return result[0]['headType'] else: return 0 else: logger.error('Could not create P4 instance')
def p4clientDiag(self): """ SYNOPSIS: Diagnose specs about P4 client INPUTS: NONE RETURNS: clientName Example: mP4.p4clientDiag """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4clientDiag --') infoL = self.p4i.run("info") #print "infoL is: '%s'" %infoL info = infoL[0] j = 0 clientName = 0 # perforce diagnostics if self.p4Version == 2.4: # list = P4 for Python 2.4 logger.debug("Client 'info' specs are:\n%s" % '\n'.join(i for i in infoL)) for i in infoL: if not i.find("Client unknown") == -1: clientName = '*unknown*' elif not i.find("Client name") == -1: clientName = i[i.rfind(' ') + 1:] elif self.p4Version == 2.5 or 2.6: logger.debug("Client 'info' specs are:\n%s" % '\n'.join( '%s is: %s' % (stat, val) for stat, val in info.iteritems())) keys = info.keys() #@UnusedVariable for i in info: j = j + 1 clientName = info['clientName'] logger.debug('returning %s' % clientName) logger.debug('-- Exiting p4clientDiag --') return clientName else: logger.error('Could not create P4 instance') return 0
def __init__(self, maya=1, pyTargetVersion='26', fileName=None): """ SYNOPSIS: Perforce Library class init INPUTS: maya* - instantiate for use in Maya pyTargetVersion* - where to import P4 from fileName* - Which system file name to act upon (self.fileName) Example: mP4 = pcsP4.P4Lib() """ # Parse User XML userXML = ET.parse("%s/data/%s/PCSuser.xml" % (gv.toolsLocation, getpass.getuser())) self.userXMLcore = userXML.getiterator('Core')[0] p4Mode = self.userXMLcore.get('P4_Mode') # Parse Team XML globalXML = ET.parse("%s/installData/PCSstudio.xml" % gv.toolsLocation) self.globalXMLcore = globalXML.getiterator(self.userXMLcore.get('PCSactiveTeam'))[0] self.maya = maya self.pyTargetVersion = pyTargetVersion if fileName: self.fileName = fileName else: self._fileName = fileName self.depotPath = None if p4Mode: if self.maya: try: # Path is hardcoded per team in PCSstudio.xml from P4 import P4 # @UnusedImport @UnresolvedImport except ImportError: logger.error('Failed to import P4 from Maya - check that the path is in pcsGlobalSetup') else: if self.pyTargetVersion == '26': try: if platform.architecture()[0] == '64bit': # cannot import via '.' path, bug, must add this path to sys.path # from perforce.p426.win64.P4 import P4 #@Reimport @UnresolvedImport @UnusedImport from P4 import P4 # @Reimport @UnresolvedImport @UnusedImport else: # from perforce.p426.win32.P4 import P4 #@UnresolvedImport @Reimport @UnusedImport from P4 import P4 # @UnresolvedImport @Reimport @UnusedImport except ImportError: logger.error('Failed to import P4 for pyTargetVersion - %s' % self.pyTargetVersion) elif self.pyTargetVersion == '25': try: # from perforce.p425.P4 import P4 #@Reimport @UnresolvedImport @UnusedImport from P4 import P4 # @Reimport @UnresolvedImport @UnusedImport except ImportError: logger.error('Failed to import P4 for pyTargetVersion - %s' % self.pyTargetVersion) if self.canP4connect: self.createP4Instance() self.p4Connect() else: logger.warning('Perforce is turned off, if you want to use it, turn it on in your Maya menu')
def isCheckedOut(self): """ **Property, do not use ()** SYNOPSIS: Check if file is checked out INPUTS NONE RETURNS: True/False Example: mP4.isCheckedOut """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered isCheckedOut --') checkedOut = 0 if self.isInP4: logger.debug('%s is in depot' % self.depotPath) stats = self.p4i.run("opened", "-a", self._fileName) if stats: if self.p4Version == 2.4: logger.debug('p4(Python2.4) stats are:%s' % stats) if not stats[0].find(' by ') == -1: checkedOut = stats[0][stats[0].rfind(' ') + 1:] elif self.p4Version == 2.5 or 2.6: logger.debug('P4(Python2.5) stats are:\n%s' % '\n'.join('%s,%s' % (stat, stats[0][stat]) for stat in stats[0].keys())) if stats[0].has_key('user'): logger.debug('Already checked out by: %s' % stats[0]['user']) checkedOut = stats[0]['user'] logger.debug('Not checked out.') logger.debug('-- Exiting isCheckedOut --') return checkedOut else: logger.error('Could not create P4 instance') return 0
def pushToNetwork(self, networkLoc=gv.toolsLocation, remote=True): """ copies all files from depot to desired network test location Params: networkLoc: destination location Returns: True/False? """ _pNetworkLoc = Path(networkLoc) result = True # copy to remote build location, straight-up delete and copy all if remote: # try whole loop 5 times? for unused in range(4): if _pNetworkLoc.exists(): # nuke current folders print "Cleaning old: %s/." % _pNetworkLoc for _dir in _pNetworkLoc.dirs(): # make writable for _file in _dir.walk(): _file.makeWritable() # try /python twice if "python" in _dir: try: _dir.rmtree() print "Removing dir: %s" % _dir except WindowsError: print "Failed once on '%s', trying again . . ." % _dir if _dir.exists(): try: _dir.rmtree() print "Removing dir: %s" % _dir except WindowsError: print "Unable to delete dir: '%s'" % _dir raise # remote top dir too _pNetworkLoc.rmtree() # copy to network print "Copying '%s' dir to '%s'" % (self.pipelineSourceLocation, _pNetworkLoc) try: Path(self.pipelineSourceLocation).copytree(_pNetworkLoc) except WindowsError: print "Process locked trying to copy to: '%s'. Please just run again." % _pNetworkLoc raise except shutil.Error as e: print "Permission denied for file/folder: '%s'" % e[0] # success? if not _pNetworkLoc.exists(): logger.error("Failed to copy to remote location build: '%s'" % _pNetworkLoc) # copy/move dataResources sub-folder for _dir in Path("%s/dataResources" % _pNetworkLoc).dirs(): if _dir.namebase == "installData": Path(_dir).move(_pNetworkLoc) # have to dance around data and installData dirs else: if _pNetworkLoc.exists(): # nuke current folders print "Cleaning old: %s/." % _pNetworkLoc for _dir in _pNetworkLoc.dirs(): if "data" not in _dir: # keep 'data' & 'installData'! # make writable for _file in _dir.walk(): _file.makeWritable() # try /python twice if "python" in _dir: try: _dir.rmtree() except WindowsError: print "Failed once on '%s', trying again . . ." % _dir if _dir.exists(): try: _dir.rmtree() print "Removing dir: %s" % _dir except WindowsError: print "Unable to delete dir: '%s'" % _dir raise # clean dataResources elif _dir == "dataResources": # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # copy to network tempNetworkLoc = Path("%s/temp" % _pNetworkLoc) # copy print "Copying '%s' dir to '%s'" % (self.pipelineSourceLocation, tempNetworkLoc) try: Path(self.pipelineSourceLocation).copytree(tempNetworkLoc) except WindowsError: print "Process locked trying to copy to: '%s'. Please just run again." % tempNetworkLoc except shutil.Error as e: print "Permission denied for file/folder: '%s'" % e[0] # move first-layer sub-dirs from '/temp' up to parent for _dir in tempNetworkLoc.dirs(): try: if "data" not in _dir: # skip 'data' & 'installData'! Path(_dir).move(_pNetworkLoc) except WindowsError: print "failed on: " + _dir except shutil.Error: print "failed to copy from dir: '%s', already exists?" % _dir raise # nuke tempNetworkLoc if tempNetworkLoc.exists(): print "Cleaning old: %s" % tempNetworkLoc # make writable for _file in tempNetworkLoc.walk(): _file.makeWritable() print "Removing tree: %s" % tempNetworkLoc tempNetworkLoc.rmtree() ############# start cleaning ############## # clean un-needed root folders unNeededRoot = ["dataResources", "docs", "logs"] for unNeeded in unNeededRoot: print "Cleaning un-needed: %s/%s" % (_pNetworkLoc, unNeeded) for _dir in Path(_pNetworkLoc).dirs(): if _dir.namebase == unNeeded: # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # clean unitTests print "Cleaning un-needed: %s/python/unitTests" % _pNetworkLoc for _dir in Path("%s/python" % _pNetworkLoc).dirs(): if _dir.namebase == "unitTests": # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # clean non-maya/pymel dirs from pymels print "Cleaning un-needed: %s/python/maya/pymel" % _pNetworkLoc pyMelDirs = ["pymel-1.0.2", "pymel-1.0.3"] for pyMelDir in pyMelDirs: if not Path("%s/python/maya/%s" % (_pNetworkLoc, pyMelDir)).exists(): logger.error("No pymel dir found, probably failed copy earlier.") if not _dir.namebase == "maya" and not _dir.namebase == "pymel": # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() for _file in Path("%s/python/maya/%s" % (_pNetworkLoc, pyMelDir)).files(): _file.makeWritable() print "Removing file: %s" % _file _file.remove() # clean apps print "Cleaning un-needed: %s/python/apps" % _pNetworkLoc for _dir in Path("%s/python/apps" % _pNetworkLoc).dirs(): if not _dir.namebase == "APE": # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # clean misc print "Cleaning un-needed project files in : %s" % _pNetworkLoc unNeededRoot = [".project", ".pydevproject", "artMonkey.wpr", "artMonkey.wpu"] for unNeeded in unNeededRoot: for _file in _pNetworkLoc.files(): if _file.basename() == unNeeded: # make writable _file.makeWritable() print "Removing file: %s" % _file _file.remove() print "**********************************" print "Push To Network complete." print "**********************************" logger.info("**********************************") logger.info("Push To Network complete.") logger.info("**********************************") return result
def pushToNetwork(self, networkLoc=gv.toolsLocation, remote=True): ''' copies all files from depot to desired network test location Params: networkLoc: destination location Returns: True/False? ''' _pNetworkLoc = Path(networkLoc) result = True # copy to remote build location, straight-up delete and copy all if remote: # try whole loop 5 times? for unused in range(4): if _pNetworkLoc.exists(): # nuke current folders print "Cleaning old: %s/." % _pNetworkLoc for _dir in _pNetworkLoc.dirs(): # make writable for _file in _dir.walk(): _file.makeWritable() # try /python twice if 'python' in _dir: try: _dir.rmtree() print "Removing dir: %s" % _dir except WindowsError: print "Failed once on '%s', trying again . . ." % _dir if _dir.exists(): try: _dir.rmtree() print "Removing dir: %s" % _dir except WindowsError: print "Unable to delete dir: '%s'" % _dir raise # remote top dir too _pNetworkLoc.rmtree() # copy to network print "Copying '%s' dir to '%s'" % (self.pipelineSourceLocation, _pNetworkLoc) try: Path(self.pipelineSourceLocation).copytree(_pNetworkLoc) except WindowsError: print "Process locked trying to copy to: '%s'. Please just run again." % _pNetworkLoc raise except shutil.Error as e: print "Permission denied for file/folder: '%s'" % e[0] # success? if not _pNetworkLoc.exists(): logger.error("Failed to copy to remote location build: '%s'" % _pNetworkLoc) # copy/move dataResources sub-folder for _dir in Path('%s/dataResources' % _pNetworkLoc).dirs(): if _dir.namebase == 'installData': Path(_dir).move(_pNetworkLoc) # have to dance around data and installData dirs else: if _pNetworkLoc.exists(): # nuke current folders print "Cleaning old: %s/." % _pNetworkLoc for _dir in _pNetworkLoc.dirs(): if "data" not in _dir: #keep 'data' & 'installData'! # make writable for _file in _dir.walk(): _file.makeWritable() # try /python twice if 'python' in _dir: try: _dir.rmtree() except WindowsError: print "Failed once on '%s', trying again . . ." % _dir if _dir.exists(): try: _dir.rmtree() print "Removing dir: %s" % _dir except WindowsError: print "Unable to delete dir: '%s'" % _dir raise # clean dataResources elif _dir == 'dataResources': # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # copy to network tempNetworkLoc = Path('%s/temp' % _pNetworkLoc) # copy print "Copying '%s' dir to '%s'" % (self.pipelineSourceLocation, tempNetworkLoc) try: Path(self.pipelineSourceLocation).copytree(tempNetworkLoc) except WindowsError: print "Process locked trying to copy to: '%s'. Please just run again." % tempNetworkLoc except shutil.Error as e: print "Permission denied for file/folder: '%s'" % e[0] # move first-layer sub-dirs from '/temp' up to parent for _dir in tempNetworkLoc.dirs(): try: if "data" not in _dir: #skip 'data' & 'installData'! Path(_dir).move(_pNetworkLoc) except WindowsError: print "failed on: " + _dir except shutil.Error: print "failed to copy from dir: '%s', already exists?" % _dir raise # nuke tempNetworkLoc if tempNetworkLoc.exists(): print "Cleaning old: %s" % tempNetworkLoc # make writable for _file in tempNetworkLoc.walk(): _file.makeWritable() print "Removing tree: %s" % tempNetworkLoc tempNetworkLoc.rmtree() ############# start cleaning ############## # clean un-needed root folders unNeededRoot = ['dataResources', 'docs', 'logs'] for unNeeded in unNeededRoot: print "Cleaning un-needed: %s/%s" % (_pNetworkLoc, unNeeded) for _dir in Path(_pNetworkLoc).dirs(): if _dir.namebase == unNeeded: # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # clean unitTests print "Cleaning un-needed: %s/python/unitTests" % _pNetworkLoc for _dir in Path('%s/python' % _pNetworkLoc).dirs(): if _dir.namebase == 'unitTests': # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # clean non-maya/pymel dirs from pymels print "Cleaning un-needed: %s/python/maya/pymel" % _pNetworkLoc pyMelDirs = ['pymel-1.0.2', 'pymel-1.0.3'] for pyMelDir in pyMelDirs: if not Path('%s/python/maya/%s' % (_pNetworkLoc, pyMelDir)).exists(): logger.error( "No pymel dir found, probably failed copy earlier.") if not _dir.namebase == 'maya' and not _dir.namebase == 'pymel': # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() for _file in Path('%s/python/maya/%s' % (_pNetworkLoc, pyMelDir)).files(): _file.makeWritable() print "Removing file: %s" % _file _file.remove() # clean apps print "Cleaning un-needed: %s/python/apps" % _pNetworkLoc for _dir in Path('%s/python/apps' % _pNetworkLoc).dirs(): if not _dir.namebase == 'APE': # make writable for _file in _dir.walk(): _file.makeWritable() print "Removing dir: %s" % _dir _dir.rmtree() # clean misc print "Cleaning un-needed project files in : %s" % _pNetworkLoc unNeededRoot = [ '.project', '.pydevproject', 'artMonkey.wpr', 'artMonkey.wpu' ] for unNeeded in unNeededRoot: for _file in _pNetworkLoc.files(): if _file.basename() == unNeeded: # make writable _file.makeWritable() print "Removing file: %s" % _file _file.remove() print "**********************************" print "Push To Network complete." print "**********************************" logger.info("**********************************") logger.info("Push To Network complete.") logger.info("**********************************") return result
def __init__(self, maya=1, pyTargetVersion='26', fileName=None): """ SYNOPSIS: Perforce Library class init INPUTS: maya* - instantiate for use in Maya pyTargetVersion* - where to import P4 from fileName* - Which system file name to act upon (self.fileName) Example: mP4 = pcsP4.P4Lib() """ # Parse User XML userXML = ET.parse("%s/data/%s/PCSuser.xml" % (gv.toolsLocation, getpass.getuser())) self.userXMLcore = userXML.getiterator('Core')[0] p4Mode = self.userXMLcore.get('P4_Mode') # Parse Team XML globalXML = ET.parse("%s/installData/PCSstudio.xml" % gv.toolsLocation) self.globalXMLcore = globalXML.getiterator( self.userXMLcore.get('PCSactiveTeam'))[0] self.maya = maya self.pyTargetVersion = pyTargetVersion if fileName: self.fileName = fileName else: self._fileName = fileName self.depotPath = None if p4Mode: if self.maya: try: # Path is hardcoded per team in PCSstudio.xml from P4 import P4 # @UnusedImport @UnresolvedImport except ImportError: logger.error( 'Failed to import P4 from Maya - check that the path is in pcsGlobalSetup' ) else: if self.pyTargetVersion == '26': try: if platform.architecture()[0] == '64bit': # cannot import via '.' path, bug, must add this path to sys.path # from perforce.p426.win64.P4 import P4 #@Reimport @UnresolvedImport @UnusedImport from P4 import P4 # @Reimport @UnresolvedImport @UnusedImport else: # from perforce.p426.win32.P4 import P4 #@UnresolvedImport @Reimport @UnusedImport from P4 import P4 # @UnresolvedImport @Reimport @UnusedImport except ImportError: logger.error( 'Failed to import P4 for pyTargetVersion - %s' % self.pyTargetVersion) elif self.pyTargetVersion == '25': try: # from perforce.p425.P4 import P4 #@Reimport @UnresolvedImport @UnusedImport from P4 import P4 # @Reimport @UnresolvedImport @UnusedImport except ImportError: logger.error( 'Failed to import P4 for pyTargetVersion - %s' % self.pyTargetVersion) if self.canP4connect: self.createP4Instance() self.p4Connect() else: logger.warning( 'Perforce is turned off, if you want to use it, turn it on in your Maya menu' )
def p4MakeChangeList(self, desc="Updated via python script"): """ SYNOPSIS: Make a new changelist INPUTS: desc* - Changelist name RETURNS: New Changelist Example: mP4.p4MakeChangeList("My New Changelist Name") """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4MakeChangeList --') # check for desc length if len(desc) > 31: logger.warning( "WARNING!: '%s' is longer than 31 characters, descriptions will NOT match." % desc) # create new list with: newChangeList = 0 if not self.isP4Connected: logger.error('Could not connect') return False # check if already exists changeLists = self.p4i.run("changes", "-c%s" % self.p4i.client, "-spending") logger.debug("changeLists is '%s'" % changeLists) if changeLists: for cl in changeLists: if self.p4Version == 2.4: logger.debug( "Checking p4 (Python 2.4) changelist: '%s'" % cl) if re.search(desc, cl): # list = P4 for Python 2.4 newChangeList = cl[cl.find(' ') + 1:cl.find('on') - 1] logger.debug("Found desc: '%s' for changeList %s" % (desc, newChangeList)) elif self.p4Version == 2.5 or 2.6: # dictionary = P4 for Python 2.5,2.6 logger.debug( "Checking P4 (Python 2.5) changelist: '%s'" % cl) if re.search(desc, cl["desc"]): newChangeList = cl['change'] if not newChangeList: change = '' if self.p4Version == 2.4: change = 'Description:%s\nChange: new' % desc elif self.p4Version == 2.5 or 2.6: change = {} change["Description"] = desc change['Change'] = 'new' self.p4i.input = change result = self.p4i.run('change', '-i')[0] newChangeList = result[result.find(' ') + 1:result.rfind(' ')] logger.debug("newChangeList is: '%s'" % newChangeList) logger.debug('-- Exiting p4MakeChangeList --') return newChangeList else: logger.error('Could not create P4 instance')
def p4DescribeChangeList(self, changeListNum): """ NAME: p4DescribeChangList SYNOPSIS Queries changeList and returns files and description INPUTS * = optional (int) changListNum: changeList to lookup ##RETURNS: (list),(string) files, desc RETURNS: (string) description """ if not self.p4i: self.createP4Instance() if self.p4i: logger.debug('-- Entered p4DescribeChangList --') description = '' try: if self.p4Version == 2.4: results = self.p4i.run('describe', '-dc', str(changeListNum)) if not results: logger.info("Changelist %s probably doesn't exist" % changeListNum) return doneWithDesc, doneWithFiles = [0, 0] desc, files = [[], []] for line in results: if 'Affected files ' in line: doneWithDesc = 1 if 'Differences ' in line: doneWithFiles = 1 if not doneWithDesc: desc.append(line) elif not doneWithFiles: files.append(line) text = '\nDescription of change:\n\n' for des in desc: if des[:1] == '\t': des = des[1:] # remove tab text = '%s%s\n' % (text, des) for _file in files: if _file[:2] == '//': _file = _file[:-5] # remove '#edit' text = '%s%s\n' % (text, _file) description = text elif self.p4Version == 2.5 or 2.6: results = self.p4i.run('describe', '-dc', changeListNum)[0] files = results['depotFile'] desc = results['desc'] #description = [desc, files] filesText = '' for _file in files: filesText = '%s%s\n' % (filesText, _file) description = '\nDescription of change:\n\n%s\n\nAffected files ...\n\n%s\n' % ( desc, filesText) except: logger.info("Changelist %s probably doesn't exist" % changeListNum) return return description else: logger.error('Could not create P4 instance')