@@ -14,97 +14,97 @@
"""
kallithea.bin.kallithea_api
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Api CLI client for Kallithea
This file was forked by the Kallithea project in July 2014.
Original author and date, and relevant copyright and licensing information is below:
:created_on: Jun 3, 2012
:author: marcink
:copyright: (c) 2013 RhodeCode GmbH, and others.
:license: GPLv3, see LICENSE.md for more details.
import argparse
import json
import sys
from kallithea.bin.base import FORMAT_JSON, FORMAT_PRETTY, RcConf, api_call
def argparser(argv):
usage = (
"kallithea-api [-h] [--format=FORMAT] [--apikey=APIKEY] [--apihost=APIHOST] "
"[--config=CONFIG] [--save-config] "
"METHOD <key:val> <key2:val> ...\n"
"Create config file: kallithea-api --apikey=<key> --apihost=http://kallithea.example.com --save-config"
)
parser = argparse.ArgumentParser(description='Kallithea API cli',
usage=usage)
## config
group = parser.add_argument_group('config')
group.add_argument('--apikey', help='api access key')
group.add_argument('--apihost', help='api host')
group.add_argument('--config', help='config file')
group.add_argument('--save-config', action='store_true', help='save the given config into a file')
group = parser.add_argument_group('API')
group.add_argument('method', metavar='METHOD', nargs='?', type=str, default=None,
help='API method name to call followed by key:value attributes',
group.add_argument('--format', dest='format', type=str,
help='output format default: `%s` can '
'be also `%s`' % (FORMAT_PRETTY, FORMAT_JSON),
default=FORMAT_PRETTY
args, other = parser.parse_known_args(args=argv)
args, other = parser.parse_known_args(args=argv[1:])
return parser, args, other
def main(argv=None):
Main execution function for cli
:param argv:
if argv is None:
argv = sys.argv
conf = None
parser, args, other = argparser(argv)
api_credentials_given = (args.apikey and args.apihost)
if args.save_config:
if not api_credentials_given:
raise parser.error('--save-config requires --apikey and --apihost')
conf = RcConf(config_location=args.config,
autocreate=True, config={'apikey': args.apikey,
'apihost': args.apihost})
sys.exit()
if not conf:
conf = RcConf(config_location=args.config, autoload=True)
parser.error('Could not find config file and missing '
'--apikey or --apihost in params')
apikey = args.apikey or conf['apikey']
apihost = args.apihost or conf['apihost']
method = args.method
# if we don't have method here it's an error
if not method:
parser.error('Please specify method name')
try:
margs = dict(s.split(':', 1) for s in other)
except ValueError:
sys.stderr.write('Error parsing arguments \n')
if args.format == FORMAT_PRETTY:
print('Calling method %s => %s' % (method, apihost))
json_resp = api_call(apikey, apihost, method, **margs)
@@ -23,97 +23,97 @@ Original author and date, and relevant c
import fileinput
import os
import stat
"kallithea-gist [-h] [--format=FORMAT] [--apikey=APIKEY] [--apihost=APIHOST] "
"[--config=CONFIG] [--save-config] [GIST OPTIONS] "
"[filename or stdin use - for terminal stdin ]\n"
"Create config file: kallithea-gist --apikey=<key> --apihost=http://kallithea.example.com --save-config"
parser = argparse.ArgumentParser(description='Kallithea Gist cli',
group.add_argument('--config', help='config file path DEFAULT: ~/.config/kallithea')
group.add_argument('--save-config', action='store_true',
help='save the given config into a file')
group = parser.add_argument_group('GIST')
group.add_argument('-p', '--private', action='store_true',
help='create private Gist')
group.add_argument('-f', '--filename',
help='set uploaded gist filename, '
'also defines syntax highlighting')
group.add_argument('-d', '--description', help='Gist description')
group.add_argument('-l', '--lifetime', metavar='MINUTES',
help='gist lifetime in minutes, -1 (DEFAULT) is forever')
help='output format DEFAULT: `%s` can '
def _run(argv):
host = args.apihost or conf['apihost']
DEFAULT_FILENAME = 'gistfile1.txt'
if other:
# skip multifiles for now
filename = other[0]
if filename == '-':
filename = DEFAULT_FILENAME
gist_content = ''
for line in fileinput.input('-'):
gist_content += line
else:
with open(filename, 'rb') as f:
gist_content = f.read()
gist_content = None
# little bit hacky but cross platform check where the
# stdin comes from we skip the terminal case it can be handled by '-'
mode = os.fstat(0).st_mode
if stat.S_ISFIFO(mode):
# "stdin is piped"
gist_content = sys.stdin.read()
elif stat.S_ISREG(mode):
Status change: