diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2014-04-29 07:53:52 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2014-04-29 16:40:28 (GMT) |
commit | 7b650854958d03386ae54e87cbbb2bc82053661e (patch) | |
tree | 486f54e50d58e21aedda86fcbc19237d921f401a /sugar_network | |
parent | fe07c5f9f1da79059f8fcd5e33e0f043b7cc6814 (diff) |
Fix aslo-sync script
Diffstat (limited to 'sugar_network')
-rw-r--r-- | sugar_network/client/routes.py | 14 | ||||
-rw-r--r-- | sugar_network/db/blobs.py | 5 | ||||
-rw-r--r-- | sugar_network/model/context.py | 59 | ||||
-rw-r--r-- | sugar_network/node/__init__.py | 2 | ||||
-rw-r--r-- | sugar_network/node/model.py | 51 | ||||
-rw-r--r-- | sugar_network/node/slave.py | 4 | ||||
-rw-r--r-- | sugar_network/toolkit/application.py | 4 | ||||
-rw-r--r-- | sugar_network/toolkit/i18n.py | 14 |
8 files changed, 90 insertions, 63 deletions
diff --git a/sugar_network/client/routes.py b/sugar_network/client/routes.py index 8a037ee..4bdd10f 100644 --- a/sugar_network/client/routes.py +++ b/sugar_network/client/routes.py @@ -53,8 +53,8 @@ class ClientRoutes(FrontRoutes, JournalRoutes): self._connect_jobs = coroutine.Pool() self._sync_jobs = coroutine.Pool() self._no_subscription = no_subscription - self._pull_r = toolkit.Bin( - join(home_volume.root, 'var', 'pull'), [[1, None]]) + self._refresh_r = toolkit.Bin( + join(home_volume.root, 'var', 'refresh'), [[1, None]]) def connect(self, api=None): if self._connect_jobs: @@ -71,7 +71,7 @@ class ClientRoutes(FrontRoutes, JournalRoutes): self._connect_jobs.kill() self._got_offline() self._local.volume.close() - self._pull_r.commit() + self._refresh_r.commit() @fallbackroute('GET', ['hub']) def hub(self): @@ -370,14 +370,14 @@ class ClientRoutes(FrontRoutes, JournalRoutes): contexts.delete(local_context.guid) def _pull_checkin(self, request, response, header_key): - request.headers[header_key] = self._pull_r.value + request.headers[header_key] = self._refresh_r.value packet = packets.decode(self.fallback(request, response)) volume = self._local.volume volume[request.resource].patch(request.guid, packet['patch']) for blob in packet: volume.blobs.patch(blob) - ranges.exclude(self._pull_r.value, packet['ranges']) + ranges.exclude(self._refresh_r.value, packet['ranges']) def _pull(self): _logger.debug('Start pulling checkin updates') @@ -389,7 +389,7 @@ class ClientRoutes(FrontRoutes, JournalRoutes): request = Request(method='GET', path=[directory.metadata.name], cmd='diff') while True: - request.headers['ranges'] = self._pull_r.value + request.headers['ranges'] = self._refresh_r.value diff = self.fallback(request, response) if not diff: break @@ -397,7 +397,7 @@ class ClientRoutes(FrontRoutes, JournalRoutes): checkin = Request(method='GET', path=[request.resource, guid], cmd='diff') self._pull_checkin(checkin, response, 'ranges') - ranges.exclude(self._pull_r.value, r) + ranges.exclude(self._refresh_r.value, r) def _push(self): volume = self._local.volume diff --git a/sugar_network/db/blobs.py b/sugar_network/db/blobs.py index 6426341..2faedb0 100644 --- a/sugar_network/db/blobs.py +++ b/sugar_network/db/blobs.py @@ -247,7 +247,8 @@ class Blobs(object): return if not exists(dirname(path)): os.makedirs(dirname(path)) - os.rename(patch.path, path) + if patch.path: + os.rename(patch.path, path) if exists(path + _META_SUFFIX): meta = _read_meta(path) meta.update(patch.meta) @@ -282,7 +283,7 @@ def _write_meta(path, meta, seqno): for key, value in meta.items() if isinstance(meta, dict) else meta: if seqno is None and key == 'x-seqno': seqno = int(value) - f.write('%s: %s\n' % (key, toolkit.ascii(value))) + f.write(toolkit.ascii(key) + ': ' + toolkit.ascii(value) + '\n') os.utime(path, (seqno, seqno)) diff --git a/sugar_network/model/context.py b/sugar_network/model/context.py index cf24650..457281f 100644 --- a/sugar_network/model/context.py +++ b/sugar_network/model/context.py @@ -32,30 +32,9 @@ class Context(db.Resource): self.post('icon', 'assets/package.png') self.post('logo', 'assets/package-logo.png') self.post('artefact_icon', 'assets/package.svg') - return value - - svg = None - blobs = this.volume.blobs - if not self['artefact_icon']: - for type_ in ('activity', 'book', 'group'): - if type_ in value: - with file(blobs.get('assets/%s.svg' % type_).path) as f: - svg = f.read() - from sugar_network.toolkit.sugar import color_svg - svg = color_svg(svg, self['guid']) - self.post('artefact_icon', - blobs.post(svg, 'image/svg+xml').digest) - break - for prop, png, size in ( - ('icon', 'assets/missing.png', model.ICON_SIZE), - ('logo', 'assets/missing-logo.svg', model.LOGO_SIZE), - ): - if self[prop]: - continue - if svg is not None: - png = blobs.post(svg_to_png(svg, size), 'image/png').digest - self.post(prop, png) - + elif 'activity' not in value: + if not self['artefact_icon']: + self._generate_default_icons(value) return value @db.indexed_property(db.Localized, slot=1, prefix='S', full_text=True) @@ -78,15 +57,18 @@ class Context(db.Resource): def mime_types(self, value): return value - @db.stored_property(db.Blob, mime_type='image/png') + @db.stored_property(db.Blob, mime_type='image/png', + default='assets/missing.png') def icon(self, value): return value - @db.stored_property(db.Blob, mime_type='image/svg+xml') + @db.stored_property(db.Blob, mime_type='image/svg+xml', + default='assets/missing.svg') def artefact_icon(self, value): return value - @db.stored_property(db.Blob, mime_type='image/png') + @db.stored_property(db.Blob, mime_type='image/png', + default='assets/missing-logo.png') def logo(self, value): return value @@ -118,3 +100,26 @@ class Context(db.Resource): """ return value + + def _generate_default_icons(self, types): + blobs = this.volume.blobs + svg = None + for type_ in ('activity', 'book', 'group'): + if type_ in types: + with file(blobs.get('assets/%s.svg' % type_).path) as f: + svg = f.read() + from sugar_network.toolkit.sugar import color_svg + svg = color_svg(svg, self['guid']) + self.post('artefact_icon', + blobs.post(svg, 'image/svg+xml').digest) + break + else: + return + for prop, size in ( + ('icon', model.ICON_SIZE), + ('logo', model.LOGO_SIZE), + ): + if self[prop]: + continue + png = blobs.post(svg_to_png(svg, size), 'image/png').digest + self.post(prop, png) diff --git a/sugar_network/node/__init__.py b/sugar_network/node/__init__.py index 66bd37e..82cb8a9 100644 --- a/sugar_network/node/__init__.py +++ b/sugar_network/node/__init__.py @@ -47,4 +47,4 @@ mode = Option( master_api = Option( 'master API url either to connect to (for slave or proxy nodes), or, ' - 'to provide from (for master nodes)') + 'to provide from (for master nodes)', name='master-api') diff --git a/sugar_network/node/model.py b/sugar_network/node/model.py index d2a6475..310d2db 100644 --- a/sugar_network/node/model.py +++ b/sugar_network/node/model.py @@ -84,7 +84,7 @@ class _Release(object): class Context(_context.Context): @db.stored_property(db.Aggregated, subtype=_Release(), - acl=ACL.READ | ACL.INSERT | ACL.REMOVE | ACL.REPLACE | ACL.LOCAL) + acl=ACL.READ | ACL.INSERT | ACL.REMOVE | ACL.REPLACE) def releases(self, value): return value @@ -423,9 +423,11 @@ def presolve(presolve_path): def load_bundle(blob, context=None, initial=False, extra_deps=None, - license=None, release_notes=None): + license=None, release_notes=None, update_context=True): context_type = None context_meta = None + context_icon = None + context_updated = False version = None release = _ReleaseValue() release.guid = blob.digest @@ -456,7 +458,7 @@ def load_bundle(blob, context=None, initial=False, extra_deps=None, changelog = None unpack_size += bundle.getmember(arcname).size spec = bundle.get_spec() - context_meta = _load_context_metadata(bundle, spec) + context_meta, context_icon = _load_context_metadata(bundle, spec) if not context: context = spec['context'] @@ -489,10 +491,13 @@ def load_bundle(blob, context=None, initial=False, extra_deps=None, enforce(context_meta, http.BadRequest, 'No way to initate context') context_meta['guid'] = context context_meta['type'] = [context_type] + if context_icon: + _generate_icons(context_icon, context_meta) with this.principal as principal: principal.cap_create_with_guid = True this.call(method='POST', path=['context'], content=context_meta, principal=principal) + context_updated = True else: enforce(doc.available, http.NotFound, 'No context') enforce(context_type in doc['type'], @@ -513,12 +518,15 @@ def load_bundle(blob, context=None, initial=False, extra_deps=None, _logger.debug('Load %r release: %r', context, release) - if this.principal in doc['author']: - patch = doc.format_patch(context_meta) - if patch: - this.call(method='PUT', path=['context', context], content=patch, - principal=this.principal) - doc.posts.update(patch) + if this.principal in doc['author'] or this.principal.cap_author_override: + if not context_updated and update_context: + patch = doc.format_patch(context_meta) or {} + if context_icon and doc['artefact_icon'] == 'assets/missing.svg': + _generate_icons(context_icon, patch) + if patch: + this.call(method='PUT', path=['context', context], + content=patch, principal=this.principal) + doc.posts.update(patch) # TRANS: Release notes title title = i18n._('%(name)s %(version)s release') else: @@ -571,21 +579,12 @@ def _load_context_metadata(bundle, spec): if spec[prop]: result[prop] = spec[prop] result['guid'] = spec['context'] + icon_svg = None try: from sugar_network.toolkit.sugar import color_svg - icon_file = bundle.extractfile(join(bundle.rootdir, spec['icon'])) - svg = color_svg(icon_file.read(), result['guid']) - blobs = this.volume.blobs - - result['artefact_icon'] = \ - blobs.post(svg, 'image/svg+xml').digest - result['icon'] = \ - blobs.post(svg_to_png(svg, ICON_SIZE), 'image/png').digest - result['logo'] = \ - blobs.post(svg_to_png(svg, LOGO_SIZE), 'image/png').digest - + icon_svg = color_svg(icon_file.read(), result['guid']) icon_file.close() except Exception: _logger.exception('Failed to load icon') @@ -618,7 +617,7 @@ def _load_context_metadata(bundle, spec): except Exception: _logger.exception('Gettext failed to read %r', mo_path[-1]) - return result + return result, icon_svg def _resolve_package_alias(doc, value): @@ -669,6 +668,16 @@ def _resolve_package_alias(doc, value): doc.post('releases', {'resolves': resolves}) +def _generate_icons(svg, props): + blobs = this.volume.blobs + props['artefact_icon'] = \ + blobs.post(svg, 'image/svg+xml').digest + props['icon'] = \ + blobs.post(svg_to_png(svg, ICON_SIZE), 'image/png').digest + props['logo'] = \ + blobs.post(svg_to_png(svg, LOGO_SIZE), 'image/png').digest + + _STABILITY_RATES = { 'insecure': 0, 'buggy': 1, diff --git a/sugar_network/node/slave.py b/sugar_network/node/slave.py index babf1f0..a1195ab 100644 --- a/sugar_network/node/slave.py +++ b/sugar_network/node/slave.py @@ -52,8 +52,8 @@ class SlaveRoutes(NodeRoutes): f.write(guid) NodeRoutes.__init__(self, guid, volume=volume, **kwargs) vardir = join(volume.root, 'var') - self._push_r = toolkit.Bin(join(vardir, 'push.ranges'), [[1, None]]) - self._pull_r = toolkit.Bin(join(vardir, 'pull.ranges'), [[1, None]]) + self._push_r = toolkit.Bin(join(vardir, 'push'), [[1, None]]) + self._pull_r = toolkit.Bin(join(vardir, 'pull'), [[1, None]]) self._master_guid = urlsplit(master_api).netloc self._master_api = master_api diff --git a/sugar_network/toolkit/application.py b/sugar_network/toolkit/application.py index 06d55a6..bc6b99c 100644 --- a/sugar_network/toolkit/application.py +++ b/sugar_network/toolkit/application.py @@ -168,6 +168,9 @@ class Application(object): init_logging(debug.value) + def prolog(self): + pass + def epilog(self): pass @@ -186,6 +189,7 @@ class Application(object): if cmd.options.get('keep_stdout') and not foreground.value: self._keep_stdout() + self.prolog() exit(cmd() or 0) except Exception: printf.exception('%s %s', _('Aborted'), self.name) diff --git a/sugar_network/toolkit/i18n.py b/sugar_network/toolkit/i18n.py index 86d3cae..57f242f 100644 --- a/sugar_network/toolkit/i18n.py +++ b/sugar_network/toolkit/i18n.py @@ -23,7 +23,7 @@ from gettext import translation _ = lambda x: x _logger = logging.getLogger('i18n') -_i18n = {} +_i18n = None def default_lang(): @@ -107,10 +107,18 @@ def decode(value, accept_language=None): def encode(msgid, *args, **kwargs): - if not _i18n: + global _i18n + + if _i18n is None: from sugar_network.toolkit.languages import LANGUAGES + + _i18n = {} for lang in LANGUAGES: - _i18n[lang] = translation('sugar-network', languages=[lang]) + try: + _i18n[lang] = translation('sugar-network', languages=[lang]) + except IOError, error: + _logger.error('Failed to open %r locale: %s', lang, error) + result = {} for lang, trans in _i18n.items(): |