Skip to content

Commit b73b3f3

Browse files
committed
Address review feedback.
1 parent cfceb52 commit b73b3f3

File tree

4 files changed

+16
-343
lines changed

4 files changed

+16
-343
lines changed

external/Java.Interop

src/Xamarin.Android.Build.Tasks/Tasks/GetMicrosoftNuGetPackagesMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public override async System.Threading.Tasks.Task RunTaskAsync ()
3636
if (!all_files.Any (x => x.IsToday)) {
3737
// No file for today, download a new one
3838
try {
39-
var http = new HttpClient ();
39+
using var http = new HttpClient ();
4040
var json = await http.GetStringAsync ("https://aka.ms/ms-nuget-packages");
4141
var outfile = Path.Combine (MavenCacheDirectory, $"microsoft-packages-{DateTime.Today:yyyyMMdd}.json");
4242

src/Xamarin.Android.Build.Tasks/Tasks/JavaDependencyVerification.cs

Lines changed: 10 additions & 273 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static bool TryResolveProject (Artifact artifact, IPomResolver resolver, [NotNul
111111

112112
class DependencyResolver
113113
{
114-
readonly List<Artifact> artifacts = new List<Artifact> ();
114+
readonly Dictionary<string, Artifact> artifacts = new ();
115115

116116
readonly NuGetPackageVersionFinder? finder;
117117
readonly TaskLoggingHelper log;
@@ -157,7 +157,7 @@ public void AddAndroidLibraries (ITaskItem []? tasks)
157157

158158
if (version != null && MavenExtensions.TryParseArtifactWithVersion (id, version, log, out var art)) {
159159
log.LogMessage ("Found Java dependency '{0}:{1}' version '{2}' from AndroidLibrary '{3}'", art.GroupId, art.Id, art.Version, task.ItemSpec);
160-
artifacts.Add (art);
160+
artifacts.Add (art.ToGroupAndArtifactId (), art);
161161
}
162162
}
163163
}
@@ -168,7 +168,7 @@ public void AddPackageReferences (ITaskItem []? tasks)
168168

169169
// See if JavaArtifact/JavaVersion overrides were used
170170
if (task.TryParseJavaArtifactAndJavaVersion ("PackageReference", log, out var explicit_artifact, out var attributes_specified)) {
171-
artifacts.Add (explicit_artifact);
171+
artifacts.Add (explicit_artifact.ToGroupAndArtifactId (), explicit_artifact);
172172
continue;
173173
}
174174

@@ -181,7 +181,7 @@ public void AddPackageReferences (ITaskItem []? tasks)
181181

182182
if (artifact != null) {
183183
log.LogMessage ("Found Java dependency '{0}:{1}' version '{2}' from PackageReference '{3}'", artifact.GroupId, artifact.Id, artifact.Version, task.ItemSpec);
184-
artifacts.Add (artifact);
184+
artifacts.Add (artifact.ToGroupAndArtifactId (), artifact);
185185

186186
continue;
187187
}
@@ -195,7 +195,7 @@ public void AddProjectReferences (ITaskItem []? tasks)
195195
foreach (var task in tasks.OrEmpty ()) {
196196
// See if JavaArtifact/JavaVersion overrides were used
197197
if (task.TryParseJavaArtifactAndJavaVersion ("ProjectReference", log, out var explicit_artifact, out var attributes_specified)) {
198-
artifacts.Add (explicit_artifact);
198+
artifacts.Add (explicit_artifact.ToGroupAndArtifactId (), explicit_artifact);
199199
continue;
200200
}
201201

@@ -219,27 +219,22 @@ public void AddIgnoredDependencies (ITaskItem []? tasks)
219219

220220
if (version != null && MavenExtensions.TryParseArtifactWithVersion (id, version, log, out var art)) {
221221
log.LogMessage ("Ignoring Java dependency '{0}:{1}' version '{2}'", art.GroupId, art.Id, art.Version);
222-
artifacts.Add (art);
222+
artifacts.Add (art.ToGroupAndArtifactId (), art);
223223
}
224224
}
225225
}
226226

227227
bool TrySatisfyDependency (ResolvedDependency dependency)
228228
{
229229
if (!dependency.Version.HasValue ())
230-
return artifacts.Any (a =>
231-
a.GroupId == dependency.GroupId
232-
&& a.Id == dependency.ArtifactId);
230+
return artifacts.ContainsKey (dependency.ToGroupAndArtifactId ());
233231

234232
var dep_versions = MavenVersionRange.Parse (dependency.Version);
235233

236-
var satisfied = artifacts.Any (a =>
237-
a.GroupId == dependency.GroupId
238-
&& a.Id == dependency.ArtifactId
239-
&& dep_versions.Any (r => r.ContainsVersion (MavenVersion.Parse (a.Version)))
240-
);
234+
if (artifacts.TryGetValue (dependency.ToGroupAndArtifactId (), out var artifact))
235+
return dep_versions.Any (r => r.ContainsVersion (MavenVersion.Parse (artifact.Version)));
241236

242-
return satisfied;
237+
return false;
243238
}
244239
}
245240

@@ -431,261 +426,3 @@ public class NuGetPackageVersionFinder
431426
return new Artifact (match.Groups ["GroupId"].Value, match.Groups ["ArtifactId"].Value, match.Groups ["Version"].Value);
432427
}
433428
}
434-
// https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
435-
public class MavenVersion : IComparable, IComparable<MavenVersion>, IEquatable<MavenVersion>
436-
{
437-
public string? Major { get; private set; }
438-
public string? Minor { get; private set; }
439-
public string? Patch { get; private set; }
440-
public string RawVersion { get; private set; }
441-
public bool IsValid { get; private set; } = true;
442-
443-
private MavenVersion (string rawVersion) => RawVersion = rawVersion;
444-
445-
public static MavenVersion Parse (string version)
446-
{
447-
var mv = new MavenVersion (version);
448-
449-
if (!version.HasValue ()) {
450-
mv.IsValid = false;
451-
return mv;
452-
}
453-
454-
// We're going to parse through this assuming it's a valid Maven version
455-
mv.Major = version.FirstSubset ('.');
456-
version = version.ChompFirst ('.');
457-
458-
if (!TryParsePart (mv.Major, out var _, out var _))
459-
mv.IsValid = false;
460-
461-
if (!version.HasValue ())
462-
return mv;
463-
464-
mv.Minor = version.FirstSubset ('.');
465-
version = version.ChompFirst ('.');
466-
467-
if (!TryParsePart (mv.Minor, out var _, out var _))
468-
mv.IsValid = false;
469-
470-
if (!version.HasValue ())
471-
return mv;
472-
473-
mv.Patch = version.FirstSubset ('.');
474-
version = version.ChompFirst ('.');
475-
476-
if (!TryParsePart (mv.Patch, out var _, out var _))
477-
mv.IsValid = false;
478-
479-
if (!version.HasValue ())
480-
return mv;
481-
482-
// If there's something left, this is a nonstandard Maven version and all bets are off
483-
mv.IsValid = false;
484-
485-
return mv;
486-
}
487-
488-
public int CompareTo (object obj)
489-
{
490-
return CompareTo (obj as MavenVersion);
491-
}
492-
493-
public int CompareTo (MavenVersion? other)
494-
{
495-
if (other is null)
496-
return 1;
497-
498-
// If either instance is nonstandard, Maven does a simple string compare
499-
if (!IsValid || !other.IsValid)
500-
return string.Compare (RawVersion, other.RawVersion);
501-
502-
var major_compare = ComparePart (Major ?? "0", other.Major ?? "0");
503-
504-
if (major_compare != 0)
505-
return major_compare;
506-
507-
var minor_compare = ComparePart (Minor ?? "0", other.Minor ?? "0");
508-
509-
if (minor_compare != 0)
510-
return minor_compare;
511-
512-
return ComparePart (Patch ?? "0", other.Patch ?? "0");
513-
}
514-
515-
public bool Equals (MavenVersion other)
516-
{
517-
return CompareTo (other) == 0;
518-
}
519-
520-
int ComparePart (string a, string b)
521-
{
522-
// Check if they're the same string
523-
if (a == b)
524-
return 0;
525-
526-
// Don't need to check the return because this shouldn't be called if IsValid = false
527-
TryParsePart (a, out var a_version, out var a_qualifier);
528-
TryParsePart (b, out var b_version, out var b_qualifier);
529-
530-
// If neither have a qualifier, treat them like numbers
531-
if (a_qualifier is null && b_qualifier is null)
532-
return a_version.CompareTo (b_version);
533-
534-
// If the numeric versions are different, just use those
535-
if (a_version != b_version)
536-
return a_version.CompareTo (b_version);
537-
538-
// Identical versions with different qualifier fields are compared by using basic string comparison.
539-
if (a_qualifier is not null && b_qualifier is not null)
540-
return a_qualifier.CompareTo (b_qualifier);
541-
542-
// All versions with a qualifier are older than the same version without a qualifier (release version).
543-
if (a_qualifier is not null)
544-
return -1;
545-
546-
return 1;
547-
}
548-
549-
static bool TryParsePart (string part, out int version, out string? qualifier)
550-
{
551-
// These can look like:
552-
// 1
553-
// 1-anything
554-
var version_string = part.FirstSubset ('-');
555-
qualifier = null;
556-
557-
// The first piece must be a number
558-
if (!int.TryParse (version_string, out version))
559-
return false;
560-
561-
part = part.ChompFirst ('-');
562-
563-
if (part.HasValue ())
564-
qualifier = part;
565-
566-
return true;
567-
}
568-
}
569-
570-
public class MavenVersionRange
571-
{
572-
public string? MinVersion { get; private set; }
573-
public string? MaxVersion { get; private set; }
574-
public bool IsMinInclusive { get; private set; } = true;
575-
public bool IsMaxInclusive { get; private set; }
576-
public bool HasLowerBound { get; private set; }
577-
public bool HasUpperBound { get; private set; }
578-
579-
// Adapted from https://github.com/Redth/MavenNet/blob/master/MavenNet/MavenVersionRange.cs
580-
// Original version uses NuGetVersion, which doesn't cover all "valid" Maven version cases
581-
public static IEnumerable<MavenVersionRange> Parse (string range)
582-
{
583-
if (!range.HasValue ())
584-
yield break;
585-
586-
// Do a pass over the range string to parse out version groups
587-
// eg: (1.0],(1.1,]
588-
var in_group = false;
589-
var current_group = string.Empty;
590-
591-
foreach (var c in range) {
592-
if (c == '(' || c == '[') {
593-
current_group += c;
594-
in_group = true;
595-
} else if (c == ')' || c == ']' || (!in_group && c == ',')) {
596-
// Don't add the , separating groups
597-
if (in_group)
598-
current_group += c;
599-
600-
in_group = false;
601-
602-
if (current_group.HasValue ())
603-
yield return ParseSingle (current_group);
604-
605-
current_group = string.Empty;
606-
} else {
607-
current_group += c;
608-
}
609-
}
610-
611-
if (!string.IsNullOrEmpty (current_group))
612-
yield return ParseSingle (current_group);
613-
}
614-
615-
static MavenVersionRange ParseSingle (string range)
616-
{
617-
var mv = new MavenVersionRange ();
618-
619-
// Check for opening ( or [
620-
if (range [0] == '(') {
621-
mv.IsMinInclusive = false;
622-
range = range.Substring (1);
623-
} else if (range [0] == '[') {
624-
range = range.Substring (1);
625-
}
626-
627-
var last = range.Length - 1;
628-
629-
// Check for closing ) or ]
630-
if (range [last] == ')') {
631-
mv.IsMaxInclusive = false;
632-
range = range.Substring (0, last);
633-
} else if (range [last] == ']') {
634-
mv.IsMaxInclusive = true;
635-
range = range.Substring (0, last);
636-
}
637-
638-
// Look for a single value
639-
if (!range.Contains (",")) {
640-
mv.MinVersion = range;
641-
mv.HasLowerBound = true;
642-
643-
// Special case [1.0]
644-
if (mv.IsMinInclusive && mv.IsMaxInclusive) {
645-
mv.MaxVersion = range;
646-
mv.HasUpperBound = true;
647-
}
648-
649-
return mv;
650-
}
651-
652-
// Split the 2 values (note either can be empty)
653-
var lower = range.FirstSubset (',').Trim ();
654-
var upper = range.LastSubset (',').Trim ();
655-
656-
if (lower.HasValue ()) {
657-
mv.MinVersion = lower;
658-
mv.HasLowerBound = true;
659-
}
660-
661-
if (upper.HasValue ()) {
662-
mv.MaxVersion = upper;
663-
mv.HasUpperBound = true;
664-
}
665-
666-
return mv;
667-
}
668-
669-
public bool ContainsVersion (MavenVersion version)
670-
{
671-
if (HasLowerBound) {
672-
var min_version = MavenVersion.Parse (MinVersion!);
673-
674-
if (IsMinInclusive && version.CompareTo (min_version) < 0)
675-
return false;
676-
else if (!IsMinInclusive && version.CompareTo (min_version) <= 0)
677-
return false;
678-
}
679-
680-
if (HasUpperBound) {
681-
var max_version = MavenVersion.Parse (MaxVersion!);
682-
683-
if (IsMaxInclusive && version.CompareTo (max_version) > 0)
684-
return false;
685-
else if (!IsMaxInclusive && version.CompareTo (max_version) >= 0)
686-
return false;
687-
}
688-
689-
return true;
690-
}
691-
}

0 commit comments

Comments
 (0)