def do_edit(self, line): """ edit ID [ID...] Edit a content with $EDITOR, then push it on the website. """ contents = [] for id in line.split(): _id, backend_name = self.parse_id(id, unique_backend=True) backend_names = ( backend_name, ) if backend_name is not None else self.enabled_backends contents += [ content for backend, content in self.do( 'get_content', _id, backends=backend_names) if content ] if len(contents) == 0: print >> sys.stderr, 'No contents found' return 3 paths = {} for content in contents: tmpdir = os.path.join(tempfile.gettempdir(), "weboob") if not os.path.isdir(tmpdir): os.makedirs(tmpdir) fd, path = tempfile.mkstemp(prefix='%s_' % content.id.replace(os.path.sep, '_'), dir=tmpdir) with os.fdopen(fd, 'w') as f: data = content.content if isinstance(data, unicode): data = data.encode('utf-8') elif data is None: content.content = u'' data = '' f.write(data) paths[path.encode('utf-8')] = content params = '' editor = os.environ.get('EDITOR', 'vim') if editor == 'vim': params = '-p' os.system("%s %s %s" % (editor, params, ' '.join( ['"%s"' % path.replace('"', '\\"') for path in paths.iterkeys()]))) for path, content in paths.iteritems(): with open(path, 'r') as f: data = f.read() try: data = data.decode('utf-8') except UnicodeError: pass if content.content != data: content.content = data else: contents.remove(content) if len(contents) == 0: print >> sys.stderr, 'No changes. Abort.' return 1 print 'Contents changed:\n%s' % ('\n'.join(' * %s' % content.id for content in contents)) message = self.ask('Enter a commit message', default='') minor = self.ask('Is this a minor edit?', default=False) if not self.ask('Do you want to push?', default=True): return errors = CallErrors([]) for content in contents: path = [path for path, c in paths.iteritems() if c == content][0] sys.stdout.write('Pushing %s...' % content.id.encode('utf-8')) sys.stdout.flush() try: self.do('push_content', content, message, minor=minor, backends=[content.backend]).wait() except CallErrors, e: errors.errors += e.errors sys.stdout.write(' error (content saved in %s)\n' % path) else: sys.stdout.write(' done\n') os.unlink(path)
def do_edit(self, line): """ edit ID [ID...] Edit a content with $EDITOR, then push it on the website. """ contents = [] for id in line.split(): _id, backend_name = self.parse_id(id, unique_backend=True) backend_names = ( backend_name, ) if backend_name is not None else self.enabled_backends contents += [ content for content in self.do( 'get_content', _id, backends=backend_names) if content ] if len(contents) == 0: print('No contents found', file=self.stderr) return 3 if self.stdin.isatty(): paths = {} for content in contents: tmpdir = os.path.join(tempfile.gettempdir(), "weboob") if not os.path.isdir(tmpdir): os.makedirs(tmpdir) with tempfile.NamedTemporaryFile( prefix='%s_' % content.id.replace(os.path.sep, '_'), dir=tmpdir, delete=False) as f: data = content.content if isinstance(data, unicode): data = data.encode('utf-8') elif data is None: content.content = u'' data = '' f.write(data) paths[f.name.encode('utf-8')] = content params = '' editor = os.environ.get('EDITOR', 'vim') # check cases where /usr/bin/vi is a symlink to vim if 'vim' in (os.path.basename(editor), os.path.basename( os.path.realpath(find_executable(editor) or '/')).replace('.nox', '')): params = '-p' os.system( "%s %s %s" % (editor, params, ' '.join('"%s"' % path.replace('"', '\\"') for path in paths))) for path, content in paths.items(): with open(path, 'r') as f: data = f.read() try: data = data.decode('utf-8') except UnicodeError: pass if content.content != data: content.content = data else: contents.remove(content) if len(contents) == 0: print('No changes. Abort.', file=self.stderr) return 1 print('Contents changed:\n%s' % ('\n'.join(' * %s' % content.id for content in contents))) message = self.ask('Enter a commit message', default='') minor = self.ask('Is this a minor edit?', default=False) if not self.ask('Do you want to push?', default=True): return errors = CallErrors([]) for content in contents: path = [path for path, c in paths.items() if c == content][0] self.stdout.write('Pushing %s...' % content.id.encode('utf-8')) self.stdout.flush() try: self.do('push_content', content, message, minor=minor, backends=[content.backend]).wait() except CallErrors as e: errors.errors += e.errors self.stdout.write(' error (content saved in %s)\n' % path) else: self.stdout.write(' done\n') os.unlink(path) else: # stdin is not a tty if len(contents) != 1: print("Multiple ids not supported with pipe", file=self.stderr) return 2 message, minor = '', False data = self.stdin.read() contents[0].content = data.decode(self.guess_encoding(self.stdin)) errors = CallErrors([]) for content in contents: self.stdout.write('Pushing %s...' % content.id.encode(self.encoding)) self.stdout.flush() try: self.do('push_content', content, message, minor=minor, backends=[content.backend]).wait() except CallErrors as e: errors.errors += e.errors self.stdout.write(' error\n') else: self.stdout.write(' done\n') if len(errors.errors) > 0: raise errors