def mkdir(path): try: os.makedirs(path) except OSError as e: if e.errno != errno.EEXIST: editor.error_message("Cannot create directory {0}.\n{1}".format(path, str_e(e))) raise
def mkdir(path): try: os.makedirs(path) except OSError as e: if e.errno != errno.EEXIST: editor.error_message('Cannot create directory {0}.\n{1}'.format(path, str_e(e))) raise
def mkdir(path): try: os.makedirs(path) except OSError as e: if e.errno != 17: editor.error_message('Cannot create directory {0}.\n{1}'.format(path, e)) raise
def check_and_join_workspace(self, args): if not self.start_ticker(): return workspace_url = args[0] self.set_globals() try: r = api.get_workspace_by_url(workspace_url) except Exception as e: return editor.error_message('Error joining %s: %s' % (workspace_url, str(e))) if r.code >= 400: return editor.error_message('Error joining %s: %s' % (workspace_url, r.body)) msg.debug('Workspace %s exists' % workspace_url) return self.join_workspace(workspace_url)
def _on_create_workspace(self, data, workspace_name, dir_to_share, owner=None, perms=None): owner = owner or G.USERNAME workspace_name = data.get('response', workspace_name) try: api_args = { 'name': workspace_name, 'owner': owner, } if perms: api_args['perms'] = perms msg.debug(str(api_args)) r = api.create_workspace(api_args) except Exception as e: msg.error('Unable to create workspace: %s' % unicode(e)) return editor.error_message('Unable to create workspace: %s' % unicode(e)) workspace_url = 'https://%s/%s/%s' % (G.DEFAULT_HOST, owner, workspace_name) if r.code < 400: msg.log('Created workspace %s' % workspace_url) utils.add_workspace_to_persistent_json(owner, workspace_name, workspace_url, dir_to_share) G.PROJECT_PATH = dir_to_share agent = self.remote_connect(owner, workspace_name, False) return agent.once("room_info", lambda: agent.upload(dir_to_share)) msg.error('Unable to create workspace: %s' % r.body) if r.code not in [400, 402, 409]: try: r.body = r.body['detail'] except Exception: pass return editor.error_message('Unable to create workspace: %s' % r.body) if r.code == 400: workspace_name = re.sub('[^A-Za-z0-9_\-\.]', '-', workspace_name) prompt = 'Invalid name. Workspace names must match the regex [A-Za-z0-9_\-\.]. Choose another name:' elif r.code == 402: try: r.body = r.body['detail'] except Exception: pass cb = lambda data: data['response'] and webbrowser.open('https://%s/%s/settings#billing' % (G.DEFAULT_HOST, owner)) self.get_input('%s Open billing settings?' % r.body, '', cb, y_or_n=True) return else: prompt = 'Workspace %s/%s already exists. Choose another name:' % (owner, workspace_name) return self.get_input(prompt, workspace_name, self._on_create_workspace, workspace_name, dir_to_share, owner, perms)
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)
def prejoin_workspace(workspace_url, dir_to_share, api_args): try: result = utils.parse_url(workspace_url) except Exception as e: msg.error(unicode(e)) return False try: w = get_workspace_by_url(workspace_url) except Exception as e: editor.error_message('Error opening url %s: %s' % (workspace_url, str(e))) return False if w.code >= 400: try: d = utils.get_persistent_data() try: del d['workspaces'][result['owner']][result['name']] except Exception: pass try: del d['recent_workspaces'][workspace_url] except Exception: pass utils.update_persistent_data(d) except Exception as e: msg.debug(unicode(e)) return False msg.debug('workspace: %s', json.dumps(w.body)) anon_perms = w.body.get('perms', {}).get('AnonymousUser', []) msg.debug('api args: %s' % api_args) new_anon_perms = api_args.get('perms', {}).get('AnonymousUser', []) # TODO: prompt/alert user if going from private to public if set(anon_perms) != set(new_anon_perms): msg.debug(str(anon_perms), str(new_anon_perms)) w.body['perms']['AnonymousUser'] = new_anon_perms response = update_workspace(w.body['owner'], w.body['name'], w.body) msg.debug(str(response.body)) utils.add_workspace_to_persistent_json(w.body['owner'], w.body['name'], workspace_url, dir_to_share) return result
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)
def _on_create_workspace(self, data, workspace_name, dir_to_share, owner=None, perms=None): owner = owner or G.USERNAME workspace_name = data.get('response', workspace_name) prompt = 'workspace %s already exists. Choose another name: ' % workspace_name try: api_args = { 'name': workspace_name, 'owner': owner, } if perms: api_args['perms'] = perms api.create_workspace(api_args) workspace_url = utils.to_workspace_url({ 'secure': True, 'owner': owner, 'workspace': workspace_name }) msg.debug('Created workspace %s' % workspace_url) except HTTPError as e: err_body = e.read() msg.error('Unable to create workspace: %s %s' % (unicode(e), err_body)) if e.code not in [400, 402, 409]: return msg.error('Unable to create workspace: %s' % str(e)) if e.code == 400: workspace_name = re.sub('[^A-Za-z0-9_\-]', '-', workspace_name) prompt = 'Invalid name. Workspace names must match the regex [A-Za-z0-9_\-]. Choose another name:' elif e.code == 402: try: err_body = json.loads(err_body) err_body = err_body['detail'] except Exception: pass return editor.error_message('%s' % err_body) else: prompt = 'Workspace %s/%s already exists. Choose another name:' % ( owner, workspace_name) return self.get_input(prompt, workspace_name, self._on_create_workspace, workspace_name, dir_to_share, owner, perms) except Exception as e: return msg.error('Unable to create workspace: %s' % str(e)) G.PROJECT_PATH = dir_to_share agent = self.remote_connect(owner, workspace_name, False) agent.once("room_info", lambda: agent.upload(dir_to_share))
def _on_create_workspace(self, data, workspace_name, dir_to_share, owner=None, perms=None): owner = owner or G.USERNAME workspace_name = data.get("response", workspace_name) prompt = "workspace %s already exists. Choose another name: " % workspace_name try: api_args = {"name": workspace_name, "owner": owner} if perms: api_args["perms"] = perms api.create_workspace(api_args) workspace_url = utils.to_workspace_url({"secure": True, "owner": owner, "workspace": workspace_name}) msg.debug("Created workspace %s" % workspace_url) except HTTPError as e: err_body = e.read() msg.error("Unable to create workspace: %s %s" % (unicode(e), err_body)) if e.code not in [400, 402, 409]: return msg.error("Unable to create workspace: %s" % str(e)) if e.code == 400: workspace_name = re.sub("[^A-Za-z0-9_\-]", "-", workspace_name) prompt = "Invalid name. Workspace names must match the regex [A-Za-z0-9_\-]. Choose another name:" elif e.code == 402: try: err_body = json.loads(err_body) err_body = err_body["detail"] except Exception: pass return editor.error_message("%s" % err_body) else: prompt = "Workspace %s/%s already exists. Choose another name:" % (owner, workspace_name) return self.get_input( prompt, workspace_name, self._on_create_workspace, workspace_name, dir_to_share, owner, perms ) except Exception as e: return msg.error("Unable to create workspace: %s" % str(e)) G.PROJECT_PATH = dir_to_share agent = self.remote_connect(owner, workspace_name, False) agent.once("room_info", lambda: agent.upload(dir_to_share))
def _on_create_workspace(self, data, workspace_name, dir_to_share, owner=None, perms=None): owner = owner or G.USERNAME workspace_name = data.get('response', workspace_name) try: api_args = { 'name': workspace_name, 'owner': owner, } if perms: api_args['perms'] = perms msg.debug(str(api_args)) r = api.create_workspace(api_args) except Exception as e: msg.error('Unable to create workspace: %s' % unicode(e)) return editor.error_message('Unable to create workspace: %s' % unicode(e)) workspace_url = 'https://%s/%s/%s' % (G.DEFAULT_HOST, owner, workspace_name) if r.code < 400: msg.log('Created workspace %s' % workspace_url) utils.add_workspace_to_persistent_json(owner, workspace_name, workspace_url, dir_to_share) G.PROJECT_PATH = dir_to_share agent = self.remote_connect(owner, workspace_name, False) return agent.once("room_info", lambda: agent.upload(dir_to_share)) msg.error('Unable to create workspace: %s' % r.body) if r.code not in [400, 402, 409]: try: r.body = r.body['detail'] except Exception: pass return editor.error_message('Unable to create workspace: %s' % r.body) if r.code == 400: workspace_name = re.sub('[^A-Za-z0-9_\-\.]', '-', workspace_name) prompt = 'Invalid name. Workspace names must match the regex [A-Za-z0-9_\-\.]. Choose another name:' elif r.code == 402: try: r.body = r.body['detail'] except Exception: pass cb = lambda data: data['response'] and webbrowser.open( 'https://%s/%s/settings#billing' % (G.DEFAULT_HOST, owner)) self.get_input('%s Open billing settings?' % r.body, '', cb, y_or_n=True) return else: prompt = 'Workspace %s/%s already exists. Choose another name:' % ( owner, workspace_name) return self.get_input(prompt, workspace_name, self._on_create_workspace, workspace_name, dir_to_share, owner, perms)
def _on_share_dir(self, data): file_to_share = None utils.reload_settings() G.USERNAME = data['username'] G.SECRET = data['secret'] dir_to_share = data['dir_to_share'] perms = data['perms'] editor.line_endings = data['line_endings'].find( "unix") >= 0 and "\n" or "\r\n" dir_to_share = os.path.expanduser(dir_to_share) dir_to_share = utils.unfuck_path(dir_to_share) workspace_name = os.path.basename(dir_to_share) G.PROJECT_PATH = os.path.realpath(dir_to_share) msg.debug('%s %s %s' % (G.USERNAME, workspace_name, G.PROJECT_PATH)) if os.path.isfile(dir_to_share): file_to_share = dir_to_share dir_to_share = os.path.dirname(dir_to_share) try: utils.mkdir(dir_to_share) except Exception: return msg.error( "The directory %s doesn't exist and I can't create it." % dir_to_share) floo_file = os.path.join(dir_to_share, '.floo') info = {} try: floo_info = open(floo_file, 'rb').read().decode('utf-8') info = json.loads(floo_info) except (IOError, OSError): pass except Exception as e: msg.warn("Couldn't read .floo file: %s: %s" % (floo_file, str(e))) workspace_url = info.get('url') if workspace_url: parsed_url = api.prejoin_workspace(workspace_url, dir_to_share, {'perms': perms}) if parsed_url: # TODO: make sure we create_flooignore # utils.add_workspace_to_persistent_json(parsed_url['owner'], parsed_url['workspace'], workspace_url, dir_to_share) agent = self.remote_connect(parsed_url['owner'], parsed_url['workspace'], False) return agent.once( "room_info", lambda: agent.upload(file_to_share or dir_to_share)) parsed_url = utils.get_workspace_by_path( dir_to_share, lambda workspace_url: api.prejoin_workspace( workspace_url, dir_to_share, {'perms': perms})) if parsed_url: agent = self.remote_connect(parsed_url['owner'], parsed_url['workspace'], False) return agent.once( "room_info", lambda: agent.upload(file_to_share or dir_to_share)) def on_done(data, choices=None): self.get_input('Workspace name:', workspace_name, self._on_create_workspace, workspace_name, dir_to_share, owner=data.get('response'), perms=perms) try: r = api.get_orgs_can_admin() except IOError as e: return editor.error_message('Error getting org list: %s' % str(e)) if r.code >= 400 or len(r.body) == 0: return on_done({'response': G.USERNAME}) i = 0 choices = [] choices.append([G.USERNAME, i]) for org in r.body: i += 1 choices.append([org['name'], i]) self.get_input('Create workspace owned by (%s) ' % " ".join([x[0] for x in choices]), '', on_done, choices=choices)
def _on_share_dir(self, data): file_to_share = None utils.reload_settings() G.USERNAME = data['username'] G.SECRET = data['secret'] dir_to_share = data['dir_to_share'] perms = data['perms'] editor.line_endings = data['line_endings'].find("unix") >= 0 and "\n" or "\r\n" dir_to_share = os.path.expanduser(dir_to_share) dir_to_share = utils.unfuck_path(dir_to_share) workspace_name = os.path.basename(dir_to_share) G.PROJECT_PATH = os.path.realpath(dir_to_share) msg.debug('%s %s %s' % (G.USERNAME, workspace_name, G.PROJECT_PATH)) if os.path.isfile(dir_to_share): file_to_share = dir_to_share dir_to_share = os.path.dirname(dir_to_share) try: utils.mkdir(dir_to_share) except Exception: return msg.error("The directory %s doesn't exist and I can't create it." % dir_to_share) floo_file = os.path.join(dir_to_share, '.floo') info = {} try: floo_info = open(floo_file, 'rb').read().decode('utf-8') info = json.loads(floo_info) except (IOError, OSError): pass except Exception as e: msg.warn("Couldn't read .floo file: %s: %s" % (floo_file, str(e))) workspace_url = info.get('url') if workspace_url: parsed_url = api.prejoin_workspace(workspace_url, dir_to_share, {'perms': perms}) if parsed_url: # TODO: make sure we create_flooignore # utils.add_workspace_to_persistent_json(parsed_url['owner'], parsed_url['workspace'], workspace_url, dir_to_share) agent = self.remote_connect(parsed_url['owner'], parsed_url['workspace'], False) return agent.once("room_info", lambda: agent.upload(file_to_share or dir_to_share)) parsed_url = utils.get_workspace_by_path(dir_to_share, lambda workspace_url: api.prejoin_workspace(workspace_url, dir_to_share, {'perms': perms})) if parsed_url: agent = self.remote_connect(parsed_url['owner'], parsed_url['workspace'], False) return agent.once("room_info", lambda: agent.upload(file_to_share or dir_to_share)) def on_done(data, choices=None): self.get_input('Workspace name:', workspace_name, self._on_create_workspace, workspace_name, dir_to_share, owner=data.get('response'), perms=perms) try: r = api.get_orgs_can_admin() except IOError as e: return editor.error_message('Error getting org list: %s' % str(e)) if r.code >= 400 or len(r.body) == 0: return on_done({'response': G.USERNAME}) i = 0 choices = [] choices.append([G.USERNAME, i]) for org in r.body: i += 1 choices.append([org['name'], i]) self.get_input('Create workspace owned by (%s) ' % " ".join([x[0] for x in choices]), '', on_done, choices=choices)