|
13 | 13 | ) |
14 | 14 | load( |
15 | 15 | ":semver.bzl", |
| 16 | + "compatible", |
16 | 17 | "lt", |
17 | 18 | "version_from_string", |
18 | 19 | ) |
@@ -227,24 +228,45 @@ def _newest(a, b): |
227 | 228 | b_version = b.version, |
228 | 229 | b_module = b.module.name, |
229 | 230 | )) |
230 | | - elif lt(a_version, b_version): |
| 231 | + if not compatible(a_version, b_version): |
| 232 | + fail("Version {dep_name}@{a_version} (required by {a_module}) & {dep_name}@{b_version} (required by {b_module}) cannot be resolved (major version mismatch)".format( |
| 233 | + dep_name = a.name, |
| 234 | + a_version = a.version, |
| 235 | + a_module = a.module.name, |
| 236 | + b_version = b.version, |
| 237 | + b_module = b.module.name, |
| 238 | + )) |
| 239 | + if lt(a_version, b_version): |
231 | 240 | return b |
232 | 241 | else: |
233 | 242 | return a |
234 | 243 |
|
235 | | -def _resolve_local(packages): |
| 244 | +def _dedupe_by_version(packages): |
| 245 | + by_version = {} |
| 246 | + for p in packages: |
| 247 | + by_version[p.version] = p |
| 248 | + return by_version.values() |
| 249 | + |
| 250 | +def _resolve_local(ctx, packages): |
236 | 251 | deduped = [] |
237 | 252 | packages_by_name = {} |
238 | 253 | for p in packages: |
239 | 254 | if p.name in packages_by_name: |
240 | 255 | packages_by_name[p.name].append(p) |
241 | 256 | else: |
242 | 257 | packages_by_name[p.name] = [p] |
243 | | - for (_, dupes) in packages_by_name.items(): |
| 258 | + for (name, dupes) in packages_by_name.items(): |
244 | 259 | p = dupes[0] |
245 | 260 | for dupe in dupes[1:]: |
246 | 261 | p = _newest(p, dupe) |
247 | 262 | deduped.append(p) |
| 263 | + filtered_dupes = _dedupe_by_version(dupes) |
| 264 | + if len(filtered_dupes) > 1: |
| 265 | + log(ctx, "Multiple versions of {} requested ({}), selecting {}".format( |
| 266 | + name, |
| 267 | + ", ".join([p.version for p in filtered_dupes]), |
| 268 | + p.version, |
| 269 | + )) |
248 | 270 | return deduped |
249 | 271 |
|
250 | 272 | def _erlang_package(ctx): |
@@ -290,7 +312,7 @@ def _erlang_package(ctx): |
290 | 312 | dep = dep, |
291 | 313 | )) |
292 | 314 |
|
293 | | - deduped = _resolve_local(packages) |
| 315 | + deduped = _resolve_local(ctx, packages) |
294 | 316 |
|
295 | 317 | resolved = _resolve_hex_pm(ctx, deduped) |
296 | 318 |
|
|
0 commit comments