Merge pull request #2791 from ThomasWaldmann/dash_open

WIP dash_open
This commit is contained in:
enkore 2017-07-05 10:02:34 +02:00 committed by GitHub
commit 6ffa797bde
4 changed files with 19 additions and 25 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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)

View File

@ -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