-
Notifications
You must be signed in to change notification settings - Fork 37
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
feat: support flat repos [OLD, see #90] #86
feat: support flat repos [OLD, see #90] #86
Conversation
@thesayyn I think the PR is ready but IMHO it's a bit "dirty" due to how the current code is structured. I have a bunch of refactors and code cleanups in my local repo that IMHO are quite nice and help separate concerns between manifest, lockfile, etc, but it's a much larger PR. Not sure if I should try and get that PR reviewed so that I can then rebase this PR on top. My guess is that once the refactors are done, the Also, I had to bump
EDIT: @aaomidi solved it! THANKS!! 🎉 Thanks!! |
0884182
to
b4414ac
Compare
b4414ac
to
35ed287
Compare
Fixes issue GoogleContainerTools#56 Follow-up and credit to @alexconrey (PR GoogleContainerTools#55), @ericlchen1 (PR GoogleContainerTools#64) and @benmccown (PR GoogleContainerTools#67) for their work on similar PRs that I've reviewed and drawn some inspiration to create "one 💍 PR to merge them all" 😅 Problem: Debian has two types of repos: "canonical" and "flat". Each has a different sources.list syntax: "canonical": ``` deb uri distribution [component1] [component2] [...] ``` (see https://wiki.debian.org/DebianRepository/Format#Overview) flat: ``` deb uri directory/ ``` (see https://wiki.debian.org/DebianRepository/Format#Flat_Repository_Format) A flat repository does not use the dists hierarchy of directories, and instead places meta index and indices directly into the archive root (or some part below it) Thus, the URL logic in _fetch_package_index() is incorrect for these repos and it always fails to fetch the Package index. Solution: Just use the Debian sources.list convention in the 'sources' section of the manifest to add canonical and flat repos. Depending on whether the channel has one directory that ends in '/' or a (dist, component, ...) structure the _fetch_package_index and other internal logic will know whether the source is a canonical or a flat repo. For example: ``` version: 1 sources: # canonical repo - channel: bullseye main contrib url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z # flat repos, note the trailing '/' and the lack of distribution or components - channel: bullseye-cran40/ url: https://cloud.r-project.org/bin/linux/debian - channel: ubuntu2404/x86_64/ url: https://developer.download.nvidia.com/compute/cuda/repos archs: - amd64 packages: - bash - r-mathlib - nvidia-container-toolkit-base ``` Disregarding the "mixing" of Ubuntu and Debian repos for the purpose of the example, this manifest shows that you can mix canonical and flat repos and you can mix multiarch and single-arch flat repos and canonical repos. You will still have the same problems as before with packages that only exist for one architecture and/or repos that only support one architecture. In those cases, simply separate the repos and packages into their own manifests. NOTE: The NVIDIA CUDA repos don't follow Debian specs and have issues with the package filenames. This is addressed in a separate commit.
Although the Debian repo spec for 'Filename' (see https://wiki.debian.org/DebianRepository/Format#Filename) clearly says that 'Filename' should be relative to the base directory of the repo and should be in canonical form (i.e. without '.' or '..') there are cases where this is not honored. In those cases we try to work around this by assuming 'Filename' is relative to the sources.list directory/ so we combine them and normalize the new 'Filename' path. Note that, so far, only the NVIDIA CUDA repos needed this workaround so maybe this heuristic will break for other repos that don't conform to the Debian repo spec.
35ed287
to
8441ec3
Compare
@jjmaestro I think this addresses the issues I reported in #66 and tried to address in #67. The one issue I ran into with Nvidia's CUDA repo and packages, that I'm not sure I see addressed, is duplicate transitive dependencies not being handled (which I handled with a depset). I responded to you on this topic here. |
@benmccown cool, thanks! will definitely have a look! I've also drafted #90 which is the exact same as this PR but on top of other PRs with fixes and a MASSIVE refactoring PR that fixes a lot of the architecture issues that I found. TL;DR there's no more "if-else" for flat repos in multiple places, everything is now in one @thesayyn / @alexeagle please have a look at the new PRs, I hope you like them better and thus, this one should be abandoned. |
Fixes issue #56
Follow-up and credit to @alexconrey (PR #55), @ericlchen1 (PR #64) and @benmccown (PR #67) for their work on similar PRs that I've reviewed and drawn some inspiration to create "one 💍 PR to merge them all" 😅
Problem
Debian has two types of repos: "canonical" and "flat". Each has a different sources.list syntax:
"canonical": (see https://wiki.debian.org/DebianRepository/Format#Overview)
flat: (see https://wiki.debian.org/DebianRepository/Format#Flat_Repository_Format)
Per the spec,
Thus, the URL logic in
_fetch_package_index()
is incorrect for these repos and it always fails to fetch the Package index.Solution
Just use the Debian sources.list convention in the
sources
section of the manifest to add canonical and flat repos. Depending on whether the channel has one directory that ends in'/'
or a(dist, component, ...)
structure the_fetch_package_index ()
and other internal logic will know whether the source is a canonical or a flat repo.For example:
Disregarding the "mixing" of Ubuntu and Debian repos for the purpose of the example, this manifest shows that you can mix canonical and flat repos and you can mix multiarch and single-arch flat repos and canonical repos.
You will still have the same problems as before with packages that only exist for one architecture and/or repos that only support one architecture. In those cases, simply separate the repos and packages into their own manifests.
Note
This PR also fixes an issue with NVIDIA CUDA flat repos that don't follow the Debian repo spec and have invalid
'Filename'
paths.The Debian repo spec for
'Filename'
says:However, there are cases where this is not honored. In those cases we try to work around this by assuming
'Filename'
is relative to thesources.list
directory/
so we combine them and normalize the new'Filename'
path.Note that, so far, only the NVIDIA CUDA repos needed this workaround so maybe this heuristic will break for other repos that don't conform to the Debian repo spec.