autobuild 1.5.59 → 1.5.60

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 CHANGED
@@ -1,3 +1,13 @@
1
+ == Version 1.5.60
2
+ * patching: fix some more issues regarding the interaction of patching and VCS:
3
+ * autobuild will now properly remove patches before we try to update
4
+ This fixes un-updateable systems on which the update would fail before
5
+ the patch, but autobuild would try to update before removing the patches
6
+ * if a patch conflicts with a VCS update, the reported error will now be
7
+ that the patch can't be applied, NOT that the VCS cannot update. The
8
+ latter behaviour was too confusing.
9
+ * patching: better progress messages.
10
+
1
11
  == Version 1.5.59
2
12
  * orogen: try to autodetect the orogen_file value earlier, if not provided
3
13
  * added Autobuild.color? and Autobuild.color= to control whether the output
@@ -77,22 +77,79 @@ class Importer
77
77
  end
78
78
  end
79
79
 
80
+ def perform_update(package)
81
+ cur_patches = currently_applied_patches(package)
82
+ needed_patches = self.patches
83
+ kept_patches = (cur_patches & needed_patches)
84
+ if kept_patches != cur_patches
85
+ patch(package, kept_patches)
86
+ end
87
+
88
+ package.progress "updating %s"
89
+ update(package)
90
+ patch(package)
91
+ package.updated = true
92
+ rescue Interrupt
93
+ raise
94
+ rescue ::Exception => original_error
95
+ # If the package is patched, it might be that the update
96
+ # failed because we needed to unpatch first. Try it out
97
+ #
98
+ # This assumes that importing data with conflict will
99
+ # make the import fail, but not make the patch
100
+ # un-appliable. Importers that do not follow this rule
101
+ # will have to unpatch by themselves.
102
+ cur_patches = currently_applied_patches(package)
103
+ if cur_patches.empty?
104
+ return fallback(original_error, package, :import, package)
105
+ end
106
+
107
+ package.progress "update failed and some patches are applied, retrying after removing all patches first"
108
+ begin
109
+ patch(package, [])
110
+
111
+ rescue ::Exception => e
112
+ # The unpatching failed. The importer probably did
113
+ # change the files in a way that made the patching
114
+ # impossible to reverse. Just raise the original
115
+ # error (which hopefully should be the importer
116
+ # message that says that there are conflicts)
117
+ raise original_error
118
+ end
119
+
120
+ begin
121
+ package.progress "updating %s"
122
+ update(package)
123
+ patch(package)
124
+ package.updated = true
125
+ rescue Interrupt
126
+ raise
127
+ rescue ::Exception => e
128
+ fallback(e, package, :import, package)
129
+ end
130
+ end
131
+
132
+ def perform_checkout(package)
133
+ package.progress "checking out %s"
134
+ checkout(package)
135
+ patch(package)
136
+ package.updated = true
137
+ rescue Autobuild::Exception => e
138
+ FileUtils.rm_rf package.srcdir
139
+ fallback(e, package, :import, package)
140
+ rescue ::Exception
141
+ package.progress "checkout of %s failed, deleting the source directory #{package.srcdir}"
142
+ FileUtils.rm_rf package.srcdir
143
+ raise
144
+ end
145
+
80
146
  # Performs the import of +package+
81
147
  def import(package)
82
148
  srcdir = package.srcdir
83
149
  if File.directory?(srcdir)
84
150
  package.isolate_errors(false) do
85
151
  if Autobuild.do_update
86
- package.progress "updating %s"
87
- begin
88
- update(package)
89
- patch(package)
90
- package.updated = true
91
- rescue Interrupt
92
- raise
93
- rescue ::Exception => e
94
- fallback(e, package, :import, package)
95
- end
152
+ perform_update(package)
96
153
  else
97
154
  if Autobuild.verbose
98
155
  puts " not updating #{package.name}"
@@ -104,21 +161,8 @@ class Importer
104
161
  elsif File.exists?(srcdir)
105
162
  raise ConfigException, "#{srcdir} exists but is not a directory"
106
163
  else
107
- begin
108
- package.progress "checking out %s"
109
- checkout(package)
110
- patch(package)
111
- package.updated = true
112
- rescue Autobuild::Exception => e
113
- FileUtils.rm_rf package.srcdir
114
- fallback(e, package, :import, package)
115
- rescue ::Exception
116
- package.progress "checkout of %s failed, deleting the source directory #{package.srcdir}"
117
- FileUtils.rm_rf package.srcdir
118
- raise
119
- end
164
+ perform_checkout(package)
120
165
  end
121
-
122
166
  end
123
167
 
124
168
  # Tries to find a fallback importer because of the given error.
@@ -154,27 +198,37 @@ class Importer
154
198
  def apply(package, path); call_patch(package, false, path) end
155
199
  def unapply(package, path); call_patch(package, true, path) end
156
200
 
201
+ def currently_applied_patches(package)
202
+ patches_file = patchlist(package)
203
+ if !File.exists?(patches_file) then []
204
+ else
205
+ File.open(patches_file) do |f|
206
+ f.readlines.collect { |path| path.rstrip }
207
+ end
208
+ end
209
+ end
210
+
157
211
  def patch(package, patches = self.patches)
158
212
  # Get the list of already applied patches
159
- patches_file = patchlist(package)
160
- cur_patches = if !File.exists?(patches_file) then []
161
- else
162
- File.open(patches_file) do |f|
163
- f.readlines.collect { |path| path.rstrip }
164
- end
165
- end
213
+ cur_patches = currently_applied_patches(package)
166
214
 
167
215
  if cur_patches == patches
168
- return
216
+ return false
169
217
  end
170
218
 
171
- if !patches.empty?
172
- package.progress "patching %s"
173
- end
174
-
175
219
  # Do not be smart, remove all already applied patches
176
220
  # and then apply the new ones
177
221
  begin
222
+ apply_count = (patches - cur_patches).size
223
+ unapply_count = (cur_patches - patches).size
224
+ if apply_count > 0 && unapply_count > 0
225
+ package.progress "patching %s: applying #{apply_count} and unapplying #{unapply_count} patch(es)"
226
+ elsif apply_count > 0
227
+ package.progress "patching %s: applying #{apply_count} patch(es)"
228
+ else
229
+ package.progress "patching %s: unapplying #{unapply_count} patch(es)"
230
+ end
231
+
178
232
  while p = cur_patches.last
179
233
  unapply(package, p)
180
234
  cur_patches.pop
@@ -189,6 +243,8 @@ class Importer
189
243
  f.write(cur_patches.join("\n"))
190
244
  end
191
245
  end
246
+
247
+ return true
192
248
  end
193
249
  end
194
250
  end
@@ -1,5 +1,5 @@
1
1
  module Autobuild
2
- VERSION = "1.5.59" unless defined? Autobuild::VERSION
2
+ VERSION = "1.5.60" unless defined? Autobuild::VERSION
3
3
  end
4
4
 
5
5
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autobuild
3
3
  version: !ruby/object:Gem::Version
4
- hash: 117
4
+ hash: 123
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 5
9
- - 59
10
- version: 1.5.59
9
+ - 60
10
+ version: 1.5.60
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sylvain Joyeux
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-18 00:00:00 Z
18
+ date: 2012-01-28 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rake
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
164
  requirements: []
165
165
 
166
166
  rubyforge_project: autobuild
167
- rubygems_version: 1.8.12
167
+ rubygems_version: 1.8.15
168
168
  signing_key:
169
169
  specification_version: 3
170
170
  summary: Rake-based utility to build and install multiple packages with dependencies