[Thincrust-devel] [PATCH appliance-tools] image-minimizer: support drop-keep-drop

apevec at gmail.com apevec at gmail.com
Tue Jul 27 21:30:58 UTC 2010


From: Alan Pevec <apevec at redhat.com>

Resolve removal set on the fly, so that drop-keep-drop can work.
The order of drop*/keep* commands is important, last one wins!

Example: given the file tree:
d1/
├── d2/
│   ├── d3/
│   │   └── f
│   └── f
└── f

and image-minimizer input:
drop d1
keep d1/d2
drop d1/d2/d3

it should keep only d1/d2:
d1/
└── d2/
    └── f

Signed-off-by: Alan Pevec <apevec at redhat.com>
---
 tools/image-minimizer |   28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/tools/image-minimizer b/tools/image-minimizer
index 321cfd8..ada529d 100755
--- a/tools/image-minimizer
+++ b/tools/image-minimizer
@@ -28,10 +28,8 @@ class ImageMinimizer:
     dryrun = False
     verbose = False
     prefix = None
-    keeps = set()
     drops = set()
     visited = set()
-    keeps_rpm = set()
     drops_rpm = set()
     ts = None
 
@@ -89,18 +87,24 @@ class ImageMinimizer:
         # Strip out all the comments and blank lines
         if not (command.startswith('#') or command==''):
             if command == 'keep':
-                self.add_pattern(self.keeps, pattern)
+                keeps = set()
+                self.add_pattern(keeps, pattern)
+                self.drops.difference_update(keeps)
+                keeps = None
             elif command == 'drop':
                 self.add_pattern(self.drops, pattern)
             elif command == 'keeprpm':
-                self.add_pattern_rpm(self.keeps_rpm, pattern_orig)
+                keeps_rpm = set()
+                self.add_pattern_rpm(keeps_rpm, pattern_orig)
+                self.drops_rpm.difference_update(keeps_rpm)
+                keeps_rpm = None
             elif command == 'droprpm':
                 self.add_pattern_rpm(self.drops_rpm, pattern_orig)
             else:
                 raise Exception ('Unknown Command: ' + command)
 
-    def remove(self, files):
-        for tag in sorted(files, reverse=True):
+    def remove(self):
+        for tag in sorted(self.drops, reverse=True):
             self.visited.add(os.path.split(tag)[0])
             if os.path.isdir(tag):
                 self.visited.add(tag)
@@ -122,16 +126,16 @@ class ImageMinimizer:
                         print 'rm -rf ' + dir
                     os.rmdir(dir)
 
-    def remove_rpm(self, rpms):
+    def remove_rpm(self):
 
         def runCallback(reason, amount, total, key, client_data):
             if self.verbose and reason == rpm.RPMCALLBACK_UNINST_STOP:
                 print key, "erased"
 
-        if len(rpms) == 0:
+        if len(self.drops_rpm) == 0:
             return
 
-        for pkg in rpms:
+        for pkg in self.drops_rpm:
             if self.dryrun:
                 print "erasing ", pkg
             else:
@@ -143,10 +147,8 @@ class ImageMinimizer:
     def filter(self):
         for line in (open(self.filename).readlines()):
             self.parse_line(line.strip())
-        final = self.drops.difference(self.keeps)
-        self.remove(final)
-        final_rpm = self.drops_rpm.difference(self.keeps_rpm)
-        self.remove_rpm(final_rpm)
+        self.remove()
+        self.remove_rpm()
 
 
 def parse_options():
-- 
1.7.2




More information about the Thincrust-devel mailing list