[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Move packages from alioth to salsa



On Fri, May 18, 2018 at 03:59:41PM +0200, Geert Stappers wrote:
> On Fri, May 11, 2018 at 11:04:13AM +0200, Jörg Frings-Fürst wrote:
> > 
> > please can someone move my packages from alioth to salsa.
> > 
> 
> Copying is done
> 
> Next step is automating granting permission.
> 

Done.

If it needs more TLC, say so.


Groeten
Geert Stappers
-- 
Leven en laten leven
#!/usr/bin/python

import argparse
import locale
import logging
import os.path
import sys
import time

import requests


if sys.version_info [0] < 3:
    input = raw_input


# keep trailing slashes if changed
SALSA_BASE_URL='https://salsa.debian.org/'
SALSA_API=SALSA_BASE_URL + "api/v4/"
ENV_VAR='GITLAB_TOKEN'


def parse_args():
    parser = argparse.ArgumentParser(description='add a GitLab user',
                                     epilog="Your GitLab token should be "
                                     "provided via the {} environment variable. You can create one here: "
                                     "{}profile/personal_access_tokens.".format(ENV_VAR, SALSA_BASE_URL))
    parser.add_argument('user',
                        help='gitlab user name')
    parser.add_argument('project',
                        nargs= '+',
                        help=('gitlab project name [ project [ project [ ... ] ] ]'
                            + '\n\t\te.g. debian/radvd')
                        )
    default_level = 'WARNING'
    parser.add_argument('-v', '--verbose',
                        dest='loglevel', action='store_const',
                        const='INFO', default=default_level,
                        help='enable verbose messages')
    parser.add_argument('-d', '--debug',
                        dest='loglevel', action='store_const',
                        const='DEBUG', default=default_level,
                        help='enable debugging messages')
    parser.add_argument('--loglevel',
                        default=default_level, type=str.upper,
                        help='expliticly set logging level')
    parser.add_argument('--syslog',
                        const='INFO', nargs='?',
                        default=None, type=str.upper,
                        help='send logs to syslog')
    parser.add_argument('--logfile', default=None,
                        help='write log to the given file (default: %(default)s)')
    return parser.parse_args()


def setup_logging(args):
    logger = logging.getLogger('')
    # disable the base filter, each stream has its own filter
    logger.setLevel('DEBUG')
    if args.syslog:
        sl = logging.handlers.SysLogHandler(address='/dev/log')
        sl.setFormatter(logging.Formatter(prog+'[%(process)d]: %(message)s'))
        # convert syslog argument to a numeric value
        sl.setLevel(args.syslog.upper())
        logger.addHandler(sl)
        logger.debug('configured syslog level %s' % args.syslog)
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter('%(message)s'))
    handler.setLevel(args.loglevel.upper())
    logger.addHandler(handler)
    if args.logfile:
        handler = logging.FileHandler(args.logfile)
        handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
        logger.addHandler(handler)


def get_salsa_member_id(args):
    headers = {'PRIVATE-TOKEN': os.environ[ENV_VAR]}
    salsa_member_id = None
    members = requests.get(SALSA_API + 'users?username=' + args.user, headers=headers)
    members.raise_for_status()
    for member in members.json():
        if member['username'] == args.user:
            salsa_member_id = member['id']
    logging.debug('salsa_member_id: %d', salsa_member_id)
    return salsa_member_id


def get_salsa_project_id(prj):
    headers = {'PRIVATE-TOKEN': os.environ[ENV_VAR]}
    salsa_project_id = None
    projects = requests.get(SALSA_API + 'search?scope=projects&search='
            + str(prj.split('/')[-1]), headers=headers)
    projects.raise_for_status()
    for project in projects.json():
        logging.debug('salsa_project_found: %s', project['path_with_namespace'])
        if project['path_with_namespace'] == prj:
            salsa_project_id = project['id']
            logging.debug('salsa_project_id: %d', salsa_project_id)
    return salsa_project_id


def add_member_to_project(member_id,project_id,project_name,level):
    logging.info("add member to project %d", project_id)
    payload = {'user_id': member_id,
               'access_level': level}
    headers = {'PRIVATE-TOKEN': os.environ[ENV_VAR]}
    logging.debug('payload: %s', payload)
    result = requests.post(SALSA_API
            + 'projects/' + str(project_id) + '/members',
            data=payload, headers=headers)
    logging.debug('result.content: %s', result.content)
    try:
        result.raise_for_status()
    except requests.exceptions.HTTPError as e:
        logging.error('request failed with %s: %s, project: %s', e,
                result.json()['message'], project_name )


def main():
    args = parse_args()
    gl_level = 30  # wanted gitlab access level

    setup_logging(args)

    if ENV_VAR in os.environ:
        salsa_member_id = get_salsa_member_id(args)
    else:
        logging.warning('Please provide gitlab API token via %s',
                        ENV_VAR)
        sys.exit(1)
    if salsa_member_id == None:
        logging.warning('Could not find %s, so stopped', args.user)
        sys.exit(1)
    for p in args.project:
        logging.debug('looping for project  %s', p)
        salsa_project_id = get_salsa_project_id(p)
        if salsa_project_id == None:
            logging.warning('Could not find %s, so skipped', p)
        else:
            add_member_to_project(salsa_member_id,salsa_project_id,p,gl_level)


if __name__ == '__main__':
    main()

Reply to: