Commit 83b7ac64 authored by Robert Speicher's avatar Robert Speicher Committed by Robert Speicher

Merge branch 'ci/recursive-artifacts-entries' into 'master'

Add method to calculate total size of artifacts in subpath

See merge request !2500
parent fc293bae
...@@ -346,17 +346,17 @@ module Ci ...@@ -346,17 +346,17 @@ module Ci
end end
def artifacts_browse_url def artifacts_browse_url
if artifacts_browser_supported? if artifacts_metadata?
browse_namespace_project_build_artifacts_path(project.namespace, project, self) browse_namespace_project_build_artifacts_path(project.namespace, project, self)
end end
end end
def artifacts_browser_supported? def artifacts_metadata?
artifacts? && artifacts_metadata.exists? artifacts? && artifacts_metadata.exists?
end end
def artifacts_metadata_entry(path) def artifacts_metadata_entry(path, **options)
Gitlab::Ci::Build::Artifacts::Metadata.new(artifacts_metadata.path, path).to_entry Gitlab::Ci::Build::Artifacts::Metadata.new(artifacts_metadata.path, path, **options).to_entry
end end
private private
......
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
.center .center
.btn-group{ role: :group } .btn-group{ role: :group }
= link_to "Download", @build.artifacts_download_url, class: 'btn btn-sm btn-primary' = link_to "Download", @build.artifacts_download_url, class: 'btn btn-sm btn-primary'
- if @build.artifacts_browser_supported? - if @build.artifacts_metadata?
= link_to "Browse", @build.artifacts_browse_url, class: 'btn btn-sm btn-primary' = link_to "Browse", @build.artifacts_browse_url, class: 'btn btn-sm btn-primary'
.build-widget .build-widget
......
...@@ -13,8 +13,8 @@ module Gitlab ...@@ -13,8 +13,8 @@ module Gitlab
attr_reader :file, :path, :full_version attr_reader :file, :path, :full_version
def initialize(file, path) def initialize(file, path, **opts)
@file, @path = file, path @file, @path, @opts = file, path, opts
@full_version = read_version @full_version = read_version
end end
...@@ -52,7 +52,9 @@ module Gitlab ...@@ -52,7 +52,9 @@ module Gitlab
def match_entries(gz) def match_entries(gz)
entries = {} entries = {}
match_pattern = %r{^#{Regexp.escape(@path)}[^/]*/?$}
child_pattern = '[^/]*/?$' unless @opts[:recursive]
match_pattern = /^#{Regexp.escape(@path)}#{child_pattern}/
until gz.eof? do until gz.eof? do
begin begin
......
...@@ -95,6 +95,13 @@ module Gitlab ...@@ -95,6 +95,13 @@ module Gitlab
children.empty? children.empty?
end end
def total_size
descendant_pattern = %r{^#{Regexp.escape(@path)}}
entries.sum do |path, entry|
(entry[:size] if path =~ descendant_pattern).to_i
end
end
def to_s def to_s
@path @path
end end
......
...@@ -4,13 +4,13 @@ describe Gitlab::Ci::Build::Artifacts::Metadata::Entry do ...@@ -4,13 +4,13 @@ describe Gitlab::Ci::Build::Artifacts::Metadata::Entry do
let(:entries) do let(:entries) do
{ 'path/' => {}, { 'path/' => {},
'path/dir_1/' => {}, 'path/dir_1/' => {},
'path/dir_1/file_1' => {}, 'path/dir_1/file_1' => { size: 10 },
'path/dir_1/file_b' => {}, 'path/dir_1/file_b' => { size: 10 },
'path/dir_1/subdir/' => {}, 'path/dir_1/subdir/' => {},
'path/dir_1/subdir/subfile' => {}, 'path/dir_1/subdir/subfile' => { size: 10 },
'path/second_dir' => {}, 'path/second_dir' => {},
'path/second_dir/dir_3/file_2' => {}, 'path/second_dir/dir_3/file_2' => { size: 10 },
'path/second_dir/dir_3/file_3'=> {}, 'path/second_dir/dir_3/file_3'=> { size: 10 },
'another_directory/'=> {}, 'another_directory/'=> {},
'another_file' => {}, 'another_file' => {},
'/file/with/absolute_path' => {} } '/file/with/absolute_path' => {} }
...@@ -112,6 +112,11 @@ describe Gitlab::Ci::Build::Artifacts::Metadata::Entry do ...@@ -112,6 +112,11 @@ describe Gitlab::Ci::Build::Artifacts::Metadata::Entry do
subject { |example| path(example).empty? } subject { |example| path(example).empty? }
it { is_expected.to be false } it { is_expected.to be false }
end end
describe '#total_size' do
subject { |example| path(example).total_size }
it { is_expected.to eq(30) }
end
end end
end end
......
require 'spec_helper' require 'spec_helper'
describe Gitlab::Ci::Build::Artifacts::Metadata do describe Gitlab::Ci::Build::Artifacts::Metadata do
def metadata(path = '') def metadata(path = '', **opts)
described_class.new(metadata_file_path, path) described_class.new(metadata_file_path, path, **opts)
end end
let(:metadata_file_path) do let(:metadata_file_path) do
...@@ -51,6 +51,19 @@ describe Gitlab::Ci::Build::Artifacts::Metadata do ...@@ -51,6 +51,19 @@ describe Gitlab::Ci::Build::Artifacts::Metadata do
end end
end end
describe '#find_entries! recursively for other_artifacts_0.1.2/' do
subject { metadata('other_artifacts_0.1.2/', recursive: true).find_entries! }
it 'matches correct paths' do
expect(subject.keys).
to contain_exactly 'other_artifacts_0.1.2/',
'other_artifacts_0.1.2/doc_sample.txt',
'other_artifacts_0.1.2/another-subdirectory/',
'other_artifacts_0.1.2/another-subdirectory/empty_directory/',
'other_artifacts_0.1.2/another-subdirectory/banana_sample.gif'
end
end
describe '#to_entry' do describe '#to_entry' do
subject { metadata('').to_entry } subject { metadata('').to_entry }
it { is_expected.to be_an_instance_of(Gitlab::Ci::Build::Artifacts::Metadata::Entry) } it { is_expected.to be_an_instance_of(Gitlab::Ci::Build::Artifacts::Metadata::Entry) }
......
...@@ -362,12 +362,12 @@ describe Ci::Build, models: true do ...@@ -362,12 +362,12 @@ describe Ci::Build, models: true do
subject { build.artifacts_browse_url } subject { build.artifacts_browse_url }
it "should be nil if artifacts browser is unsupported" do it "should be nil if artifacts browser is unsupported" do
allow(build).to receive(:artifacts_browser_supported?).and_return(false) allow(build).to receive(:artifacts_metadata?).and_return(false)
is_expected.to be_nil is_expected.to be_nil
end end
it 'should not be nil if artifacts browser is supported' do it 'should not be nil if artifacts browser is supported' do
allow(build).to receive(:artifacts_browser_supported?).and_return(true) allow(build).to receive(:artifacts_metadata?).and_return(true)
is_expected.to_not be_nil is_expected.to_not be_nil
end end
end end
...@@ -391,8 +391,8 @@ describe Ci::Build, models: true do ...@@ -391,8 +391,8 @@ describe Ci::Build, models: true do
end end
describe :artifacts_browser_supported? do describe :artifacts_metadata? do
subject { build.artifacts_browser_supported? } subject { build.artifacts_metadata? }
context 'artifacts metadata does not exist' do context 'artifacts metadata does not exist' do
it { is_expected.to be_falsy } it { is_expected.to be_falsy }
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment