Browse Source

Merge pull request #2791 from ThomasWaldmann/dash_open

WIP dash_open
enkore 8 years ago
parent
commit
6ffa797bde
4 changed files with 19 additions and 25 deletions
  1. 7 14
      src/borg/archiver.py
  2. 2 2
      src/borg/crypto/keymanager.py
  3. 4 5
      src/borg/helpers.py
  4. 6 4
      src/borg/testsuite/helpers.py

+ 7 - 14
src/borg/archiver.py

@@ -65,6 +65,7 @@ from .helpers import basic_json_data, json_print
 from .helpers import replace_placeholders
 from .helpers import ChunkIteratorFileWrapper
 from .helpers import popen_with_error_handling
+from .helpers import dash_open
 from .nanorst import rst_to_terminal
 from .patterns import ArgparsePatternAction, ArgparseExcludeFileAction, ArgparsePatternFileAction, parse_exclude_pattern
 from .patterns import PatternMatcher
@@ -778,10 +779,8 @@ class Archiver:
         else:
             filter = args.tar_filter
 
-        if args.tarfile == '-':
-            tarstream, tarstream_close = sys.stdout.buffer, False
-        else:
-            tarstream, tarstream_close = open(args.tarfile, 'wb'), True
+        tarstream = dash_open(args.tarfile, 'wb')
+        tarstream_close = args.tarfile != '-'
 
         if filter:
             # When we put a filter between us and the final destination,
@@ -1743,11 +1742,8 @@ class Archiver:
             fd.write('\n')
             fd.write('    ]\n}\n')
 
-        if args.path == '-':
-            output(sys.stdout)
-        else:
-            with open(args.path, 'w') as fd:
-                output(fd)
+        with dash_open(args.path, 'w') as fd:
+            output(fd)
         return EXIT_SUCCESS
 
     @with_repository(compatibility=Manifest.NO_OPERATION_CHECK)
@@ -1758,11 +1754,8 @@ class Archiver:
 
         meta = prepare_dump_dict(msgpack.fallback.unpackb(data, object_hook=StableDict, unicode_errors='surrogateescape'))
 
-        if args.path == '-':
-            json.dump(meta, sys.stdout, indent=4)
-        else:
-            with open(args.path, 'w') as fd:
-                json.dump(meta, fd, indent=4)
+        with dash_open(args.path, 'w') as fd:
+            json.dump(meta, fd, indent=4)
         return EXIT_SUCCESS
 
     @with_repository(compatibility=Manifest.NO_OPERATION_CHECK)

+ 2 - 2
src/borg/crypto/keymanager.py

@@ -4,7 +4,7 @@ import textwrap
 from binascii import unhexlify, a2b_base64, b2a_base64
 from hashlib import sha256
 
-from ..helpers import Manifest, NoManifestError, Error, yes, bin_to_hex, open_file_or_stdin
+from ..helpers import Manifest, NoManifestError, Error, yes, bin_to_hex, dash_open
 from ..repository import Repository
 
 from .key import KeyfileKey, KeyfileNotFoundError, KeyBlobStorage, identify_key
@@ -130,7 +130,7 @@ class KeyManager:
     def import_keyfile(self, args):
         file_id = KeyfileKey.FILE_ID
         first_line = file_id + ' ' + bin_to_hex(self.repository.id) + '\n'
-        with open_file_or_stdin(args.path, 'r') as fd:
+        with dash_open(args.path, 'r') as fd:
             file_first_line = fd.read(len(first_line))
             if file_first_line != first_line:
                 if not file_first_line.startswith(file_id):

+ 4 - 5
src/borg/helpers.py

@@ -2186,12 +2186,11 @@ def popen_with_error_handling(cmd_line: str, log_prefix='', **kwargs):
         return
 
 
-def open_file_or_stdin(path, mode):
+def dash_open(path, mode):
+    assert '+' not in mode  # the streams are either r or w, but never both
     if path == '-':
-        if 'b' in mode:
-            return sys.stdin.buffer
-        else:
-            return sys.stdin
+        stream = sys.stdin if 'r' in mode else sys.stdout
+        return stream.buffer if 'b' in mode else stream
     else:
         return open(path, mode)
 

+ 6 - 4
src/borg/testsuite/helpers.py

@@ -28,7 +28,7 @@ from ..helpers import swidth_slice
 from ..helpers import chunkit
 from ..helpers import safe_ns, safe_s, SUPPORT_32BIT_PLATFORMS
 from ..helpers import popen_with_error_handling
-from ..helpers import open_file_or_stdin
+from ..helpers import dash_open
 
 from . import BaseTestCase, FakeInputs
 
@@ -945,6 +945,8 @@ class TestPopenWithErrorHandling:
             popen_with_error_handling('', shell=True)
 
 
-def test_open_file_or_stdin():
-    assert open_file_or_stdin('-', 'r') is sys.stdin
-    assert open_file_or_stdin('-', 'rb') is sys.stdin.buffer
+def test_dash_open():
+    assert dash_open('-', 'r') is sys.stdin
+    assert dash_open('-', 'w') is sys.stdout
+    assert dash_open('-', 'rb') is sys.stdin.buffer
+    assert dash_open('-', 'wb') is sys.stdout.buffer