add non tty stdin support to edit command in webcontentedit

Signed-off-by: Laurent Bachelier <laurent@bachelier.name>
This commit is contained in:
Goffi 2013-03-09 14:47:40 +01:00 committed by Laurent Bachelier
commit 19a89c9a9e

View file

@ -24,6 +24,7 @@ from __future__ import with_statement
import os import os
import sys import sys
import tempfile import tempfile
import locale
from weboob.core.bcall import CallErrors from weboob.core.bcall import CallErrors
from weboob.capabilities.content import ICapContent from weboob.capabilities.content import ICapContent
@ -58,64 +59,87 @@ class WebContentEdit(ReplApplication):
print >>sys.stderr, 'No contents found' print >>sys.stderr, 'No contents found'
return 3 return 3
paths = {} if sys.stdin.isatty():
for content in contents: paths = {}
tmpdir = os.path.join(tempfile.gettempdir(), "weboob") for content in contents:
if not os.path.isdir(tmpdir): tmpdir = os.path.join(tempfile.gettempdir(), "weboob")
os.makedirs(tmpdir) if not os.path.isdir(tmpdir):
fd, path = tempfile.mkstemp(prefix='%s_' % content.id.replace(os.path.sep, '_'), dir=tmpdir) os.makedirs(tmpdir)
with os.fdopen(fd, 'w') as f: fd, path = tempfile.mkstemp(prefix='%s_' % content.id.replace(os.path.sep, '_'), dir=tmpdir)
data = content.content with os.fdopen(fd, 'w') as f:
if isinstance(data, unicode): data = content.content
data = data.encode('utf-8') if isinstance(data, unicode):
elif data is None: data = data.encode('utf-8')
content.content = u'' elif data is None:
data = '' content.content = u''
f.write(data) data = ''
paths[path.encode('utf-8')] = content f.write(data)
paths[path.encode('utf-8')] = content
params = '' params = ''
editor = os.environ.get('EDITOR', 'vim') editor = os.environ.get('EDITOR', 'vim')
if editor == 'vim': if editor == 'vim':
params = '-p' params = '-p'
os.system("%s %s %s" % (editor, params, ' '.join(['"%s"' % path.replace('"', '\\"') for path in paths.iterkeys()]))) os.system("%s %s %s" % (editor, params, ' '.join(['"%s"' % path.replace('"', '\\"') for path in paths.iterkeys()])))
for path, content in paths.iteritems(): for path, content in paths.iteritems():
with open(path, 'r') as f: with open(path, 'r') as f:
data = f.read() 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: try:
data = data.decode('utf-8') self.do('push_content', content, message, minor=minor, backends=[content.backend]).wait()
except UnicodeError: except CallErrors, e:
pass errors.errors += e.errors
if content.content != data: sys.stdout.write(' error (content saved in %s)\n' % path)
content.content = data else:
else: sys.stdout.write(' done\n')
contents.remove(content) os.unlink(path)
else:
# stdin is not a tty
if len(contents) == 0: if len(contents) != 1:
print >>sys.stderr, 'No changes. Abort.' print >>sys.stderr, "Multiple ids not supported with pipe"
return 1 return 2
print 'Contents changed:\n%s' % ('\n'.join(' * %s' % content.id for content in contents)) message, minor = '', False
data = sys.stdin.read()
contents[0].content = data.decode(sys.stdin.encoding or locale.getpreferredencoding())
message = self.ask('Enter a commit message', default='') errors = CallErrors([])
minor = self.ask('Is this a minor edit?', default=False) for content in contents:
if not self.ask('Do you want to push?', default=True): sys.stdout.write('Pushing %s...' % content.id.encode('utf-8'))
return sys.stdout.flush()
try:
errors = CallErrors([]) self.do('push_content', content, message, minor=minor, backends=[content.backend]).wait()
for content in contents: except CallErrors, e:
path = [path for path, c in paths.iteritems() if c == content][0] errors.errors += e.errors
sys.stdout.write('Pushing %s...' % content.id.encode('utf-8')) sys.stdout.write(' error\n')
sys.stdout.flush() else:
try: sys.stdout.write(' done\n')
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)
if len(errors.errors) > 0: if len(errors.errors) > 0:
raise errors raise errors