示例#1
0
        private static int ProcessSuccessfulUpdates(AssemblyUpdaterUpdateTask[] tasks)
        {
            var assembliesToUpdate = GetAssembliesToBeUpdated();
            var succeededUpdates   = tasks.Where(t => t.Result == APIUpdaterAssemblyHelper.UpdatesApplied);

            if (!succeededUpdates.Any())
            {
                assembliesToUpdate.Clear();
                return(0);
            }

            var assembliesRequiringConsent = FilterOutLocalAndEmbeddedPackagesWhenAskingForConsent(assembliesToUpdate.Select(a => a.Path)).ToArray();

            if (assembliesRequiringConsent.Length > 0 && !AskForConsent(assembliesRequiringConsent))
            {
                APIUpdaterLogger.WriteToFile(L10n.Tr("User declined to run APIUpdater"));
                return(0);
            }

            var updatedAssemblyPaths = succeededUpdates.Select(u => u.Candidate.Path).ToArray();

            if (!CheckoutFromVCSIfNeeded(updatedAssemblyPaths))
            {
                return(-1);
            }

            APIUpdaterHelper.HandleFilesInPackagesVirtualFolder(updatedAssemblyPaths);
            if (!APIUpdaterHelper.CheckReadOnlyFiles(updatedAssemblyPaths))
            {
                return(0);
            }

            foreach (var succeed in succeededUpdates)
            {
                APIUpdaterLogger.WriteToFile("{0}{1}", Environment.NewLine, succeed.StdOut);
                FileUtil.MoveFileIfExists(succeed.OutputPath, succeed.Candidate.Path);
            }

            assembliesToUpdate.Clear();
            return(succeededUpdates.Count());

            bool CheckoutFromVCSIfNeeded(string[] assemblyPathsToCheck)
            {
                // Only try to connect to VCS if there are files under VCS that need to be updated
                var assembliesInAssetsFolder = assemblyPathsToCheck.Where(path => path.IndexOf("Assets/", StringComparison.OrdinalIgnoreCase) != -1).ToArray();

                if (!assembliesInAssetsFolder.Any())
                {
                    return(true);
                }

                if (!WaitForVCSServerConnection())
                {
                    return(false);
                }

                var failedToCheckoutFiles = !APIUpdaterHelper.MakeEditable(assembliesInAssetsFolder);

                if (failedToCheckoutFiles)
                {
                    assembliesToUpdate.Clear();
                    return(false);
                }

                return(true);
            }

            IEnumerable <string> FilterOutLocalAndEmbeddedPackagesWhenAskingForConsent(IEnumerable <string> ass)
            {
                foreach (var path in ass.Select(path => path.Replace("\\", "/"))) // package manager paths are always separated by /
                {
                    var packageInfo = UnityEditor.PackageManager.PackageInfo.FindForAssetPath(path);
                    if (packageInfo == null || packageInfo.source == PackageSource.Local || packageInfo.source == PackageSource.Embedded)
                    {
                        yield return(path);
                    }
                }
            }
        }