Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gdatastore/datastore.py25
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