@@ -1819,19 +1819,28 @@ function set_force_latest_compatible_version!(ctx::Types.Context,
18191819 has_compat = haskey(ctx. env. project. compat, dep_name)
18201820 if has_compat
18211821 old_compat_entry_string = ctx. env. project. compat[dep_name]
1822+ old_compat_entry_spec = Types. semver_spec(old_compat_entry_string)
1823+ all_registered_versions = get_all_registered_versions(ctx, dep_uuid)
18221824 latest_compatible_version = get_latest_compatible_version(
18231825 ctx,
18241826 dep_uuid,
1825- old_compat_entry_string,
1827+ old_compat_entry_spec,
1828+ all_registered_versions,
18261829 )
18271830 earliest_backwards_compatible_version = get_earliest_backwards_compatible_version(latest_compatible_version)
1831+ all_compatible_earliest_to_latest = get_all_compatible_earliest_to_latest(
1832+ old_compat_entry_spec,
1833+ earliest_backwards_compatible_version,
1834+ latest_compatible_version,
1835+ all_registered_versions,
1836+ )
18281837 if allow_earlier_backwards_compatible_versions
1829- version_to_use_for_compat = earliest_backwards_compatible_version
1838+ new_compat_entry_string = join(string.(Ref( " = " ), all_compatible_earliest_to_latest), " , " )
18301839 else
1831- version_to_use_for_compat = latest_compatible_version
1840+ new_compat_entry_string = " = $( latest_compatible_version) "
18321841 end
1833- new_compat_entry_string = " ^$(version_to_use_for_compat) "
18341842 ctx. env. project. compat[dep_name] = new_compat_entry_string
1843+ @info(" Setting new `[compat]` entry: `$(dep_name) = \" $(new_compat_entry_string) \" `" )
18351844 else
18361845 if dep_name != target_name
18371846 @warn(
@@ -1843,17 +1852,31 @@ function set_force_latest_compatible_version!(ctx::Types.Context,
18431852 return nothing
18441853end
18451854
1846- function get_earliest_backwards_compatible_version(ver:: Base.VersionNumber )
1847- (ver. major > 0 ) && return Base. VersionNumber(ver. major, 0 , 0 )
1848- (ver. minor > 0 ) && return Base. VersionNumber(0 , ver. minor, 0 )
1849- return Base. VersionNumber(0 , 0 , ver. patch)
1855+ function get_all_compatible_earliest_to_latest(compat_spec:: VersionSpec ,
1856+ earliest_ver:: VersionNumber ,
1857+ latest_ver:: VersionNumber ,
1858+ all_registered_versions:: Set{VersionNumber} )
1859+ compatible_versions = Set{VersionNumber}()
1860+ for ver in all_registered_versions
1861+ if earliest_ver <= ver <= latest_ver
1862+ if ver in compat_spec
1863+ push!(compatible_versions, ver)
1864+ end
1865+ end
1866+ end
1867+ return sort(collect(compatible_versions))
1868+ end
1869+
1870+ function get_earliest_backwards_compatible_version(ver:: VersionNumber )
1871+ (ver. major > 0 ) && return VersionNumber(ver. major, 0 , 0 )
1872+ (ver. minor > 0 ) && return VersionNumber(0 , ver. minor, 0 )
1873+ return VersionNumber(0 , 0 , ver. patch)
18501874end
18511875
18521876function get_latest_compatible_version(ctx:: Types.Context ,
18531877 uuid:: Base.UUID ,
1854- compat_entry_string:: AbstractString )
1855- all_registered_versions = get_all_registered_versions(ctx, uuid)
1856- compat_spec = Pkg. Types. semver_spec(compat_entry_string)
1878+ compat_spec:: VersionSpec ,
1879+ all_registered_versions:: Set{VersionNumber} )
18571880 compatible_versions = filter(in(compat_spec), all_registered_versions)
18581881 latest_compatible_version = maximum(compatible_versions)
18591882 return latest_compatible_version
0 commit comments