Open in... Latest work file version

OK I’ve put an example together. It is just that, an example, it works, but it will likely need tweaking to make it more robust.
You need to take over the app_launch.py hook of the tk-multi-launchapp .

Then replace the script contents with the following:

import os
import re
import sys
import tank
import sgtk


class AppLaunch(tank.Hook):

    def execute(self, app_path, app_args, version, engine_name, **kwargs):

        engine = sgtk.platform.current_engine()

        if engine_name == "tk-nuke" and engine.context.task is not None:
            self.logger.debug("Finding latest file to load on startup ...")

            # Get the settings for the workfiles app in the environment we will be launchig Nuke in.
            # This is so we can find out the publish and work templates it would use.
            app_settings = sgtk.platform.find_app_settings(engine_name,
                                                           'tk-multi-workfiles2',
                                                           engine.sgtk,
                                                           engine.context)

            # extracting the templates from the app settings
            publish_template = app_settings[0]['settings']['template_publish']
            work_template = app_settings[0]['settings']['template_work']

            # Now get the latest work and publish file along with the version number for each
            work_file, work_file_version = self.get_next_version(engine.sgtk, engine.context, publish_template)
            publish_file, publish_file_version = self.get_next_version(engine.sgtk, engine.context, work_template)

            # Figure out which of the latest publish and work file is the highest version and use that.
            # In the situation where both are the same, use the work file
            file_to_open = work_file if work_file_version >= publish_file_version else publish_file
            # Now add the file path to the Nuke launch args. If you were doing this for software other than nuke
            # Then you will need to handle it in the way in which that software expects the arg to be passed.
            app_args = "{0} {1}".format(file_to_open, app_args)

        system = sys.platform

        if system == "linux2":
            # on linux, we just run the executable directly
            cmd = "%s %s &" % (app_path, app_args)

        elif system == "darwin":
            # If we're on OS X, then we have two possibilities: we can be asked
            # to launch an application bundle using the "open" command, or we
            # might have been given an executable that we need to treat like
            # any other Unix-style command. The best way we have to know whether
            # we're in one situation or the other is to check the app path we're
            # being asked to launch; if it's a .app, we use the "open" command,
            # and if it's not then we treat it like a typical, Unix executable.
            if app_path.endswith(".app"):
                # The -n flag tells the OS to launch a new instance even if one is
                # already running. The -a flag specifies that the path is an
                # application and supports both the app bundle form or the full
                # executable form.
                cmd = "open -n -a \"%s\"" % (app_path)
                if app_args:
                    cmd += " --args %s" % app_args
            else:
                cmd = "%s %s &" % (app_path, app_args)

        elif system == "win32":
            # on windows, we run the start command in order to avoid
            # any command shells popping up as part of the application launch.
            cmd = "start /B \"App\" \"%s\" %s" % (app_path, app_args)

        # run the command to launch the app
        exit_code = os.system(cmd)

        return {
            "command": cmd,
            "return_code": exit_code
        }

    def get_next_version(self, tk, context, template_name, ):
        """
        Get the highest version file found on disk for a given template
        :param tk:
        :param template_name:
        :return:
        """
        template = tk.templates[template_name]
        fields = context.as_template_fields(template)

        # Get a list of existing file paths on disk that match the template and provided fields
        # Skip the version field as we want to find all versions, not a specific version.
        skip_fields = ["version"]
        file_paths = tk.paths_from_template(
            template,
            fields,
            skip_fields,
            skip_missing_optional_keys=True
        )
        # now loop over the files and find the highest version file
        latest_file = None
        highest_version = 0
        for a_file in file_paths:
            # extract the values from the path so we can read the version.
            path_fields = template.get_fields(a_file)
            if path_fields["version"] > highest_version:
                highest_version = path_fields["version"]
                latest_file = a_file
        return latest_file, highest_version
3 Likes