Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature request (with code!): Search for registered packages + display releases #3926

Open
haakon-e opened this issue Jun 12, 2024 · 1 comment

Comments

@haakon-e
Copy link

Pkg has seen amazing improvements in the past few versions, with indicators for packages that are upgradeable, hindered from being upgraded, and so on.

One feature I'm missing that I've found in other ecosystems is a "search" functionality with some basic information about the packages.

Personally, I'm most interested in learning about package versions and url, a small blurb/about-me could be useful too (see related discussions below for potential approaches)

I'm envisioning something along the lines of:

pkg> search Makie
Package 'Makie' is available from:
- "General" registry
    Most recent releases: 0.21.2, 0.21.1, 0.21.0, 0.20.10, 0.20.9
    Repository: https://github.com/MakieOrg/Makie.jl.git

[Potentially / easy to support too:] 
- "OtherInstalledRegistry" registry
    [...]

Below is a quickly hacked together code for obtaining version history for a given package in the General registry, mostly achieved by poking into Pkgs existing internals (e.g. Pkg.status(), Pkg.print_status(...), Pkg.Types.Context())

import Pkg: Pkg, API, Operations, Registry

function search(pkgname; min_version = v"0.0.0", max_version = nothing)
    registries = Registry.reachable_registries();  # can loop over this to print info from all installed registries
    reg_ind = findfirst(r -> r.name == "General", registries);
    reg = registries[reg_ind];
    pkguuids_in_registry = collect(keys(reg.pkgs));
    pkgnames_in_registry = [reg.pkgs[key].name for key in pkguuids_in_registry];

    pkgname_ind = findfirst(==(pkgname), pkgnames_in_registry);
    pkguuid = pkguuids_in_registry[pkgname_ind]

    reg_pkg = get(reg, pkguuid, nothing);  # Pkg.Registry.PkgEntry

    info = Registry.registry_info(reg_pkg);
    reg_compat_info = Registry.compat_info(info);
    versions = keys(reg_compat_info);
    versions = Base.filter(v -> !Registry.isyanked(info, v), collect(versions));
    versions_sorted = sort(versions, rev=true)

    # filter between min_version and max_version
    max_version = isnothing(max_version) ? maximum(versions_sorted; init=v"0") : max_version
    filter!(v -> min_version <= v <= max_version, versions_sorted) 

    version_list = versions_sorted[1:min(5, length(versions_sorted))]
    pkg_url = info.repo
    
    # Prints what is shown above
    println("Package '$pkgname' is available from:")
    println("- '$(reg.name)' registry")
    println("    Most recent releases: $(join(version_list, ", "))")
    println("    Repository: $pkg_url")
    nothing
end

Having written the code first, then discovered all the discussion about this already (as one does...), I realize more thinking may be needed to hone down a really great long-term interface. That said, I hope a variant of this suggestion can be a small, but practically achievable step, in this direction.


relevant issue(s): #3259, #2613, #1397 (with great discussion)
Related to (but smaller(?) in scope than): discourse#98813
Tags/metadata aspect also described in: #1967, #1070 (includes similar code to the above)
Similar goals, but web-based: https://juliapackages.com

@KristofferC
Copy link
Member

While I understand it can be nice to do everything from Pkg itself I am not sure it is worth spending much effort on to this when you can just go to https://juliahub.com/ui/Packages/ or https://juliapackages.com/ etc and have a much better experience with graphs and tables etc than what Pkg can ever provide.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants