PrintSupportedRevits()
 {
     PyRevitCLIAppCmds.PrintHeader("Supported Revits");
     foreach (var revit in RevitProduct.ListSupportedProducts().OrderByDescending(x => x.Version))
     {
         Console.WriteLine(string.Format("{0} | Version: {1} | Build: {2}({3})", revit.ProductName, revit.Version, revit.BuildNumber, revit.BuildTarget));
     }
 }
 PrintExtensionDefinitions(string searchPattern, string headerPrefix = "Registered")
 {
     PyRevitCLIAppCmds.PrintHeader(string.Format("{0} Extensions", headerPrefix));
     foreach (PyRevitExtensionDefinition ext in PyRevit.LookupRegisteredExtensions(searchPattern))
     {
         Console.WriteLine(ext);
     }
 }
 PrintExtensionLookupSources()
 {
     PyRevitCLIAppCmds.PrintHeader("Extension Sources - Default");
     Console.WriteLine(PyRevit.GetDefaultExtensionLookupSource());
     PyRevitCLIAppCmds.PrintHeader("Extension Sources - Additional");
     foreach (var extLookupSrc in PyRevit.GetRegisteredExtensionLookupSources())
     {
         Console.WriteLine(extLookupSrc);
     }
 }
 PrintExtensionSearchPaths()
 {
     PyRevitCLIAppCmds.PrintHeader("Default Extension Search Path");
     Console.WriteLine(PyRevit.pyRevitDefaultExtensionsPath);
     PyRevitCLIAppCmds.PrintHeader("Extension Search Paths");
     foreach (var searchPath in PyRevit.GetRegisteredExtensionSearchPaths())
     {
         Console.WriteLine(searchPath);
     }
 }
 PrintCloneEngines(string cloneName)
 {
     if (cloneName != null)
     {
         var clone = PyRevit.GetRegisteredClone(cloneName);
         PyRevitCLIAppCmds.PrintHeader(string.Format("Deployments for \"{0}\"", clone.Name));
         foreach (var engine in clone.GetConfiguredEngines())
         {
             Console.WriteLine(engine);
         }
     }
 }
        PrintExtensions(IEnumerable <PyRevitExtension> extList = null, string headerPrefix = "Installed")
        {
            if (extList == null)
            {
                extList = PyRevit.GetInstalledExtensions();
            }

            PyRevitCLIAppCmds.PrintHeader(string.Format("{0} Extensions", headerPrefix));
            foreach (PyRevitExtension ext in extList.OrderBy(x => x.Name))
            {
                Console.WriteLine(ext);
            }
        }
 PrintAttachments(int revitYear = 0)
 {
     PyRevitCLIAppCmds.PrintHeader("Attachments");
     foreach (var attachment in PyRevit.GetAttachments().OrderByDescending(x => x.Product.Version))
     {
         if (revitYear == 0)
         {
             Console.WriteLine(attachment);
         }
         else if (revitYear == attachment.Product.ProductYear)
         {
             Console.WriteLine(attachment);
         }
     }
 }
        PrintClones()
        {
            PyRevitCLIAppCmds.PrintHeader("Registered Clones (full git repos)");
            var clones = PyRevit.GetRegisteredClones().OrderBy(x => x.Name);

            foreach (var clone in clones.Where(c => c.IsRepoDeploy))
            {
                Console.WriteLine(clone);
            }

            PyRevitCLIAppCmds.PrintHeader("Registered Clones (deployed from archive/image)");
            foreach (var clone in clones.Where(c => !c.IsRepoDeploy))
            {
                Console.WriteLine(clone);
            }
        }
 PrintCloneDeployments(string cloneName)
 {
     if (cloneName != null)
     {
         var clone = PyRevit.GetRegisteredClone(cloneName);
         PyRevitCLIAppCmds.PrintHeader(string.Format("Deployments for \"{0}\"", clone.Name));
         foreach (var dep in clone.GetConfiguredDeployments())
         {
             Console.WriteLine(string.Format("\"{0}\" deploys:", dep.Name));
             foreach (var path in dep.Paths)
             {
                 Console.WriteLine("    " + path);
             }
             Console.WriteLine();
         }
     }
 }
 PrintLocalRevits(bool running = false)
 {
     if (running)
     {
         PyRevitCLIAppCmds.PrintHeader("Running Revit Instances");
         foreach (var revit in RevitController.ListRunningRevits().OrderByDescending(x => x.RevitProduct.Version))
         {
             Console.WriteLine(revit);
         }
     }
     else
     {
         PyRevitCLIAppCmds.PrintHeader("Installed Revits");
         foreach (var revit in RevitProduct.ListInstalledProducts().OrderByDescending(x => x.Version))
         {
             Console.WriteLine(revit);
         }
     }
 }
        PrintReleases(string searchPattern, bool latest = false, bool printReleaseNotes = false, bool listPreReleases = false)
        {
            PyRevitCLIAppCmds.PrintHeader("Releases");
            List <PyRevitRelease> releasesToList = new List <PyRevitRelease>();

            // determine latest release
            if (latest)
            {
                var latestRelease = PyRevitRelease.GetLatestRelease(includePreRelease: listPreReleases);

                if (latestRelease == null)
                {
                    throw new pyRevitException("Can not determine latest release.");
                }

                releasesToList.Add(latestRelease);
            }
            else
            {
                if (searchPattern != null)
                {
                    releasesToList = PyRevitRelease.FindReleases(searchPattern, includePreRelease: listPreReleases);
                }
                else
                {
                    releasesToList = PyRevitRelease.GetReleases().Where(r => r.IsPyRevitRelease).ToList();
                }
            }

            foreach (var prelease in releasesToList)
            {
                Console.WriteLine(prelease);
                if (printReleaseNotes)
                {
                    Console.WriteLine(prelease.ReleaseNotes.Indent(1));
                }
            }
        }
 PrintCloneInfo(string cloneName)
 {
     PyRevitCLIAppCmds.PrintHeader("Clone info");
     Console.WriteLine(PyRevit.GetRegisteredClone(cloneName));
 }
        RunPythonCommand(string inputCommand, string targetFile, string revitYear, PyRevitRunnerOptions runOptions)
        {
            // determine if script or command

            var modelFiles = new List <string>();

            // make sure file exists
            if (targetFile != null)
            {
                CommonUtils.VerifyFile(targetFile);
            }

            if (inputCommand != null)
            {
                // determine target revit year
                int revitYearNumber = 0;
                // if revit year is not specified try to get from model file
                if (revitYear == null)
                {
                    if (targetFile != null)
                    {
                        try {
                            revitYearNumber = new RevitModelFile(targetFile).RevitProduct.ProductYear;
                            // collect model names also
                            modelFiles.Add(targetFile);
                        }
                        catch (Exception ex) {
                            logger.Error(
                                "Revit version must be explicitly specifies if using a model list file. | {0}",
                                ex.Message
                                );
                        }
                    }
                    // if no revit year and no model, run with latest revit
                    else
                    {
                        revitYearNumber = RevitProduct.ListInstalledProducts().Max(r => r.ProductYear);
                    }
                }
                // otherwise, grab the year from argument
                else
                {
                    revitYearNumber = int.Parse(revitYear);
                    // prepare model list of provided
                    if (targetFile != null)
                    {
                        try {
                            var modelVer = new RevitModelFile(targetFile).RevitProduct.ProductYear;
                            if (revitYearNumber < modelVer)
                            {
                                logger.Warn("Model is newer than the target Revit version.");
                            }
                            else
                            {
                                modelFiles.Add(targetFile);
                            }
                        }
                        catch {
                            // attempt at reading the list file and grab the model files only
                            foreach (var modelPath in File.ReadAllLines(targetFile))
                            {
                                if (CommonUtils.VerifyFile(modelPath))
                                {
                                    try {
                                        var modelVer = new RevitModelFile(modelPath).RevitProduct.ProductYear;
                                        if (revitYearNumber < modelVer)
                                        {
                                            logger.Warn("Model is newer than the target Revit version.");
                                        }
                                        else
                                        {
                                            modelFiles.Add(modelPath);
                                        }
                                    }
                                    catch {
                                        logger.Error("File is not a valid Revit file: \"{0}\"", modelPath);
                                    }
                                }
                                else
                                {
                                    logger.Error("File does not exist: \"{0}\"", modelPath);
                                }
                            }
                        }
                    }
                }

                // now run
                if (revitYearNumber != 0)
                {
                    // determine attached clone
                    var attachment = PyRevit.GetAttached(revitYearNumber);
                    if (attachment == null)
                    {
                        logger.Error("pyRevit is not attached to Revit \"{0}\". " +
                                     "Runner needs to use the attached clone and engine to execute the script.",
                                     revitYear);
                    }
                    else
                    {
                        // determine script to run
                        string commandScriptPath = null;

                        if (!CommonUtils.VerifyPythonScript(inputCommand))
                        {
                            logger.Debug("Input is not a script file \"{0}\"", inputCommand);
                            logger.Debug("Attempting to find run command matching \"{0}\"", inputCommand);

                            // try to find run command in attached clone being used for execution
                            // if not found, try to get run command from all other installed extensions
                            var targetExtensions = new List <PyRevitExtension>();
                            if (attachment.Clone != null)
                            {
                                targetExtensions.AddRange(attachment.Clone.GetExtensions());
                            }
                            targetExtensions.AddRange(PyRevit.GetInstalledExtensions());

                            foreach (PyRevitExtension ext in targetExtensions)
                            {
                                logger.Debug("Searching for run command in: \"{0}\"", ext.ToString());
                                if (ext.Type == PyRevitExtensionTypes.RunnerExtension)
                                {
                                    try {
                                        var cmdScript = ext.GetRunCommand(inputCommand);
                                        if (cmdScript != null)
                                        {
                                            logger.Debug("Run command matching \"{0}\" found: \"{1}\"",
                                                         inputCommand, cmdScript);
                                            commandScriptPath = cmdScript;
                                            break;
                                        }
                                    }
                                    catch {
                                        // does not include command
                                        continue;
                                    }
                                }
                            }
                        }
                        else
                        {
                            commandScriptPath = inputCommand;
                        }

                        // if command is not found, stop
                        if (commandScriptPath == null)
                        {
                            throw new pyRevitException(
                                      string.Format("Run command not found: \"{0}\"", inputCommand)
                                      );
                        }

                        // RUN!
                        var execEnv = PyRevitRunner.Run(
                            attachment,
                            commandScriptPath,
                            modelFiles,
                            runOptions
                            );

                        // print results (exec env)
                        PyRevitCLIAppCmds.PrintHeader("Execution Environment");
                        Console.WriteLine(string.Format("Execution Id: \"{0}\"", execEnv.ExecutionId));
                        Console.WriteLine(string.Format("Product: {0}", execEnv.Revit));
                        Console.WriteLine(string.Format("Clone: {0}", execEnv.Clone));
                        Console.WriteLine(string.Format("Engine: {0}", execEnv.Engine));
                        Console.WriteLine(string.Format("Script: \"{0}\"", execEnv.Script));
                        Console.WriteLine(string.Format("Working Directory: \"{0}\"", execEnv.WorkingDirectory));
                        Console.WriteLine(string.Format("Journal File: \"{0}\"", execEnv.JournalFile));
                        Console.WriteLine(string.Format("Manifest File: \"{0}\"", execEnv.PyRevitRunnerManifestFile));
                        Console.WriteLine(string.Format("Log File: \"{0}\"", execEnv.LogFile));
                        // report whether the env was purge or not
                        if (execEnv.Purged)
                        {
                            Console.WriteLine("Execution env is successfully purged.");
                        }

                        // print target models
                        if (execEnv.ModelPaths.Count() > 0)
                        {
                            PyRevitCLIAppCmds.PrintHeader("Target Models");
                            foreach (var modelPath in execEnv.ModelPaths)
                            {
                                Console.WriteLine(modelPath);
                            }
                        }

                        // print log file contents if exists
                        if (File.Exists(execEnv.LogFile))
                        {
                            PyRevitCLIAppCmds.PrintHeader("Execution Log");
                            Console.WriteLine(File.ReadAllText(execEnv.LogFile));
                        }
                    }
                }
            }
        }