autobuild 1.4.5 → 1.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changes.txt +3 -0
- data/Manifest.txt +1 -0
- data/lib/autobuild.rb +1 -1
- data/lib/autobuild/import/archive.rb +161 -0
- metadata +4 -3
data/Changes.txt
CHANGED
data/Manifest.txt
CHANGED
data/lib/autobuild.rb
CHANGED
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'autobuild/importer'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Autobuild
|
6
|
+
class ArchiveImporter < Importer
|
7
|
+
# The tarball is not compressed
|
8
|
+
Plain = 0
|
9
|
+
# The tarball is compressed with gzip
|
10
|
+
Gzip = 1
|
11
|
+
# The tarball is compressed using bzip
|
12
|
+
Bzip = 2
|
13
|
+
# Not a tarball but a zip
|
14
|
+
Zip = 3
|
15
|
+
|
16
|
+
TAR_OPTION = {
|
17
|
+
Plain => '',
|
18
|
+
Gzip => 'z',
|
19
|
+
Bzip => 'j'
|
20
|
+
}
|
21
|
+
|
22
|
+
# Known URI schemes for +url+
|
23
|
+
VALID_URI_SCHEMES = [ 'file', 'http', 'https', 'ftp' ]
|
24
|
+
|
25
|
+
# Returns the unpack mode from the file name
|
26
|
+
def self.filename_to_mode(filename)
|
27
|
+
case filename
|
28
|
+
when /\.zip$/; Zip
|
29
|
+
when /\.tar$/; Plain
|
30
|
+
when /\.tar\.gz|\.tgz$/; Gzip
|
31
|
+
when /\.bz2$/; Bzip
|
32
|
+
else
|
33
|
+
raise "unknown file type '#{filename}'"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Updates the downloaded file in cache only if it is needed
|
38
|
+
def update_cache(package)
|
39
|
+
do_update = true
|
40
|
+
|
41
|
+
if File.file?(cachefile)
|
42
|
+
cached_size = File.lstat(cachefile).size
|
43
|
+
cached_mtime = File.lstat(cachefile).mtime
|
44
|
+
|
45
|
+
size, mtime = nil
|
46
|
+
open @url, :content_length_proc => lambda { |size| } do |file|
|
47
|
+
mtime = file.last_modified
|
48
|
+
end
|
49
|
+
|
50
|
+
if mtime && size
|
51
|
+
do_update = (size != cached_size || mtime > cached_mtime)
|
52
|
+
elsif mtime
|
53
|
+
$stderr.puts "WARNING: size is not available for #{@url}, relying on modification time"
|
54
|
+
do_update = (mtime > cached_mtime)
|
55
|
+
elsif size
|
56
|
+
$stderr.puts "WARNING: modification time is not available for #{@url}, relying on size"
|
57
|
+
do_update = (size != cached_size)
|
58
|
+
else
|
59
|
+
$stderr.puts "WARNING: neither size nor modification time available for #{@url}, will always update"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
if do_update
|
64
|
+
FileUtils.mkdir_p(cachedir)
|
65
|
+
Subprocess.run(package, :import, Autobuild.tool('wget'), '-q', '-P', cachedir, @url)
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# The source URL
|
71
|
+
attr_reader :url
|
72
|
+
# The local file (either a downloaded file if +url+ is not local, or +url+ itself)
|
73
|
+
attr_reader :cachefile
|
74
|
+
# The unpack mode. One of Zip, Bzip, Gzip or Plain
|
75
|
+
attr_reader :mode
|
76
|
+
# The directory in which remote files are cached
|
77
|
+
def cachedir; @options[:cachedir] end
|
78
|
+
# The directory contained in the tar file
|
79
|
+
#
|
80
|
+
# DEPRECATED use #archive_dir instead
|
81
|
+
def tardir; @options[:tardir] end
|
82
|
+
# The directory contained in the archive. If not set, we assume that it
|
83
|
+
# is the same than the source dir
|
84
|
+
def archive_dir; @options[:archive_dir] || tardir end
|
85
|
+
|
86
|
+
# Creates a new importer which downloads +url+ in +cachedir+ and unpacks it. The following options
|
87
|
+
# are allowed:
|
88
|
+
# [:cachedir] the cache directory. Defaults to "#{Autobuild.prefix}/cache"
|
89
|
+
# [:archive_dir] the directory contained in the archive file. If set,
|
90
|
+
# the importer will rename that directory to make it match
|
91
|
+
# Package#srcdir
|
92
|
+
# [:no_subdirectory] the archive does not have the custom archive
|
93
|
+
# subdirectory.
|
94
|
+
def initialize(url, options)
|
95
|
+
@options = options.dup
|
96
|
+
@options[:cachedir] ||= "#{Autobuild.prefix}/cache"
|
97
|
+
|
98
|
+
@url = URI.parse(url)
|
99
|
+
raise ConfigException, "invalid URL #{@url}" unless VALID_URI_SCHEMES.include?(@url.scheme)
|
100
|
+
|
101
|
+
@mode = options[:mode] || ArchiveImporter.filename_to_mode(options[:filename] || url)
|
102
|
+
if @url.scheme == 'file'
|
103
|
+
@cachefile = @url.path
|
104
|
+
else
|
105
|
+
@cachefile = File.join(cachedir, @options[:filename] || File.basename(url))
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def update(package) # :nodoc:
|
110
|
+
checkout(package) if update_cache(package)
|
111
|
+
rescue OpenURI::HTTPError
|
112
|
+
raise Autobuild::Exception.new(package.name, :import)
|
113
|
+
end
|
114
|
+
|
115
|
+
def checkout(package) # :nodoc:
|
116
|
+
update_cache(package)
|
117
|
+
|
118
|
+
base_dir = File.dirname(package.srcdir)
|
119
|
+
FileUtils.mkdir_p base_dir
|
120
|
+
|
121
|
+
main_dir = if @options[:no_subdirectory] then package.srcdir
|
122
|
+
else base_dir
|
123
|
+
end
|
124
|
+
|
125
|
+
if mode == Zip
|
126
|
+
cmd = [ 'unzip', '-o', '-f', cachefile, '-d', main_dir ]
|
127
|
+
else
|
128
|
+
cmd = [ 'tar', "x#{TAR_OPTION[mode]}f", cachefile, '-C', main_dir ]
|
129
|
+
end
|
130
|
+
|
131
|
+
Subprocess.run(package, :import, *cmd)
|
132
|
+
if archive_dir
|
133
|
+
FileUtils.mv File.join(base_dir, archive_dir), package.srcdir
|
134
|
+
end
|
135
|
+
if !File.directory?(package.srcdir)
|
136
|
+
raise Autobuild::Exception, "#{cachefile} does not contain directory called #{File.basename(package.srcdir)}. Did you forget to use the :archive_dir option ?"
|
137
|
+
end
|
138
|
+
|
139
|
+
rescue OpenURI::HTTPError
|
140
|
+
raise Autobuild::Exception.new(package.name, :import)
|
141
|
+
rescue SubcommandFailed
|
142
|
+
FileUtils.rm_f cachefile
|
143
|
+
raise
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# For backwards compatibility
|
148
|
+
TarImporter = ArchiveImporter
|
149
|
+
|
150
|
+
# Creates an importer which downloads a tarball from +source+ and unpacks
|
151
|
+
# it. The allowed values in +options+ are described in ArchiveImporter.new.
|
152
|
+
def self.archive(source, options = {})
|
153
|
+
ArchiveImporter.new(source, options)
|
154
|
+
end
|
155
|
+
|
156
|
+
# DEPRECATED. Use Autobuild.archive instead.
|
157
|
+
def self.tar(source, options = {})
|
158
|
+
ArchiveImporter.new(source, options)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autobuild
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Joyeux
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-24 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -60,7 +60,7 @@ dependencies:
|
|
60
60
|
requirements:
|
61
61
|
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 2.
|
63
|
+
version: 2.3.3
|
64
64
|
version:
|
65
65
|
description: |-
|
66
66
|
This work is licensed under the GPLv2 license. See License.txt for details
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- lib/autobuild/import/darcs.rb
|
107
107
|
- lib/autobuild/import/git.rb
|
108
108
|
- lib/autobuild/import/svn.rb
|
109
|
+
- lib/autobuild/import/archive.rb
|
109
110
|
- lib/autobuild/import/tar.rb
|
110
111
|
- lib/autobuild/importer.rb
|
111
112
|
- lib/autobuild/package.rb
|