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('/'),
);
}