1016 lines
30 KiB
Python
1016 lines
30 KiB
Python
import maya.cmds as cmds
|
|
from P4 import P4,P4Exception
|
|
import os, cPickle
|
|
from functools import partial
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def p4_getLatestRevision(fileName, *args):
|
|
fileArg = fileName
|
|
#try to connect
|
|
p4 = P4()
|
|
|
|
try:
|
|
p4.connect()
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to connect to perforce server.")
|
|
return
|
|
|
|
#find currently opened file name
|
|
if fileName == None:
|
|
fileName = cmds.file(q = True, sceneName = True)
|
|
|
|
syncFiles = []
|
|
|
|
|
|
try:
|
|
#client info
|
|
spec = p4.run( "client", "-o" )[0]
|
|
client = spec.get("Client")
|
|
owner = spec.get("Owner")
|
|
p4.user = owner
|
|
p4.client = client
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to obtain client spec information.")
|
|
|
|
|
|
|
|
#try to get the current file revision on local, and compare to depot
|
|
try:
|
|
#Find out the revision of the local version of the file
|
|
myFile = p4.run_have(fileName)[0]
|
|
|
|
#This will find the revision number of your local file.
|
|
localRevision = int(myFile['haveRev'])
|
|
|
|
#find out the revision number of the depot version of the file
|
|
depotVersion = p4.run_files(myFile['depotFile'])[0]
|
|
|
|
#find the depot file path
|
|
depotFile = depotVersion['depotFile']
|
|
|
|
#find the depot revision number of the file
|
|
depotRevision = int(depotVersion['rev'])
|
|
|
|
#check for latest
|
|
if localRevision != depotRevision:
|
|
syncFiles.append(depotFile)
|
|
|
|
|
|
|
|
#Check for scene references in the file
|
|
allRefs = []
|
|
references = cmds.file(q = True, reference = True)
|
|
for reference in references:
|
|
nestedRef = cmds.file(reference, q = True, reference = True)
|
|
allRefs.append(reference)
|
|
allRefs.append(nestedRef)
|
|
|
|
#loop through all found references and check for latest
|
|
for ref in allRefs:
|
|
#get revision of local file
|
|
myFile = p4.run_have(ref)[0]
|
|
|
|
#get revision number
|
|
localRefRevision = int(myFile['haveRev'])
|
|
|
|
#grab depot file info
|
|
depotRefVersion = p4.run_files(myFile['depotFile'])[0]
|
|
|
|
#depot file path
|
|
depotFile = depotRefVersion['depotFile']
|
|
|
|
#get depot's revision #
|
|
depotRefRevision = int(depotRefVersion['rev'])
|
|
|
|
|
|
#compare
|
|
if localRefRevision != depotRefRevision:
|
|
syncFiles.append(depotFile)
|
|
|
|
|
|
|
|
|
|
#if there are files to sync, do it now
|
|
if len(syncFiles) > 0:
|
|
message = "The following files are not at latest revision:\n\n"
|
|
for file in syncFiles:
|
|
message += file + "\n"
|
|
|
|
result = cmds.confirmDialog(title = "Perforce", icon = "warning", message = message, button = ["Sync", "Cancel"])
|
|
|
|
if result == "Sync":
|
|
#sync files
|
|
for f in syncFiles:
|
|
p4.run_sync(f)
|
|
|
|
#ask if user would like to reopen
|
|
if fileArg == None:
|
|
result = cmds.confirmDialog(title = "Perforce", icon = "question", message = "Sync Complete. Reopen file to get changes?", button = ["Yes", "Cancel"])
|
|
|
|
if result == "Yes":
|
|
cmds.file(fileName, open = True, force = True)
|
|
|
|
else:
|
|
cmds.confirmDialog(title = "Perforce", icon = "information", message = "This file is already at head revision.", button = "Close")
|
|
|
|
#disconnect from server
|
|
p4.disconnect()
|
|
|
|
|
|
|
|
#Handle any p4 errors that come back from trying to run the above code
|
|
except P4Exception:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
p4.disconnect()
|
|
return
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def p4_checkOutCurrentFile(fileName, *args):
|
|
fileArg = fileName
|
|
#try to connect
|
|
p4 = P4()
|
|
|
|
try:
|
|
p4.connect()
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to connect to perforce server.")
|
|
return False
|
|
|
|
#find currently opened file name
|
|
if fileName == None:
|
|
fileName = cmds.file(q = True, sceneName = True)
|
|
|
|
reopen = False
|
|
syncFiles = []
|
|
|
|
|
|
try:
|
|
#client info
|
|
spec = p4.run( "client", "-o" )[0]
|
|
client = spec.get("Client")
|
|
owner = spec.get("Owner")
|
|
p4.user = owner
|
|
p4.client = client
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to obtain client spec information.")
|
|
|
|
|
|
try:
|
|
#check to see if file is at head revision
|
|
myFile = p4.run_have(fileName)[0]
|
|
|
|
#This will find the revision number of your local file.
|
|
localRevision = int(myFile['haveRev'])
|
|
|
|
#find out the revision number of the depot version of the file
|
|
depotVersion = p4.run_files(myFile['depotFile'])[0]
|
|
|
|
#find the depot file path
|
|
depotFile = depotVersion['depotFile']
|
|
|
|
#find the depot revision number of the file
|
|
depotRevision = int(depotVersion['rev'])
|
|
|
|
#check for latest
|
|
if localRevision != depotRevision:
|
|
result = cmds.confirmDialog(title = "Perforce", icon = "warning", message = "This file is not at head revision. Please get latest and try again.", button = ["Get Latest", "Cancel"])
|
|
|
|
if result == "Get Latest":
|
|
p4_getLatestRevision(fileArg)
|
|
p4.disconnect()
|
|
|
|
else:
|
|
return False
|
|
|
|
else:
|
|
try:
|
|
#check to see if file is checked out
|
|
opened = p4.run_opened(depotFile)
|
|
|
|
if len(opened) > 0:
|
|
user = opened[0]['user']
|
|
cmds.confirmDialog(title = "Perforce", icon = "warning", message = "This file is already checked out by: " + user, button = "Close")
|
|
p4.disconnect()
|
|
|
|
else:
|
|
#check out the file
|
|
p4.run_edit(depotFile)
|
|
cmds.confirmDialog(title = "Perfoce", icon = "information", message = "This file is now checked out.", button = "Close")
|
|
p4.disconnect()
|
|
#tools path
|
|
toolsPath = cmds.internalVar(usd = True) + "mayaTools.txt"
|
|
if os.path.exists(toolsPath):
|
|
|
|
f = open(toolsPath, 'r')
|
|
mayaToolsDir = f.readline()
|
|
f.close()
|
|
|
|
return True
|
|
|
|
#Handle any p4 errors that come back from trying to run the above code
|
|
except P4Exception:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
return False
|
|
|
|
|
|
|
|
#Handle any p4 errors that come back from trying to run the above code
|
|
except P4Exception:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
p4.disconnect()
|
|
return False
|
|
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def p4_getRevisionHistory(*args):
|
|
|
|
#try to connect
|
|
p4 = P4()
|
|
|
|
try:
|
|
p4.connect()
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to connect to perforce server.")
|
|
return
|
|
|
|
#find currently opened file name
|
|
clientFile = cmds.file(q = True, sceneName = True)
|
|
reopen = False
|
|
syncFiles = []
|
|
|
|
|
|
try:
|
|
#client info
|
|
spec = p4.run( "client", "-o" )[0]
|
|
client = spec.get("Client")
|
|
owner = spec.get("Owner")
|
|
p4.user = owner
|
|
p4.client = client
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to obtain client spec information.")
|
|
|
|
|
|
#get revision history of current file
|
|
try:
|
|
#check to see if file is at head revision
|
|
myFile = p4.run_have(clientFile)[0]
|
|
depotVersion = p4.run_files(myFile['depotFile'])[0]
|
|
depotFile = depotVersion['depotFile']
|
|
history = p4.run_changes(depotFile)
|
|
|
|
info = ""
|
|
|
|
for h in history:
|
|
user = h.get("user")
|
|
change = h.get("change")
|
|
desc = h.get("desc")
|
|
|
|
if desc.find("\n") == -1:
|
|
desc = desc + "...\n"
|
|
|
|
else:
|
|
desc = desc.partition("\n")[0] + "...\n"
|
|
|
|
info += change + " by " + user + ": " + desc
|
|
|
|
|
|
#print report into a confirm dialog
|
|
cmds.confirmDialog(title = "History", icon = "information", ma = "left", message = info, button = "Close")
|
|
p4.disconnect()
|
|
|
|
|
|
|
|
|
|
except P4Exception:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
p4.disconnect()
|
|
return
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def p4_submitCurrentFile(fileName, desc, *args):
|
|
|
|
fileArg = fileName
|
|
#try to connect
|
|
p4 = P4()
|
|
|
|
|
|
try:
|
|
p4.connect()
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to connect to perforce server.")
|
|
return
|
|
|
|
#find currently opened file name
|
|
if fileName == None:
|
|
fileName = cmds.file(q = True, sceneName = True)
|
|
|
|
reopen = False
|
|
syncFiles = []
|
|
|
|
|
|
try:
|
|
#client info
|
|
spec = p4.run( "client", "-o" )[0]
|
|
client = spec.get("Client")
|
|
owner = spec.get("Owner")
|
|
p4.user = owner
|
|
p4.client = client
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to obtain client spec information.")
|
|
|
|
|
|
|
|
#SUBMIT
|
|
try:
|
|
|
|
if desc == None:
|
|
result = cmds.promptDialog(title = "Perforce", message = "Please Enter a Description..", button = ["Accept", "Cancel"], defaultButton = "Accept", dismissString = "Cancel", cancelButton = "Cancel")
|
|
|
|
else:
|
|
result = "Accept"
|
|
|
|
#process
|
|
if result == "Accept":
|
|
|
|
#description = "test"
|
|
myFile = p4.run_have(fileName)[0]
|
|
depotVersion = p4.run_files(myFile['depotFile'])[0]
|
|
depotFile = depotVersion['depotFile']
|
|
|
|
#check to see if file is checked out
|
|
opened = p4.run_opened(depotFile)
|
|
|
|
if len(opened) > 0:
|
|
opendBy = opened[0]['user']
|
|
|
|
|
|
if opendBy.lower() != owner.lower():
|
|
cmds.confirmDialog(title = "Perforce", icon = "warning", message = "This file is already checked out by: " + opendBy, button = "Close")
|
|
p4.disconnect()
|
|
return
|
|
|
|
else:
|
|
|
|
#fetch the description
|
|
if desc == None:
|
|
desc = cmds.promptDialog(q = True, text = True)
|
|
|
|
#save the file locally (so depot and HD are in sync)
|
|
openedFile = cmds.file(q = True, sceneName = True)
|
|
saveFileName = openedFile.rpartition("/")[2]
|
|
if fileArg == None:
|
|
cmds.file(f = True, save = True, options = "v = 0", type = "mayaBinary")
|
|
|
|
|
|
#grab the name of the file
|
|
fileNameWithExt = openedFile.rpartition("/")[2]
|
|
fileName = fileNameWithExt.rpartition(".")[0]
|
|
|
|
description = (desc + "\n Affected Files: " + openedFile)
|
|
|
|
#create new changelist
|
|
newChange = p4.fetch_change()
|
|
newChange._description = description
|
|
|
|
#make sure we don't add existing default changelist files.
|
|
newChange._files = []
|
|
|
|
#determine the new number so we can refetch it.
|
|
newChangeNum = int(p4.save_change(newChange)[0].split()[1])
|
|
|
|
|
|
#change changelist number
|
|
p4.run_reopen('-c', newChangeNum, depotFile)
|
|
|
|
#submit the changelist
|
|
p4.run_submit('-c', newChangeNum)
|
|
|
|
#tell the user submit was successful
|
|
if fileArg == None:
|
|
cmds.confirmDialog(title = "Perforce", icon = "information", message = "Submit Operation was successful!", button = "Close")
|
|
|
|
else:
|
|
return True
|
|
|
|
else:
|
|
#if the file is not checked out by the user, let them know
|
|
result = cmds.confirmDialog(title = "Perforce", icon = "warning", message = "File is not checked out. Unable to continue submit operation on this file:\n\n" + fileName)
|
|
|
|
|
|
|
|
except P4Exception:
|
|
if fileArg == None:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
|
|
p4.disconnect()
|
|
return False
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def p4_addAndSubmitCurrentFile(fileName, description, *args):
|
|
fileArg = fileName
|
|
#try to connect
|
|
p4 = P4()
|
|
|
|
|
|
try:
|
|
p4.connect()
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to connect to perforce server.")
|
|
return
|
|
|
|
|
|
#find currently opened file name
|
|
if fileName == None:
|
|
fileName = cmds.file(q = True, sceneName = True)
|
|
reopen = False
|
|
syncFiles = []
|
|
|
|
|
|
|
|
try:
|
|
#client info
|
|
spec = p4.run( "client", "-o" )[0]
|
|
client = spec.get("Client")
|
|
owner = spec.get("Owner")
|
|
p4.user = owner
|
|
p4.client = client
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to obtain client spec information.")
|
|
|
|
|
|
#find currently opened file name
|
|
proceed = False
|
|
if fileArg == None:
|
|
fileName = cmds.file(q = True, sceneName = True)
|
|
|
|
if fileName == "":
|
|
cmds.confirmDialog(title = "Perforce", icon = "warning", message = "Cannot Add file to perforce as file has no name.", button = "Close")
|
|
p4.disconnect()
|
|
return
|
|
|
|
else:
|
|
proceed = True
|
|
|
|
else:
|
|
proceed = True
|
|
|
|
|
|
#if the file has a filename,
|
|
if proceed:
|
|
try:
|
|
|
|
|
|
clientRoot = p4.fetch_client(p4.client)._Root
|
|
|
|
#check to make sure client root is in the client file path
|
|
if os.path.normpath(fileName).find(os.path.normpath(clientRoot)) == 0:
|
|
#if it was, then get a description for the changelist
|
|
if description == None:
|
|
result = cmds.promptDialog(title = "Perforce", message = "Please Enter a Description..", button = ["Accept", "Cancel"], defaultButton = "Accept", dismissString = "Cancel", cancelButton = "Cancel")
|
|
|
|
else:
|
|
result = "Accept"
|
|
|
|
|
|
if result == "Accept":
|
|
|
|
#get changelist description
|
|
if description == None:
|
|
description = cmds.promptDialog(q = True, text = True)
|
|
|
|
|
|
#create changelist
|
|
newChange = p4.fetch_change()
|
|
newChange._description = description
|
|
|
|
#make sure we don't add existing default changelist files.
|
|
newChange._files = []
|
|
|
|
#determine the new number so we can refetch it.
|
|
newChangeNum = int(p4.save_change(newChange)[0].split()[1])
|
|
|
|
|
|
#description = "test"
|
|
p4.run_add('-c', newChangeNum, fileName)
|
|
|
|
#submit the changelist
|
|
p4.run_submit('-c', newChangeNum)
|
|
|
|
#tell user operation was successful
|
|
if fileArg == None:
|
|
result = cmds.confirmDialog(title = "Perforce", icon = "information", message = "File has been successfully added to perforce and submitted!", button = ["Close", "Check Out File"])
|
|
|
|
if result == "Close":
|
|
p4.disconnect()
|
|
return
|
|
|
|
if result == "Check Out File":
|
|
p4_checkOutCurrentFile(fileName)
|
|
|
|
#return operation succuessful
|
|
return True
|
|
|
|
|
|
|
|
|
|
else:
|
|
p4.disconnect()
|
|
return
|
|
|
|
|
|
else:
|
|
cmds.confirmDialog(title = "Perforce", icon = "warning", message = "Cannot proceed. File is not under client's root, " + clientRoot, button = "Close")
|
|
p4.disconnect()
|
|
return False
|
|
|
|
|
|
|
|
|
|
except P4Exception:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
p4.disconnect()
|
|
return False
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def p4_checkForUpdates(*args):
|
|
#try to connect
|
|
p4 = P4()
|
|
|
|
#get maya tools path
|
|
toolsPath = cmds.internalVar(usd = True) + "mayaTools.txt"
|
|
if os.path.exists(toolsPath):
|
|
|
|
f = open(toolsPath, 'r')
|
|
mayaToolsDir = f.readline()
|
|
f.close()
|
|
|
|
#connect to p4
|
|
try:
|
|
p4.connect()
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to connect to perforce server.")
|
|
return
|
|
|
|
#find currently opened file name
|
|
clientFile = cmds.file(q = True, sceneName = True)
|
|
reopen = False
|
|
syncFiles = []
|
|
|
|
|
|
try:
|
|
#client info
|
|
spec = p4.run( "client", "-o" )[0]
|
|
client = spec.get("Client")
|
|
owner = spec.get("Owner")
|
|
p4.user = owner
|
|
p4.client = client
|
|
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to obtain client spec information.")
|
|
|
|
|
|
#this will check the maya tools directory in p4 for any updates
|
|
try:
|
|
syncFiles = []
|
|
clientRoot = p4.fetch_client(p4.client)._Root
|
|
depotDirectories = []
|
|
|
|
#get current project
|
|
if os.path.exists(mayaToolsDir + "/General/Scripts/projectSettings.txt"):
|
|
#read to find current project
|
|
f = open(mayaToolsDir + "/General/Scripts/projectSettings.txt", 'r')
|
|
settings = cPickle.load(f)
|
|
f.close()
|
|
|
|
#write out new settings
|
|
project = settings.get("CurrentProject")
|
|
|
|
if os.path.exists(mayaToolsDir + "/General/Scripts/" + project + "_Project_Settings.txt"):
|
|
#read the depot paths to sync from the project settings
|
|
f = open(mayaToolsDir + "/General/Scripts/" + project + "_Project_Settings.txt", 'r')
|
|
settings = cPickle.load(f)
|
|
f.close()
|
|
depotDirectories = settings.get("depotPaths")
|
|
print depotDirectories
|
|
|
|
|
|
#look at each directory inside MayaTools
|
|
for dir in depotDirectories:
|
|
depotFiles = p4.run_files(dir + "...")
|
|
|
|
for each in depotFiles:
|
|
|
|
#try to compare depot to local. It is possible that there are local files not in depot, and vise versa
|
|
try:
|
|
fileInfo = p4.run_files(each['depotFile'])[0]
|
|
depotFilePath = fileInfo['depotFile']
|
|
fileName = depotFilePath.rpartition("/")[2]
|
|
|
|
#compare local files
|
|
localFile = p4.run_have(depotFilePath)[0]
|
|
localRevision = int(localFile['haveRev'])
|
|
depotRevision = int(fileInfo['rev'])
|
|
|
|
if localRevision < depotRevision:
|
|
syncFiles.append(depotFilePath)
|
|
|
|
|
|
except:
|
|
|
|
try:
|
|
#check to see if it errors out because we don't have a local version of the file
|
|
fileInfo = p4.run_files(each['depotFile'])[0]
|
|
depotFilePath = fileInfo['depotFile']
|
|
fileName = depotFilePath.rpartition("/")[2]
|
|
localFile = p4.run_have(depotFilePath)[0]
|
|
|
|
except:
|
|
action = each.get("action")
|
|
if action != "delete":
|
|
syncFiles.append(depotFilePath)
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
#check size of syncFiles and ask user if they want to sync
|
|
if len(syncFiles) > 0:
|
|
result = cmds.confirmDialog(title = "MayaTools", icon = "warning", message = "There are new updates available to the depot directories specified by your project settings.", button = ["Update", "Not Now"])
|
|
|
|
if result == "Update":
|
|
for file in syncFiles:
|
|
p4.run_sync(file)
|
|
|
|
|
|
cmds.confirmDialog(title = "MayaTools", icon = "information", message = "Tools are now up to date!", button = "Close")
|
|
p4.disconnect()
|
|
|
|
else:
|
|
p4.disconnect()
|
|
return
|
|
|
|
|
|
#handle any errors
|
|
except P4Exception:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
p4.disconnect()
|
|
return
|
|
|
|
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def createNewProject(*args):
|
|
|
|
if cmds.window("createNewARTProject_Window", exists = True):
|
|
cmds.deleteUI("createNewARTProject_Window")
|
|
|
|
#create window
|
|
window = cmds.window("createNewARTProject_Window", w = 400, h = 600, mnb = False, mxb = False, title = "Create New Project")
|
|
|
|
#frameLayouts for settings: Perforce/Auto-Sync
|
|
mainLayout = cmds.columnLayout(w = 400, h = 600)
|
|
|
|
#project name field
|
|
projectName = cmds.textFieldGrp("newARTProjectNameField", label = "Project Name: ", w = 400, h = 30, parent = mainLayout, cal = [1, "left"])
|
|
|
|
|
|
scrollLayout = cmds.scrollLayout(w = 400, h = 520, parent = mainLayout)
|
|
columnLayout = cmds.columnLayout(w = 380, parent = scrollLayout)
|
|
|
|
|
|
|
|
#perforce/auto-sync layout
|
|
p4Frame = cmds.frameLayout(parent = columnLayout, w = 370, cll = True, label='Perforce/Auto-Sync', borderStyle='in')
|
|
p4Layout = cmds.columnLayout(w = 360, parent = p4Frame, co = ["both", 5], rs = 5)
|
|
|
|
#create the scrollField with the information
|
|
cmds.scrollField(parent = p4Layout, w = 350, h = 100, editable = False, wordWrap = True, text = "Add depot paths you would like the tools to check for updates on. If updates are found, you will be notified, and asked if you would like to sync. Valid depot paths look like:\n\n//depot/usr/jeremy_ernst/MayaTools")
|
|
|
|
#crete the add button
|
|
cmds.button(w = 350, label = "Add Perforce Depot Path", parent = p4Layout, c = partial(addPerforceDepotPath, p4Layout))
|
|
|
|
|
|
|
|
|
|
#save settings button
|
|
cmds.button(parent = mainLayout, w = 400, h = 50, label = "Save Settings and Close", c = partial(saveProjectSettings, p4Layout, False))
|
|
|
|
#show window
|
|
cmds.showWindow(window)
|
|
|
|
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def editProject(project, *args):
|
|
|
|
if cmds.window("createNewARTProject_Window", exists = True):
|
|
cmds.deleteUI("createNewARTProject_Window")
|
|
|
|
#create window
|
|
window = cmds.window("createNewARTProject_Window", w = 400, h = 600, mnb = False, mxb = False, title = "Edit Project")
|
|
|
|
#frameLayouts for settings: Perforce/Auto-Sync
|
|
mainLayout = cmds.columnLayout(w = 400, h = 600)
|
|
|
|
#project name field
|
|
projectName = cmds.textFieldGrp("newARTProjectNameField", label = "Project Name: ", text = project, w = 400, h = 30, parent = mainLayout, cal = [1, "left"])
|
|
|
|
|
|
scrollLayout = cmds.scrollLayout(w = 400, h = 520, parent = mainLayout)
|
|
columnLayout = cmds.columnLayout(w = 380, parent = scrollLayout)
|
|
|
|
|
|
|
|
#perforce/auto-sync layout
|
|
p4Frame = cmds.frameLayout(parent = columnLayout, w = 370, cll = True, label='Perforce/Auto-Sync', borderStyle='in')
|
|
p4Layout = cmds.columnLayout(w = 360, parent = p4Frame, co = ["both", 5], rs = 5)
|
|
|
|
#create the scrollField with the information
|
|
cmds.scrollField(parent = p4Layout, w = 350, h = 100, editable = False, wordWrap = True, text = "Add depot paths you would like the tools to check for updates on. If updates are found, you will be notified, and asked if you would like to sync. Valid depot paths look like:\n\n//depot/usr/jeremy_ernst/MayaTools")
|
|
|
|
#crete the add button
|
|
cmds.button(w = 350, label = "Add Perforce Depot Path", parent = p4Layout, c = partial(addPerforceDepotPath, p4Layout))
|
|
|
|
#get maya tools path
|
|
toolsPath = cmds.internalVar(usd = True) + "mayaTools.txt"
|
|
if os.path.exists(toolsPath):
|
|
|
|
f = open(toolsPath, 'r')
|
|
mayaToolsDir = f.readline()
|
|
f.close()
|
|
|
|
|
|
#open the project settings and auto-fill in the info
|
|
if os.path.exists(mayaToolsDir + "/General/Scripts/" + project + "_Project_Settings.txt"):
|
|
f = open(mayaToolsDir + "/General/Scripts/" + project + "_Project_Settings.txt", 'r')
|
|
settings = cPickle.load(f)
|
|
f.close()
|
|
|
|
paths = settings.get("depotPaths")
|
|
|
|
|
|
if len(paths) > 0:
|
|
for path in paths:
|
|
#add the path
|
|
field = addPerforceDepotPath(p4Layout)
|
|
cmds.textField(field, edit = True, text = path)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#save settings button
|
|
cmds.button(parent = mainLayout, w = 400, h = 50, label = "Save Settings and Close", c = partial(saveProjectSettings, p4Layout, True))
|
|
|
|
#show window
|
|
cmds.showWindow(window)
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def addPerforceDepotPath(layout, *args):
|
|
|
|
field = cmds.textField(docTag = "P4DepotPath", w = 350, parent = layout)
|
|
|
|
#add a RMB menu to remove the field
|
|
menu = cmds.popupMenu(parent = field, b = 3)
|
|
cmds.menuItem(parent = menu, label = "Remove Path", c = partial(removePerforceDepotPath, field))
|
|
|
|
return field
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def removePerforceDepotPath(field, *args):
|
|
cmds.textField(field, edit = True, visible = False, h = 1)
|
|
#cmds.deleteUI(field) This crashes maya instantly. Come ON AUTODESK
|
|
|
|
|
|
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def saveProjectSettings(perforceLayout, edit, *args):
|
|
|
|
#find p4 depot path textfields
|
|
children = cmds.columnLayout(perforceLayout, q = True, childArray = True)
|
|
textFields = []
|
|
for child in children:
|
|
if child.find("textField") == 0:
|
|
data = cmds.textField(child, q = True, docTag = True)
|
|
if data == "P4DepotPath":
|
|
textFields.append(child)
|
|
|
|
|
|
#make sure paths are valid
|
|
savePaths = []
|
|
for field in textFields:
|
|
path = cmds.textField(field, q = True, text = True)
|
|
if path != "":
|
|
|
|
try:
|
|
p4 = P4()
|
|
p4.connect()
|
|
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to connect to perforce server.")
|
|
return
|
|
|
|
|
|
try:
|
|
#client info
|
|
spec = p4.run( "client", "-o" )[0]
|
|
client = spec.get("Client")
|
|
owner = spec.get("Owner")
|
|
p4.user = owner
|
|
p4.client = client
|
|
|
|
|
|
except:
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = "Unable to obtain client spec information.")
|
|
|
|
|
|
#now check
|
|
try:
|
|
depotFiles = p4.run_files(path + "...")
|
|
if len(depotFiles) > 0:
|
|
savePaths.append(path)
|
|
|
|
#handle any errors
|
|
except P4Exception:
|
|
errorString = "The following errors were encountered:\n\n"
|
|
|
|
for e in p4.errors:
|
|
errorString += e + "\n"
|
|
|
|
cmds.confirmDialog(title = "Perforce", icon = "critical", message = errorString)
|
|
p4.disconnect()
|
|
return
|
|
|
|
else:
|
|
#see if the text field is just hidden or if it is actually blank
|
|
vis = cmds.textField(field, q = True, visible = True)
|
|
if vis == True:
|
|
cmds.confirmDialog(title = "Error", icon = "critical", message = "Empty string not allowed as a path name. Either remove that field, or enter a correct depot path.")
|
|
return
|
|
|
|
|
|
#write out to disk
|
|
projectName = cmds.textFieldGrp("newARTProjectNameField", q = True, text = True)
|
|
if projectName == "":
|
|
cmds.confirmDialog(title = "Error", icon = "critical", message = "Empty string not allowed as a project name.")
|
|
return
|
|
|
|
#save the new project file under MayaTools/General/Scripts as projName + "_Project_Settings.txt"
|
|
toolsPath = cmds.internalVar(usd = True) + "mayaTools.txt"
|
|
if os.path.exists(toolsPath):
|
|
|
|
f = open(toolsPath, 'r')
|
|
mayaToolsDir = f.readline()
|
|
f.close()
|
|
|
|
if edit == False:
|
|
if os.path.exists(mayaToolsDir + "/General/Scripts/" + projectName + "_Project_Settings.txt"):
|
|
cmds.confirmDialog(title = "Error", icon = "critical", message = "Project already exists with that name")
|
|
return
|
|
|
|
#save out
|
|
f = open(mayaToolsDir + "/General/Scripts/" + projectName + "_Project_Settings.txt", 'w')
|
|
|
|
|
|
#create a dictionary with values
|
|
settings = {}
|
|
settings["depotPaths"] = savePaths
|
|
|
|
|
|
#write our dictionary to file
|
|
cPickle.dump(settings, f)
|
|
f.close()
|
|
|
|
|
|
#delete the UI
|
|
cmds.deleteUI("createNewARTProject_Window")
|
|
|
|
|
|
#add the project to the menu
|
|
create = True
|
|
items = cmds.lsUI(menuItems = True)
|
|
for i in items:
|
|
data = cmds.menuItem(i, q = True, docTag = True)
|
|
if data == "P4Proj":
|
|
label = cmds.menuItem(i, q = True, label = True)
|
|
print label
|
|
|
|
if label == projectName:
|
|
create = False
|
|
|
|
|
|
|
|
if create:
|
|
menuItem = cmds.menuItem(label = projectName, parent = "perforceProjectList", cl = "perforceProjectRadioMenuCollection", rb = True, docTag = "P4Proj", c = partial(setCurrentProject, projectName))
|
|
cmds.menuItem(parent = "perforceProjectList", optionBox = True, c = partial(editProject, projectName))
|
|
|
|
|
|
|
|
#open up the projectSettings.txt file and add an entry for current project
|
|
if os.path.exists(mayaToolsDir + "/General/Scripts/projectSettings.txt"):
|
|
f = open(mayaToolsDir + "/General/Scripts/projectSettings.txt", 'r')
|
|
oldSettings = cPickle.load(f)
|
|
useSourceControl = oldSettings.get("UseSourceControl")
|
|
f.close()
|
|
|
|
#write out new settings
|
|
settings = {}
|
|
settings["UseSourceControl"] = useSourceControl
|
|
settings["CurrentProject"] = projectName
|
|
|
|
f = open(mayaToolsDir + "/General/Scripts/projectSettings.txt", 'w')
|
|
cPickle.dump(settings, f)
|
|
f.close()
|
|
|
|
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
def setCurrentProject(projectName, *args):
|
|
#get access to maya tools path
|
|
toolsPath = cmds.internalVar(usd = True) + "mayaTools.txt"
|
|
if os.path.exists(toolsPath):
|
|
|
|
f = open(toolsPath, 'r')
|
|
mayaToolsDir = f.readline()
|
|
f.close()
|
|
|
|
|
|
#re-write settings
|
|
if os.path.exists(mayaToolsDir + "/General/Scripts/projectSettings.txt"):
|
|
f = open(mayaToolsDir + "/General/Scripts/projectSettings.txt", 'r')
|
|
oldSettings = cPickle.load(f)
|
|
useSourceControl = oldSettings.get("UseSourceControl")
|
|
f.close()
|
|
|
|
#write out new settings
|
|
settings = {}
|
|
settings["UseSourceControl"] = useSourceControl
|
|
settings["CurrentProject"] = projectName
|
|
|
|
f = open(mayaToolsDir + "/General/Scripts/projectSettings.txt", 'w')
|
|
cPickle.dump(settings, f)
|
|
f.close()
|
|
|