From 32d50483b235e8c786a3482fb8fc35d8f80af2cc Mon Sep 17 00:00:00 2001 From: Amir Sarsenov Date: Sat, 29 Sep 2018 20:08:55 +0200 Subject: [PATCH 1/7] Added "Git Clone" function --- blih.egg-info/PKG-INFO | 75 ++++++ blih.egg-info/SOURCES.txt | 10 + blih.egg-info/dependency_links.txt | 1 + blih.egg-info/entry_points.txt | 3 + blih.egg-info/requires.txt | 1 + blih.egg-info/top_level.txt | 1 + blih/__init__.py | 19 +- blih/__init__.pyc | Bin 0 -> 8793 bytes build/lib/blih/__init__.py | 386 +++++++++++++++++++++++++++++ dist/blih-2.0-py2.7.egg | Bin 0 -> 8359 bytes test_repo | 1 + 11 files changed, 496 insertions(+), 1 deletion(-) create mode 100644 blih.egg-info/PKG-INFO create mode 100644 blih.egg-info/SOURCES.txt create mode 100644 blih.egg-info/dependency_links.txt create mode 100644 blih.egg-info/entry_points.txt create mode 100644 blih.egg-info/requires.txt create mode 100644 blih.egg-info/top_level.txt create mode 100644 blih/__init__.pyc create mode 100644 build/lib/blih/__init__.py create mode 100644 dist/blih-2.0-py2.7.egg create mode 160000 test_repo diff --git a/blih.egg-info/PKG-INFO b/blih.egg-info/PKG-INFO new file mode 100644 index 0000000..af5f415 --- /dev/null +++ b/blih.egg-info/PKG-INFO @@ -0,0 +1,75 @@ +Metadata-Version: 1.1 +Name: blih +Version: 2.0 +Summary: BLIH - Bocal Lightweight Interface for Humans +Home-page: https://github.com/bocal/blih +Author: Emmanuel Vadot +Author-email: elbarto@bocal.org +License: BSD +Description: BLIH - Bocal Lightweight Interface for Humans + ============================================= + + |build-status| + + Script for using the bocal api (BLIH). + + Usage:: + + usage: blih [-h] [-u USER] [-t TOKEN] [-v] {repository,sshkey} ... + + positional arguments: + {repository,sshkey} The main command + repository Manage your repository + sshkey Manage your sshkey + + optional arguments: + -h, --help show this help message and exit + -u USER, --user USER The user + -t TOKEN, --token TOKEN + Specify the token on the command line + -v, --verbose Increase the verbosity level + + Repository :: + + usage: blih repository [-h] {create,delete,info,list,getacl,setacl} ... + + positional arguments: + {create,delete,info,list,getacl,setacl} + The subcommand + create Create a repository + delete Delete a repository + info Get information about a repository + list Get the list of your repositories + getacl Manage repository acls + setacl Get repository acls + + optional arguments: + -h, --help show this help message and exit + + SSHKey :: + + usage: blih sshkey [-h] {upload,list,delete} ... + + positional arguments: + {upload,list,delete} The sshkey subcommand + upload Upload a new sshkey + list List your sshkey(s) + delete Delete a sshkey + + optional arguments: + -h, --help show this help message and exit + + + .. |build-status| image:: https://circleci.com/gh/bocal/blih.svg?&style=shield + :target: https://circleci.com/gh/bocal/blih + +Keywords: blih bocal api +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: End Users/Desktop +Classifier: Topic :: Utilities +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 diff --git a/blih.egg-info/SOURCES.txt b/blih.egg-info/SOURCES.txt new file mode 100644 index 0000000..d1425a2 --- /dev/null +++ b/blih.egg-info/SOURCES.txt @@ -0,0 +1,10 @@ +README.rst +setup.cfg +setup.py +blih/__init__.py +blih.egg-info/PKG-INFO +blih.egg-info/SOURCES.txt +blih.egg-info/dependency_links.txt +blih.egg-info/entry_points.txt +blih.egg-info/requires.txt +blih.egg-info/top_level.txt \ No newline at end of file diff --git a/blih.egg-info/dependency_links.txt b/blih.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/blih.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/blih.egg-info/entry_points.txt b/blih.egg-info/entry_points.txt new file mode 100644 index 0000000..8348d63 --- /dev/null +++ b/blih.egg-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +blih = blih:main + diff --git a/blih.egg-info/requires.txt b/blih.egg-info/requires.txt new file mode 100644 index 0000000..f229360 --- /dev/null +++ b/blih.egg-info/requires.txt @@ -0,0 +1 @@ +requests diff --git a/blih.egg-info/top_level.txt b/blih.egg-info/top_level.txt new file mode 100644 index 0000000..ae8e219 --- /dev/null +++ b/blih.egg-info/top_level.txt @@ -0,0 +1 @@ +blih diff --git a/blih/__init__.py b/blih/__init__.py index 189e0c5..2debe07 100755 --- a/blih/__init__.py +++ b/blih/__init__.py @@ -34,6 +34,7 @@ import sys import os +import git from argparse import ArgumentParser import getpass @@ -230,6 +231,15 @@ def sshkey_delete(user, password, comment, **kwargs): return {'data' : data, 'format' : ''} +# pylint: disable=unused-argument +def clone_from_repository(user, password, name, **kwargs): + """ + Git clone from repository + """ + g = git.cmd.Git(os.getcwd()) + git_url = 'git@git.epitech.eu:/' + user + '/' + name + g.clone(git_url) + #pylint: disable=R0914,too-many-statements def main(): """ @@ -283,7 +293,7 @@ def main(): ) parser_repo_info.add_argument('name', help='The repository name') parser_repo_info.set_defaults(func=repository_info) - + parser_repo_list = subparser_repository.add_parser( 'list', help='Get the list of your repositories' @@ -348,6 +358,13 @@ def main(): parser_sshkey_delete.add_argument('comment', help='The comment of the sshkey file to delete') parser_sshkey_delete.set_defaults(func=sshkey_delete) + parser_clone = subparser.add_parser( + 'clone', + help='Use git clone' + ) + parser_clone.add_argument('name', help='The repository name') + parser_clone.set_defaults(func=clone_from_repository) + argument = parser.parse_args() if argument.password == None: diff --git a/blih/__init__.pyc b/blih/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f71e4caf5945b5bb3f17414cf5272f04f24b24aa GIT binary patch literal 8793 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 oPngsif|SRR5FIZ~<2wYY4Iu@!Z)p5bb+S5 +# All rights reserved +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted providing that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +""" +Bocal Lightweight Interface for Humans +""" + +from __future__ import print_function + +import sys +import os +import git + +from argparse import ArgumentParser +import getpass + +__version__ = '2.0' + +USER_AGENT = 'blih-' + __version__ +API_VERSION = '2.0' +URL = 'https://blih.epitech.eu/' + API_VERSION + +class BlihError(Exception): + """ + Base exception class + """ + pass + +def blih(method, resource, auth, data=None): + """ + Wrapper around requests + """ + try: + import requests + except ImportError: + raise + try: + requests_method = getattr(requests, method) + req = requests_method( + URL + resource, + auth=auth, + headers={'User-Agent' : USER_AGENT}, + data=data + ) + if req.status_code != 204: + data = req.json() + except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): + raise BlihError('Can\'t connect to {0}'.format(URL)) + except requests.exceptions.HTTPError: + raise BlihError('An HTTP Error occured') + except ValueError: + raise BlihError('Unknown Error') + + if req.status_code in [400, 401, 403, 404, 405, 409]: + raise BlihError(data['message']) + + return data + +# pylint: disable=unused-argument +def repository_create(user, password, name, **kwargs): + """ + Create a repository + """ + data = blih( + 'post', + '/repositories', + (user, password), + data={'name' : name, 'type' : 'git'} + ) + + return {data : data} + +# pylint: disable=unused-argument +def repository_delete(user, password, name, **kwargs): + """ + Delete a repository + """ + data = blih( + 'delete', + '/repository/' + name, + (user, password) + ) + + return {data : data} + +# pylint: disable=unused-argument +def repository_info(user, password, name, **kwargs): + """ + Get some info about a repository + """ + data = blih( + 'get', + '/repository/' + name, + (user, password) + ) + + return {data : data} + +# pylint: disable=unused-argument +def repository_list(user, password, **kwargs): + """ + List the users repositories + """ + data = blih( + 'get', + '/repositories', + (user, password) + ) + + return {data : data} + +# pylint: disable=unused-argument +def repository_getacl(user, password, name, **kwargs): + """ + Get the defined acls for one repo + """ + data = blih( + 'get', + '/repository/' + name + '/acls', + (user, password) + ) + + return {data : data} + +# pylint: disable=unused-argument +def repository_setacl(user, password, name, user_acl, acl, **kwargs): + """ + Set some acls on one repository + """ + data = blih( + 'post', + '/repository/' + name + '/acls', + (user, password), + data={'user' : user_acl, 'acl' : acl} + ) + + return {data : data} + +# pylint: disable=unused-argument +def sshkey_upload(user, password, keyfile, **kwargs): + """ + Upload a new sshkey + """ + try: + handle = open(keyfile, 'r') + except (OSError, IOError): + raise BlihError('File {0} not found'.format(keyfile)) + + keydata = handle.read().strip('\n') + handle.close() + + try: + keytype, key, comment = keydata.split(' ') + except ValueError: + raise + + data = blih( + 'post', + '/sshkeys', + (user, password), + data={'key' : keytype + ' ' + key, 'comment' : comment} + ) + + return {'data' : data, + 'format' : '{key} {comment}'} + +# pylint: disable=unused-argument +def sshkey_list(user, password, **kwargs): + """ + List the sshkeys + """ + data = blih( + 'get', + '/sshkeys', + (user, password) + ) + + return {'data' : data, + 'format' : '{key} {comment}'} + +# pylint: disable=unused-argument +def sshkey_get(user, password, comment, **kwargs): + """ + Get a sshkey + """ + data = blih( + 'get', + '/sshkeys/' + comment, + (user, password) + ) + + return {'data' : data, + 'format' : '{key} {comment}'} + +# pylint: disable=unused-argument +def sshkey_delete(user, password, comment, **kwargs): + """ + Delete a sshkey + """ + data = blih( + 'delete', + '/sshkeys/' + comment, + (user, password) + ) + + return {'data' : data, + 'format' : ''} + +# pylint: disable=unused-argument +def clone_from_repository(user, password, name, **kwargs): + """ + Git clone from repository + """ + g = git.cmd.Git(os.getcwd()) + git_url = 'git@git.epitech.eu:/' + user + '/' + name + g.clone(git_url) +#pylint: disable=R0914,too-many-statements +def main(): + """ + Main entry point + """ + + parser = ArgumentParser() + parser.add_argument( + '-u', '--user', + help='The user', + default=os.environ.get('BLIH_USER', getpass.getuser()) + ) + parser.add_argument( + '-t', '--password', + help='Specify the password on the command line', + default=os.environ.get('BLIH_PASSWORD', None) + ) + + subparser = parser.add_subparsers(dest='command', help='The main command') + subparser.required = True + + # Create the subparser for the repository argument + parser_repository = subparser.add_parser( + 'repository', + help='Manage your repository' + ) + subparser_repository = parser_repository.add_subparsers( + dest='subcommand', + help='The subcommand' + ) + subparser_repository.required = True + + # Create the subparser for the repository create command + parser_repo_create = subparser_repository.add_parser( + 'create', + help='Create a repository' + ) + parser_repo_create.add_argument('name', help='The repository name') + parser_repo_create.set_defaults(func=repository_create) + + parser_repo_delete = subparser_repository.add_parser( + 'delete', + help='Delete a repository' + ) + parser_repo_delete.add_argument('name', help='The repository name') + parser_repo_delete.set_defaults(func=repository_delete) + + parser_repo_info = subparser_repository.add_parser( + 'info', + help='Get information about a repository' + ) + parser_repo_info.add_argument('name', help='The repository name') + parser_repo_info.set_defaults(func=repository_info) + + parser_repo_list = subparser_repository.add_parser( + 'list', + help='Get the list of your repositories' + ) + parser_repo_list.set_defaults(func=repository_list) + + parser_repo_getacl = subparser_repository.add_parser( + 'getacl', + help='Manage repository acls' + ) + parser_repo_getacl.add_argument('name', help='The repository name') + parser_repo_getacl.set_defaults(func=repository_getacl) + + parser_repo_setacl = subparser_repository.add_parser( + 'setacl', + help='Get repository acls' + ) + parser_repo_setacl.add_argument('name', help='The repository name') + parser_repo_setacl.add_argument('user_acl', help='The user to apply acls to') + parser_repo_setacl.add_argument('acl', help='The acl (r or w)') + parser_repo_setacl.set_defaults(func=repository_setacl) + + parser_sshkey = subparser.add_parser( + 'sshkey', + help='Manage your sshkey' + ) + subparser_sshkey = parser_sshkey.add_subparsers( + dest='subcommand', + help='The sshkey subcommand' + ) + subparser_sshkey.required = True + + parser_sshkey_upload = subparser_sshkey.add_parser( + 'upload', + help='Upload a new sshkey' + ) + parser_sshkey_upload.add_argument( + 'keyfile', + help='The sshkey file to upload', + nargs='?', + default=os.getenv('HOME') + '/.ssh/id_rsa.pub' + ) + parser_sshkey_upload.set_defaults(func=sshkey_upload) + + parser_sshkey_list = subparser_sshkey.add_parser( + 'list', + help='List your sshkey(s)' + ) + parser_sshkey_list.set_defaults(func=sshkey_list) + + parser_sshkey_get = subparser_sshkey.add_parser( + 'get', + help='Get a sshkey' + ) + parser_sshkey_get.add_argument('comment', help='The sshkey comment') + parser_sshkey_get.set_defaults(func=sshkey_get) + + parser_sshkey_delete = subparser_sshkey.add_parser( + 'delete', + help='Delete a sshkey' + ) + parser_sshkey_delete.add_argument('comment', help='The comment of the sshkey file to delete') + parser_sshkey_delete.set_defaults(func=sshkey_delete) + + parser_clone = subparser.add_parser( + 'clone', + help='Use git clone' + ) + parser_clone.add_argument('name', help='The repository name') + parser_clone.set_defaults(func=clone_from_repository) + + argument = parser.parse_args() + + if argument.password == None: + try: + argument.password = getpass.getpass() + except KeyboardInterrupt: + sys.exit(1) + + try: + ret = argument.func(**vars(argument)) + except BlihError as err: + print('Error: {0}'.format(err)) + sys.exit(1) + + if ret['data']: + if isinstance(ret['data'], list): + for item in ret['data']: + print(ret['format'].format(**item)) + elif isinstance(ret['data'], dict): + print(ret['format'].format(**ret['data'])) diff --git a/dist/blih-2.0-py2.7.egg b/dist/blih-2.0-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..9fc4782323ef9ab13dc60ac9c64813976de0bffe GIT binary patch literal 8359 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 literal 0 HcmV?d00001 diff --git a/test_repo b/test_repo new file mode 160000 index 0000000..6bec44a --- /dev/null +++ b/test_repo @@ -0,0 +1 @@ +Subproject commit 6bec44afa3c4dd9bb9c226265b62a0993cb97d6d From ae1b1760308750c8630e5ffbaa53b49eda81dd7c Mon Sep 17 00:00:00 2001 From: Amir Sarsenov Date: Sat, 29 Sep 2018 20:11:50 +0200 Subject: [PATCH 2/7] --- blih.egg-info/PKG-INFO | 75 ------ blih.egg-info/SOURCES.txt | 10 - blih.egg-info/dependency_links.txt | 1 - blih.egg-info/entry_points.txt | 3 - blih.egg-info/requires.txt | 1 - blih.egg-info/top_level.txt | 1 - build/lib/blih/__init__.py | 386 ----------------------------- dist/blih-2.0-py2.7.egg | Bin 8359 -> 0 bytes test_repo | 1 - 9 files changed, 478 deletions(-) delete mode 100644 blih.egg-info/PKG-INFO delete mode 100644 blih.egg-info/SOURCES.txt delete mode 100644 blih.egg-info/dependency_links.txt delete mode 100644 blih.egg-info/entry_points.txt delete mode 100644 blih.egg-info/requires.txt delete mode 100644 blih.egg-info/top_level.txt delete mode 100644 build/lib/blih/__init__.py delete mode 100644 dist/blih-2.0-py2.7.egg delete mode 160000 test_repo diff --git a/blih.egg-info/PKG-INFO b/blih.egg-info/PKG-INFO deleted file mode 100644 index af5f415..0000000 --- a/blih.egg-info/PKG-INFO +++ /dev/null @@ -1,75 +0,0 @@ -Metadata-Version: 1.1 -Name: blih -Version: 2.0 -Summary: BLIH - Bocal Lightweight Interface for Humans -Home-page: https://github.com/bocal/blih -Author: Emmanuel Vadot -Author-email: elbarto@bocal.org -License: BSD -Description: BLIH - Bocal Lightweight Interface for Humans - ============================================= - - |build-status| - - Script for using the bocal api (BLIH). - - Usage:: - - usage: blih [-h] [-u USER] [-t TOKEN] [-v] {repository,sshkey} ... - - positional arguments: - {repository,sshkey} The main command - repository Manage your repository - sshkey Manage your sshkey - - optional arguments: - -h, --help show this help message and exit - -u USER, --user USER The user - -t TOKEN, --token TOKEN - Specify the token on the command line - -v, --verbose Increase the verbosity level - - Repository :: - - usage: blih repository [-h] {create,delete,info,list,getacl,setacl} ... - - positional arguments: - {create,delete,info,list,getacl,setacl} - The subcommand - create Create a repository - delete Delete a repository - info Get information about a repository - list Get the list of your repositories - getacl Manage repository acls - setacl Get repository acls - - optional arguments: - -h, --help show this help message and exit - - SSHKey :: - - usage: blih sshkey [-h] {upload,list,delete} ... - - positional arguments: - {upload,list,delete} The sshkey subcommand - upload Upload a new sshkey - list List your sshkey(s) - delete Delete a sshkey - - optional arguments: - -h, --help show this help message and exit - - - .. |build-status| image:: https://circleci.com/gh/bocal/blih.svg?&style=shield - :target: https://circleci.com/gh/bocal/blih - -Keywords: blih bocal api -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Intended Audience :: End Users/Desktop -Classifier: Topic :: Utilities -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 diff --git a/blih.egg-info/SOURCES.txt b/blih.egg-info/SOURCES.txt deleted file mode 100644 index d1425a2..0000000 --- a/blih.egg-info/SOURCES.txt +++ /dev/null @@ -1,10 +0,0 @@ -README.rst -setup.cfg -setup.py -blih/__init__.py -blih.egg-info/PKG-INFO -blih.egg-info/SOURCES.txt -blih.egg-info/dependency_links.txt -blih.egg-info/entry_points.txt -blih.egg-info/requires.txt -blih.egg-info/top_level.txt \ No newline at end of file diff --git a/blih.egg-info/dependency_links.txt b/blih.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/blih.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/blih.egg-info/entry_points.txt b/blih.egg-info/entry_points.txt deleted file mode 100644 index 8348d63..0000000 --- a/blih.egg-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -blih = blih:main - diff --git a/blih.egg-info/requires.txt b/blih.egg-info/requires.txt deleted file mode 100644 index f229360..0000000 --- a/blih.egg-info/requires.txt +++ /dev/null @@ -1 +0,0 @@ -requests diff --git a/blih.egg-info/top_level.txt b/blih.egg-info/top_level.txt deleted file mode 100644 index ae8e219..0000000 --- a/blih.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -blih diff --git a/build/lib/blih/__init__.py b/build/lib/blih/__init__.py deleted file mode 100644 index a865db4..0000000 --- a/build/lib/blih/__init__.py +++ /dev/null @@ -1,386 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -#- -# Copyright 2013-2015 Emmanuel Vadot -# All rights reserved -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted providing that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -""" -Bocal Lightweight Interface for Humans -""" - -from __future__ import print_function - -import sys -import os -import git - -from argparse import ArgumentParser -import getpass - -__version__ = '2.0' - -USER_AGENT = 'blih-' + __version__ -API_VERSION = '2.0' -URL = 'https://blih.epitech.eu/' + API_VERSION - -class BlihError(Exception): - """ - Base exception class - """ - pass - -def blih(method, resource, auth, data=None): - """ - Wrapper around requests - """ - try: - import requests - except ImportError: - raise - try: - requests_method = getattr(requests, method) - req = requests_method( - URL + resource, - auth=auth, - headers={'User-Agent' : USER_AGENT}, - data=data - ) - if req.status_code != 204: - data = req.json() - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): - raise BlihError('Can\'t connect to {0}'.format(URL)) - except requests.exceptions.HTTPError: - raise BlihError('An HTTP Error occured') - except ValueError: - raise BlihError('Unknown Error') - - if req.status_code in [400, 401, 403, 404, 405, 409]: - raise BlihError(data['message']) - - return data - -# pylint: disable=unused-argument -def repository_create(user, password, name, **kwargs): - """ - Create a repository - """ - data = blih( - 'post', - '/repositories', - (user, password), - data={'name' : name, 'type' : 'git'} - ) - - return {data : data} - -# pylint: disable=unused-argument -def repository_delete(user, password, name, **kwargs): - """ - Delete a repository - """ - data = blih( - 'delete', - '/repository/' + name, - (user, password) - ) - - return {data : data} - -# pylint: disable=unused-argument -def repository_info(user, password, name, **kwargs): - """ - Get some info about a repository - """ - data = blih( - 'get', - '/repository/' + name, - (user, password) - ) - - return {data : data} - -# pylint: disable=unused-argument -def repository_list(user, password, **kwargs): - """ - List the users repositories - """ - data = blih( - 'get', - '/repositories', - (user, password) - ) - - return {data : data} - -# pylint: disable=unused-argument -def repository_getacl(user, password, name, **kwargs): - """ - Get the defined acls for one repo - """ - data = blih( - 'get', - '/repository/' + name + '/acls', - (user, password) - ) - - return {data : data} - -# pylint: disable=unused-argument -def repository_setacl(user, password, name, user_acl, acl, **kwargs): - """ - Set some acls on one repository - """ - data = blih( - 'post', - '/repository/' + name + '/acls', - (user, password), - data={'user' : user_acl, 'acl' : acl} - ) - - return {data : data} - -# pylint: disable=unused-argument -def sshkey_upload(user, password, keyfile, **kwargs): - """ - Upload a new sshkey - """ - try: - handle = open(keyfile, 'r') - except (OSError, IOError): - raise BlihError('File {0} not found'.format(keyfile)) - - keydata = handle.read().strip('\n') - handle.close() - - try: - keytype, key, comment = keydata.split(' ') - except ValueError: - raise - - data = blih( - 'post', - '/sshkeys', - (user, password), - data={'key' : keytype + ' ' + key, 'comment' : comment} - ) - - return {'data' : data, - 'format' : '{key} {comment}'} - -# pylint: disable=unused-argument -def sshkey_list(user, password, **kwargs): - """ - List the sshkeys - """ - data = blih( - 'get', - '/sshkeys', - (user, password) - ) - - return {'data' : data, - 'format' : '{key} {comment}'} - -# pylint: disable=unused-argument -def sshkey_get(user, password, comment, **kwargs): - """ - Get a sshkey - """ - data = blih( - 'get', - '/sshkeys/' + comment, - (user, password) - ) - - return {'data' : data, - 'format' : '{key} {comment}'} - -# pylint: disable=unused-argument -def sshkey_delete(user, password, comment, **kwargs): - """ - Delete a sshkey - """ - data = blih( - 'delete', - '/sshkeys/' + comment, - (user, password) - ) - - return {'data' : data, - 'format' : ''} - -# pylint: disable=unused-argument -def clone_from_repository(user, password, name, **kwargs): - """ - Git clone from repository - """ - g = git.cmd.Git(os.getcwd()) - git_url = 'git@git.epitech.eu:/' + user + '/' + name - g.clone(git_url) -#pylint: disable=R0914,too-many-statements -def main(): - """ - Main entry point - """ - - parser = ArgumentParser() - parser.add_argument( - '-u', '--user', - help='The user', - default=os.environ.get('BLIH_USER', getpass.getuser()) - ) - parser.add_argument( - '-t', '--password', - help='Specify the password on the command line', - default=os.environ.get('BLIH_PASSWORD', None) - ) - - subparser = parser.add_subparsers(dest='command', help='The main command') - subparser.required = True - - # Create the subparser for the repository argument - parser_repository = subparser.add_parser( - 'repository', - help='Manage your repository' - ) - subparser_repository = parser_repository.add_subparsers( - dest='subcommand', - help='The subcommand' - ) - subparser_repository.required = True - - # Create the subparser for the repository create command - parser_repo_create = subparser_repository.add_parser( - 'create', - help='Create a repository' - ) - parser_repo_create.add_argument('name', help='The repository name') - parser_repo_create.set_defaults(func=repository_create) - - parser_repo_delete = subparser_repository.add_parser( - 'delete', - help='Delete a repository' - ) - parser_repo_delete.add_argument('name', help='The repository name') - parser_repo_delete.set_defaults(func=repository_delete) - - parser_repo_info = subparser_repository.add_parser( - 'info', - help='Get information about a repository' - ) - parser_repo_info.add_argument('name', help='The repository name') - parser_repo_info.set_defaults(func=repository_info) - - parser_repo_list = subparser_repository.add_parser( - 'list', - help='Get the list of your repositories' - ) - parser_repo_list.set_defaults(func=repository_list) - - parser_repo_getacl = subparser_repository.add_parser( - 'getacl', - help='Manage repository acls' - ) - parser_repo_getacl.add_argument('name', help='The repository name') - parser_repo_getacl.set_defaults(func=repository_getacl) - - parser_repo_setacl = subparser_repository.add_parser( - 'setacl', - help='Get repository acls' - ) - parser_repo_setacl.add_argument('name', help='The repository name') - parser_repo_setacl.add_argument('user_acl', help='The user to apply acls to') - parser_repo_setacl.add_argument('acl', help='The acl (r or w)') - parser_repo_setacl.set_defaults(func=repository_setacl) - - parser_sshkey = subparser.add_parser( - 'sshkey', - help='Manage your sshkey' - ) - subparser_sshkey = parser_sshkey.add_subparsers( - dest='subcommand', - help='The sshkey subcommand' - ) - subparser_sshkey.required = True - - parser_sshkey_upload = subparser_sshkey.add_parser( - 'upload', - help='Upload a new sshkey' - ) - parser_sshkey_upload.add_argument( - 'keyfile', - help='The sshkey file to upload', - nargs='?', - default=os.getenv('HOME') + '/.ssh/id_rsa.pub' - ) - parser_sshkey_upload.set_defaults(func=sshkey_upload) - - parser_sshkey_list = subparser_sshkey.add_parser( - 'list', - help='List your sshkey(s)' - ) - parser_sshkey_list.set_defaults(func=sshkey_list) - - parser_sshkey_get = subparser_sshkey.add_parser( - 'get', - help='Get a sshkey' - ) - parser_sshkey_get.add_argument('comment', help='The sshkey comment') - parser_sshkey_get.set_defaults(func=sshkey_get) - - parser_sshkey_delete = subparser_sshkey.add_parser( - 'delete', - help='Delete a sshkey' - ) - parser_sshkey_delete.add_argument('comment', help='The comment of the sshkey file to delete') - parser_sshkey_delete.set_defaults(func=sshkey_delete) - - parser_clone = subparser.add_parser( - 'clone', - help='Use git clone' - ) - parser_clone.add_argument('name', help='The repository name') - parser_clone.set_defaults(func=clone_from_repository) - - argument = parser.parse_args() - - if argument.password == None: - try: - argument.password = getpass.getpass() - except KeyboardInterrupt: - sys.exit(1) - - try: - ret = argument.func(**vars(argument)) - except BlihError as err: - print('Error: {0}'.format(err)) - sys.exit(1) - - if ret['data']: - if isinstance(ret['data'], list): - for item in ret['data']: - print(ret['format'].format(**item)) - elif isinstance(ret['data'], dict): - print(ret['format'].format(**ret['data'])) diff --git a/dist/blih-2.0-py2.7.egg b/dist/blih-2.0-py2.7.egg deleted file mode 100644 index 9fc4782323ef9ab13dc60ac9c64813976de0bffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8359 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 diff --git a/test_repo b/test_repo deleted file mode 160000 index 6bec44a..0000000 --- a/test_repo +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6bec44afa3c4dd9bb9c226265b62a0993cb97d6d From fb5165b44a7bcf49ed4ce937f7c109e905c3a27f Mon Sep 17 00:00:00 2001 From: Amir Sarsenov Date: Sat, 29 Sep 2018 20:15:35 +0200 Subject: [PATCH 3/7] Clone command functionality --- README.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.rst b/README.rst index 6178770..924b4f8 100644 --- a/README.rst +++ b/README.rst @@ -13,6 +13,7 @@ Usage:: {repository,sshkey} The main command repository Manage your repository sshkey Manage your sshkey + clone Clone your repository optional arguments: -h, --help show this help message and exit @@ -51,6 +52,14 @@ SSHKey :: optional arguments: -h, --help show this help message and exit +Clone :: + +usage: blih clone {name} ... + +positional arguments: + {name} The clone subcommand + name Name of your repository + .. |build-status| image:: https://circleci.com/gh/bocal/blih.svg?&style=shield :target: https://circleci.com/gh/bocal/blih From ee86c744956cb57f45c6d777b7623036008dc91b Mon Sep 17 00:00:00 2001 From: Amir Sarsenov Date: Sat, 29 Sep 2018 20:18:26 +0200 Subject: [PATCH 4/7] "Clone" command functionality --- README.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 924b4f8..6629bb9 100644 --- a/README.rst +++ b/README.rst @@ -54,10 +54,9 @@ SSHKey :: Clone :: -usage: blih clone {name} ... + usage: blih clone {name} ... -positional arguments: - {name} The clone subcommand + positional arguments: name Name of your repository From a80813389cb83b383368a7cd26b7152c8b045b11 Mon Sep 17 00:00:00 2001 From: Amir Sarsenov Date: Sun, 30 Sep 2018 04:03:39 +0200 Subject: [PATCH 5/7] Added "Add, Commit and Push" functionality three-in-one --- .vscode/settings.json | 4 ++++ README.rst | 10 ++++++++-- blih/__init__.py | 27 ++++++++++++++++++++++++++- blih/__init__.pyc | Bin 8793 -> 9334 bytes 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6196547 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python.pythonPath": "/usr/bin/python3", + "python.linting.pylintEnabled": false +} \ No newline at end of file diff --git a/README.rst b/README.rst index 6629bb9..999febb 100644 --- a/README.rst +++ b/README.rst @@ -14,6 +14,7 @@ Usage:: repository Manage your repository sshkey Manage your sshkey clone Clone your repository + push Add, commit and push to your repository optional arguments: -h, --help show this help message and exit @@ -54,10 +55,15 @@ SSHKey :: Clone :: - usage: blih clone {name} ... + usage: blih clone ... positional arguments: - name Name of your repository + Name of your repository + +Push :: + usage: blih push ... + + Message of your commit .. |build-status| image:: https://circleci.com/gh/bocal/blih.svg?&style=shield diff --git a/blih/__init__.py b/blih/__init__.py index 2debe07..f2bbcfc 100755 --- a/blih/__init__.py +++ b/blih/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- #- @@ -239,6 +239,22 @@ def clone_from_repository(user, password, name, **kwargs): g = git.cmd.Git(os.getcwd()) git_url = 'git@git.epitech.eu:/' + user + '/' + name g.clone(git_url) + +#pylink: disable=unused-argument +def push_to_repository(user, password, message, **kwargs): + """ + Git add, commit and push to repository + """ + repo = git.Repo(os.getcwd()) + # files = repo.git.diff(None, name_only=True) + # for f in files.split('\n'): + # show_diff(f) + # repo.git.add(f) + repo.git.add(A=True) + + repo.git.commit('-m', message) + repo.git.push('origin', 'master') + #pylint: disable=R0914,too-many-statements def main(): @@ -358,6 +374,8 @@ def main(): parser_sshkey_delete.add_argument('comment', help='The comment of the sshkey file to delete') parser_sshkey_delete.set_defaults(func=sshkey_delete) + # Git functionality in BLIH + parser_clone = subparser.add_parser( 'clone', help='Use git clone' @@ -365,6 +383,13 @@ def main(): parser_clone.add_argument('name', help='The repository name') parser_clone.set_defaults(func=clone_from_repository) + parser_push = subparser.add_parser( + 'push', + help='Use git push' + ) + parser_push.add_argument('message', help='Commit message') + parser_push.set_defaults(func=push_to_repository) + argument = parser.parse_args() if argument.password == None: diff --git a/blih/__init__.pyc b/blih/__init__.pyc index f71e4caf5945b5bb3f17414cf5272f04f24b24aa..1f7e4eba143fa85e3796198afc136ddd577b6236 100644 GIT binary patch delta 970 zcmY*XUr!T35TCu`6uT@ zD$rdf?m1u}hd-x!*x(qv26&nVVL~x`zMW--_&&Kr@TYx+Tpd&tfX6@?;F-_@XfbGV zXmIcl=OEA&L7cHJ6a`^G!+@3nC(s#6B6tXi2&Ri7t(-&AXW@F_DyuBSRcpWE*J^aA z3u}8Z*FtU?)CIl&Sma5=bBy1ABBqmXW9&{&tt!Hr|h6uTrlwbOH(O-y4 zx&!c$NZg3C3hATx6U{xU>lghdQDXV_x5Sva&%o;kaWgE^0@jx`hoLb{MHh=9c#A+r z&;W>0P{~fcvHlmRBh45zV&J7fbFQAhqd~3;K~l8S2$}XfT>9kcfh*{jRg7O_a7x5 z>I~K!aS%(83=X)u1l@z0qA>_Q@Ru81=y`H^BMr?FKuU7TL6T@kC^ymWD89CHiefsX zK!UPPh{2F#4)4Jg`Jgy)R)fe)v8jKH}#Kk zn_bqibS2_ELZg0__6?_~zo(bjhQ5-S8!90h4ufzjDm&VCGcFtIM{v6w$ZAj`a(y`A zMmbKb{Hk--N5=J$b%SN}key~y&)ODqb-~WFE&blkMT;2hywivFDx25Slk;Y8@43H2 COvz{f delta 542 zcmY*VJxgOj6g}5Bkr)s$FB+1V4-*Y3ws3c=-Hj44g@tU9C=o=SAuqalLe!TDY#_lR zY-u$qtSz=(B(;Twjra$)*?z%FK`g!V)FK0OX6`-bp1E_M*8dh`#^Yolef4LjhPP$# zSpcEszl{0GXP}%54?og(GpGeKyeD|CX~nsU&swxR?9GOaQ^1L!5A>$dorV*Iy^O;# zxHm?}g!IAjX_hG~ipt52A!H1P0l3!&5y?3?aoAtbClHg{O`sF;j1rJZePQN|-Git! zKSRirS8NLEnIJijQ~N8NG`gl1YL^kqCSki9g#8T>cOYa2Z-HDupL^UBKX>0##oai1 zA+V*^As$FMw=#T)-WlpXk)o`cOx7l( z;Bjuc?Ye3wkJSHUp2{klTAJG8w8z!}8*fAc@aADL*~s*Uu8dQN{R#5pYa zv^c Date: Sun, 30 Sep 2018 04:05:27 +0200 Subject: [PATCH 6/7] Added "Add, Commit and Push" functionality three-in-one --- .vscode/settings.json | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 6196547..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "python.pythonPath": "/usr/bin/python3", - "python.linting.pylintEnabled": false -} \ No newline at end of file From e0622db7c9bb57e8777a0757172ecfd9b433ba00 Mon Sep 17 00:00:00 2001 From: Amir Sarsenov Date: Sun, 30 Sep 2018 04:09:37 +0200 Subject: [PATCH 7/7] Added "Add, Commit and Push" functionality three-in-one --- README.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 999febb..9bca125 100644 --- a/README.rst +++ b/README.rst @@ -61,9 +61,11 @@ Clone :: Name of your repository Push :: + usage: blih push ... - Message of your commit + positional arguments: + Message of your commit .. |build-status| image:: https://circleci.com/gh/bocal/blih.svg?&style=shield