From 57d561307e2dfa9dad4dd6cb191e75bed52e9683 Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Wed, 9 Jun 2010 18:12:35 +0100
Subject: [PATCH] ListVisibleFiles: do optional sorting

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 lib/utils.py                  |  7 +++++--
 test/ganeti.utils_unittest.py | 33 ++++++++++++++++++++-------------
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/lib/utils.py b/lib/utils.py
index 1ef35cb33..a5ec895ad 100644
--- a/lib/utils.py
+++ b/lib/utils.py
@@ -1715,11 +1715,13 @@ def OwnIpAddress(address):
                  source=constants.LOCALHOST_IP_ADDRESS)
 
 
-def ListVisibleFiles(path):
+def ListVisibleFiles(path, sort=True):
   """Returns a list of visible files in a directory.
 
   @type path: str
   @param path: the directory to enumerate
+  @type sort: boolean
+  @param sort: whether to provide a sorted output
   @rtype: list
   @return: the list of all files not starting with a dot
   @raise ProgrammerError: if L{path} is not an absolue and normalized path
@@ -1729,7 +1731,8 @@ def ListVisibleFiles(path):
     raise errors.ProgrammerError("Path passed to ListVisibleFiles is not"
                                  " absolute/normalized: '%s'" % path)
   files = [i for i in os.listdir(path) if not i.startswith(".")]
-  files.sort()
+  if sort:
+    files.sort()
   return files
 
 
diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py
index 68ef82672..691b5d03f 100755
--- a/test/ganeti.utils_unittest.py
+++ b/test/ganeti.utils_unittest.py
@@ -1334,22 +1334,15 @@ class TestListVisibleFiles(unittest.TestCase):
   def tearDown(self):
     shutil.rmtree(self.path)
 
-  def _test(self, files, expected):
-    # Sort a copy
-    expected = expected[:]
-    expected.sort()
-
+  def _CreateFiles(self, files):
     for name in files:
-      f = open(os.path.join(self.path, name), 'w')
-      try:
-        f.write("Test\n")
-      finally:
-        f.close()
+      utils.WriteFile(os.path.join(self.path, name), data="test")
 
+  def _test(self, files, expected):
+    self._CreateFiles(files)
     found = ListVisibleFiles(self.path)
-    found.sort()
-
-    self.assertEqual(found, expected)
+    # by default ListVisibleFiles sorts its output
+    self.assertEqual(found, sorted(expected))
 
   def testAllVisible(self):
     files = ["a", "b", "c"]
@@ -1366,6 +1359,20 @@ class TestListVisibleFiles(unittest.TestCase):
     expected = ["a", "b"]
     self._test(files, expected)
 
+  def testForceSort(self):
+    files = ["c", "b", "a"]
+    self._CreateFiles(files)
+    found = ListVisibleFiles(self.path, sort=True)
+    self.assertEqual(found, sorted(files))
+
+  def testForceNonSort(self):
+    files = ["c", "b", "a"]
+    self._CreateFiles(files)
+    found = ListVisibleFiles(self.path, sort=False)
+    # We can't actually check that they weren't sorted, because they might come
+    # out sorted by chance
+    self.assertEqual(set(found), set(files))
+
   def testNonAbsolutePath(self):
     self.failUnlessRaises(errors.ProgrammerError, ListVisibleFiles, "abc")
 
-- 
GitLab