Browse code

stage/RPMS cleanup support for incremental build

run `make clean-stage-for-incremental-build` to remove all upward
dependencies (rpms) baased on latest commit change

Extras:
- ceph: fix multiversioning support (use proper dep versions)

Change-Id: I536cd0a0db86cb18036e397b3fa6297ea044df19
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5775
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>
Tested-by: Anish Swaminathan <anishs@vmware.com>

Alexey Makhalov authored on 2018/09/22 17:59:15
Showing 4 changed files
... ...
@@ -235,6 +235,14 @@ who-needs:
235 235
 	@cd $(PHOTON_SPECDEPS_DIR) && \
236 236
 		$(PHOTON_SPECDEPS) -s $(PHOTON_SPECS_DIR) -i who-needs -p $(pkg)
237 237
 
238
+# This target analyzes top git commit and removes staged RPMS that can be affected
239
+# by this change and should be rebuilt as part of incremental build support
240
+# For every spec file touched - remove all upward dependent packages (rpms)
241
+# If support folder was touched - do full build
242
+clean-stage-for-incremental-build:
243
+	@test -n "$$(git show @ SPECS)" && $(PHOTON_SPECDEPS) -s $(PHOTON_SPECS_DIR) -i remove-upward-deps -p $$(echo `git show --pretty="format:" --name-only @ | grep .spec | xargs -n1 basename 2>/dev/null` | tr ' ' :)
244
+	@test -n "$$(git show @ support)" && $(RM) -rf $(PHOTON_RPMS_DIR)
245
+
238 246
 packages: check-docker-py check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_XRPMS) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
239 247
 	@echo "Building all RPMS..."
240 248
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
... ...
@@ -29,10 +29,10 @@ Patch0:         fix-build-warnings-errors-gcc-7.3.patch
29 29
 #################################################################################
30 30
 # dependencies that apply across all distro families
31 31
 #################################################################################
32
-Requires:       ceph-osd = %{epoch}:%{version}-%{release}
33
-Requires:       ceph-mds = %{epoch}:%{version}-%{release}
34
-Requires:       ceph-mgr = %{epoch}:%{version}-%{release}
35
-Requires:       ceph-mon = %{epoch}:%{version}-%{release}
32
+Requires:       ceph-osd = %{version}-%{release}
33
+Requires:       ceph-mds = %{version}-%{release}
34
+Requires:       ceph-mgr = %{version}-%{release}
35
+Requires:       ceph-mon = %{version}-%{release}
36 36
 Requires(post): binutils
37 37
 BuildRequires:  boost-devel
38 38
 BuildRequires:  cmake
... ...
@@ -93,11 +93,11 @@ on commodity hardware and delivers object, block and file system storage.
93 93
 %package base
94 94
 Summary:       Ceph Base Package
95 95
 Group:         System Environment/Base
96
-Requires:      ceph-common = %{epoch}:%{version}-%{release}
97
-Requires:      librbd1 = %{epoch}:%{version}-%{release}
98
-Requires:      librados2 = %{epoch}:%{version}-%{release}
99
-Requires:      libcephfs2 = %{epoch}:%{version}-%{release}
100
-Requires:      librgw2 = %{epoch}:%{version}-%{release}
96
+Requires:      ceph-common = %{version}-%{release}
97
+Requires:      librbd1 = %{version}-%{release}
98
+Requires:      librados2 = %{version}-%{release}
99
+Requires:      libcephfs2 = %{version}-%{release}
100
+Requires:      librgw2 = %{version}-%{release}
101 101
 
102 102
 Requires:      python2
103 103
 Requires:      python-requests
... ...
@@ -114,13 +114,13 @@ Base is the package that includes all the files shared amongst ceph servers
114 114
 %package -n ceph-common
115 115
 Summary:    Ceph Common
116 116
 Group:      System Environment/Base
117
-Requires:   librbd1 = %{epoch}:%{version}-%{release}
118
-Requires:   librados2 = %{epoch}:%{version}-%{release}
119
-Requires:   libcephfs2 = %{epoch}:%{version}-%{release}
120
-Requires:   python-rados = %{epoch}:%{version}-%{release}
121
-Requires:   python-rbd = %{epoch}:%{version}-%{release}
122
-Requires:   python-cephfs = %{epoch}:%{version}-%{release}
123
-Requires:   python-rgw = %{epoch}:%{version}-%{release}
117
+Requires:   librbd1 = %{version}-%{release}
118
+Requires:   librados2 = %{version}-%{release}
119
+Requires:   libcephfs2 = %{version}-%{release}
120
+Requires:   python-rados = %{version}-%{release}
121
+Requires:   python-rbd = %{version}-%{release}
122
+Requires:   python-cephfs = %{version}-%{release}
123
+Requires:   python-rgw = %{version}-%{release}
124 124
 Requires:   python-requests
125 125
 %{?systemd_requires}
126 126
 %description -n ceph-common
... ...
@@ -130,7 +130,7 @@ Comprised of files that are common to Ceph clients and servers.
130 130
 %package mds
131 131
 Summary:    Ceph Metadata Server Daemon
132 132
 Group:      System Environment/Base
133
-Requires:   ceph-base = %{epoch}:%{version}-%{release}
133
+Requires:   ceph-base = %{version}-%{release}
134 134
 %description mds
135 135
 ceph-mds is the metadata server daemon for the Ceph distributed file system.
136 136
 One or more instances of ceph-mds collectively manage the file system
... ...
@@ -139,7 +139,7 @@ namespace, coordinating access to the shared OSD cluster.
139 139
 %package mon
140 140
 Summary:    Ceph Monitor Daemon
141 141
 Group:      System Environment/Base
142
-Requires:   ceph-base = %{epoch}:%{version}-%{release}
142
+Requires:   ceph-base = %{version}-%{release}
143 143
 %description mon
144 144
 ceph-mon is the cluster monitor daemon for the Ceph distributed file
145 145
 system. One or more instances of ceph-mon form a Paxos part-time
... ...
@@ -150,7 +150,7 @@ of cluster membership, configuration, and state.
150 150
 Summary:        Ceph Manager Daemon
151 151
 License:        LGPL-2.1 and CC-BY-SA-1.0 and GPL-2.0 and BSL-1.0 and GPL-2.0-with-autoconf-exception and BSD-3-Clause and MIT
152 152
 Group:          System Environment/Base
153
-Requires:       ceph-base = %{epoch}:%{version}-%{release}
153
+Requires:       ceph-base = %{version}-%{release}
154 154
 
155 155
 %description mgr
156 156
 ceph-mgr enables python modules that provide services (such as the REST
... ...
@@ -167,16 +167,16 @@ FUSE based client for Ceph distributed network file system
167 167
 %package -n rbd-fuse
168 168
 Summary:    Ceph fuse-based client
169 169
 Group:      System Environment/Base
170
-Requires:   librados2 = %{epoch}:%{version}-%{release}
171
-Requires:   librbd1 = %{epoch}:%{version}-%{release}
170
+Requires:   librados2 = %{version}-%{release}
171
+Requires:   librbd1 = %{version}-%{release}
172 172
 %description -n rbd-fuse
173 173
 FUSE based client to map Ceph rbd images to files
174 174
 
175 175
 %package -n rbd-mirror
176 176
 Summary:    Ceph daemon for mirroring RBD images
177 177
 Group:      System Environment/Base
178
-Requires:   ceph-common = %{epoch}:%{version}-%{release}
179
-Requires:   librados2 = %{epoch}:%{version}-%{release}
178
+Requires:   ceph-common = %{version}-%{release}
179
+Requires:   librados2 = %{version}-%{release}
180 180
 %description -n rbd-mirror
181 181
 Daemon for mirroring RBD images between Ceph clusters, streaming
182 182
 changes asynchronously.
... ...
@@ -184,17 +184,17 @@ changes asynchronously.
184 184
 %package -n rbd-nbd
185 185
 Summary:    Ceph RBD client base on NBD
186 186
 Group:      System Environment/Base
187
-Requires:   librados2 = %{epoch}:%{version}-%{release}
188
-Requires:   librbd1 = %{epoch}:%{version}-%{release}
187
+Requires:   librados2 = %{version}-%{release}
188
+Requires:   librbd1 = %{version}-%{release}
189 189
 %description -n rbd-nbd
190 190
 NBD based client to map Ceph rbd images to local device
191 191
 
192 192
 %package radosgw
193 193
 Summary:    Rados REST gateway
194 194
 Group:      Development/Libraries
195
-Requires:   ceph-common = %{epoch}:%{version}-%{release}
196
-Requires:   librados2 = %{epoch}:%{version}-%{release}
197
-Requires:   librgw2 = %{epoch}:%{version}-%{release}
195
+Requires:   ceph-common = %{version}-%{release}
196
+Requires:   librados2 = %{version}-%{release}
197
+Requires:   librgw2 = %{version}-%{release}
198 198
 %description radosgw
199 199
 RADOS is a distributed object store used by the Ceph distributed
200 200
 storage system.  This package provides a REST gateway to the
... ...
@@ -204,7 +204,7 @@ service as well as the OpenStack Object Storage ("Swift") API.
204 204
 %package osd
205 205
 Summary:    Ceph Object Storage Daemon
206 206
 Group:      System Environment/Base
207
-Requires:   ceph-base = %{epoch}:%{version}-%{release}
207
+Requires:   ceph-base = %{version}-%{release}
208 208
 Requires:   gptfdisk
209 209
 Requires:       parted
210 210
 %description osd
... ...
@@ -217,7 +217,7 @@ Summary:    RADOS distributed object store client library
217 217
 Group:      System Environment/Libraries
218 218
 License:    LGPL-2.0
219 219
 %if 0%{?rhel} || 0%{?fedora}
220
-Obsoletes:  ceph-libs < %{epoch}:%{version}-%{release}
220
+Obsoletes:  ceph-libs < %{version}-%{release}
221 221
 Requires:   libatomic_ops
222 222
 %endif
223 223
 %description -n librados2
... ...
@@ -230,10 +230,10 @@ store using a simple file-like interface.
230 230
 Summary:    RADOS headers
231 231
 Group:      Development/Libraries
232 232
 License:    LGPL-2.0
233
-Requires:   librados2 = %{epoch}:%{version}-%{release}
234
-Obsoletes:  ceph-devel < %{epoch}:%{version}-%{release}
235
-Provides:   librados2-devel = %{epoch}:%{version}-%{release}
236
-Obsoletes:  librados2-devel < %{epoch}:%{version}-%{release}
233
+Requires:   librados2 = %{version}-%{release}
234
+Obsoletes:  ceph-devel < %{version}-%{release}
235
+Provides:   librados2-devel = %{version}-%{release}
236
+Obsoletes:  librados2-devel < %{version}-%{release}
237 237
 %description -n librados-devel
238 238
 This package contains libraries and headers needed to develop programs
239 239
 that use RADOS object store.
... ...
@@ -242,7 +242,7 @@ that use RADOS object store.
242 242
 Summary:    RADOS gateway client library
243 243
 Group:      System Environment/Libraries
244 244
 License:    LGPL-2.0
245
-Requires:   librados2 = %{epoch}:%{version}-%{release}
245
+Requires:   librados2 = %{version}-%{release}
246 246
 %description -n librgw2
247 247
 This package provides a library implementation of the RADOS gateway
248 248
 (distributed object store with S3 and Swift personalities).
... ...
@@ -251,10 +251,10 @@ This package provides a library implementation of the RADOS gateway
251 251
 Summary:    RADOS gateway client library
252 252
 Group:      Development/Libraries
253 253
 License:    LGPL-2.0
254
-Requires:   librados-devel = %{epoch}:%{version}-%{release}
255
-Requires:   librgw2 = %{epoch}:%{version}-%{release}
256
-Provides:   librgw2-devel = %{epoch}:%{version}-%{release}
257
-Obsoletes:  librgw2-devel < %{epoch}:%{version}-%{release}
254
+Requires:   librados-devel = %{version}-%{release}
255
+Requires:   librgw2 = %{version}-%{release}
256
+Provides:   librgw2-devel = %{version}-%{release}
257
+Obsoletes:  librgw2-devel < %{version}-%{release}
258 258
 %description -n librgw-devel
259 259
 This package contains libraries and headers needed to develop programs
260 260
 that use RADOS gateway client library.
... ...
@@ -263,9 +263,9 @@ that use RADOS gateway client library.
263 263
 Summary:    Python 2 libraries for the RADOS gateway
264 264
 Group:      System Environment/Libraries
265 265
 License:    LGPL-2.0
266
-Requires:   librgw2 = %{epoch}:%{version}-%{release}
267
-Requires:   python-rados = %{epoch}:%{version}-%{release}
268
-Obsoletes:  python-ceph < %{epoch}:%{version}-%{release}
266
+Requires:   librgw2 = %{version}-%{release}
267
+Requires:   python-rados = %{version}-%{release}
268
+Obsoletes:  python-ceph < %{version}-%{release}
269 269
 %description -n python-rgw
270 270
 This package contains Python 2 libraries for interacting with Cephs RADOS
271 271
 gateway.
... ...
@@ -274,8 +274,8 @@ gateway.
274 274
 Summary:    Python 3 libraries for the RADOS gateway
275 275
 Group:      System Environment/Libraries
276 276
 License:    LGPL-2.0
277
-Requires:   librgw2 = %{epoch}:%{version}-%{release}
278
-Requires:   python3-rados = %{epoch}:%{version}-%{release}
277
+Requires:   librgw2 = %{version}-%{release}
278
+Requires:   python3-rados = %{version}-%{release}
279 279
 %description -n python3-rgw
280 280
 This package contains Python 3 libraries for interacting with Cephs RADOS
281 281
 gateway.
... ...
@@ -284,8 +284,8 @@ gateway.
284 284
 Summary:    Python 2 libraries for the RADOS object store
285 285
 Group:      System Environment/Libraries
286 286
 License:    LGPL-2.0
287
-Requires:   librados2 = %{epoch}:%{version}-%{release}
288
-Obsoletes:  python-ceph < %{epoch}:%{version}-%{release}
287
+Requires:   librados2 = %{version}-%{release}
288
+Obsoletes:  python-ceph < %{version}-%{release}
289 289
 %description -n python-rados
290 290
 This package contains Python 2 libraries for interacting with Cephs RADOS
291 291
 object store.
... ...
@@ -295,7 +295,7 @@ Summary:    Python 3 libraries for the RADOS object store
295 295
 Group:      System Environment/Libraries
296 296
 License:    LGPL-2.0
297 297
 Requires:   python3
298
-Requires:   librados2 = %{epoch}:%{version}-%{release}
298
+Requires:   librados2 = %{version}-%{release}
299 299
 %description -n python3-rados
300 300
 This package contains Python 3 libraries for interacting with Cephs RADOS
301 301
 object store.
... ...
@@ -304,7 +304,7 @@ object store.
304 304
 Summary:    RADOS striping interface
305 305
 Group:      System Environment/Libraries
306 306
 License:    LGPL-2.0
307
-Requires:   librados2 = %{epoch}:%{version}-%{release}
307
+Requires:   librados2 = %{version}-%{release}
308 308
 %description -n libradosstriper1
309 309
 Striping interface built on top of the rados library, allowing
310 310
 to stripe bigger objects onto several standard rados objects using
... ...
@@ -314,11 +314,11 @@ an interface very similar to the rados one.
314 314
 Summary:    RADOS striping interface headers
315 315
 Group:      Development/Libraries
316 316
 License:    LGPL-2.0
317
-Requires:   libradosstriper1 = %{epoch}:%{version}-%{release}
318
-Requires:   librados-devel = %{epoch}:%{version}-%{release}
319
-Obsoletes:  ceph-devel < %{epoch}:%{version}-%{release}
320
-Provides:   libradosstriper1-devel = %{epoch}:%{version}-%{release}
321
-Obsoletes:  libradosstriper1-devel < %{epoch}:%{version}-%{release}
317
+Requires:   libradosstriper1 = %{version}-%{release}
318
+Requires:   librados-devel = %{version}-%{release}
319
+Obsoletes:  ceph-devel < %{version}-%{release}
320
+Provides:   libradosstriper1-devel = %{version}-%{release}
321
+Obsoletes:  libradosstriper1-devel < %{version}-%{release}
322 322
 %description -n libradosstriper-devel
323 323
 This package contains libraries and headers needed to develop programs
324 324
 that use RADOS striping interface.
... ...
@@ -327,8 +327,8 @@ that use RADOS striping interface.
327 327
 Summary:    RADOS block device client library
328 328
 Group:      System Environment/Libraries
329 329
 License:    LGPL-2.0
330
-Requires:   librados2 = %{epoch}:%{version}-%{release}
331
-Obsoletes:  ceph-libs < %{epoch}:%{version}-%{release}
330
+Requires:   librados2 = %{version}-%{release}
331
+Obsoletes:  ceph-libs < %{version}-%{release}
332 332
 %description -n librbd1
333 333
 RBD is a block device striped across multiple distributed objects in
334 334
 RADOS, a reliable, autonomic distributed object storage cluster
... ...
@@ -339,11 +339,11 @@ shared library allowing applications to manage these block devices.
339 339
 Summary:    RADOS block device headers
340 340
 Group:      Development/Libraries
341 341
 License:    LGPL-2.0
342
-Requires:   librbd1 = %{epoch}:%{version}-%{release}
343
-Requires:   librados-devel = %{epoch}:%{version}-%{release}
344
-Obsoletes:  ceph-devel < %{epoch}:%{version}-%{release}
345
-Provides:   librbd1-devel = %{epoch}:%{version}-%{release}
346
-Obsoletes:  librbd1-devel < %{epoch}:%{version}-%{release}
342
+Requires:   librbd1 = %{version}-%{release}
343
+Requires:   librados-devel = %{version}-%{release}
344
+Obsoletes:  ceph-devel < %{version}-%{release}
345
+Provides:   librbd1-devel = %{version}-%{release}
346
+Obsoletes:  librbd1-devel < %{version}-%{release}
347 347
 %description -n librbd-devel
348 348
 This package contains libraries and headers needed to develop programs
349 349
 that use RADOS block device.
... ...
@@ -352,9 +352,9 @@ that use RADOS block device.
352 352
 Summary:    Python 2 libraries for the RADOS block device
353 353
 Group:      System Environment/Libraries
354 354
 License:    LGPL-2.0
355
-Requires:   librbd1 = %{epoch}:%{version}-%{release}
356
-Requires:   python-rados = %{epoch}:%{version}-%{release}
357
-Obsoletes:  python-ceph < %{epoch}:%{version}-%{release}
355
+Requires:   librbd1 = %{version}-%{release}
356
+Requires:   python-rados = %{version}-%{release}
357
+Obsoletes:  python-ceph < %{version}-%{release}
358 358
 %description -n python-rbd
359 359
 This package contains Python 2 libraries for interacting with Cephs RADOS
360 360
 block device.
... ...
@@ -363,8 +363,8 @@ block device.
363 363
 Summary:    Python 3 libraries for the RADOS block device
364 364
 Group:      System Environment/Libraries
365 365
 License:    LGPL-2.0
366
-Requires:   librbd1 = %{epoch}:%{version}-%{release}
367
-Requires:   python3-rados = %{epoch}:%{version}-%{release}
366
+Requires:   librbd1 = %{version}-%{release}
367
+Requires:   python3-rados = %{version}-%{release}
368 368
 %description -n python3-rbd
369 369
 This package contains Python 3 libraries for interacting with Cephs RADOS
370 370
 block device.
... ...
@@ -373,7 +373,7 @@ block device.
373 373
 Summary:    Ceph distributed file system client library
374 374
 Group:      System Environment/Libraries
375 375
 License:    LGPL-2.0
376
-Obsoletes:  ceph-libs < %{epoch}:%{version}-%{release}
376
+Obsoletes:  ceph-libs < %{version}-%{release}
377 377
 Obsoletes:  ceph-libcephfs
378 378
 %description -n libcephfs2
379 379
 Ceph is a distributed network file system designed to provide excellent
... ...
@@ -385,11 +385,11 @@ POSIX-like interface.
385 385
 Summary:    Ceph distributed file system headers
386 386
 Group:      Development/Libraries
387 387
 License:    LGPL-2.0
388
-Requires:   libcephfs2 = %{epoch}:%{version}-%{release}
389
-Requires:   librados-devel = %{epoch}:%{version}-%{release}
390
-Obsoletes:  ceph-devel < %{epoch}:%{version}-%{release}
391
-Provides:   libcephfs2-devel = %{epoch}:%{version}-%{release}
392
-Obsoletes:  libcephfs2-devel < %{epoch}:%{version}-%{release}
388
+Requires:   libcephfs2 = %{version}-%{release}
389
+Requires:   librados-devel = %{version}-%{release}
390
+Obsoletes:  ceph-devel < %{version}-%{release}
391
+Provides:   libcephfs2-devel = %{version}-%{release}
392
+Obsoletes:  libcephfs2-devel < %{version}-%{release}
393 393
 %description -n libcephfs-devel
394 394
 This package contains libraries and headers needed to develop programs
395 395
 that use Cephs distributed file system.
... ...
@@ -398,9 +398,9 @@ that use Cephs distributed file system.
398 398
 Summary:    Python 2 libraries for Ceph distributed file system
399 399
 Group:      System Environment/Libraries
400 400
 License:    LGPL-2.0
401
-Requires:   libcephfs2 = %{epoch}:%{version}-%{release}
402
-Requires:   python-rados = %{epoch}:%{version}-%{release}
403
-Obsoletes:  python-ceph < %{epoch}:%{version}-%{release}
401
+Requires:   libcephfs2 = %{version}-%{release}
402
+Requires:   python-rados = %{version}-%{release}
403
+Obsoletes:  python-ceph < %{version}-%{release}
404 404
 %description -n python-cephfs
405 405
 This package contains Python 2 libraries for interacting with Cephs distributed
406 406
 file system.
... ...
@@ -409,8 +409,8 @@ file system.
409 409
 Summary:    Python 3 libraries for Ceph distributed file system
410 410
 Group:      System Environment/Libraries
411 411
 License:    LGPL-2.0
412
-Requires:   libcephfs2 = %{epoch}:%{version}-%{release}
413
-Requires:   python3-rados = %{epoch}:%{version}-%{release}
412
+Requires:   libcephfs2 = %{version}-%{release}
413
+Requires:   python3-rados = %{version}-%{release}
414 414
 %description -n python3-cephfs
415 415
 This package contains Python 3 libraries for interacting with Cephs distributed
416 416
 file system.
... ...
@@ -429,12 +429,12 @@ descriptions, and submitting the command to the appropriate daemon.
429 429
 Summary:    Compatibility package for Cephs python libraries
430 430
 Group:      System Environment/Libraries
431 431
 License:    LGPL-2.0
432
-Obsoletes:  python-ceph < %{epoch}:%{version}-%{release}
433
-Requires:   python-rados = %{epoch}:%{version}-%{release}
434
-Requires:   python-rbd = %{epoch}:%{version}-%{release}
435
-Requires:   python-cephfs = %{epoch}:%{version}-%{release}
436
-Requires:   python-rgw = %{epoch}:%{version}-%{release}
437
-Provides:   python-ceph = %{epoch}:%{version}-%{release}
432
+Obsoletes:  python-ceph < %{version}-%{release}
433
+Requires:   python-rados = %{version}-%{release}
434
+Requires:   python-rbd = %{version}-%{release}
435
+Requires:   python-cephfs = %{version}-%{release}
436
+Requires:   python-rgw = %{version}-%{release}
437
+Provides:   python-ceph = %{version}-%{release}
438 438
 %description -n python-ceph-compat
439 439
 This is a compatibility package to accommodate python-ceph split into
440 440
 python-rados, python-rbd, python-rgw and python-cephfs. Packages still
... ...
@@ -39,6 +39,7 @@ class SpecObjectsUtils(object):
39 39
     def __init__(self, logPath):
40 40
         self.mapSpecObjects = {}
41 41
         self.mapPackageToSpec = {}
42
+        self.mapSpecFileNameToSpecObj = {}
42 43
         self.logger = Logger.getLogger("Serializable Spec objects", logPath)
43 44
 
44 45
     def readSpecsAndConvertToSerializableObjects(self, specFilesPath):
... ...
@@ -76,6 +77,7 @@ class SpecObjectsUtils(object):
76 76
                 self.mapSpecObjects[specName].append(specObj)
77 77
             else:
78 78
                 self.mapSpecObjects[specName]=[specObj]
79
+            self.mapSpecFileNameToSpecObj[os.path.basename(specFile)]=specObj
79 80
         for key, value in self.mapSpecObjects.items():
80 81
             if len(value) > 1:
81 82
                 self.mapSpecObjects[key] = sorted(value,
... ...
@@ -97,25 +99,29 @@ class SpecObjectsUtils(object):
97 97
         if (depPkg.compare == ""):
98 98
             return self.getHighestVersion(depPkg.package)
99 99
         specObjs=self.getSpecObj(depPkg.package)
100
-        for obj in specObjs:
100
+        try:
101
+            for obj in specObjs:
101 102
                 verrel=obj.version+"-"+obj.release
102 103
                 if depPkg.compare == ">=":
103
-                       if LooseVersion(verrel) >= LooseVersion(depPkg.version):
104
-                                return obj.version
104
+                    if LooseVersion(verrel) >= LooseVersion(depPkg.version):
105
+                        return obj.version
105 106
                 elif depPkg.compare == "<=":
106
-                        if LooseVersion(verrel) <= LooseVersion(depPkg.version):
107
-                                return obj.version
107
+                    if LooseVersion(verrel) <= LooseVersion(depPkg.version):
108
+                        return obj.version
108 109
                 elif depPkg.compare == "=":
109
-                        if LooseVersion(verrel) == LooseVersion(depPkg.version):
110
-                                return obj.version
111
-                        if LooseVersion(obj.version) == LooseVersion(depPkg.version):
112
-                                return obj.version
110
+                    if LooseVersion(verrel) == LooseVersion(depPkg.version):
111
+                        return obj.version
112
+                    if LooseVersion(obj.version) == LooseVersion(depPkg.version):
113
+                        return obj.version
113 114
                 elif depPkg.compare == "<":
114
-                        if LooseVersion(verrel) < LooseVersion(depPkg.version):
115
-                                return obj.version
115
+                    if LooseVersion(verrel) < LooseVersion(depPkg.version):
116
+                        return obj.version
116 117
                 elif depPkg.compare == ">":
117
-                        if LooseVersion(verrel) > LooseVersion(depPkg.version):
118
-                                return obj.version
118
+                    if LooseVersion(verrel) > LooseVersion(depPkg.version):
119
+                        return obj.version
120
+        except Exception as e:
121
+            self.logger.error("Exception happened while searching for: " + depPkg.package + depPkg.compare + depPkg.version)
122
+            raise e
119 123
 
120 124
         # about to throw exception
121 125
         availableVersions=""
... ...
@@ -144,10 +150,6 @@ class SpecObjectsUtils(object):
144 144
         package, version = StringUtils.splitPackageNameAndVersion(pkg)
145 145
         return self.getBuildRequiresForPackage(package, version)
146 146
 
147
-    def getBuildRequiresForPkg(self, pkg):
148
-        package, version = StringUtils.splitPackageNameAndVersion(pkg)
149
-        return self.getBuildRequiresForPackage(package, version)
150
-
151 147
     # Returns list of [ "pkg1-vers1", "pkg2-vers2",.. ]
152 148
     def getRequiresAllForPackage(self, package, version):
153 149
         requiresList=[]
... ...
@@ -284,33 +286,24 @@ class SpecObjectsUtils(object):
284 284
     def printAllObjects(self):
285 285
         listSpecs = self.mapSpecObjects.keys()
286 286
         for spec in listSpecs:
287
-            specObj = self.mapSpecObjects[spec]
288
-            self.logger.info("-----------Spec:"+specObj.name+"--------------")
289
-            self.logger.info("Version:"+specObj.version)
290
-            self.logger.info("Release:"+specObj.release)
291
-            self.logger.info("SpecFile:"+specObj.specFile)
292
-            self.logger.info(" ")
293
-            self.logger.info("Source Files")
294
-            self.logger.info(specObj.listSources)
295
-            self.logger.info(" ")
296
-            self.logger.info("Patch Files")
297
-            self.logger.info(specObj.listPatches)
298
-            self.logger.info(" ")
299
-            self.logger.info(" ")
300
-            self.logger.info("List RPM packages")
301
-            self.logger.info(specObj.listPackages)
302
-            self.logger.info(" ")
303
-            self.logger.info(" ")
304
-            self.logger.info("Build require packages")
305
-            self.logger.info(self.getPkgNamesFromObj(specObj.buildRequirePackages))
306
-            self.logger.info(" ")
307
-            self.logger.info(" ")
308
-            self.logger.info("install require packages")
309
-            self.logger.info(self.getPkgNamesFromObj(specObj.installRequiresAllPackages))
310
-            self.logger.info(" ")
311
-            self.logger.info(specObj.installRequiresPackages)
312
-            self.logger.info("security_hardening: " + specObj.securityHardening)
313
-            self.logger.info("------------------------------------------------")
287
+            for specObj in self.mapSpecObjects[spec]:
288
+                self.logger.info("-----------Spec:"+specObj.name+"--------------")
289
+                self.logger.info("Version:"+specObj.version)
290
+                self.logger.info("Release:"+specObj.release)
291
+                self.logger.info("SpecFile:"+specObj.specFile)
292
+                self.logger.info("Source Files")
293
+                self.logger.info(specObj.listSources)
294
+                self.logger.info("Patch Files")
295
+                self.logger.info(specObj.listPatches)
296
+                self.logger.info("List RPM packages")
297
+                self.logger.info(specObj.listPackages)
298
+                self.logger.info("Build require packages")
299
+                self.logger.info(self.getPkgNamesFromObj(specObj.buildRequirePackages))
300
+                self.logger.info("install require packages")
301
+                self.logger.info(self.getPkgNamesFromObj(specObj.installRequiresAllPackages))
302
+                self.logger.info(specObj.installRequiresPackages)
303
+                self.logger.info("security_hardening: " + specObj.securityHardening)
304
+                self.logger.info("------------------------------------------------")
314 305
 
315 306
 
316 307
 class SPECS(object):
... ...
@@ -411,6 +404,17 @@ class SpecDependencyGenerator(object):
411 411
                     whoNeedsBuild.append(depSpecPkg)
412 412
                     depQue.put(depSpecPkg)
413 413
 
414
+    def findTotalWhoNeeds(self, depQue, whoNeeds):
415
+        while not depQue.empty():
416
+            specPkg = depQue.get()
417
+            listPackagesRequired = SPECS.getData().getBuildRequiresForPkg(specPkg)
418
+            listPackagesRequired.extend(SPECS.getData().getRequiresAllForPkg(specPkg))
419
+            for depPkg in listPackagesRequired:
420
+                depSpecPkg = SPECS.getData().getBasePkg(depPkg)
421
+                if depSpecPkg not in whoNeeds:
422
+                    whoNeeds.append(depSpecPkg)
423
+                    depQue.put(depSpecPkg)
424
+
414 425
     def printTree(self, children, curParent, depth):
415 426
         if curParent in children:
416 427
             for child in children[curParent]:
... ...
@@ -500,11 +504,25 @@ class SpecDependencyGenerator(object):
500 500
                 return self.displayDependencies(displayOption, inputType, outputFile, mapDependencies, parent)
501 501
             else:
502 502
                 return self.displayDependencies(displayOption, inputType, inputValue, mapDependencies, parent)
503
+        elif inputType == "remove-upward-deps":
504
+            depQue = queue.Queue()
505
+            for specFile in inputValue.split(":"):
506
+                if specFile in SPECS.getData().mapSpecFileNameToSpecObj:
507
+                    specObj = SPECS.getData().mapSpecFileNameToSpecObj[specFile]
508
+                    whoNeedsList.append(specObj.name+"-"+specObj.version)
509
+                    for package in specObj.listPackages:
510
+                        depQue.put(package+"-"+specObj.version)
511
+            self.findTotalWhoNeeds(depQue, whoNeedsList)
512
+            return whoNeedsList
513
+
503 514
         elif inputType == "who-needs":
504
-            for depPkg in SPECS.getData().mapPackageToSpec:
515
+            for depPackage in SPECS.getData().mapPackageToSpec:
505 516
                 pkg=inputValue+"-"+SPECS.getData().getHighestVersion(inputValue)
506
-                if pkg in SPECS.getData().getRequiresForPkg(depPkg):
507
-                    whoNeedsList.append(depPkg)
517
+                for version in SPECS.getData().getVersions(depPackage):
518
+                    depPkg = depPackage+"-"+version
519
+                    print (depPkg)
520
+                    if pkg in SPECS.getData().getRequiresForPkg(depPkg):
521
+                        whoNeedsList.append(depPkg)
508 522
             print (whoNeedsList)
509 523
             return whoNeedsList
510 524
         elif inputType == "who-needs-build":
... ...
@@ -8,10 +8,11 @@ import os
8 8
 from argparse import ArgumentParser
9 9
 import shutil
10 10
 import traceback
11
-from SpecData import SpecDependencyGenerator
11
+from SpecData import SpecDependencyGenerator, SPECS
12 12
 from jsonwrapper import JsonWrapper
13 13
 from constants import constants
14 14
 from CommandUtils import CommandUtils
15
+from StringUtils import StringUtils
15 16
 
16 17
 DEFAULT_INPUT_TYPE = "pkg"
17 18
 DEFAULT_DISPLAY_OPTION = "tree"
... ...
@@ -47,8 +48,17 @@ def main():
47 47
     try:
48 48
         specDeps = SpecDependencyGenerator()
49 49
 
50
+        if options.input_type == "remove-upward-deps":
51
+            whoNeedsList = specDeps.process(options.input_type, options.pkg, options.display_option)
52
+            print ("Removing upward dependencies: " + str(whoNeedsList))
53
+            for pkg in whoNeedsList:
54
+                package, version = StringUtils.splitPackageNameAndVersion(pkg)
55
+                release = SPECS.getData().getRelease(package, version)
56
+                buildarch=SPECS.getData().getBuildArch(package, version)
57
+                rpmFile = "stage/RPMS/" + buildarch + "/" +package + "-" + version + "-" + release + ".*" + buildarch+".rpm"
58
+                cmdUtils.runCommandInShell2("rm -f "+rpmFile)
50 59
         # To display/print package dependencies on console
51
-        if (options.input_type == "pkg" or
60
+        elif (options.input_type == "pkg" or
52 61
                 options.input_type == "who-needs" or
53 62
                 options.input_type == "who-needs-build"):
54 63
             specDeps.process(options.input_type, options.pkg, options.display_option)
... ...
@@ -76,7 +86,6 @@ def main():
76 76
         sys.stderr.write("Failed to generate dependency lists from spec files\n")
77 77
         sys.exit(1)
78 78
 
79
-    sys.stderr.write("Successfully generated dependency lists from spec files\n")
80 79
     sys.exit(0)
81 80
 
82 81