From 6d4d6dd91ae82d9a327b8283342e5105c075076a Mon Sep 17 00:00:00 2001 From: John Chilton Date: Tue, 10 Jun 2014 09:36:28 -0500 Subject: [PATCH] Bugfix: Fix shutil.move for converted files in upload.py. --- lib/galaxy/datatypes/sniff.py | 8 ++++---- tools/data_source/upload.py | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index 7d64e386c1f..e35931c04b3 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -90,7 +90,7 @@ def check_newlines( fname, bytes_to_read=52428800 ): f.close() return False -def convert_newlines( fname, in_place=True ): +def convert_newlines( fname, in_place=True, tmp_dir=None, tmp_prefix=None ): """ Converts in place a file from universal line endings to Posix line endings. @@ -102,7 +102,7 @@ def convert_newlines( fname, in_place=True ): >>> file(fname).read() '1 2\\n3 4\\n' """ - fd, temp_name = tempfile.mkstemp() + fd, temp_name = tempfile.mkstemp( prefix=tmp_prefix, dir=tmp_dir ) fp = os.fdopen( fd, "wt" ) i = None for i, line in enumerate( file( fname, "U" ) ): @@ -150,7 +150,7 @@ def sep2tabs( fname, in_place=True, patt="\\s+" ): else: return ( i, temp_name ) -def convert_newlines_sep2tabs( fname, in_place=True, patt="\\s+" ): +def convert_newlines_sep2tabs( fname, in_place=True, patt="\\s+", tmp_dir=None, tmp_prefix=None ): """ Combines above methods: convert_newlines() and sep2tabs() so that files do not need to be read twice @@ -163,7 +163,7 @@ def convert_newlines_sep2tabs( fname, in_place=True, patt="\\s+" ): '1\\t2\\n3\\t4\\n' """ regexp = re.compile( patt ) - fd, temp_name = tempfile.mkstemp() + fd, temp_name = tempfile.mkstemp( prefix=tmp_prefix, dir=tmp_dir ) fp = os.fdopen( fd, "wt" ) for i, line in enumerate( file( fname, "U" ) ): line = line.rstrip( '\r\n' ) diff --git a/tools/data_source/upload.py b/tools/data_source/upload.py index 4d5a0a1ff90..f3911191288 100644 --- a/tools/data_source/upload.py +++ b/tools/data_source/upload.py @@ -272,10 +272,12 @@ def add_file( dataset, registry, json_file, output_path ): # so that is becomes possible to upload gzip, bz2 or zip files with binary data without # corrupting the content of those files. if dataset.to_posix_lines: + tmpdir = output_adjacent_tmpdir( output_path ) + tmp_prefix = 'data_id_%s_convert_' % dataset.dataset_id if dataset.space_to_tab: - line_count, converted_path = sniff.convert_newlines_sep2tabs( dataset.path, in_place=in_place ) + line_count, converted_path = sniff.convert_newlines_sep2tabs( dataset.path, in_place=in_place, tmp_dir=tmpdir, tmp_prefix=tmp_prefix ) else: - line_count, converted_path = sniff.convert_newlines( dataset.path, in_place=in_place ) + line_count, converted_path = sniff.convert_newlines( dataset.path, in_place=in_place, tmp_dir=tmpdir, tmp_prefix=tmp_prefix ) if dataset.file_type == 'auto': ext = sniff.guess_ext( dataset.path, registry.sniff_order ) else: @@ -343,10 +345,12 @@ def add_composite_file( dataset, registry, json_file, output_path, files_path ): dataset.path = temp_name dp = temp_name if not value.is_binary: + tmpdir = output_adjacent_tmpdir( output_path ) + tmp_prefix = 'data_id_%s_convert_' % dataset.dataset_id if dataset.composite_file_paths[ value.name ].get( 'space_to_tab', value.space_to_tab ): - sniff.convert_newlines_sep2tabs( dp ) + sniff.convert_newlines_sep2tabs( dp, tmp_dir=tmpdir, tmp_prefix=tmp_prefix ) else: - sniff.convert_newlines( dp ) + sniff.convert_newlines( dp, tmp_dir=tmpdir, tmp_prefix=tmp_prefix ) shutil.move( dp, os.path.join( files_path, name ) ) # Move the dataset to its "real" path shutil.move( dataset.primary_file, output_path ) @@ -356,6 +360,15 @@ def add_composite_file( dataset, registry, json_file, output_path, files_path ): stdout = 'uploaded %s file' % dataset.file_type ) json_file.write( to_json_string( info ) + "\n" ) + +def output_adjacent_tmpdir( output_path ): + """ For temp files that will ultimately be moved to output_path anyway + just create the file directly in output_path's directory so shutil.move + will work optimially. + """ + return os.path.dirname( output_path ) + + def __main__(): if len( sys.argv ) < 4: