RepositoryUrl? _tryParseRepositoryUrl()

in lib/src/repository_url.dart [110:157]


RepositoryUrl? _tryParseRepositoryUrl(String input) {
  var uri = Uri.tryParse(input);
  if (uri == null) return null;

  // apply known prefix replace patterns
  if (_replaceSchemes.containsKey(uri.scheme)) {
    uri = uri.replace(scheme: _replaceSchemes[uri.scheme]!);
  }
  if (_replaceHosts.containsKey(uri.host)) {
    uri = uri.replace(host: _replaceHosts[uri.host]!);
  }

  final provider = _detectProvider(uri);

  // detect repo vs path segments
  final segments = Uri.parse(p.normalize(uri.path))
      .pathSegments
      .where((s) => s.isNotEmpty)
      .toList();
  final repoSegmentIndex = _repoSegmentIndex(provider, segments);
  if (repoSegmentIndex < 0) return null;

  String? separator;
  String? branch;
  final extraSegments = segments.skip(repoSegmentIndex + 1).toList();
  if (RepositoryProvider.isGitHubCompatible(provider)) {
    if (extraSegments.isNotEmpty &&
        _githubSegmentSeparators.contains(extraSegments.first)) {
      separator = extraSegments.removeAt(0);
    }
    if (separator != null && extraSegments.isNotEmpty) {
      branch = extraSegments.removeAt(0);
    }
  }

  return RepositoryUrl(
    provider: provider,
    baseUrl: Uri(
      scheme: uri.scheme,
      host: uri.host,
      port: uri.hasPort ? uri.port : null,
      pathSegments: segments.sublist(0, repoSegmentIndex + 1),
    ).toString(),
    separator: separator,
    branch: branch,
    path: extraSegments.join('/'),
  );
}