From 42d89d2a61a8c9e550a3a98cf7aaebce23f1b033 Mon Sep 17 00:00:00 2001 From: Raju Subramanian Date: Fri, 23 Mar 2012 15:49:32 -0700 Subject: [PATCH] ovs-bugtool: Add ability to prioritize files by date. When size limit is reached in the middle of processing a dir, the report ends up containing oldest files. This change adds an optional param in the plugin to prioritize newer files. Feature #9937 Requested-by: Ronald Lee Signed-off-by: Raju Subramanian Signed-off-by: Ben Pfaff --- AUTHORS | 1 + utilities/bugtool/ovs-bugtool.in | 60 ++++++++++++++++++++------------ 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/AUTHORS b/AUTHORS index fa47e5050..92aa47b9a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -39,6 +39,7 @@ Neil McKee neil.mckee@inmon.com Paul Fazzone pfazzone@nicira.com Philippe Jung phil.jung@free.fr Pravin B Shelar pshelar@nicira.com +Raju Subramanian rsubramanian@nicira.com Ravi Kerur Ravi.Kerur@telekom.com Reid Price reid@nicira.com Rob Hoes rob.hoes@citrix.com diff --git a/utilities/bugtool/ovs-bugtool.in b/utilities/bugtool/ovs-bugtool.in index f78289dee..1e0fc7c30 100755 --- a/utilities/bugtool/ovs-bugtool.in +++ b/utilities/bugtool/ovs-bugtool.in @@ -319,30 +319,42 @@ def cmd_output(cap, args, label = None, filter = None): label = args data[label] = {'cap': cap, 'cmd_args': args, 'filter': filter} -def file_output(cap, path_list): +def file_output(cap, path_list, newest_first=False): + """ + If newest_first is True, the list of files in path_list is sorted + by file modification time in descending order, else its sorted + in ascending order. + """ if cap in entries: - for p in path_list: - if os.path.exists(p): - if unlimited_data or caps[cap][MAX_SIZE] == -1 or \ - cap_sizes[cap] < caps[cap][MAX_SIZE]: - data[p] = {'cap': cap, 'filename': p} - try: - s = os.stat(p) - cap_sizes[cap] += s.st_size - except: - pass - else: - output("Omitting %s, size constraint of %s exceeded" % (p, cap)) + path_entries = [] + for path in path_list: + try: + s = os.stat(path) + except OSError, e: + continue + path_entries.append((path, s)) + + mtime = lambda(path, stat): stat.st_mtime + path_entries.sort(key=mtime, reverse=newest_first) + for p in path_entries: + if unlimited_data or caps[cap][MAX_SIZE] == -1 or \ + cap_sizes[cap] < caps[cap][MAX_SIZE]: + data[p] = {'cap': cap, 'filename': p[0]} + cap_sizes[cap] += p[1].st_size + else: + output("Omitting %s, size constraint of %s exceeded" % (p[0], cap)) -def tree_output(cap, path, pattern = None, negate = False): +def tree_output(cap, path, pattern=None, negate=False, newest_first=False): + """ + Walks the directory tree rooted at path. Files in current dir are processed + before files in sub-dirs. + """ if cap in entries: if os.path.exists(path): - for f in os.listdir(path): - fn = os.path.join(path, f) - if os.path.isfile(fn) and matches(fn, pattern, negate): - file_output(cap, [fn]) - elif os.path.isdir(fn): - tree_output(cap, fn, pattern, negate) + for root, dirs, files in os.walk(path): + fns = [fn for fn in [os.path.join(root, f) for f in files] + if os.path.isfile(fn) and matches(fn, pattern, negate)] + file_output(cap, fns, newest_first=newest_first) def func_output(cap, label, func): if cap in entries: @@ -876,12 +888,16 @@ def load_plugins(just_capabilities = False): for el in xmldoc.documentElement.getElementsByTagName("*"): if el.tagName == "files": - file_output(dir, getText(el.childNodes).split()) + newest_first = getBoolAttr(el, 'newest_first') + file_output(dir, getText(el.childNodes).split(), + newest_first=newest_first) elif el.tagName == "directory": pattern = el.getAttribute("pattern") if pattern == '': pattern = None negate = getBoolAttr(el, 'negate') - tree_output(dir, getText(el.childNodes), pattern and re.compile(pattern) or None, negate) + newest_first = getBoolAttr(el, 'newest_first') + tree_output(dir, getText(el.childNodes), pattern and re.compile(pattern) or None, + negate=negate, newest_first=newest_first) elif el.tagName == "command": label = el.getAttribute("label") if label == '': label = None -- 2.43.0