@@ -111,7 +111,7 @@ static bool TryResolveProject (Artifact artifact, IPomResolver resolver, [NotNul
111
111
112
112
class DependencyResolver
113
113
{
114
- readonly List < Artifact > artifacts = new List < Artifact > ( ) ;
114
+ readonly Dictionary < string , Artifact > artifacts = new ( ) ;
115
115
116
116
readonly NuGetPackageVersionFinder ? finder ;
117
117
readonly TaskLoggingHelper log ;
@@ -157,7 +157,7 @@ public void AddAndroidLibraries (ITaskItem []? tasks)
157
157
158
158
if ( version != null && MavenExtensions . TryParseArtifactWithVersion ( id , version , log , out var art ) ) {
159
159
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 ) ;
161
161
}
162
162
}
163
163
}
@@ -168,7 +168,7 @@ public void AddPackageReferences (ITaskItem []? tasks)
168
168
169
169
// See if JavaArtifact/JavaVersion overrides were used
170
170
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 ) ;
172
172
continue ;
173
173
}
174
174
@@ -181,7 +181,7 @@ public void AddPackageReferences (ITaskItem []? tasks)
181
181
182
182
if ( artifact != null ) {
183
183
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 ) ;
185
185
186
186
continue ;
187
187
}
@@ -195,7 +195,7 @@ public void AddProjectReferences (ITaskItem []? tasks)
195
195
foreach ( var task in tasks . OrEmpty ( ) ) {
196
196
// See if JavaArtifact/JavaVersion overrides were used
197
197
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 ) ;
199
199
continue ;
200
200
}
201
201
@@ -219,27 +219,22 @@ public void AddIgnoredDependencies (ITaskItem []? tasks)
219
219
220
220
if ( version != null && MavenExtensions . TryParseArtifactWithVersion ( id , version , log , out var art ) ) {
221
221
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 ) ;
223
223
}
224
224
}
225
225
}
226
226
227
227
bool TrySatisfyDependency ( ResolvedDependency dependency )
228
228
{
229
229
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 ( ) ) ;
233
231
234
232
var dep_versions = MavenVersionRange . Parse ( dependency . Version ) ;
235
233
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 ) ) ) ;
241
236
242
- return satisfied ;
237
+ return false ;
243
238
}
244
239
}
245
240
@@ -431,261 +426,3 @@ public class NuGetPackageVersionFinder
431
426
return new Artifact ( match . Groups [ "GroupId" ] . Value , match . Groups [ "ArtifactId" ] . Value , match . Groups [ "Version" ] . Value ) ;
432
427
}
433
428
}
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