diff options
Diffstat (limited to 'gdatastore/datastore.py')
-rw-r--r-- | gdatastore/datastore.py | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/gdatastore/datastore.py b/gdatastore/datastore.py index 72bf832..0fd7765 100644 --- a/gdatastore/datastore.py +++ b/gdatastore/datastore.py @@ -32,6 +32,13 @@ import dbus import dbus.service import gconf +try: + from sugar import mime as sugar_mime +except ImportError: + # Only used for helping legacy applications that use the file + # extension rather than the MIME type + sugar_mime = None + from gdatastore.index import Index @@ -534,13 +541,16 @@ class InternalApi(object): def get_data_path(self, (tree_id, version_id), sender=None): logging.debug('get_data_path((%r, %r), %r)', tree_id, version_id, sender) + metadata = self._index.retrieve((tree_id, version_id)) ref_name = _format_ref(tree_id, version_id) top_level_entries = self._git_call('ls-tree', [ref_name]).splitlines() if len(top_level_entries) == 1 and \ top_level_entries[0].endswith('\tdata'): blob_hash = top_level_entries[0].split('\t')[0].split(' ')[2] - return self._checkout_file(blob_hash) + mime_type = metadata.get('mime_type', '') + return self._checkout_file(blob_hash, + suffix=_guess_extension(mime_type)) return self._checkout_dir(ref_name) @@ -661,8 +671,8 @@ class InternalApi(object): for entry in old_versions: self.delete((entry['tree_id'], entry['version_id'])) - def _checkout_file(self, blob_hash): - fd, file_name = tempfile.mkstemp(dir=self._checkouts_dir) + def _checkout_file(self, blob_hash, suffix=''): + fd, file_name = tempfile.mkstemp(dir=self._checkouts_dir, suffix=suffix) try: self._git_call('cat-file', ['blob', blob_hash], stdout_fd=fd) finally: @@ -855,3 +865,12 @@ def to_native(value): def _format_ref(tree_id, version_id): return 'refs/gdatastore/%s/%s' % (tree_id, version_id) + + +def _guess_extension(mime_type): + if sugar_mime is None: + return '' + extension = sugar_mime.get_primary_extension(mime_type) + if not extension: + return '' + return '.' + extension |