Issue #110: download new (binary) `stx:stc` and `stx:librun` when doing `rake update`
To save some network traffic, the `download_binary_component()` first download
SHA256 hash of the archive and compares it with previous hash (if any). If they
differ, it downloads the component. If not it does nothing, assuming the most
recent version has already been downloaded.
--- a/specs/stx-jv.rbspec Thu Jan 18 13:27:55 2018 +0000
+++ b/specs/stx-jv.rbspec Tue Jan 23 09:50:40 2018 +0000
@@ -1,9 +1,10 @@
# A helper function to download and unpack pre-built stc and librun
# for those who are not lucky enough to have an access to sources
-def download_blob_matching(pattern, directory)
+def download_binary_component(component, directory)
plat = nil
blob = nil
sha256 = nil
+ pattern = /prebuilt-#{Regexp.quote(component)}/
build_url = %Q{https://swing.fit.cvut.cz/jenkins/job/stx_jv/lastStableBuild}
@@ -26,19 +27,34 @@
end
end
if not blob then
- error "No artifact matching given pattern found: '#{pattern}'"
+ error "No binary component \"'#{component}\" found: #{build_url}/artifact/artifacts/"
end
- puts "Downloading binary component #{blob.name}"
+ if sha256 then
+ info "Downloading binary component SHA265 checksum #{sha256.name}"
+ sha256.download_to(directory)
+ if File.exist? directory / "#{component}" and File.exist? directory / "#{component}.sha256" then
+ # Compare a "current" checksum and the (possibly) "new" checkum.
+ # if same, skip the download (assuming that version has been
+ # downloaded already)
+ sha256_current = File.read(directory / ".#{component}.sha256")
+ sha256_new = File.read(directory / sha256.name)
+ if sha256_new == sha256_current then
+ return
+ end
+ end
+ end
+ info "Downloading binary component #{blob.name}"
blob.download_to(directory)
- if sha256 then
- sha256.download_to(directory)
+ info "Extracting binary component #{blob.name}"
+ if File.exist? directory / component then
+ rm_rf directory / component
end
unzip directory / blob.name, remove: true
- rm_f directory / sha256.name
+ if sha256 then
+ mv directory / sha256.name, directory / ".#{component}.sha256"
+ end
end
-
-
project :'stx:jv-branch-core' do
# Core Smalltalk/X - does contain only standard libraries,
# and development tools. Does not contain any other 'features'
@@ -49,35 +65,35 @@
# FORKED STC and librun
package "stx:stc", :repository => :'jv-branch:private', :branch => 'jv', revision: 'stx-8.0.0',
:checkout => (Proc.new do | pkg |
- # Download pre-compiled binary if user has no access to source code
- if Rake::Stx::Configuration::Repository::find(pkg.repository) then
- checkout pkg.repository, 'stx/stc', :branch => pkg.branch, :revision => pkg.revision
- else
- download_blob_matching(/prebuilt-stc/, BUILD_DIR / 'stx')
+ # Download pre-compiled binary if user has no access to source code
+ if Rake::Stx::Configuration::Repository::find(pkg.repository) then
+ checkout pkg.repository, 'stx/stc', :branch => pkg.branch, :revision => pkg.revision
+ else
+ download_binary_component('stc', BUILD_DIR / 'stx')
end
end),
:update => (Proc.new do | pkg |
if (File.exists? BUILD_DIR / 'stx' / 'stc' / '.hg' / 'hgrc') then
update pkg.repository, 'stx/stc', :branch => pkg.branch, :revision => pkg.revision
else
- warn "Not updating #{pkg.name} as no HG repository found in #{BUILD_DIR / 'stx' / 'stc'}"
+ download_binary_component('stc', BUILD_DIR / 'stx')
end
end)
package "stx:librun", :repository => :'jv-branch:private', :branch => 'jv', revision: 'stx-8.0.0',
:checkout => (Proc.new do | pkg |
- # Download pre-compiled binary if user has no access to source code
- if Rake::Stx::Configuration::Repository::find(pkg.repository) then
+ # Download pre-compiled binary if user has no access to source code
+ if Rake::Stx::Configuration::Repository::find(pkg.repository) then
checkout pkg.repository, 'stx/librun', :branch => pkg.branch, :revision => pkg.revision
- else
- download_blob_matching(/prebuilt-librun/, BUILD_DIR / 'stx')
+ else
+ download_binary_component('librun', BUILD_DIR / 'stx')
end
end),
:update => (Proc.new do | pkg |
if (File.exists? BUILD_DIR / 'stx' / 'librun' / '.hg' / 'hgrc') then
update pkg.repository, 'stx/stc', :branch => pkg.branch, :revision => pkg.revision
else
- warn "Not updating #{pkg.name} as no HG repository found in #{BUILD_DIR / 'stx' / 'librun'}"
+ download_binary_component('librun', BUILD_DIR / 'stx')
end
end)