@@ -130,6 +130,54 @@ internal static Dictionary<string, string> DependenciesToPackageSpecs(
130
130
return sourcesByPackageSpec ;
131
131
}
132
132
133
+ /// <summary>
134
+ /// From a list of dependencies generate a list of Maven / Gradle / Ivy package spec
135
+ /// strings along with their corresponding dependency versions.
136
+ /// </summary>
137
+ /// <param name="dependencies">Dependency instances to query for package specs.</param>
138
+ /// <returns>Dictionary where the key is a package spec string and value is a
139
+ /// 3 item list of sources string, dependency version less string,
140
+ /// and a dependency version string. </returns>
141
+ internal static Dictionary < string , List < string > > DependenciesToPackageSpecsWithVersions (
142
+ IEnumerable < Dependency > dependencies ) {
143
+ // To keep it simple to iterate and process, create 3 separate
144
+ // dictionaries to record required metadata about a package spec
145
+ // (version and versionless key).
146
+ var sourcesByPackageSpec = new Dictionary < string , string > ( ) ;
147
+ var versionsByPackageSpec = new Dictionary < string , string > ( ) ;
148
+ var versionlessKeysByPackageSpec = new Dictionary < string , string > ( ) ;
149
+ foreach ( var dependency in dependencies ) {
150
+ // Convert the legacy "LATEST" version spec to a Gradle version spec.
151
+ var packageSpec = dependency . Version . ToUpper ( ) == "LATEST" ?
152
+ dependency . VersionlessKey + ":+" : dependency . Key ;
153
+ var source = CommandLine . SplitLines ( dependency . CreatedBy ) [ 0 ] ;
154
+ string sources ;
155
+ if ( sourcesByPackageSpec . TryGetValue ( packageSpec , out sources ) ) {
156
+ sources = sources + ", " + source ;
157
+ } else {
158
+ sources = source ;
159
+ }
160
+ sourcesByPackageSpec [ packageSpec ] = sources ;
161
+ versionsByPackageSpec [ packageSpec ] = dependency . Version ;
162
+ versionlessKeysByPackageSpec [ packageSpec ] = dependency . VersionlessKey ;
163
+ }
164
+ // Create a new dictionary which combines the data from sources and
165
+ // versions dictionaries. Key is packageSpec string and value is a
166
+ // three-item list of strings of sources, version less string
167
+ // and dependency version.
168
+ // NOTE: tuples are a more elegant way of doing this but they work
169
+ // only in .NET frameworks >= 4.0.
170
+ var mergedByPackageSpec = new Dictionary < string , List < string > > ( ) ;
171
+ foreach ( var item in sourcesByPackageSpec ) {
172
+ mergedByPackageSpec [ item . Key ] = new List < string > {
173
+ sourcesByPackageSpec [ item . Key ] ,
174
+ versionlessKeysByPackageSpec [ item . Key ] ,
175
+ versionsByPackageSpec [ item . Key ]
176
+ } ;
177
+ }
178
+ return mergedByPackageSpec ;
179
+ }
180
+
133
181
/// <summary>
134
182
/// Convert a repo path to a valid URI.
135
183
/// If the specified repo is a local directory and it doesn't exist, search the project
0 commit comments