/
zipdirectory.rb
105 lines (86 loc) · 2.59 KB
/
zipdirectory.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
require 'albacore/albacoretask'
require 'zip/zip'
require 'zip/zipfilesystem'
include Zip
class ZipDirectory
TaskName = :zip
include Albacore::Task
attr_accessor :output_path, :output_file
attr_accessor :flatten_zip
attr_array :directories_to_zip, :additional_files, :exclusions
def initialize
@flatten_zip = true
@exclusions = []
super()
update_attributes Albacore.configuration.zip.to_hash
end
def execute()
fail_with_message 'Output File cannot be empty' if @output_file.nil?
return if @output_file.nil?
clean_directories_names
remove zip_name
ZipFile.open(zip_name, 'w') do |zipfile|
zip_directory(zipfile)
zip_additional(zipfile)
end
end
def clean_directories_names
return if @directories_to_zip.nil?
@directories_to_zip.each { |d| d.sub!(%r[/$],'')}
end
def remove(filename)
FileUtils.rm filename, :force=>true
end
def reject_file(f)
f == zip_name || is_excluded(f)
end
def is_excluded(f)
expanded_exclusions.any? do |e|
return true if e.respond_to? '~' and f =~ e
e == f
end
end
def expanded_exclusions
return @expanded_exclusions unless @expanded_exclusions.nil?
regexp_exclusions, string_exclusions = @exclusions.partition {|x| x.respond_to? '~' }
@expanded_exclusions = [].concat(regexp_exclusions)
@directories_to_zip.each do |dir|
Dir.chdir(dir) do
string_exclusions.each do |ex|
exclusions = Dir.glob(ex)
exclusions = exclusions.map {|x| File.join(dir, x) } unless exclusions[0] == ex
exclusions << ex if exclusions.empty?
@expanded_exclusions += exclusions
end
end
end
@expanded_exclusions
end
def zip_name()
@output_path = set_output_path
File.join(@output_path, @output_file)
end
def set_output_path()
path = ''
path = @directories_to_zip.first unless @directories_to_zip.nil?
path = @output_path unless @output_path.nil?
return path
end
def zip_directory(zipfile)
return if @directories_to_zip.nil?
@directories_to_zip.each do |d|
Dir["#{d}/**/**"].reject{|f| reject_file(f)}.each do |file_path|
file_name = file_path
file_name = file_path.sub(d + '/','') if @flatten_zip
zipfile.add(file_name, file_path)
end
end
end
def zip_additional(zipfile)
return if @additional_files.nil?
@additional_files.reject{|f| reject_file(f)}.each do |file_path|
file_name = file_path.split('/').last if @flatten_zip
zipfile.add(file_name, file_path)
end
end
end