Alejandro Alvarez Ayllon 3ad7fa1
Index: test/functional/test_copy.py
Alejandro Alvarez Ayllon 3ad7fa1
===================================================================
Alejandro Alvarez Ayllon 3ad7fa1
--- test/functional/test_copy.py	(revision 7052)
Alejandro Alvarez Ayllon 3ad7fa1
+++ test/functional/test_copy.py	(revision 7054)
Alejandro Alvarez Ayllon 3ad7fa1
@@ -1,6 +1,5 @@
Alejandro Alvarez Ayllon 3ad7fa1
 import unittest
Alejandro Alvarez Ayllon 3ad7fa1
 import utils
Alejandro Alvarez Ayllon 3ad7fa1
-import shutil
Alejandro Alvarez Ayllon 3ad7fa1
 import os
Alejandro Alvarez Ayllon 3ad7fa1
 from base import TestBase
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
@@ -113,5 +112,24 @@
Alejandro Alvarez Ayllon 3ad7fa1
         os.unlink(dst_path)
Alejandro Alvarez Ayllon 3ad7fa1
         os.rmdir('/tmp/make/')
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
+    def test_copy_pseudotty(self):
Alejandro Alvarez Ayllon 3ad7fa1
+        """
Alejandro Alvarez Ayllon 3ad7fa1
+        Regression test for DMC-522
Alejandro Alvarez Ayllon 3ad7fa1
+        Trick gfal-copy into thinking it is inside a tty so we trigger some logic that would not
Alejandro Alvarez Ayllon 3ad7fa1
+        be executed otherwise
Alejandro Alvarez Ayllon 3ad7fa1
+        """
Alejandro Alvarez Ayllon 3ad7fa1
+        ffname3 = self.ffname1 + "_copy"
Alejandro Alvarez Ayllon 3ad7fa1
+        self.assertFalse(os.path.isfile(ffname3))
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+        (ret, out, err) = utils.run_command_pty('gfal-copy', \
Alejandro Alvarez Ayllon 3ad7fa1
+                            'file://' + self.ffname1 + ' file://' + ffname3)
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+        self.assertTrue(os.path.isfile(ffname3))
Alejandro Alvarez Ayllon 3ad7fa1
+        self.assertNotEqual(len(out), 0) # this makes sure the interactive mode works!
Alejandro Alvarez Ayllon 3ad7fa1
+        self.assertEqual(ret, 0)
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+        if os.path.isfile(ffname3):
Alejandro Alvarez Ayllon 3ad7fa1
+            os.remove(ffname3)
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
 if __name__ == '__main__':
Alejandro Alvarez Ayllon 3ad7fa1
     unittest.main()
Alejandro Alvarez Ayllon 3ad7fa1
Index: test/functional/utils.py
Alejandro Alvarez Ayllon 3ad7fa1
===================================================================
Alejandro Alvarez Ayllon 3ad7fa1
--- test/functional/utils.py	(revision 7052)
Alejandro Alvarez Ayllon 3ad7fa1
+++ test/functional/utils.py	(revision 7054)
Alejandro Alvarez Ayllon 3ad7fa1
@@ -1,6 +1,8 @@
Alejandro Alvarez Ayllon 3ad7fa1
 import subprocess
Alejandro Alvarez Ayllon 3ad7fa1
 import datetime
Alejandro Alvarez Ayllon 3ad7fa1
 import os
Alejandro Alvarez Ayllon 3ad7fa1
+import pty
Alejandro Alvarez Ayllon 3ad7fa1
+import select
Alejandro Alvarez Ayllon 3ad7fa1
 import stat
Alejandro Alvarez Ayllon 3ad7fa1
 import inspect
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
@@ -8,22 +10,48 @@
Alejandro Alvarez Ayllon 3ad7fa1
     fout = open(path, 'w')
Alejandro Alvarez Ayllon 3ad7fa1
     fout.write(os.urandom(size))
Alejandro Alvarez Ayllon 3ad7fa1
     fout.close()
Alejandro Alvarez Ayllon 3ad7fa1
-        
Alejandro Alvarez Ayllon 3ad7fa1
-        
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
 def create_random_suffix():
Alejandro Alvarez Ayllon 3ad7fa1
     return datetime.datetime.now().strftime("%y%m%d_%H%M%S")
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
 def remove_file(path):
Alejandro Alvarez Ayllon 3ad7fa1
     os.remove(path)
Alejandro Alvarez Ayllon 3ad7fa1
-    
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
 def run_command(cmd, args):
Alejandro Alvarez Ayllon 3ad7fa1
     script_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
Alejandro Alvarez Ayllon 3ad7fa1
     cmd = script_path + '/../../src/' + cmd
Alejandro Alvarez Ayllon 3ad7fa1
     p = subprocess.Popen([cmd] +  args.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Alejandro Alvarez Ayllon 3ad7fa1
-    out,err = p.communicate()
Alejandro Alvarez Ayllon 3ad7fa1
-    
Alejandro Alvarez Ayllon 3ad7fa1
+    out, err = p.communicate()
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
     return (p.returncode, out, err)
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
+def run_command_pty(cmd, args):
Alejandro Alvarez Ayllon 3ad7fa1
+    script_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
Alejandro Alvarez Ayllon 3ad7fa1
+    cmd = script_path + '/../../src/' + cmd
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+    master, slave = pty.openpty()
Alejandro Alvarez Ayllon 3ad7fa1
+    p = subprocess.Popen([cmd] +  args.split(), stdout=slave, stderr=slave, close_fds=True)
Alejandro Alvarez Ayllon 3ad7fa1
+    os.close(slave)
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+    output = ''
Alejandro Alvarez Ayllon 3ad7fa1
+    while True:
Alejandro Alvarez Ayllon 3ad7fa1
+        ready, _, _ = select.select([master], [], [], 1)
Alejandro Alvarez Ayllon 3ad7fa1
+        if ready:
Alejandro Alvarez Ayllon 3ad7fa1
+            try:
Alejandro Alvarez Ayllon 3ad7fa1
+                data = os.read(ready[0], 512)
Alejandro Alvarez Ayllon 3ad7fa1
+            except:
Alejandro Alvarez Ayllon 3ad7fa1
+                data = None
Alejandro Alvarez Ayllon 3ad7fa1
+            if data:
Alejandro Alvarez Ayllon 3ad7fa1
+                output += data
Alejandro Alvarez Ayllon 3ad7fa1
+            else:
Alejandro Alvarez Ayllon 3ad7fa1
+                break
Alejandro Alvarez Ayllon 3ad7fa1
+    os.close(master)
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+    rstatus = p.wait()
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
+    return (rstatus, output, None)
Alejandro Alvarez Ayllon 3ad7fa1
+
Alejandro Alvarez Ayllon 3ad7fa1
 def num_entries(directory):
Alejandro Alvarez Ayllon 3ad7fa1
     return len([name for name in os.listdir(directory)])
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
Index: src/gfal2_util/progress.py
Alejandro Alvarez Ayllon 3ad7fa1
===================================================================
Alejandro Alvarez Ayllon 3ad7fa1
--- src/gfal2_util/progress.py	(revision 7052)
Alejandro Alvarez Ayllon 3ad7fa1
+++ src/gfal2_util/progress.py	(revision 7054)
Alejandro Alvarez Ayllon 3ad7fa1
@@ -3,7 +3,7 @@
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
 @author: Duarte Meneses <duarte.meneses@cern.ch>
Alejandro Alvarez Ayllon 3ad7fa1
 """
Alejandro Alvarez Ayllon 3ad7fa1
-import os
Alejandro Alvarez Ayllon 3ad7fa1
+import subprocess
Alejandro Alvarez Ayllon 3ad7fa1
 import sys
Alejandro Alvarez Ayllon 3ad7fa1
 import datetime
Alejandro Alvarez Ayllon 3ad7fa1
 import math
Alejandro Alvarez Ayllon 3ad7fa1
@@ -47,8 +47,10 @@
Alejandro Alvarez Ayllon 3ad7fa1
             if self.stopped or not self.started:
Alejandro Alvarez Ayllon 3ad7fa1
                 break
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
-            self._update()
Alejandro Alvarez Ayllon 3ad7fa1
-            self.lock.release()
Alejandro Alvarez Ayllon 3ad7fa1
+            try:
Alejandro Alvarez Ayllon 3ad7fa1
+                self._update()
Alejandro Alvarez Ayllon 3ad7fa1
+            finally:
Alejandro Alvarez Ayllon 3ad7fa1
+                self.lock.release()
Alejandro Alvarez Ayllon 3ad7fa1
             time.sleep(0.5)
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
         self.lock.release()
Alejandro Alvarez Ayllon 3ad7fa1
@@ -163,7 +165,7 @@
Alejandro Alvarez Ayllon 3ad7fa1
         if not self.started:
Alejandro Alvarez Ayllon 3ad7fa1
             return
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
-        if self.t_main.is_alive():
Alejandro Alvarez Ayllon 3ad7fa1
+        if self.t_main.isAlive():
Alejandro Alvarez Ayllon 3ad7fa1
             self.lock.acquire()
Alejandro Alvarez Ayllon 3ad7fa1
             if self.stopped:
Alejandro Alvarez Ayllon 3ad7fa1
                 self.lock.release()
Alejandro Alvarez Ayllon 3ad7fa1
@@ -194,7 +196,11 @@
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
     @staticmethod
Alejandro Alvarez Ayllon 3ad7fa1
     def _get_width():
Alejandro Alvarez Ayllon 3ad7fa1
-        return int(os.popen('stty size', 'r').read().split()[1])
Alejandro Alvarez Ayllon 3ad7fa1
+        p = subprocess.Popen(['stty', 'size'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Alejandro Alvarez Ayllon 3ad7fa1
+        out, err = p.communicate()
Alejandro Alvarez Ayllon 3ad7fa1
+        if p.returncode != 0:
Alejandro Alvarez Ayllon 3ad7fa1
+            return 80  # Asume default
Alejandro Alvarez Ayllon 3ad7fa1
+        return int(out.split()[1])
Alejandro Alvarez Ayllon 3ad7fa1
 
Alejandro Alvarez Ayllon 3ad7fa1
     @staticmethod
Alejandro Alvarez Ayllon 3ad7fa1
     def _clean():