From b69e18f262ba112e9cb261f5193f915f73498a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Such=C3=BD?= Date: Fri, 23 Nov 2012 11:31:46 +0100 Subject: [PATCH 1/2] allow accents in names of files this will encode name to utf8 before sending closes: #16 --- glacier.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/glacier.py b/glacier.py index e13d702..903124d 100755 --- a/glacier.py +++ b/glacier.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- # Copyright (c) 2012 Robie Basak # @@ -476,7 +477,11 @@ def archive_list(self): archive_list = list(self.cache.get_archive_list(self.args.vault)) if archive_list: - print(*archive_list, sep="\n") + if args.convert_utf8: + for i in archive_list: + print(i.encode('utf-8')) + else: + print(*archive_list, sep="\n") def archive_upload(self): # XXX: "Leading whitespace in archive descriptions is removed." @@ -493,6 +498,8 @@ def archive_upload(self): raise RuntimeError('Archive name not specified. Use --name') name = os.path.basename(full_name) + if not isinstance(name, unicode) and arg.convert_utf8: + name = name.decode('utf-8') vault = self.connection.get_vault(self.args.vault) archive_id = vault.create_archive_from_file( file_obj=self.args.file, description=name) @@ -555,7 +562,7 @@ def archive_retrieve_one(self, name): complete_job = wait_until_job_completed(retrieval_jobs) self._archive_retrieve_completed(self.args, complete_job, name) else: - raise RetryConsoleError('job still pending for archive %r' % name) + raise RetryConsoleError(u'job still pending for archive %s' % name) else: # create an archive retrieval job job = vault.retrieve_archive(archive_id) @@ -563,7 +570,7 @@ def archive_retrieve_one(self, name): wait_until_job_completed([job]) self._archive_retrieve_completed(self.args, job, name) else: - raise RetryConsoleError('queued retrieval job for archive %r' % name) + raise RetryConsoleError(u"queued retrieval job for archive %s" % name) def archive_retrieve(self): if len(self.args.names) > 1 and self.args.output_filename: @@ -571,6 +578,8 @@ def archive_retrieve(self): success_list = [] retry_list = [] for name in self.args.names: + if args.convert_utf8: + name = name.decode('utf-8') try: self.archive_retrieve_one(name) except RetryConsoleError, e: @@ -583,13 +592,16 @@ def archive_retrieve(self): def archive_delete(self): try: + name = self.args.name + if args.convert_utf8: + name = name.decode('utf-8') archive_id = self.cache.get_archive_id( - self.args.vault, self.args.name) + self.args.vault, name) except KeyError: - raise ConsoleError('archive %r not found' % self.args.name) + raise ConsoleError('archive %r not found' % name) vault = self.connection.get_vault(self.args.vault) vault.delete_archive(archive_id) - self.cache.delete_archive(self.args.vault, self.args.name) + self.cache.delete_archive(self.args.vault, name) def archive_checkpresent(self): try: @@ -644,6 +656,8 @@ def too_old(last_seen): def parse_args(self, args=None): parser = argparse.ArgumentParser() parser.add_argument('--region', default='us-east-1') + parser.add_argument('--convert-utf8', action='store_true', + help='encode name to UTF-8 before sending to Amazon, and decode from UTF-8 when retrieving') subparsers = parser.add_subparsers() vault_subparser = subparsers.add_parser('vault').add_subparsers() vault_subparser.add_parser('list').set_defaults(func=self.vault_list) From 40ba355133786fc8792fd800d7312c83f44a5a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Such=C3=BD?= Date: Sat, 24 Nov 2012 08:18:11 +0100 Subject: [PATCH 2/2] change --convert-utf8 to --transcode-names=CODEC which is more flexible and allow user to decide which codec will be used to encode characters with ord() > 125 --- glacier.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/glacier.py b/glacier.py index 903124d..7f6cad7 100755 --- a/glacier.py +++ b/glacier.py @@ -477,9 +477,9 @@ def archive_list(self): archive_list = list(self.cache.get_archive_list(self.args.vault)) if archive_list: - if args.convert_utf8: + if self.args.transcode_names: for i in archive_list: - print(i.encode('utf-8')) + print(i.encode(self.args.transcode_names)) else: print(*archive_list, sep="\n") @@ -498,8 +498,8 @@ def archive_upload(self): raise RuntimeError('Archive name not specified. Use --name') name = os.path.basename(full_name) - if not isinstance(name, unicode) and arg.convert_utf8: - name = name.decode('utf-8') + if not isinstance(name, unicode) and self.args.transcode_names: + name = name.decode(self.args.transcode_names) vault = self.connection.get_vault(self.args.vault) archive_id = vault.create_archive_from_file( file_obj=self.args.file, description=name) @@ -578,8 +578,8 @@ def archive_retrieve(self): success_list = [] retry_list = [] for name in self.args.names: - if args.convert_utf8: - name = name.decode('utf-8') + if self.args.transcode_names: + name = name.decode(self.args.transcode_names) try: self.archive_retrieve_one(name) except RetryConsoleError, e: @@ -593,8 +593,8 @@ def archive_retrieve(self): def archive_delete(self): try: name = self.args.name - if args.convert_utf8: - name = name.decode('utf-8') + if self.args.transcode_names: + name = name.decode(self.args.transcode_names) archive_id = self.cache.get_archive_id( self.args.vault, name) except KeyError: @@ -656,8 +656,8 @@ def too_old(last_seen): def parse_args(self, args=None): parser = argparse.ArgumentParser() parser.add_argument('--region', default='us-east-1') - parser.add_argument('--convert-utf8', action='store_true', - help='encode name to UTF-8 before sending to Amazon, and decode from UTF-8 when retrieving') + parser.add_argument('--transcode-names', metavar='CODEC', + help='encode name to CODEC before sending to Amazon, and decode from CODEC when retrieving') subparsers = parser.add_subparsers() vault_subparser = subparsers.add_parser('vault').add_subparsers() vault_subparser.add_parser('list').set_defaults(func=self.vault_list)