[PATCH 7/9] Add the fs status/diff commands.
James Antill
james at and.org
Wed Feb 12 23:27:13 UTC 2014
---
docs/yum.8 | 11 ++++-
yumcommands.py | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 117 insertions(+), 6 deletions(-)
diff --git a/docs/yum.8 b/docs/yum.8
index 31c1c88..6794581 100644
--- a/docs/yum.8
+++ b/docs/yum.8
@@ -742,12 +742,19 @@ mainly for removing languages/documentation for minimal installs:
.br
.I \fR yum fs du [path]
+.br
+.I \fR yum fs status [path]
+
+.br
+.I \fR yum fs diff [path]
+
+
the first 3 being a simple interface to change yum.conf altering the tsflags
and override_install_langs configurations. The refilter command is an optimized
way of calling "yum reinstall" to reinstall the packages with the new filters
applied. The refilter-cleanup command is needed because rpm doesn't actually
-remove the files on reinstall, as it should. And the du command is included so
-you can easily see the space used/saved.
+remove the files on reinstall, as it should. And the du/status/diff commands are
+included so you can easily see the space used/saved and any other changes.
.IP
.IP "\fBcheck\fP"
diff --git a/yumcommands.py b/yumcommands.py
index c5abfba..b4e172c 100644
--- a/yumcommands.py
+++ b/yumcommands.py
@@ -21,6 +21,7 @@ Classes for subcommands of the yum command line interface.
"""
import os
+import sys
import cli
from yum import logginglevels
from yum import _, P_
@@ -4692,9 +4693,112 @@ class FSCommand(YumCommand):
misc.unlink_f(fname)
def _fs_diff(self, base, extcmds):
- pass
+ def deal_with_file(fpath):
+ if fpath in pfr['norm']:
+ pass
+ elif fpath in pfr['ghost']:
+ pass
+ elif fpath in pfr['not']:
+ print >>sys.stderr, _('Not installed:'), fpath
+ elif fpath in pfr['miss']:
+ pass
+ elif fpath in pfr['mod']:
+ pkg = apkgs[pfr['mod'][fpath].pkgtup]
+ # Hacky ... but works.
+ sys.stdout.flush()
+ extract_cmd = "cd %s; rpm2cpio %s | cpio --quiet -id .%s"
+ extract_cmd = extract_cmd % (tmpdir, pkg.localPkg(), fpath)
+ os.system(extract_cmd)
+ diff_cmd = "diff -ru %s %s" % (tmpdir + fpath, fpath)
+ print diff_cmd
+ sys.stdout.flush()
+ os.system(diff_cmd)
+ else:
+ print >>sys.stderr, _('Not packaged?:'), fpath
+
+ prefix = "."
+ if extcmds:
+ prefix = extcmds[0]
+ extcmds = extcmds[1:]
+
+ pkgs = base.rpmdb.returnPackages(patterns=extcmds)
+
+ verbose = base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)
+
+ pfr = self._fs_pkg_walk(pkgs, prefix, verbose=verbose, modified=True)
+
+ base.closeRpmDB() # C-c ftw.
+
+ apkgs = {}
+ downloadpkgs = []
+ for ipkg in set(pfr['mod'].values()):
+ for apkg in base.pkgSack.searchPkgTuple(ipkg.pkgtup):
+ iyi = ipkg.yumdb_info
+ if ('checksum_type' in iyi and
+ 'checksum_data' in iyi and
+ iyi.checksum_type == apkg.checksum_type and
+ iyi.checksum_data == apkg.pkgId):
+ apkgs[ipkg.pkgtup] = apkg
+ downloadpkgs.append(apkg)
+ break
+ if ipkg.pkgtup not in apkgs:
+ raise yum.Errors.YumBaseError, _("Can't find package: %s") %ipkg
+
+ if downloadpkgs:
+ tmpdir = tempfile.mkdtemp()
+ problems = base.downloadPkgs(downloadpkgs, callback_total=base.download_callback_total_cb)
+ if len(problems) > 0:
+ errstring = ''
+ errstring += _('Error downloading packages:\n')
+ for key in problems:
+ errors = yum.misc.unique(problems[key])
+ for error in errors:
+ errstring += ' %s: %s\n' % (key, error)
+ raise yum.Errors.YumBaseError, errstring
+
+ for root, dirs, files in os.walk(prefix):
+ for fname in files:
+ fpath = os.path.normpath(root + '/' + fname)
+ if os.path.islink(fpath):
+ continue
+
+ deal_with_file(fpath)
+
def _fs_status(self, base, extcmds):
- pass
+ def deal_with_file(fpath):
+ if fpath in pfr['norm']:
+ pass
+ elif fpath in pfr['ghost']:
+ pass
+ elif fpath in pfr['not']:
+ print _('Not installed:'), fpath
+ elif fpath in pfr['miss']:
+ pass
+ elif fpath in pfr['mod']:
+ print _('Modified:'), fpath
+ else:
+ print _('Not packaged?:'), fpath
+
+ prefix = "."
+ if extcmds:
+ prefix = extcmds[0]
+ extcmds = extcmds[1:]
+
+ pkgs = base.rpmdb.returnPackages(patterns=extcmds)
+
+ verbose = base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)
+
+ pfr = self._fs_pkg_walk(pkgs, prefix, verbose=verbose, modified=True)
+
+ base.closeRpmDB() # C-c ftw.
+
+ for root, dirs, files in os.walk(prefix):
+ for fname in files:
+ fpath = os.path.normpath(root + '/' + fname)
+ if os.path.islink(fpath):
+ continue
+
+ deal_with_file(fpath)
def doCommand(self, base, basecmd, extcmds):
"""Execute this command.
@@ -4732,10 +4836,10 @@ class FSCommand(YumCommand):
elif subcommand == 'refilter-cleanup':
ret = self._fs_refilter_cleanup(base, extcmds)
- elif False and subcommand == 'diff':
+ elif subcommand == 'diff':
ret = self._fs_diff(base, extcmds)
- elif False and subcommand == 'status':
+ elif subcommand == 'status':
ret = self._fs_status(base, extcmds)
else:
--
1.7.7.6
More information about the Yum-devel
mailing list