public static void Generate(PythonTypeDatabaseCreationRequest request) { var onExit = request.OnExit; GenerateAsync(request).ContinueWith(t => { var exc = t.Exception; if (exc == null) { return; } try { var message = string.Format( "ERROR_STDLIB: {0}\\{1}{2}", request.Factory.Configuration.Id, Environment.NewLine, (exc.InnerException ?? exc).ToString() ); Debug.WriteLine(message); var glogPath = Path.Combine(CompletionDatabasePath, "AnalysisLog.txt"); File.AppendAllText(glogPath, message); } catch (IOException) { } catch (ArgumentException) { } catch (SecurityException) { } catch (UnauthorizedAccessException) { } if (onExit != null) { onExit(PythonTypeDatabase.InvalidOperationExitCode); } }, TaskContinuationOptions.OnlyOnFaulted); }
protected virtual void GenerateDatabase(PythonTypeDatabaseCreationRequest request, Action<int> onExit = null) { var generating = _generating = new object(); PythonTypeDatabase.GenerateAsync(request).ContinueWith(t => { int exitCode; try { exitCode = t.Result; } catch (Exception ex) { Debug.Fail(ex.ToString()); exitCode = PythonTypeDatabase.InvalidOperationExitCode; } if (exitCode != PythonTypeDatabase.AlreadyGeneratingExitCode) { Interlocked.CompareExchange(ref _generating, null, generating); } onExit?.Invoke(exitCode); }); }
public virtual void GenerateDatabase(GenerateDatabaseOptions options, Action<int> onExit = null) { if (string.IsNullOrEmpty(DatabasePath)) { onExit?.Invoke(PythonTypeDatabase.NotSupportedExitCode); return; } if (IsGenerating) { onExit?.Invoke(PythonTypeDatabase.AlreadyGeneratingExitCode); return; } var req = new PythonTypeDatabaseCreationRequest { Factory = this, OutputPath = DatabasePath, SkipUnchanged = options.HasFlag(GenerateDatabaseOptions.SkipUnchanged) }; GenerateDatabase(req, onExit); }
public static async Task <int> GenerateAsync(PythonTypeDatabaseCreationRequest request) { var fact = request.Factory; var evt = request.OnExit; if (fact == null) { evt?.Invoke(NotSupportedExitCode); return(NotSupportedExitCode); } var outPath = request.OutputPath; var analyzerPath = PythonToolsInstallPath.GetFile("Microsoft.PythonTools.Analyzer.exe"); Directory.CreateDirectory(CompletionDatabasePath); var baseDb = BaselineDatabasePath; if (request.ExtraInputDatabases.Any()) { baseDb = baseDb + ";" + string.Join(";", request.ExtraInputDatabases); } var logPath = Path.Combine(outPath, "AnalysisLog.txt"); var glogPath = Path.Combine(CompletionDatabasePath, "AnalysisLog.txt"); // Tests change Debug.Listeners so look for that to determine if we're running inside a test #if DEBUG var inTests = Debug.Listeners["Microsoft.PythonTools.AssertListener"] != null; #else var inTests = false; #endif using (var output = ProcessOutput.RunHiddenAndCapture( analyzerPath, "/id", fact.Configuration.Id, "/version", fact.Configuration.Version.ToString(), "/python", fact.Configuration.InterpreterPath, "/outdir", outPath, "/basedb", baseDb, (request.SkipUnchanged ? null : "/all"), // null will be filtered out; empty strings are quoted (inTests ? "/unittest" : null), "/log", logPath, "/glog", glogPath, "/wait", (request.WaitFor != null ? AnalyzerStatusUpdater.GetIdentifier(request.WaitFor) : "") )) { output.PriorityClass = ProcessPriorityClass.BelowNormal; int exitCode = await output; if (exitCode > -10 && exitCode < 0) { try { File.AppendAllLines( glogPath, new[] { string.Format("FAIL_STDLIB: ({0}) {1}", exitCode, output.Arguments) } .Concat(output.StandardErrorLines) ); } catch (IOException) { } catch (ArgumentException) { } catch (SecurityException) { } catch (UnauthorizedAccessException) { } } if (evt != null) { evt(exitCode); } return(exitCode); } }