diff --git a/CHANGELOG.md b/CHANGELOG.md index 142c4c014..a6b5094d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ directory used for the analysis (helps switching different analyzer SDKs). - `ToolEnvironment.create()` takes `pubHostedUrl` as `PackageAnalyzer.create()` was removed. +- `InspectOptions.totalTimeBudget` to allow the dynamic reduction of `dartdocTimeout`. **BREAKING CHANGES** diff --git a/lib/src/package_analyzer.dart b/lib/src/package_analyzer.dart index e26eab6b1..076553762 100644 --- a/lib/src/package_analyzer.dart +++ b/lib/src/package_analyzer.dart @@ -28,12 +28,14 @@ import 'utils.dart'; class InspectOptions { final String? pubHostedUrl; final String? dartdocOutputDir; + final Duration? totalTimeBudget; final Duration? dartdocTimeout; final int? lineLength; InspectOptions({ this.pubHostedUrl, this.dartdocOutputDir, + this.totalTimeBudget, this.dartdocTimeout, this.lineLength, }); diff --git a/lib/src/package_context.dart b/lib/src/package_context.dart index 1bc9f0308..12139850e 100644 --- a/lib/src/package_context.dart +++ b/lib/src/package_context.dart @@ -92,6 +92,7 @@ class PackageContext { final String packageDir; final errors = []; final urlProblems = {}; + final _stopwatch = Stopwatch(); Pubspec? _pubspec; List? _codeProblems; @@ -99,10 +100,15 @@ class PackageContext { PackageContext({ required this.sharedContext, required this.packageDir, - }); + }) { + _stopwatch.start(); + } ToolEnvironment get toolEnvironment => sharedContext.toolEnvironment; InspectOptions get options => sharedContext.options; + Duration? remainingTimeBudget() => options.totalTimeBudget == null + ? null + : (options.totalTimeBudget! - _stopwatch.elapsed); late final Version currentSdkVersion = Version.parse(toolEnvironment.runtimeInfo.sdkVersion); @@ -235,7 +241,11 @@ class PackageContext { return DartdocResult.skipped(); } if (await resolveDependencies()) { - final timeout = options.dartdocTimeout ?? const Duration(minutes: 5); + var timeout = options.dartdocTimeout ?? const Duration(minutes: 5); + final rtb = remainingTimeBudget(); + if (rtb != null && rtb < timeout) { + timeout = rtb; + } await normalizeDartdocOptionsYaml(packageDir); try { final pr = await toolEnvironment.dartdoc(