def _scan_dir(ig):
        path = ig.path

        if not utils.is_shared(path):
            msg.error('Skipping adding %s because it is not in shared path %s.' % (path, G.PROJECT_PATH))
            return
        ignored = ig.is_ignored(path)
        if ignored:
            msg.log('Not creating buf: %s' % (ignored))
            return

        msg.debug('create_buf: path is %s' % path)

        if not os.path.isdir(path):
            yield path
            return

        try:
            paths = os.listdir(path)
        except Exception as e:
            msg.error('Error listing path %s: %s' % (path, unicode(e)))
            return
        for p in paths:
            p_path = os.path.join(path, p)
            if p[0] == '.':
                if p not in ignore.HIDDEN_WHITELIST:
                    msg.log('Not creating buf for hidden path %s' % p_path)
                    continue
            ignored = ig.is_ignored(p_path)
            if ignored:
                msg.log('Not creating buf: %s' % (ignored))
                continue

            yield p_path
 def delete_buf(path):
     if not utils.is_shared(path):
         msg.error('Skipping deleting %s because it is not in shared path %s.' % (path, G.PROJECT_PATH))
         return
     if os.path.isdir(path):
         for dirpath, dirnames, filenames in os.walk(path):
             # TODO: rexamine this assumption
             # Don't care about hidden stuff
             dirnames[:] = [d for d in dirnames if d[0] != '.']
             for f in filenames:
                 f_path = os.path.join(dirpath, f)
                 if f[0] == '.':
                     msg.log('Not deleting buf for hidden file %s' % f_path)
                 else:
                     Listener.delete_buf(f_path)
         return
     buf_to_delete = get_buf_by_path(path)
     if buf_to_delete is None:
         msg.error('%s is not in this workspace' % path)
         return
     msg.log('deleting buffer ', utils.to_rel_path(path))
     event = {
         'name': 'delete_buf',
         'id': buf_to_delete['id'],
     }
     G.AGENT.put(event)
Exemple #3
0
 def delete_buf(self, path):
     if not utils.is_shared(path):
         msg.error(
             'Skipping deleting %s because it is not in shared path %s.' %
             (path, G.PROJECT_PATH))
         return
     if os.path.isdir(path):
         for dirpath, dirnames, filenames in os.walk(path):
             # TODO: rexamine this assumption
             # Don't care about hidden stuff
             dirnames[:] = [d for d in dirnames if d[0] != '.']
             for f in filenames:
                 f_path = os.path.join(dirpath, f)
                 if f[0] == '.':
                     msg.log('Not deleting buf for hidden file %s' % f_path)
                 else:
                     self.delete_buf(f_path)
         return
     buf_to_delete = self.get_buf_by_path(path)
     if buf_to_delete is None:
         msg.error('%s is not in this workspace' % path)
         return
     msg.log('deleting buffer ', utils.to_rel_path(path))
     event = {
         'name': 'delete_buf',
         'id': buf_to_delete['id'],
     }
     G.AGENT.send(event)
 def delete_buf(self, path, unlink=False):
     if not utils.is_shared(path):
         msg.error('Skipping deleting ', path, ' because it is not in shared path ', G.PROJECT_PATH, '.')
         return
     if os.path.isdir(path):
         for dirpath, dirnames, filenames in os.walk(path):
             # TODO: rexamine this assumption
             # Don't care about hidden stuff
             dirnames[:] = [d for d in dirnames if d[0] != '.']
             for f in filenames:
                 f_path = os.path.join(dirpath, f)
                 if f[0] == '.':
                     msg.log('Not deleting buf for hidden file ', f_path)
                 else:
                     self.delete_buf(f_path, unlink)
         return
     buf_to_delete = self.get_buf_by_path(path)
     if buf_to_delete is None:
         msg.error(path, ' is not in this workspace')
         return
     msg.log('deleting buffer ', utils.to_rel_path(path))
     event = {
         'name': 'delete_buf',
         'id': buf_to_delete['id'],
         'unlink': unlink,
     }
     self.send(event)
    def summon(self, subl_view):
        if 'highlight' not in G.PERMS:
            return
        buf = get_buf(subl_view)
        if buf:
            msg.debug('summoning selection in subl_view ', buf['path'], ', buf id ', buf['id'])
            c = [[x.a, x.b] for x in subl_view.sel()]
            if self.joined_workspace:
                self.send({
                    'id': buf['id'],
                    'name': 'highlight',
                    'ranges': c,
                    'ping': True,
                    'summon': True,
                    'following': False,
                })
            return

        path = subl_view.file_name()
        if not utils.is_shared(path):
            sublime.error_message('Can\'t summon because %s is not in shared path %s.' % (path, G.PROJECT_PATH))
            return
        share = sublime.ok_cancel_dialog('This file isn\'t shared. Would you like to share it?', 'Share')
        if share:
            sel = [[x.a, x.b] for x in subl_view.sel()]
            self.create_buf_cbs[utils.to_rel_path(path)] = lambda buf_id: send_summon(buf_id, sel)
            self.upload(path)
    def summon(self, subl_view):
        if 'highlight' not in G.PERMS:
            return
        buf = get_buf(subl_view)
        if buf:
            msg.debug('summoning selection in subl_view ', buf['path'],
                      ', buf id ', buf['id'])
            c = [[x.a, x.b] for x in subl_view.sel()]
            if self.joined_workspace:
                self.send({
                    'id': buf['id'],
                    'name': 'highlight',
                    'ranges': c,
                    'summon': True,
                    'following': False,
                })
            return

        path = subl_view.file_name()
        if not utils.is_shared(path):
            sublime.error_message(
                'Can\'t summon because %s is not in shared path %s.' %
                (path, G.PROJECT_PATH))
            return
        share = sublime.ok_cancel_dialog(
            'This file isn\'t shared. Would you like to share it?', 'Share')
        if share:
            sel = [[x.a, x.b] for x in subl_view.sel()]
            self.create_buf_cbs[utils.to_rel_path(
                path)] = lambda buf_id: send_summon(buf_id, sel)
            self.upload(path)
    def delete_buf(self, path, unlink=False):
        if not utils.is_shared(path):
            msg.error('Skipping deleting ', path,
                      ' because it is not in shared path ', G.PROJECT_PATH,
                      '.')
            return
        if os.path.isdir(path):
            for dirpath, dirnames, filenames in os.walk(path):
                # TODO: rexamine this assumption
                # Don't care about hidden stuff
                dirnames[:] = [d for d in dirnames if d[0] != '.']
                for f in filenames:
                    f_path = os.path.join(dirpath, f)
                    if f[0] == '.':
                        msg.log('Not deleting buf for hidden file ', f_path)
                    else:
                        self.delete_buf(f_path, unlink)
            return
        buf_to_delete = self.get_buf_by_path(path)
        if buf_to_delete is None:
            msg.error(path, ' is not in this workspace')
            return
        msg.log('deleting buffer ', utils.to_rel_path(path))
        event = {
            'name': 'delete_buf',
            'id': buf_to_delete['id'],
            'unlink': unlink,
        }

        def done(d):
            self._on_delete_buf(event)

        self.send(event, done)
Exemple #8
0
    def _on_buffer_list_change(self, req):
        added = req.get('added') or {}
        for path, text in added.items():
            buf = self.get_buf_by_path(path)
            buf_id = buf and int(buf.get('id'))
            d = buf and 'buf' in buf and self.agent.on_load.get(buf_id)
            if d:
                self.emacs_bufs[path][0] = buf['buf']
            else:
                self.emacs_bufs[path][0] = text
            if not buf:
                msg.debug('no buf for path %s' % path)
                if 'create_buf' in G.PERMS and utils.is_shared(
                        path) and G.IGNORE and not G.IGNORE.is_ignored(path):
                    self.agent._upload(path, text=text)
                elif path in self.emacs_bufs:
                    del self.emacs_bufs[path]
                continue
            view = self.views.get(buf_id)
            if view is None:
                self.get_view(buf_id)
            elif view.is_loading():
                view._emacs_buf = self.emacs_bufs[path]
            else:
                msg.debug(
                    'view for buf %s already exists. this is not good. we got out of sync'
                    % buf['path'])
            if d:
                del self.agent.on_load[buf_id]
                for _, f in d.items():
                    f()

        deleted = req.get('deleted') or []
        for path in deleted:
            if self.emacs_bufs.get(path) is None:
                msg.debug(
                    'emacs deleted %s but we already deleted it from emacs_bufs'
                    % path)
            if path in self.emacs_bufs:
                del self.emacs_bufs[path]
            buf = self.get_buf_by_path(path)
            if buf and buf['id'] in self.views:
                del self.views[buf['id']]

        seen = set()
        current = req.get('current') or []
        for path in current:
            if self.emacs_bufs.get(path) is None:
                msg.debug(
                    'We should have buffer %s in emacs_bufs but we don\'t' %
                    path)
            else:
                seen.add(path)

        for buf_id, view in self.views.items():
            if utils.get_full_path(view.buf['path']) not in seen:
                msg.debug(
                    'We should not have buffer %s in our views but we do.' %
                    view.buf['path'])
 def _on_revert(self, req):
     path = req['full_path']
     view = self.get_view_by_path(path)
     self.emacs_bufs[path][0] = req['buf']
     if not view:
         if 'create_buf' in G.PERMS and utils.is_shared(path) and G.IGNORE and not G.IGNORE.is_ignored(path):
             self.agent._upload(path, text=req['buf'])
         return
     self.bufs_changed.append(view.buf['id'])
Exemple #10
0
    def on_post_save(self, view, agent):
        view_buf_id = view.buffer_id()

        def cleanup():
            i = self.between_save_events[view_buf_id]
            i[0] -= 1

        if view.is_scratch():
            return

        i = self.between_save_events[view_buf_id]
        if agent.ignored_saves[view_buf_id] > 0:
            agent.ignored_saves[view_buf_id] -= 1
            return cleanup()
        old_name = i[1]

        i = self.between_save_events[view_buf_id]
        if i[0] > 1:
            return cleanup()
        old_name = i[1]

        event = None
        buf = get_buf(view)
        try:
            name = utils.to_rel_path(view.file_name())
        except ValueError:
            name = view.file_name()
        is_shared = utils.is_shared(view.file_name())

        if buf is None:
            if not is_shared:
                return cleanup()
            if G.IGNORE and G.IGNORE.is_ignored(view.file_name(), log=True):
                msg.log(view.file_name(), ' is ignored. Not creating buffer.')
                return cleanup()
            msg.log('Creating new buffer ', name, ' ', view.file_name())
            event = {'name': 'create_buf', 'buf': get_text(view), 'path': name}
        elif name != old_name:
            if is_shared:
                msg.log('renamed buffer ', old_name, ' to ', name)
                event = {'name': 'rename_buf', 'id': buf['id'], 'path': name}
            else:
                msg.log('deleting buffer from shared: ', name)
                event = {
                    'name': 'delete_buf',
                    'id': buf['id'],
                }

        if event:
            agent.send(event)
        if is_shared and buf:
            agent.views_changed.append(('saved', view, buf))

        cleanup()
 def rename_buf(self, buf_id, new_path):
     new_path = utils.to_rel_path(new_path)
     if not utils.is_shared(new_path):
         msg.log('New path %s is not shared. Discarding rename event.' % new_path)
         return
     self.agent.put({
         'name': 'rename_buf',
         'id': buf_id,
         'path': new_path,
     })
     old_path = self.FLOO_BUFS[buf_id]['path']
     del self.FLOO_PATHS_TO_BUFS[old_path]
     self.FLOO_PATHS_TO_BUFS[new_path] = buf_id
     self.FLOO_BUFS[buf_id]['path'] = new_path
    def _on_buffer_list_change(self, req):
        added = req.get('added') or {}
        for path, text in added.items():
            buf = self.get_buf_by_path(path)
            buf_id = buf and int(buf.get('id'))
            d = buf and 'buf' in buf and self.agent.on_load.get(buf_id)
            if d:
                self.emacs_bufs[path][0] = buf['buf']
            else:
                self.emacs_bufs[path][0] = text
            if not buf:
                msg.debug('no buf for path %s' % path)
                if 'create_buf' in G.PERMS and utils.is_shared(path) and G.IGNORE and not G.IGNORE.is_ignored(path):
                    self.agent._upload(path, text=text)
                elif path in self.emacs_bufs:
                    del self.emacs_bufs[path]
                continue
            view = self.views.get(buf_id)
            if view is None:
                self.get_view(buf_id)
            elif view.is_loading():
                view._emacs_buf = self.emacs_bufs[path]
            else:
                msg.debug('view for buf %s already exists. this is not good. we got out of sync' % buf['path'])
            if d:
                del self.agent.on_load[buf_id]
                for _, f in d.items():
                    f()

        deleted = req.get('deleted') or []
        for path in deleted:
            if self.emacs_bufs.get(path) is None:
                msg.debug('emacs deleted %s but we already deleted it from emacs_bufs' % path)
            if path in self.emacs_bufs:
                del self.emacs_bufs[path]
            buf = self.get_buf_by_path(path)
            if buf and buf['id'] in self.views:
                del self.views[buf['id']]

        seen = set()
        current = req.get('current') or []
        for path in current:
            if self.emacs_bufs.get(path) is None:
                msg.debug('We should have buffer %s in emacs_bufs but we don\'t' % path)
            else:
                seen.add(path)

        for buf_id, view in self.views.items():
            if utils.get_full_path(view.buf['path']) not in seen:
                msg.debug('We should not have buffer %s in our views but we do.' % view.buf['path'])
 def summon(self, view):
     buf = get_buf(view)
     if buf:
         msg.debug("summoning selection in view %s, buf id %s" % (buf["path"], buf["id"]))
         self.selection_changed.append((view, buf, True))
     else:
         path = view.file_name()
         if not utils.is_shared(path):
             sublime.error_message("Can't summon because %s is not in shared path %s." % (path, G.PROJECT_PATH))
             return
         share = sublime.ok_cancel_dialog("This file isn't shared. Would you like to share it?", "Share")
         if share:
             sel = [[x.a, x.b] for x in view.sel()]
             self.create_buf_cbs[utils.to_rel_path(path)] = lambda buf_id: send_summon(buf_id, sel)
             self.upload(path)
Exemple #14
0
 def summon(self, view):
     buf = get_buf(view)
     if buf:
         msg.debug('summoning selection in view %s, buf id %s' % (buf['path'], buf['id']))
         self.selection_changed.append((view, buf, True))
     else:
         path = view.file_name()
         if not utils.is_shared(path):
             editor.error_message('Can\'t summon because %s is not in shared path %s.' % (path, G.PROJECT_PATH))
             return
         share = editor.ok_cancel_dialog('This file isn\'t shared. Would you like to share it?', 'Share')
         if share:
             sel = [[x.a, x.b] for x in view.sel()]
             self.create_buf_cbs[utils.to_rel_path(path)] = lambda buf_id: send_summon(buf_id, sel)
             self.upload(path)
Exemple #15
0
 def summon(view):
     buf = get_buf(view)
     if buf:
         msg.debug('summoning selection in view %s, buf id %s' % (buf['path'], buf['id']))
         Listener.selection_changed.append((view, buf, True))
     else:
         path = view.file_name()
         if not utils.is_shared(path):
             sublime.error_message('Can\'t summon because %s is not in shared path %s.' % (path, G.PROJECT_PATH))
             return
         share = sublime.ok_cancel_dialog('This file isn\'t shared. Would you like to share it?', 'Share')
         if share:
             sel = [[x.a, x.b] for x in view.sel()]
             CREATE_BUF_CBS[utils.to_rel_path(path)] = lambda buf_id: send_summon(buf_id, sel)
             Listener.create_buf(path)
Exemple #16
0
    def get_buf(self, vim_buf):
        """None- no sharing, False- should be but isn't """
        if vim_buf.name is None:
            msg.debug('get:buf buffer has no filename')
            return None

        if not utils.is_shared(vim_buf.name):
            msg.debug('get_buf: %s is not shared' % vim_buf.name)
            return None

        buf = self.get_buf_by_path(vim_buf.name)
        if buf:
            return buf

        msg.debug('get_buf: no buf has path %s' % vim_buf.name)
        return False
Exemple #17
0
    def get_buf(self, vim_buf):
        """None- no sharing, False- should be but isn't """
        if vim_buf.name is None:
            msg.debug('get:buf buffer has no filename')
            return None

        if not utils.is_shared(vim_buf.name):
            msg.debug('get_buf: %s is not shared' % vim_buf.name)
            return None

        buf = self.get_buf_by_path(vim_buf.name)
        if buf:
            return buf

        msg.debug('get_buf: no buf has path %s' % vim_buf.name)
        return False
Exemple #18
0
 def _on_rename_buf(self, req):
     old_path = utils.to_rel_path(req["old_path"])
     buf = self.get_buf_by_path(old_path)
     if not buf:
         msg.debug("No buffer for path %s" % req["path"])
         return
     path = utils.to_rel_path(req["path"])
     if not utils.is_shared(path):
         msg.log("New path %s is not shared. Discarding rename event." % path)
         return
     buf_id = buf["id"]
     self.send_to_floobits({"name": "rename_buf", "id": buf["id"], "path": path})
     # KANS: is this right? old code...
     old_path = self.agent.bufs[buf_id]["path"]
     del self.agent.paths_to_ids[old_path]
     self.agent.paths_to_ids[path] = buf_id
     self.agent.bufs[buf_id]["path"] = path
Exemple #19
0
    def on_post_save(self, view):
        if not G.AGENT or not G.AGENT.is_ready():
            return

        def cleanup():
            del self.between_save_events[view.buffer_id()]

        if view == G.CHAT_VIEW or view.file_name() == G.CHAT_VIEW_PATH:
            return cleanup()

        event = None
        buf = get_buf(view)
        name = utils.to_rel_path(view.file_name())
        is_shared = utils.is_shared(view.file_name())
        old_name = self.between_save_events[view.buffer_id()]

        if buf is None:
            if is_shared:
                msg.log('new buffer ', name, view.file_name())
                event = {
                    'name': 'create_buf',
                    'buf': get_text(view),
                    'path': name
                }
        elif name != old_name:
            if is_shared:
                msg.log('renamed buffer {0} to {1}'.format(old_name, name))
                event = {
                    'name': 'rename_buf',
                    'id': buf['id'],
                    'path': name
                }
            else:
                msg.log('deleting buffer from shared: {0}'.format(name))
                event = {
                    'name': 'delete_buf',
                    'id': buf['id'],
                }

        if event:
            G.AGENT.put(event)
        if is_shared and buf:
            G.AGENT.put({'name': 'saved', 'id': buf['id']})

        cleanup()
Exemple #20
0
    def maybe_new_file(self):
        path = self.vim.current.buffer.name
        if path is None or path == '':
            msg.debug('get:buf buffer has no filename')
            return
        if not os.path.exists(path):
            return
        if not utils.is_shared(path):
            msg.debug('get_buf: %s is not shared' % path)
            return

        buf = G.AGENT.get_buf_by_path(path)
        if not buf:
            if not G.IGNORE:
                msg.warn('G.IGNORE is not set. Uploading anyway.')
                G.AGENT.upload(path)
            if G.IGNORE and not G.IGNORE.is_ignored(path, None, True):
                G.AGENT.upload(path)
Exemple #21
0
    def on_post_save(self, view):
        if not G.AGENT or not G.AGENT.is_ready():
            return

        def cleanup():
            del self.between_save_events[view.buffer_id()]

        if view == G.CHAT_VIEW or view.file_name() == G.CHAT_VIEW_PATH:
            return cleanup()

        event = None
        buf = get_buf(view)
        name = utils.to_rel_path(view.file_name())
        is_shared = utils.is_shared(view.file_name())
        old_name = self.between_save_events[view.buffer_id()]

        if buf is None:
            if is_shared:
                msg.log('new buffer ', name, view.file_name())
                event = {
                    'name': 'create_buf',
                    'buf': get_text(view),
                    'path': name
                }
        elif name != old_name:
            if is_shared:
                msg.log('renamed buffer {0} to {1}'.format(old_name, name))
                event = {'name': 'rename_buf', 'id': buf['id'], 'path': name}
            else:
                msg.log('deleting buffer from shared: {0}'.format(name))
                event = {
                    'name': 'delete_buf',
                    'id': buf['id'],
                }

        if event:
            G.AGENT.put(event)
        if is_shared and buf:
            G.AGENT.put({'name': 'saved', 'id': buf['id']})

        cleanup()
 def _on_rename_buf(self, req):
     old_path = utils.to_rel_path(req['old_path'])
     buf = self.get_buf_by_path(old_path)
     if not buf:
         msg.debug('No buffer for path %s' % req['path'])
         return
     path = utils.to_rel_path(req['path'])
     if not utils.is_shared(path):
         msg.log('New path %s is not shared. Discarding rename event.' % path)
         return
     buf_id = buf['id']
     self.send_to_floobits({
         'name': 'rename_buf',
         'id': buf['id'],
         'path': path,
     })
     # KANS: is this right? old code...
     old_path = self.agent.bufs[buf_id]['path']
     del self.agent.paths_to_ids[old_path]
     self.agent.paths_to_ids[path] = buf_id
     self.agent.bufs[buf_id]['path'] = path
Exemple #23
0
    def _scan_dir(ig):
        path = ig.path

        if not utils.is_shared(path):
            msg.error(
                'Skipping adding %s because it is not in shared path %s.' %
                (path, G.PROJECT_PATH))
            return
        if os.path.islink(path):
            msg.error('Skipping adding %s because it is a symlink.' % path)
            return
        ignored = ig.is_ignored(path)
        if ignored:
            msg.log('Not creating buf: %s' % (ignored))
            return

        msg.debug('create_buf: path is %s' % path)

        if not os.path.isdir(path):
            yield path
            return

        try:
            paths = os.listdir(path)
        except Exception as e:
            msg.error('Error listing path %s: %s' % (path, unicode(e)))
            return
        for p in paths:
            p_path = os.path.join(path, p)
            if p[0] == '.':
                if p not in ignore.HIDDEN_WHITELIST:
                    msg.log('Not creating buf for hidden path %s' % p_path)
                    continue
            ignored = ig.is_ignored(p_path)
            if ignored:
                msg.log('Not creating buf: %s' % (ignored))
                continue

            yield p_path
Exemple #24
0
    def delete_buf(self, path):
        """deletes a path"""

        if not path:
            return

        path = utils.get_full_path(path)

        if not utils.is_shared(path):
            msg.error('Skipping deleting %s because it is not in shared path %s.' % (path, G.PROJECT_PATH))
            return

        if os.path.isdir(path):
            for dirpath, dirnames, filenames in os.walk(path):
                # Don't care about hidden stuff
                dirnames[:] = [d for d in dirnames if d[0] != '.']
                for f in filenames:
                    f_path = os.path.join(dirpath, f)
                    if f[0] == '.':
                        msg.log('Not deleting buf for hidden file %s' % f_path)
                    else:
                        self.delete_buf(f_path)
            return
        buf_to_delete = None
        rel_path = utils.to_rel_path(path)
        for buf_id, buf in self.FLOO_BUFS.items():
            if rel_path == buf['path']:
                buf_to_delete = buf
                break
        if buf_to_delete is None:
            msg.error('%s is not in this workspace' % path)
            return
        msg.log('deleting buffer ', rel_path)
        event = {
            'name': 'delete_buf',
            'id': buf_to_delete['id'],
        }
        self.agent.put(event)
 def delete_buf(self, path):
     if not utils.is_shared(path):
         msg.error("Skipping deleting %s because it is not in shared path %s." % (path, G.PROJECT_PATH))
         return
     if os.path.isdir(path):
         for dirpath, dirnames, filenames in os.walk(path):
             # TODO: rexamine this assumption
             # Don't care about hidden stuff
             dirnames[:] = [d for d in dirnames if d[0] != "."]
             for f in filenames:
                 f_path = os.path.join(dirpath, f)
                 if f[0] == ".":
                     msg.log("Not deleting buf for hidden file %s" % f_path)
                 else:
                     self.delete_buf(f_path)
         return
     buf_to_delete = self.get_buf_by_path(path)
     if buf_to_delete is None:
         msg.error("%s is not in this workspace" % path)
         return
     msg.log("deleting buffer ", utils.to_rel_path(path))
     event = {"name": "delete_buf", "id": buf_to_delete["id"]}
     self.send(event)
 def create_buf(self, path, force=False):
     if not utils.is_shared(path):
         msg.error('Skipping adding %s because it is not in shared path %s' % (path, G.PROJECT_PATH))
         return
     ig = ignore.Ignore(None, path)
     self._uploader(ig.list_paths())
Exemple #27
0
    def create_buf(self, path, ig=None, text=None):
        if not utils.is_shared(path):
            msg.error('Skipping adding %s because it is not in shared path %s.' % (path, G.PROJECT_PATH))
            return
        if os.path.islink(path):
            msg.error('Skipping adding %s because it is a symlink.' % path)
            return
        ignored = ig and ig.is_ignored(path)
        if ignored:
            msg.log('Not creating buf: %s' % (ignored))
            return
        msg.debug('create_buf: path is %s' % path)
        if os.path.isdir(path):
            if ig is None:
                try:
                    ig = ignore.build_ignores(path)
                except Exception as e:
                    msg.error('Error adding %s: %s' % (path, unicode(e)))
                    return
            try:
                paths = os.listdir(path)
            except Exception as e:
                msg.error('Error listing path %s: %s' % (path, unicode(e)))
                return
            for p in paths:
                p_path = os.path.join(path, p)
                if p[0] == '.':
                    if p not in ignore.HIDDEN_WHITELIST:
                        msg.log('Not creating buf for hidden path %s' % p_path)
                        continue
                ignored = ig.is_ignored(p_path)
                if ignored:
                    msg.log('Not creating buf: %s' % (ignored))
                    continue
                try:
                    s = os.lstat(p_path)
                except Exception as e:
                    msg.error('Error lstat()ing path %s: %s' % (path, unicode(e)))
                    continue
                if stat.S_ISDIR(s.st_mode):
                    child_ig = ignore.Ignore(ig, p_path)
                    utils.set_timeout(self.create_buf, 0, p_path, child_ig)
                elif stat.S_ISREG(s.st_mode):
                    utils.set_timeout(self.create_buf, 0, p_path, ig)
            return
        try:
            encoding = 'utf8'
            if text:
                buf_md5 = hashlib.md5(text).hexdigest()
            else:
                buf_fd = open(path, 'rb')
                text = buf_fd.read()
                buf_fd.close()
                buf_md5 = hashlib.md5(text).hexdigest()
                try:
                    text = text.decode('utf-8')
                except Exception:
                    text = base64.b64encode(text).decode('utf-8')
                    encoding = 'base64'
            rel_path = utils.to_rel_path(path)
            existing_buf = self.get_buf_by_path(path)
            if existing_buf:
                if existing_buf['md5'] == buf_md5:
                    msg.debug('%s already exists and has the same md5. Skipping creating.' % path)
                    return
                msg.log('setting buffer ', rel_path)
                self.agent.put({
                    'name': 'set_buf',
                    'id': existing_buf['id'],
                    'buf': text,
                    'encoding': encoding,
                    'md5': buf_md5,
                })
                return

            msg.log('creating buffer ', rel_path)
            event = {
                'name': 'create_buf',
                'buf': text,
                'path': rel_path,
                'encoding': encoding,
                'md5': buf_md5,
            }
            self.agent.put(event)
        except (IOError, OSError):
            msg.error('Failed to open %s.' % path)
        except Exception as e:
            msg.error('Failed to create buffer %s: %s' % (path, unicode(e)))
Exemple #28
0
 def create_buf(self, path, ig=None, force=False):
     if G.SPARSE_MODE and not force:
         msg.debug("Skipping %s because user enabled sparse mode." % path)
         return
     if not utils.is_shared(path):
         msg.error('Skipping adding %s because it is not in shared path %s.' % (path, G.PROJECT_PATH))
         return
     if os.path.islink(path):
         msg.error('Skipping adding %s because it is a symlink.' % path)
         return
     ignored = ig and ig.is_ignored(path)
     if ignored:
         msg.log('Not creating buf: %s' % (ignored))
         return
     msg.debug('create_buf: path is %s' % path)
     if os.path.isdir(path):
         if ig is None:
             try:
                 ig = ignore.build_ignores(path)
             except Exception as e:
                 msg.error('Error adding %s: %s' % (path, unicode(e)))
                 return
         try:
             paths = os.listdir(path)
         except Exception as e:
             msg.error('Error listing path %s: %s' % (path, unicode(e)))
             return
         for p in paths:
             p_path = os.path.join(path, p)
             if p[0] == '.':
                 if p not in ignore.HIDDEN_WHITELIST:
                     msg.log('Not creating buf for hidden path %s' % p_path)
                     continue
             ignored = ig.is_ignored(p_path)
             if ignored:
                 msg.log('Not creating buf: %s' % (ignored))
                 continue
             try:
                 s = os.lstat(p_path)
             except Exception as e:
                 msg.error('Error lstat()ing path %s: %s' % (path, unicode(e)))
                 continue
             if stat.S_ISDIR(s.st_mode):
                 child_ig = ignore.Ignore(ig, p_path)
                 utils.set_timeout(self.create_buf, 0, p_path, child_ig)
             elif stat.S_ISREG(s.st_mode):
                 utils.set_timeout(self.create_buf, 0, p_path, ig)
         return
     try:
         buf_fd = open(path, 'rb')
         buf = buf_fd.read()
         encoding = 'utf8'
         rel_path = utils.to_rel_path(path)
         existing_buf = self.get_buf_by_path(path)
         if existing_buf and existing_buf['md5'] == hashlib.md5(buf).hexdigest():
             msg.debug('%s already exists and has the same md5. Skipping creating.' % path)
             return
         try:
             buf = buf.decode('utf-8')
         except Exception:
             buf = base64.b64encode(buf).decode('utf-8')
             encoding = 'base64'
         msg.log('creating buffer ', rel_path)
         event = {
             'name': 'create_buf',
             'buf': buf,
             'path': rel_path,
             'encoding': encoding,
         }
         self.agent.put(event)
     except (IOError, OSError):
         msg.error('Failed to open %s.' % path)
     except Exception as e:
         msg.error('Failed to create buffer %s: %s' % (path, unicode(e)))
Exemple #29
0
    def on_post_save(self, view, agent):
        view_buf_id = view.buffer_id()

        def cleanup():
            i = self.between_save_events[view_buf_id]
            i[0] -= 1

        if view.is_scratch():
            return

        i = self.between_save_events[view_buf_id]
        if agent.ignored_saves[view_buf_id] > 0:
            agent.ignored_saves[view_buf_id] -= 1
            return cleanup()
        old_name = i[1]

        i = self.between_save_events[view_buf_id]
        if i[0] > 1:
            return cleanup()
        old_name = i[1]

        event = None
        buf = get_buf(view)
        try:
            name = utils.to_rel_path(view.file_name())
        except ValueError:
            name = view.file_name()
        is_shared = utils.is_shared(view.file_name())

        if buf is None:
            if not is_shared:
                return cleanup()
            if G.IGNORE and G.IGNORE.is_ignored(view.file_name(), log=True):
                msg.log(view.file_name(), ' is ignored. Not creating buffer.')
                return cleanup()
            msg.log('Creating new buffer ', name, view.file_name())
            event = {
                'name': 'create_buf',
                'buf': get_text(view),
                'path': name
            }
        elif name != old_name:
            if is_shared:
                msg.log('renamed buffer ', old_name, ' to ', name)
                event = {
                    'name': 'rename_buf',
                    'id': buf['id'],
                    'path': name
                }
            else:
                msg.log('deleting buffer from shared: ', name)
                event = {
                    'name': 'delete_buf',
                    'id': buf['id'],
                }

        if event:
            agent.send(event)
        if is_shared and buf:
            agent.views_changed.append(('saved', view, buf))

        cleanup()
    def on_post_save(self, view, agent):
        view_buf_id = view.buffer_id()

        def cleanup():
            i = self.between_save_events[view_buf_id]
            i[0] -= 1

        if view == G.CHAT_VIEW or view.file_name() == G.CHAT_VIEW_PATH:
            return

        i = self.between_save_events[view_buf_id]
        if agent.ignored_saves[view_buf_id] > 0:
            agent.ignored_saves[view_buf_id] -= 1
            return cleanup()
        old_name = i[1]

        i = self.between_save_events[view_buf_id]
        if i[0] > 1:
            return cleanup()
        old_name = i[1]

        event = None
        buf = get_buf(view)
        try:
            name = utils.to_rel_path(view.file_name())
        except ValueError:
            name = view.file_name()
        is_shared = utils.is_shared(view.file_name())

        if buf is None:
            if not is_shared:
                return cleanup()
            if ignore.is_ignored(view.file_name()):
                msg.log('%s is ignored. Not creating buffer.' % view.file_name())
                return cleanup()
            msg.log('Creating new buffer ', name, view.file_name())
            event = {
                'name': 'create_buf',
                'buf': get_text(view),
                'path': name
            }
        elif name != old_name:
            if is_shared:
                msg.log('renamed buffer {0} to {1}'.format(old_name, name))
                event = {
                    'name': 'rename_buf',
                    'id': buf['id'],
                    'path': name
                }
            else:
                msg.log('deleting buffer from shared: {0}'.format(name))
                event = {
                    'name': 'delete_buf',
                    'id': buf['id'],
                }

        if event:
            agent.send(event)
        if is_shared and buf:
            agent.send({'name': 'saved', 'id': buf['id']})

        cleanup()