Commit fb038743626915f226f9733089620f94539e49bf
- Diff rendering mode:
- inline
- side by side
gdatastore/datastore.py
(22 / 3)
  | |||
32 | 32 | import dbus.service | |
33 | 33 | import gconf | |
34 | 34 | ||
35 | try: | ||
36 | from sugar import mime as sugar_mime | ||
37 | except ImportError: | ||
38 | # Only used for helping legacy applications that use the file | ||
39 | # extension rather than the MIME type | ||
40 | sugar_mime = None | ||
41 | |||
35 | 42 | from gdatastore.index import Index | |
36 | 43 | ||
37 | 44 | ||
… | … | ||
541 | 541 | def get_data_path(self, (tree_id, version_id), sender=None): | |
542 | 542 | logging.debug('get_data_path((%r, %r), %r)', tree_id, version_id, | |
543 | 543 | sender) | |
544 | metadata = self._index.retrieve((tree_id, version_id)) | ||
544 | 545 | ref_name = _format_ref(tree_id, version_id) | |
545 | 546 | top_level_entries = self._git_call('ls-tree', | |
546 | 547 | [ref_name]).splitlines() | |
547 | 548 | if len(top_level_entries) == 1 and \ | |
548 | 549 | top_level_entries[0].endswith('\tdata'): | |
549 | 550 | blob_hash = top_level_entries[0].split('\t')[0].split(' ')[2] | |
550 | return self._checkout_file(blob_hash) | ||
551 | mime_type = metadata.get('mime_type', '') | ||
552 | return self._checkout_file(blob_hash, | ||
553 | suffix=_guess_extension(mime_type)) | ||
551 | 554 | ||
552 | 555 | return self._checkout_dir(ref_name) | |
553 | 556 | ||
… | … | ||
671 | 671 | for entry in old_versions: | |
672 | 672 | self.delete((entry['tree_id'], entry['version_id'])) | |
673 | 673 | ||
674 | def _checkout_file(self, blob_hash): | ||
675 | fd, file_name = tempfile.mkstemp(dir=self._checkouts_dir) | ||
674 | def _checkout_file(self, blob_hash, suffix=''): | ||
675 | fd, file_name = tempfile.mkstemp(dir=self._checkouts_dir, suffix=suffix) | ||
676 | 676 | try: | |
677 | 677 | self._git_call('cat-file', ['blob', blob_hash], stdout_fd=fd) | |
678 | 678 | finally: | |
… | … | ||
865 | 865 | ||
866 | 866 | def _format_ref(tree_id, version_id): | |
867 | 867 | return 'refs/gdatastore/%s/%s' % (tree_id, version_id) | |
868 | |||
869 | |||
870 | def _guess_extension(mime_type): | ||
871 | if sugar_mime is None: | ||
872 | return '' | ||
873 | extension = sugar_mime.get_primary_extension(mime_type) | ||
874 | if not extension: | ||
875 | return '' | ||
876 | return '.' + extension |