@@ -111,7 +111,7 @@ static bool TryResolveProject (Artifact artifact, IPomResolver resolver, [NotNul
111111
112112class 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