Skip to content

Commit

Permalink
Fix cache_dir for nested Debian repos
Browse files Browse the repository at this point in the history
  • Loading branch information
lcaparroz committed Jan 18, 2024
1 parent d9cf5c7 commit 546dd3f
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 28 deletions.
9 changes: 5 additions & 4 deletions lib/rmt/mirror/debian.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,12 @@ def parse_package_list(packagelist)
# In a nested debian repository stucture, the metadata and packages are stored in different locations
# so we need to update the base_url if we encounter the nested structure
# We assume that if the base_url contains '/dists/', it's a nested debian structure
#
# FIXME: Is there a better way to detect a nested structure?
if ref.base_url.match?(NESTED_REPOSITORY_REGEX)
ref.base_url.sub!(NESTED_REPOSITORY_REGEX, '/')
ref.base_dir.sub!(NESTED_REPOSITORY_REGEX, '/')
ref.tap do |r|
r.base_url.sub!(NESTED_REPOSITORY_REGEX, '/')
r.base_dir.sub!(NESTED_REPOSITORY_REGEX, '/')
r.cache_dir.sub!(NESTED_REPOSITORY_REGEX, '/')
end
end

packages << ref
Expand Down
55 changes: 32 additions & 23 deletions spec/lib/rmt/mirror/debian_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@

describe RMT::Mirror::Debian do
subject(:debian) { described_class.new(**debian_mirror_configuration) }
let(:repository) { create :repository, :debian_flat }

let(:repository) do
create :repository,
name: 'HYPE product repository debian 15.3',
external_url: 'https://updates.suse.com/sample/repository/15.3/'
end

# Configuration for Debian mirroring instance
let(:mirroring_base_dir) { '/test/repository/base/path/' }
Expand Down Expand Up @@ -112,7 +117,7 @@
end

context 'nested debian repository' do
let(:release_fixture) { 'Nested_Release' }
let(:release_fixture) { 'nested/Release' }

before do
allow(debian).to receive(:download_cached!).and_return(release_ref)
Expand Down Expand Up @@ -150,37 +155,20 @@
end

it 'download packages to disk' do
allow(debian).to receive(:parse_package_list).with(packages_ref).and_call_original

expect(debian).to receive(:enqueue).exactly(4).times
expect(debian).to receive(:parse_package_list).with(packages_ref).and_call_original
expect(debian).to receive(:download_enqueued)
debian.mirror_packages([packages_ref, non_package_ref])
end

it 'does not download the file if not needed' do
allow(debian).to receive(:need_to_download?).exactly(3).times.and_return(true)
allow(debian).to receive(:need_to_download?).with(any_args) { |ref| ref.size == 206796 }.and_return(false)
allow(debian).to receive(:parse_package_list).with(packages_ref).and_call_original

expect(debian).to receive(:need_to_download?).exactly(3).times.and_return(true)
expect(debian).to receive(:need_to_download?).with(any_args) { |ref| ref.size == 206796 }.and_return(false)
expect(debian).to receive(:enqueue).exactly(3).times
expect(debian).to receive(:parse_package_list).with(packages_ref).and_call_original
expect(debian).to receive(:download_enqueued)

debian.mirror_packages([packages_ref])
end

context 'nested debian repository' do
let(:fixture) { 'nested/Packages.gz' }
let(:repository) { create :repository, :debian }

it 'downloads packages but saves them to altered base directory', focus: true do
allow(debian).to receive(:need_to_download?).and_return(true)

expect(debian).to receive(:enqueue).with(base_dir_matches(/foo/)).exactly(35).times
expect(debian).to receive(:download_enqueued)

debian.mirror_packages([packages_ref])
end
end
end

describe '#parse_package_list' do
Expand All @@ -203,6 +191,27 @@
expect { debian.parse_package_list(packages_ref) }.to raise_error(RMT::Mirror::Exception, /unexpected end of file/)
end
end

context 'nested repository structure' do
let(:fixture) { 'nested/Packages.gz' }
let(:repository) do
create :repository,
name: 'HYPE product repository debian 15.3',
external_url: 'https://ppa.launchpadcontent.net/ondrej/nginx/ubuntu/dists/focal/'
end

it 'removes dists/ from mirroring path and external URL' do
packages = debian.parse_package_list(packages_ref)

expect(packages).to all(
have_attributes(
base_url: 'https://ppa.launchpadcontent.net/ondrej/nginx/ubuntu/',
base_dir: mirroring_base_dir + 'ondrej/nginx/ubuntu/',
cache_dir: mirroring_base_dir + 'ondrej/nginx/ubuntu/'
)
)
end
end
end

describe '#parse_release_file' do
Expand Down
2 changes: 1 addition & 1 deletion spec/lib/rmt/mirror/suma_product_tree_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

describe '#mirror' do
before do
allow(suma).to receive(:downloader).and_return downloader
allow(RMT::Downloader).to receive(:new).and_return downloader
end

it 'mirrors the product_tree file' do
Expand Down

0 comments on commit 546dd3f

Please sign in to comment.