Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion python/sync/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,5 +96,4 @@ def entity_info(self):
info = {
"error" : str(e)
}
self.app.log_error(traceback.format_exc())
return info
9 changes: 2 additions & 7 deletions python/sync/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,10 @@
Common Perforce sync utility methods
"""


import os
import socket
import re
import threading
import traceback


import sgtk
from sgtk import TankError
Expand Down Expand Up @@ -114,8 +111,6 @@ def sync_with_dialog(app, entities_to_sync, specific_files=False, child_asset_i

:returns Qt UI: A new Perforce sync dialog
"""

fw = sgtk.platform.current_bundle()
try:
return SyncHandler(fw).sync_with_dlg(app, entities_to_sync, specific_files=specific_files, child_asset_ids=child_asset_ids)
except Exception as e:
fw.log_error(traceback.format_exc())
return SyncHandler(fw).sync_with_dlg(app, entities_to_sync, specific_files=specific_files, child_asset_ids=child_asset_ids)
133 changes: 62 additions & 71 deletions python/widgets/open_sync_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import time
import sys


from functools import partial

from .sync_workers import SyncWorker, AssetInfoGatherWorker
Expand Down Expand Up @@ -48,10 +47,6 @@ def __init__(self, parent_sgtk_app, entities_to_sync, specific_files, child_asse
self.child_asset_ids = child_asset_ids
self.scan()

def log_error(self, e):
self.fw.log_error(str(e))
self.fw.log_error(traceback.format_exc())

def scan(self):
self._asset_item_info = {}
self._asset_items = {}
Expand Down Expand Up @@ -281,7 +276,7 @@ def open_context_menu(self, point):
menu.exec_(self._asset_tree.mapToGlobal(point))

except Exception as e:
self.log_error(e)
self.fw.log_error(e)



Expand Down Expand Up @@ -316,7 +311,7 @@ def save_ui_state(self, state_str=None):

self.prefs.write(data)
except Exception as e:
self.log_error(e)
self.fw.log_info(str(e))

def filter_syncd_items(self):
"""
Expand All @@ -342,7 +337,7 @@ def filter_syncd_items(self):


except Exception as e:
self.log_error(e)
self.fw.log_info(str(e))


def filter_items(self):
Expand Down Expand Up @@ -389,7 +384,7 @@ def filter_items(self):
getattr(self, "_{}_filter".format(f)).setIcon(QtGui.QIcon())

except Exception as e:
self.log_error(e)
self.fw.log_info(str(e))

def set_ui_interactive(self, state):
"""
Expand Down Expand Up @@ -462,7 +457,7 @@ def update_available_filters(self, filter_info):
actions[filter_value] = action

except Exception as e:
self.log_error(e)
self.fw.log_info(str(e))


def make_top_level_tree_item(self, asset_name=None, status=None, details=None, icon=None, root_path=None):
Expand Down Expand Up @@ -539,7 +534,7 @@ def make_sync_tree_item(self, sync_item_info):
#self.filter_items

except Exception as e:
self.log_error(e)
self.fw.log_info(str(e))


def asset_info_handler(self, info_processed_dict):
Expand Down Expand Up @@ -603,42 +598,40 @@ def populate_assets(self):
Utilize a global threadpool to process workers to ask P4 server for what
there is to sync for these.
"""
try:
self.asset_item_registry = {}

self.asset_item_registry = {}

self.sync_items = {}
self.sync_order = []
self.progress = 0
self.sync_items = {}
self.sync_order = []
self.progress = 0

self.progress_maximum = len(self.entities_to_sync)
self._progress_bar.setRange(0, self.progress_maximum)
self._progress_bar.setValue(0)
self.set_progress_message("Requesting asset information for SG selection...")
self.progress_maximum = len(self.entities_to_sync)
self._progress_bar.setRange(0, self.progress_maximum)
self._progress_bar.setValue(0)
self.set_progress_message("Requesting asset information for SG selection...")

# self.fw.log_info(len(self.entities_to_sync))
# iterate all parent assets
for entity_to_sync in self.entities_to_sync:
# self.fw.log_info(len(self.entities_to_sync))
# iterate all parent assets
for entity_to_sync in self.entities_to_sync:

asset_info_gather_worker = AssetInfoGatherWorker(app=self.app,
entity=entity_to_sync,
framework=self.fw)
asset_info_gather_worker = AssetInfoGatherWorker(app=self.app,
entity=entity_to_sync,
framework=self.fw)

if self._force_sync.isChecked():
asset_info_gather_worker.force_sync = True
if self._force_sync.isChecked():
asset_info_gather_worker.force_sync = True

asset_info_gather_worker.info_gathered.connect( self.asset_info_handler )
asset_info_gather_worker.progress.connect( self.iterate_progress )
asset_info_gather_worker.item_found_to_sync.connect(self.make_sync_tree_item)
asset_info_gather_worker.status_update.connect(self.set_progress_message)
asset_info_gather_worker.includes.connect(self.update_available_filters)
asset_info_gather_worker.info_gathered.connect( self.asset_info_handler )
asset_info_gather_worker.progress.connect( self.iterate_progress )
asset_info_gather_worker.item_found_to_sync.connect(self.make_sync_tree_item)
asset_info_gather_worker.status_update.connect(self.set_progress_message)
asset_info_gather_worker.includes.connect(self.update_available_filters)

if self.child_asset_ids:
if entity_to_sync.get('id') in self.child_asset_ids:
asset_info_gather_worker.child = True
if self.child_asset_ids:
if entity_to_sync.get('id') in self.child_asset_ids:
asset_info_gather_worker.child = True

self.threadpool.start(asset_info_gather_worker)
except Exception as e:
self.log_error(e)
self.threadpool.start(asset_info_gather_worker)


def make_icon(self, name):
Expand Down Expand Up @@ -717,42 +710,40 @@ def start_sync(self):
Iterate through assets and their sync items to start workers for all paths that require syncs.
Utilize a global threadpool to process
"""
try:
self.set_ui_interactive(False)

workers = []
for asset_name, asset_dict in self._asset_items.items():
for sync_path, sync_widget in asset_dict['child_widgets'].items():
if not sync_widget.isHidden():
sync_worker = SyncWorker()
sync_worker.path_to_sync = sync_path
sync_worker.asset_name = asset_name

sync_worker.fw = self.fw

sync_worker.started.connect(self.sync_in_progress)
# worker.finished.connect(self.sync_completed)
sync_worker.progress.connect(self.item_syncd)

workers.append(sync_worker)
self.set_ui_interactive(False)

workers = []
for asset_name, asset_dict in self._asset_items.items():
for sync_path, sync_widget in asset_dict['child_widgets'].items():
if not sync_widget.isHidden():
sync_worker = SyncWorker()
sync_worker.path_to_sync = sync_path
sync_worker.asset_name = asset_name

sync_worker.fw = self.fw

self.progress = 0
sync_worker.started.connect(self.sync_in_progress)
# worker.finished.connect(self.sync_completed)
sync_worker.progress.connect(self.item_syncd)

self.progress_maximum = len(workers)
self._progress_bar.setRange(0, self.progress_maximum)
self._progress_bar.setValue(0)
self._progress_bar.setVisible(True)
self._progress_bar.setFormat("%p%")
workers.append(sync_worker)

self.progress = 0

# make threadpool to take all workers and multithread their execution
self.threadpool = QtCore.QThreadPool.globalInstance()
self.threadpool.setMaxThreadCount(min(24, self.threadpool.maxThreadCount()))
self.progress_maximum = len(workers)
self._progress_bar.setRange(0, self.progress_maximum)
self._progress_bar.setValue(0)
self._progress_bar.setVisible(True)
self._progress_bar.setFormat("%p%")

self.fw.log_debug("Starting Threaded P4 Sync...")
# make threadpool to take all workers and multithread their execution
self.threadpool = QtCore.QThreadPool.globalInstance()
self.threadpool.setMaxThreadCount(min(24, self.threadpool.maxThreadCount()))

# setup workers for multiprocessing
self.fw.log_debug("Starting Threaded P4 Sync...")

for sync_worker in workers:
self.threadpool.start(sync_worker)
except Exception as e:
self.log_error(e)
# setup workers for multiprocessing

for sync_worker in workers:
self.threadpool.start(sync_worker)
42 changes: 14 additions & 28 deletions python/widgets/sync_workers.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ class SyncWorker(QtCore.QRunnable):
path_to_sync = None
asset_name = None



def __init__(self):
"""
Handles syncing specific file from perforce depot to local workspace on disk
Expand All @@ -51,10 +49,6 @@ def __init__(self):
self.finished = self.signaller.finished
self.progress = self.signaller.progress

def log_error(self, e):
self.fw.log_error(str(e))
self.fw.log_error(traceback.format_exc())

@QtCore.Slot()
def run(self):

Expand Down Expand Up @@ -117,28 +111,21 @@ def __init__(self, app=None, entity=None, framework=None):

self.publish_file = False

def log_error(self, e):
self.fw.log_error(str(e))
self.fw.log_error(traceback.format_exc())

@property
def asset_name(self):
try:
name = None
if self.asset_item.get('context'):
name = self.asset_item.get('context').entity.get('name')
if not name:
if self.entity.get('code'):
name = self.entity.get('code')
else:
name = self.app.shotgun.find_one(self.entity.get('type'), [["id", "is", self.entity.get('id')]], ['code']).get('code')

if self.entity.get('type') in ["PublishFiles"]:
sg_ret = self.app.shotgun.find_one("Asset", [["id", "is", self.entity.get('entity').get('id')]], ['code'])
name = sg_ret.get('code')
return name
except Exception as e:
self.log_error(e)
name = None
if self.asset_item.get('context'):
name = self.asset_item.get('context').entity.get('name')
if not name:
if self.entity.get('code'):
name = self.entity.get('code')
else:
name = self.app.shotgun.find_one(self.entity.get('type'), [["id", "is", self.entity.get('id')]], ['code']).get('code')

if self.entity.get('type') in ["PublishFiles"]:
sg_ret = self.app.shotgun.find_one("Asset", [["id", "is", self.entity.get('entity').get('id')]], ['code'])
name = sg_ret.get('code')
return name

@property
def root_path(self):
Expand All @@ -149,7 +136,6 @@ def root_path(self):

rp = os.path.join(self.asset_item.get('root_path'), p4_path_operator )
if self.entity.get('type') in ["PublishedFile"]:
# TODO: this needs to become dynamic
rp = "B:/" + self.entity.get('path_cache')
return rp

Expand Down Expand Up @@ -304,6 +290,6 @@ def run(self):


except Exception as e:
self.log_error(e)
self.fw.log_error(traceback.format_exc())

self.progress.emit("Gathering info for {} {}".format(self.asset_name, progress_status_string))