Skip to content
Snippets Groups Projects
Select Git revision
  • e50f612ab51683b72d9f7eb7a4c0ebed69cfd091
  • master default protected
2 results

gitlab_functions.py

Blame
  • Christopher Bohn's avatar
    Christopher Bohn authored
    Besides facilitating a more OO approach, the wrapper will make code
    completion in IDEs possible.
    e50f612a
    History
    gitlab_functions.py 6.28 KiB
    import gitlab
    from config import Config
    
    
    def get_user_by_name(git_server, username):
        return git_server.users.list(username=username)[0]
    
    
    def get_user_by_id(git_server, user_id):
        return git_server.users.get(user_id)
    
    
    def get_project_by_id(git_server, project_id):
        return git_server.projects.get(project_id)
    
    
    def get_project_by_path(git_server, namespace_and_name):
        return git_server.projects.get(namespace_and_name)
    
    
    def get_projects_by_group(git_server, group_id):
        return git_server.groups.get(group_id).projects.list(all=True)
    
    
    def get_projects_by_keyword(git_server, search_term):
        return git_server.projects.list(search=search_term, all=True)
    
    
    def create_project(git_server, project_name):
        git_server.projects.create({'name': project_name})
    
    
    def create_project_in_group(git_server, group_name, project_name):
        group_id = git_server.groups.get(group_name).id
        return git_server.projects.create({'name': project_name, 'namespace_id': group_id})
    
    
    def add_user_to_project_as_maintainer(git_server, project, user):
        if isinstance(user, str):
            git_user = get_user_by_name(git_server, user)
        else:
            git_user = user
        return project.members.create({'user_id': git_user.id, 'access_level': gitlab.MAINTAINER_ACCESS})
    
    
    def get_issues(project):
        return project.issues.list(all=True)
    
    
    def create_issue(project, title, description):
        return project.issues.create({'title': title, 'description': description})
    
    
    # user fields--
    # id:                   gitlab User ID number
    # name:                 plain-text human name
    # username:             gitlab username
    # state
    # avatar_url
    # web_url:              https URL to user's git site, would be the base path to any personal repositories they created
    
    
    # project fields--
    # id:                   Project ID number
    # description
    # name:                 project name without namespace
    # name_with_namespace:  project name with namespace, spaces around slashes
    # path:                 path without namespace (may differ from name if name has spaces)
    # path_with_namespace   path with namespace, no spaces around slashes
    # created_at
    # default_branch
    # tag_list
    # ssh_url_to_repo       ssh URL to clone repository
    # http_url_to_repo      https URL to clone repository
    # web_url               https URL to git site, should be http_url_to_repo without trailing '.git'
    # readme_url            https URL to README.md
    # avatar_url
    # star_count
    # forks_count
    # last_activity_at
    # namespace             namespace's JSON object
    # _links                JSON object with api/v4 links to self, issues, merge_requests,
    #                                                        repo_branches, labels, events, members
    # empty_repo
    # archived
    # visibility            'private', etc.
    # resolve_outdated_diff_discussions
    # container_registry_enabled
    # issues_enabled
    # merge_requests_enabled
    # jobs_enabled
    # snippets_enabled
    # issues_access_level
    # repository_access_level,
    # wiki_access_level
    # builds_access_level
    # snippets_access_level
    # shared_runners_enabled
    # lfs_enabled
    # creator_id            gitlab User ID of user who created repository
    # import_status
    # import_error
    # open_issues_count
    # runners_token
    # ci_default_git_depth
    # public_jobs
    # build_git_strategy
    # build_timeout
    # auto_cancel_pending_pipelines
    # build_coverage_regex
    # ci_config_path
    # shared_with_groups
    # only_allow_merge_if_pipeline_succeeds
    # request_access_enabled
    # only_allow_merge_if_all_discussions_are_resolved
    # printing_merge_request_link_enabled
    # merge_method
    # auto_devops_enabled
    # auto_devops_deploy_strategy
    # permissions
    
    
    # issue fields--
    # id                    universally-unique identifier
    # iid                   project-unique identifier
    # project_id
    # title
    # description
    # state                 opened or closed
    # created_at            format yyyy-mm-ddThh:mm:ss.sssUTCoffset (e.g., '2019-08-13T11:32:44.590-05:00')
    # updated_at            same date format
    # closed_at             same date format, or None (seems to prefer no UTC offset, e.g., '2019-08-13T11:32:44.590Z')
    # closed_by             user
    # labels                list of labels
    # milestone
    # assignees             list of users
    # author                user
    # assignee              user
    # user_notes_count
    # merge_requests_count
    # upvotes
    # downvotes
    # due_date              same date format, or None
    # confidential
    # discussion_locked
    # web_url               https URL to issue's page
    # time_stats
    # task_completion_status
    # has_tasks
    # _links
    # notes
    # award_emoji
    # project
    # subscribed
    
    
    if __name__ == '__main__':
        git = gitlab.Gitlab(Config.gitlab_url, private_token=Config.gitlab_api_key)
        project = get_project_by_id(git, '5484')
        student = get_user_by_id(git, project.creator_id)
        print(f'{student.name} forked repo at {project.created_at}')
        print('getting a user, by name')
        print(get_user_by_name(git, 'bohn'))
        print('getting a user by user ID and printing only the user\'s name')
        print(get_user_by_id(git, 519).name)
        print('getting a project by its namespace/name')
        print(get_project_by_path(git, 'csce_361/sandbox/HelloWorld'))
        print('getting a project by project ID and printing only the project\'s description')
        print(get_project_by_id(git, 5220).description)
        print('getting a group by name')
        print(git.groups.get('csce_361').name)
        name = git.groups.get('csce_361/sandbox').full_path
        gid = git.groups.get('csce_361/sandbox').id
        print(f'{name}\t{gid}')
        print('getting a group by group ID')
        print(get_projects_by_group(git, 1946)[0])
        print('getting a list of projects that match a keyword and printing the first project in the list')
        print(get_projects_by_keyword(git, "Homework")[0])
        print('getting a list of projects in a group (by group ID) and printing the second project in the list')
        print(get_projects_by_group(git, 1937)[1])
        print('getting a list of project members (has only inherited members)')
        print(get_project_by_id(git, 5220).members.list())
        print('getting a list of project members, including inherited members')
        print(get_project_by_id(git, 5220).members.all(all=True))
        print('getting a list of project members (has assigned members), printing the third\'s name')
        print(get_project_by_id(git, 5176).members.list()[2].name)
        print('getting a list of issues and printing the first')
        print(get_issues(get_project_by_id(git, 5215))[0])