add_artifact.py
104 lines
| 3.6 KiB
| text/x-python
|
PythonLexer
r5608 | # Copyright (C) 2016-2024 RhodeCode GmbH | |||
r4005 | # | |||
# This program is free software: you can redistribute it and/or modify | ||||
# it under the terms of the GNU Affero General Public License, version 3 | ||||
# (only), as published by the Free Software Foundation. | ||||
# | ||||
# This program is distributed in the hope that it will be useful, | ||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
# GNU General Public License for more details. | ||||
# | ||||
# You should have received a copy of the GNU Affero General Public License | ||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
# | ||||
# This program is dual-licensed. If you wish to learn more about the | ||||
# RhodeCode Enterprise Edition, including its added features, Support services, | ||||
# and proprietary license terms, please see https://rhodecode.com/licenses/ | ||||
import sys | ||||
import logging | ||||
import click | ||||
from rhodecode.lib.pyramid_utils import bootstrap | ||||
from rhodecode.model.db import Session, User, Repository | ||||
from rhodecode.model.user import UserModel | ||||
from rhodecode.apps.file_store import utils as store_utils | ||||
log = logging.getLogger(__name__) | ||||
@click.command() | ||||
@click.argument('ini_path', type=click.Path(exists=True)) | ||||
@click.option( | ||||
'--filename', | ||||
required=True, | ||||
help='Filename for artifact.') | ||||
@click.option( | ||||
'--file-path', | ||||
required=True, | ||||
type=click.Path(exists=True, dir_okay=False, readable=True), | ||||
help='Path to a file to be added as artifact') | ||||
@click.option( | ||||
'--repo-id', | ||||
required=True, | ||||
type=int, | ||||
help='ID of repository to add this artifact to.') | ||||
@click.option( | ||||
'--user-id', | ||||
default=None, | ||||
type=int, | ||||
help='User ID for creator of artifact. ' | ||||
'Default would be first super admin.') | ||||
@click.option( | ||||
'--description', | ||||
default=None, | ||||
type=str, | ||||
help='Add description to this artifact') | ||||
def main(ini_path, filename, file_path, repo_id, user_id, description): | ||||
return command(ini_path, filename, file_path, repo_id, user_id, description) | ||||
def command(ini_path, filename, file_path, repo_id, user_id, description): | ||||
with bootstrap(ini_path, env={'RC_CMD_SETUP_RC': '1'}) as env: | ||||
try: | ||||
from rc_ee.api.views.store_api import _store_file | ||||
except ImportError: | ||||
click.secho('ERROR: Unable to import store_api. ' | ||||
'store_api is only available in EE edition of RhodeCode', | ||||
fg='red') | ||||
sys.exit(-1) | ||||
request = env['request'] | ||||
repo = Repository.get(repo_id) | ||||
if not repo: | ||||
r5096 | click.secho(f'ERROR: Unable to find repository with id `{repo_id}`', | |||
r4005 | fg='red') | |||
sys.exit(-1) | ||||
# if we don't give user, or it's "DEFAULT" user we pick super-admin | ||||
if user_id is not None or user_id == 1: | ||||
db_user = User.get(user_id) | ||||
else: | ||||
db_user = User.get_first_super_admin() | ||||
if not db_user: | ||||
r5096 | click.secho(f'ERROR: Unable to find user with id/username `{user_id}`', | |||
r4005 | fg='red') | |||
sys.exit(-1) | ||||
auth_user = db_user.AuthUser(ip_addr='127.0.0.1') | ||||
r5516 | f_store = store_utils.get_filestore_backend(request.registry.settings) | |||
r4005 | ||||
with open(file_path, 'rb') as f: | ||||
r5096 | click.secho(f'Adding new artifact from path: `{file_path}`', | |||
r4005 | fg='green') | |||
file_data = _store_file( | ||||
r5516 | f_store, auth_user, filename, content=None, check_acl=True, | |||
r4005 | file_obj=f, description=description, | |||
scope_repo_id=repo.repo_id) | ||||
r5516 | click.secho(f'File Data: {file_data}', fg='green') | |||