|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# -*- coding: utf-8 -*-
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# utils.py - a module with support methods for centpkg
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
#
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# Copyright (C) 2021 Red Hat Inc.
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# Author(s): Ondrej Nosek <onosek@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
#
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# This program is free software; you can redistribute it and/or modify it
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# under the terms of the GNU General Public License as published by the
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# Free Software Foundation; either version 2 of the License, or (at your
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# option) any later version. See http://www.gnu.org/copyleft/gpl.html for
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# the full text of the license.
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
import re
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
import json
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
import git
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
import requests
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
from pyrpkg import rpkgError
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
from requests.exceptions import ConnectionError
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
from six.moves.configparser import NoOptionError, NoSectionError
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
from six.moves.urllib.parse import quote_plus, urlparse
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
def do_fork(logger, base_url, token, repo_name, namespace, cli_name):
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"""
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
Creates a fork of the project.
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param logger: A logger object
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param base_url: a string of the URL repository
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param token: a string of the API token that has rights to make a fork
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param repo_name: a string of the repository name
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param namespace: a string determines a type of the repository
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param cli_name: string of the CLI's name (e.g. centpkg)
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
:return: a tuple consisting of whether the fork needed to be created (bool)
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
and the fork path (string)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"""
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
api_url = '{0}/api/v4'.format(base_url.rstrip('/'))
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
project_id = quote_plus("redhat/centos-stream/{0}/{1}".format(namespace, repo_name))
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
fork_url = '{0}/projects/{1}/fork'.format(api_url, project_id)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
headers = {
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
'PRIVATE-TOKEN': token,
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
'Accept': 'application/json',
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
'Content-Type': 'application/json'
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
}
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
9a602e |
# define a new repository name/path to avoid collision with other projects
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
9a602e |
safe_name = "centos_{0}_{1}".format(namespace, repo_name)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
9a602e |
payload = json.dumps({
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
9a602e |
'name': safe_name, # name of the project after forking
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
9a602e |
'path': safe_name,
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
9a602e |
})
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
try:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
rv = requests.post(
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
fork_url, headers=headers, data=payload, timeout=60)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
except ConnectionError as error:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
error_msg = ('The connection to API failed while trying to '
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
'create a new fork. The error was: {0}'.format(str(error)))
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
raise rpkgError(error_msg)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
try:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# Extract response json for debugging
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
rv_json = rv.json()
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
logger.debug("GitLab API response: '{0}'".format(rv_json))
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
except Exception:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
pass
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
if rv.ok:
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
fork_id = rv.json()['id']
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
try:
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
# Unprotect c9s in fork
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
rv = requests.delete('{0}/projects/{1}/protected_branches/{2}'.format(api_url, fork_id, 'c9s'), headers=header)
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
except ConnectionError as error:
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
error_msg = ('The connection to API failed while trying to unprotect c9s branch'
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
'in the fork. The error was: {0}'.format(str(error)))
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
raise rpkgError(error_msg)
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
try:
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
# Reprotect c9s to disable pushes
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
# Only maintainers in gitlab are allowed to push with the following config
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
# In CS, every pkg maintainer is considered as a developer in gitlab
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
data = {'id': fork_id,
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
'name': 'c9s',
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
'allowed_to_push': [{'access_level': 40}],
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
'allowed_to_merge': [{'access_level': 40}],
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
}
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
rv = requests.post('{0}/projects/{1}/protected_branches'.format(api_url, fork_id), json=data, headers=header)
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
except ConnectionError as error:
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
error_msg = ('The connection to API failed while trying to reprotect c9s branch'
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
'in the fork fork. The error was: {0}'.format(str(error)))
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
raise rpkgError(error_msg)
|
|
![](https://seccdn.libravatar.org/avatar/f66ed63d77ce2cabb5bf1ed3b6b95bd9832a822e96b7589e8e3c4c344ff02de9?s=16&d=retro) |
464a71 |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
base_error_msg = ('The following error occurred while creating a new fork: {0}')
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
if not rv.ok:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# fork was already created
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
if rv.status_code == 409 or rv.reason == "Conflict":
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
# When the repo already exists, the return doesn't contain the repo
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
# path or username. Make one more API call to get the username of
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
# the token to construct the repo path.
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
rv = requests.get('{0}/user'.format(api_url), headers=headers)
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
username = rv.json()['username']
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
return False, '{0}/{1}'.format(username, safe_name)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# show hint for invalid, expired or revoked token
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
elif rv.status_code == 401 or rv.reason == "Unauthorized":
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
base_error_msg += '\nFor invalid or expired token refer to ' \
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
'"{0} fork -h" to set a token in your user ' \
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
'configuration.'.format(cli_name)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
raise rpkgError(base_error_msg.format(rv.text))
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
return True, rv_json['path_with_namespace']
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
def do_add_remote(base_url, remote_base_url, repo, repo_path, remote_name):
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"""
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
Adds remote tracked repository
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param base_url: a string of the URL repository
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param remote_base_url: a string of the remote tracked repository
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param repo: object, current project git repository
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
:param repo_path: a string of the repository path
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
:param remote_name: a string of the remote name
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:return: a bool; True if remote was created, False when already exists
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"""
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
parsed_url = urlparse(remote_base_url)
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
remote_url = '{0}://{1}/{2}.git'.format(
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
parsed_url.scheme,
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
parsed_url.netloc,
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
repo_path,
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
# check already existing remote
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
for remote in repo.remotes:
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
if remote.name == remote_name:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
return False
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
try:
|
|
![](https://seccdn.libravatar.org/avatar/016a5f3568d521d40c077bd1f06aa5b9eab60232808db00b9e3488bbb7477299?s=16&d=retro) |
5b7b46 |
repo.create_remote(remote_name, url=remote_url)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
except git.exc.GitCommandError as e:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
error_msg = "During create remote:\n {0}\n {1}".format(
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
" ".join(e.command), e.stderr)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
raise rpkgError(error_msg)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
return True
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
def config_get_safely(config, section, option):
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"""
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
Returns option from the user's configuration file. In case of missing
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
section or option method throws an exception with a human-readable
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
warning and a possible hint.
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
The method should be used especially in situations when there are newly
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
added sections/options into the config. In this case, there is a risk that
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
the user's config wasn't properly upgraded.
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param config: ConfigParser object
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param section: section name in the config
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:param option: name of the option
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:return: option value from the right section
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
:rtype: str
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"""
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
hint = (
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"First (if possible), refer to the help of the current command "
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"(-h/--help).\n"
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"There also might be a new version of the config after upgrade.\n"
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"Hint: you can check if you have 'centpkg.conf.rpmnew' or "
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"'centpkg.conf.rpmsave' in the config directory. If yes, try to merge "
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"your changes to the config with the maintainer provided version "
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
"(or replace centpkg.conf file with 'centpkg.conf.rpmnew')."
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
try:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
return config.get(section, option)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
except NoSectionError:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
msg = "Missing section '{0}' in the config file.".format(section)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
raise rpkgError("{0}\n{1}".format(msg, hint))
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
except NoOptionError:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
msg = "Missing option '{0}' in the section '{1}' of the config file.".format(
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
option, section
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
)
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
raise rpkgError("{0}\n{1}".format(msg, hint))
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
except Exception:
|
|
![](https://seccdn.libravatar.org/avatar/4839116d65bebe0d191f285b19d5774238ed4be98dedc4f0d138e5a43e413e02?s=16&d=retro) |
80f38d |
raise
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
def get_repo_name(name, org='rpms'):
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
"""
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
Try to parse the repository name in case it is a git url.
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
Parameters
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
----------
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
name: str
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
The repository name, including the org name.
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
It will try to retrieve both repository name and org in case "name" is an url.
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
org: str
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
The org to use in case name parsing is needed.
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
Returns
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
-------
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
str
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
A string containing the repository name: $ORG/$REPO`.
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
It will return the original `name` parameter in case of regex match failure.
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
"""
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
if name.startswith(org):
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
return name
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
parsed = '/'.join(name.split('/')[1:])
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
repo_name = parsed.split('_')[-1:][0]
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
|
|
![](https://seccdn.libravatar.org/avatar/5d2226572f5efd5993a3b03e9d2e38951ce985250f7030e5912208b0a11de064?s=16&d=retro) |
29dd93 |
return '%s/%s' % (org, repo_name)
|