From ee17c3cf251aeeadbb3e3883523e68c927963818 Mon Sep 17 00:00:00 2001
From: Xavier Claessens <xavier.claessens@collabora.com>
Date: Fri, 4 Sep 2015 12:13:58 -0400
Subject: [PATCH] tracker: improve media file copy method

Summary:
This fix failing tests when destination directory
does not already exists

Reviewers: smcv, pwith

Differential Revision: https://phabricator.apertis.org/D384
---
 tracker/automated/test-tracker.py       | 17 ++--------------
 tracker/common.py                       | 27 +++++++++++++++++++++++++
 tracker/manual/test-removable-device.py | 10 ++-------
 3 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/tracker/automated/test-tracker.py b/tracker/automated/test-tracker.py
index 68d2c18..20c3e7d 100755
--- a/tracker/automated/test-tracker.py
+++ b/tracker/automated/test-tracker.py
@@ -9,7 +9,6 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import unittest
-import subprocess
 import os
 import md5
 import sys
@@ -21,7 +20,6 @@ from gi.repository import Grl
 # import from parent directory
 sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir))
 from common import TrackerIndexer
-from common import MEDIADIR
 
 # define this here to make lint happy with too long lines
 long_jpeg_name = '320px-European_Common_Frog_Rana_temporaria.jpg'
@@ -29,26 +27,15 @@ long_jpeg_name = '320px-European_Common_Frog_Rana_temporaria.jpg'
 
 class TrackerTest(unittest.TestCase):
     def setUp(self):
-        self.indexer = TrackerIndexer()
         self.loop = GLib.MainLoop.new(None, False)
         self.homedir = os.path.expanduser("~")
-
-        # Copy media files appropriate directories
-        self.copytree('audio', 'Music')
-        self.copytree('documents', 'Documents')
-        self.copytree('images', 'Pictures')
-        self.copytree('playlists', 'Music')
-        self.copytree('videos', 'Videos')
+        self.indexer = TrackerIndexer()
+        self.indexer.copy_medias(self.homedir)
 
     def tearDown(self):
         # Keep everything in place for further manual checks
         pass
 
-    def copytree(self, src, dst):
-        abs_src = os.path.join(MEDIADIR, src, '*')
-        abs_dst = os.path.join(self.homedir, dst)
-        subprocess.check_call('cp -r ' + abs_src + ' ' + abs_dst, shell=True)
-
     def tracker_config_tests(self):
         settings = Gio.Settings.new("org.freedesktop.Tracker.Miner.Files")
         self.assertEqual(settings.get_boolean('index-removable-devices'), True)
diff --git a/tracker/common.py b/tracker/common.py
index 723b304..4071a12 100644
--- a/tracker/common.py
+++ b/tracker/common.py
@@ -8,6 +8,7 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import subprocess
+import shutil
 import os
 
 from gi.repository import GLib
@@ -29,6 +30,32 @@ class TrackerIndexer():
 
         self.loop = GLib.MainLoop.new(None, False)
 
+    def copy_medias(self, dst):
+        """
+        Copy media resources from apertis-tests to @dst with per media type
+        subdirectory corresponding to the default subdirectories in $HOME.
+        """
+        self.copytree(MEDIADIR + '/audio', dst + '/Music')
+        self.copytree(MEDIADIR + '/documents', dst + '/Documents')
+        self.copytree(MEDIADIR + '/images', dst + '/Pictures')
+        self.copytree(MEDIADIR + '/playlists', dst + '/Music')
+        self.copytree(MEDIADIR + '/videos', dst + '/Videos')
+
+    def copytree(self, root_src_dir, root_dst_dir):
+        # This is our own version of shutil.copytree. The difference is that
+        # if the destination directory already exists it adds files into it. If
+        # files already exists they are overwritten.
+        for src_dir, dirs, files in os.walk(root_src_dir):
+            dst_dir = src_dir.replace(root_src_dir, root_dst_dir)
+            if not os.path.exists(dst_dir):
+                os.mkdir(dst_dir)
+            for file_ in files:
+                src_file = os.path.join(src_dir, file_)
+                dst_file = os.path.join(dst_dir, file_)
+                if os.path.exists(dst_file):
+                    os.remove(dst_file)
+                shutil.copy2(src_file, dst_dir)
+
     def miner_progress_cb(self, manager, miner, status, progress,
                           remaining_time):
         # Ignore signal if status didn't change
diff --git a/tracker/manual/test-removable-device.py b/tracker/manual/test-removable-device.py
index 08ae101..ce888d8 100755
--- a/tracker/manual/test-removable-device.py
+++ b/tracker/manual/test-removable-device.py
@@ -9,7 +9,6 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import unittest
-import subprocess
 import sys
 import os
 
@@ -19,7 +18,6 @@ from gi.repository import Gio
 # import from parent directory
 sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir))
 from common import TrackerIndexer
-from common import MEDIADIR
 
 
 class TestRemovableDevice(unittest.TestCase):
@@ -44,13 +42,9 @@ class TestRemovableDevice(unittest.TestCase):
         print('Please insert storage ...')
         self.loop.run()
 
-        # Copy some files to the removable device
-        print('Copying files to ' + self.path + '...')
-        abs_src = os.path.join(MEDIADIR, 'audio', '*')
-        subprocess.check_call('cp -r ' + abs_src + ' ' + self.path, shell=True)
-
-        # Start indexer
+        # Copy our medias and start indexing
         self.indexer = TrackerIndexer()
+        self.indexer.copy_medias(self.path)
         self.indexer.start()
 
         self.assert_indexed('generic.flac', '?urn bosch:playable true')
-- 
GitLab