internal static void UpdateAssemblies() { var assembliesToUpdate = GetAssembliesToBeUpdated(); if (assembliesToUpdate.Count == 0) { return; } var assemblyPaths = assembliesToUpdate.Select(c => c.Path); var anyAssemblyInAssetsFolder = assemblyPaths.Any(path => path.IndexOf("Assets/", StringComparison.OrdinalIgnoreCase) != -1); // Only try to connect to VCS if there are files under VCS that need to be updated if (anyAssemblyInAssetsFolder) { var failedToConnectToVcs = false; if (WaitForVCSServerConnection(true)) { failedToConnectToVcs = Provider.enabled && !APIUpdaterHelper.CheckoutAndValidateVCSFiles(assemblyPaths); } if (failedToConnectToVcs) { assembliesToUpdate.Clear(); return; } } var sw = Stopwatch.StartNew(); var updatedCount = 0; var assembliesToCheckCount = assembliesToUpdate.Count; var tasks = assembliesToUpdate.Select(a => new AssemblyUpdaterUpdateTask(a)).ToArray(); foreach (var task in tasks) { CollectAssemblyObsoleteAPIUsage(task.Candidate.Path); ThreadPool.QueueUserWorkItem(RunAssemblyUpdaterTask, task); } var finishOk = false; var waitEvents = tasks.Select(t => t.Event).ToArray(); var timeout = TimeSpan.FromSeconds(30); if (WaitHandle.WaitAll(waitEvents, timeout)) { if (!HandleAssemblyUpdaterErrors(tasks)) { updatedCount = ProcessSuccessfulUpdates(tasks); finishOk = true; } } else { LogTimeoutError(tasks); } sw.Stop(); APIUpdaterLogger.WriteToFile(L10n.Tr("Update finished with {0} in {1} ms ({2}/{3} assemblie(s) updated)."), finishOk ? L10n.Tr("success") : L10n.Tr("error"), sw.ElapsedMilliseconds, updatedCount, assembliesToCheckCount); if (updatedCount > 0 && !EditorCompilationInterface.Instance.DoesProjectFolderHaveAnyScripts()) { ReportPossibleUpdateFinished(false); } PersistListOfAssembliesToUpdate(); }