dlang / dub

Package and build management system for D
MIT License
677 stars 227 forks source link

packagesuppliers/filesystem.d: Only glob versions of a package_id #2727

Closed the-horo closed 10 months ago

the-horo commented 11 months ago

When looking for versions of a package don't include other packages that start with the same name as the queried package. This is done by requiring that the first character after the - is a digit.

If a directory contains the files botan-1.zip and botan-math-2.zip the current implementation would report both 1 and math-2 as candidates followed by an error that math-2 is not a valid version:

$ ls /tmp/mytest
botan-1.13.4.zip  botan-1.13.5.zip  botan-1.13.6.zip  botan-math-1.0.3.zip  botan-math-1.0.4.zip  repo

$ dub --vverbose --cache=local --registry=file:///tmp/mytest/ --skip-registry=all fetch botan@1.13.6
Note: Failed to determine version of package repo at .. Assuming ~master.
Entry: /tmp/mytest/botan-math-1.0.3.zip
Version: math-1.0.3
     Warning Package botan not found for file repository at /tmp/mytest/: Invalid SemVer format: math-1.0.3
Full error: object.Exception@source/dub/dependency.d(783): Invalid SemVer format: math-1.0.3
----------------
??:? pure @safe noreturn std.exception.bailOut!(Exception).bailOut(immutable(char)[], ulong, scope const(char)[]) [0x55c1f07c9a9b]
??:? pure @safe bool std.exception.enforce!().enforce!(bool).enforce(bool, lazy const(char)[], immutable(char)[], ulong) [0x55c1f07c9a1c]
??:? pure ref @safe dub.dependency.Version dub.dependency.Version.__ctor(immutable(char)[]) [0x55c1f0963092]
??:? dub.dependency.Version[] dub.packagesuppliers.filesystem.FileSystemPackageSupplier.getVersions(immutable(char)[]) [0x55c1f0b7ba72]
??:? dub.internal.vibecompat.inet.path.NativePath dub.packagesuppliers.filesystem.FileSystemPackageSupplier.bestPackageFile(immutable(char)[], dub.dependency.Dependency, bool) [0x55c1f0b7c0a6]
??:? dub.internal.vibecompat.data.json.Json dub.packagesuppliers.filesystem.FileSystemPackageSupplier.fetchPackageRecipe(immutable(char)[], dub.dependency.Dependency, bool) [0x55c1f0b7bdab]
??:? dub.package_.Package dub.dub.Dub.fetch(immutable(char)[], in dub.dependency.VersionRange, dub.packagemanager.PlacementLocation, dub.dub.FetchOptions, immutable(char)[]) [0x55c1f0973a1e]
??:? int dub.commandline.FetchCommand.execute(dub.dub.Dub, immutable(char)[][], immutable(char)[][]) [0x55c1f07bbef6]
??:? int dub.commandline.runDubCommandLine(immutable(char)[][]) [0x55c1f07b4a15]
??:? _Dmain [0x55c1f0797fe7]
Error No package botan was found matching the dependency 1.13.6
Full exception: object.Exception@source/dub/dub.d(866): No package botan was found matching the dependency 1.13.6
----------------
??:? pure @safe noreturn std.exception.bailOut!(Exception).bailOut(immutable(char)[], ulong, scope const(char)[]) [0x55c1f07c9a9b]
??:? pure @safe bool std.exception.enforce!().enforce!(bool).enforce(bool, lazy const(char)[], immutable(char)[], ulong) [0x55c1f07c9a1c]
??:? dub.package_.Package dub.dub.Dub.fetch(immutable(char)[], in dub.dependency.VersionRange, dub.packagemanager.PlacementLocation, dub.dub.FetchOptions, immutable(char)[]) [0x55c1f0973b73]
??:? int dub.commandline.FetchCommand.execute(dub.dub.Dub, immutable(char)[][], immutable(char)[][]) [0x55c1f07bbef6]
??:? int dub.commandline.runDubCommandLine(immutable(char)[][]) [0x55c1f07b4a15]
??:? _Dmain [0x55c1f0797fe7]
github-actions[bot] commented 11 months ago

✅ PR OK, no changes in deprecations or warnings

Total deprecations: 0

Total warnings: 0

Build statistics:

 statistics (-before, +after)
-executable size=5277720 bin/dub
+executable size=5228376 bin/dub
 rough build time=62s
Full build output ``` DUB version 1.35.1, built on Jan 6 2024 LDC - the LLVM D compiler (1.36.0): based on DMD v2.106.1 and LLVM 17.0.6 built with LDC - the LLVM D compiler (1.36.0) Default target: x86_64-unknown-linux-gnu Host CPU: znver3 http://dlang.org - http://wiki.dlang.org/LDC Registered Targets: aarch64 - AArch64 (little endian) aarch64_32 - AArch64 (little endian ILP32) aarch64_be - AArch64 (big endian) amdgcn - AMD GCN GPUs arm - ARM arm64 - ARM64 (little endian) arm64_32 - ARM64 (little endian ILP32) armeb - ARM (big endian) avr - Atmel AVR Microcontroller bpf - BPF (host endian) bpfeb - BPF (big endian) bpfel - BPF (little endian) hexagon - Hexagon lanai - Lanai loongarch32 - 32-bit LoongArch loongarch64 - 64-bit LoongArch mips - MIPS (32-bit big endian) mips64 - MIPS (64-bit big endian) mips64el - MIPS (64-bit little endian) mipsel - MIPS (32-bit little endian) msp430 - MSP430 [experimental] nvptx - NVIDIA PTX 32-bit nvptx64 - NVIDIA PTX 64-bit ppc32 - PowerPC 32 ppc32le - PowerPC 32 LE ppc64 - PowerPC 64 ppc64le - PowerPC 64 LE r600 - AMD GPUs HD2XXX-HD6XXX riscv32 - 32-bit RISC-V riscv64 - 64-bit RISC-V sparc - Sparc sparcel - Sparc LE sparcv9 - Sparc V9 spirv32 - SPIR-V 32-bit spirv64 - SPIR-V 64-bit systemz - SystemZ thumb - Thumb thumbeb - Thumb (big endian) ve - VE wasm32 - WebAssembly 32-bit wasm64 - WebAssembly 64-bit x86 - 32-bit X86: Pentium-Pro and above x86-64 - 64-bit X86: EM64T and AMD64 xcore - XCore Upgrading project in /home/runner/work/dub/dub/ Starting Performing "release" build using /opt/hostedtoolcache/dc/ldc2-1.36.0/x64/ldc2-1.36.0-linux-x86_64/bin/ldc2 for x86_64. Building dub 1.36.0-beta.1+commit.37.g3be7c80c: building configuration [application] Linking dub STAT:statistics (-before, +after) STAT:executable size=5228376 bin/dub STAT:rough build time=62s ```
the-horo commented 11 months ago

I haven't hit it yet but can https://github.com/dlang/dub/blob/60d9cee3884ef6bd0700ee423da1c2b266d93483/source/dub/packagesuppliers/filesystem.d#L33 go from an enforce to a continue? There shouldn't be a problem if the directory contains misc files that start with the same name as a package.