diff extensions/kwarchive.py @ 32:cfa53f8a6607

Refactor the class' monkey-patching
author Franz Glasner <hg@dom66.de>
date Sat, 11 Nov 2017 17:17:00 +0100
parents 0597395e2d18
children dc8db9693262
line wrap: on
line diff
--- a/extensions/kwarchive.py	Sat Nov 11 16:30:27 2017 +0100
+++ b/extensions/kwarchive.py	Sat Nov 11 17:17:00 2017 +0100
@@ -100,29 +100,27 @@
     # Monkey patch archival's archivers classes so that an archiver's "addfile()"
     # expands keywords
     #
-
-    orig_fileit_addfile = archival.fileit.addfile
-    def new_fileit_addfile(self, name, mode, isline, data):
-        print "FILE-ARCHIVER: --------------->", name, mode, isline
-        return orig_fileit_addfile(self, name, mode, isline, data)
-    archival.fileit.addfile = new_fileit_addfile
-
-    orig_tarit_addfile = archival.tarit.addfile
-    def new_tarit_addfile(self, name, mode, isline, data):
-        print "TAR-ARCHIVER: ----------->", name, mode, isline
-        return orig_tarit_addfile(self, name, mode, isline, data)
-    archival.tarit.addfile = new_tarit_addfile
-
-    orig_zipit_addfile = archival.zipit.addfile
-    def new_zipit_addfile(self, name, mode, isline, data):
-        print "ZIP-ARCHIVER: ----------->", name, mode, isline
-        return orig_zipit_addfile(self, name, mode, isline, data)
-    archival.zipit.addfile = new_zipit_addfile
+    for ac in ("fileit", "tarit", "zipit",):
+        patch_archiver_class(ac)
 
     archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
                      matchfn, prefix, subrepos=opts.get('subrepos'))
 
-    # XXX FIXME: Should we restore the original methods here?
+    # XXX FIXME: Should the original methods be restored here?
+
+
+def patch_archiver_class(archivername):
+    """Patch an archiver class and return the original unbound method"""
+
+    archiver_class = getattr(archival, archivername)
+    orig_addfile = getattr(archiver_class, "addfile")
+
+    def new_addfile(self, name, mode, isline, data):
+        print "==> ARCHIVER(%s)" % archivername, name, mode, isline
+        return orig_addfile(self, name, mode, isline, data)
+
+    setattr(archiver_class, "addfile", new_addfile)
+    return orig_addfile
 
 
 def filter2(s, params, ui, **kwargs):