github
Utility module for working with github
Authors:
- Jens Timmerman (Ghent University)
 - Kenneth Hoste (Ghent University)
 - Toon Willems (Ghent University)
 
            GithubError
¶
    
              Bases: Exception
Error raised by the Githubfs
            Githubfs
¶
    
              Bases: object
This class implements some higher level functionality on top of the Github api
            __init__(githubuser, reponame, branchname=None, username=None, password=None, token=None)
¶
    Construct a new githubfs object
| PARAMETER | DESCRIPTION | 
|---|---|
githubuser | 
            
               the github user's repo we want to use. 
  | 
          
reponame | 
            
               The name of the repository we want to use. 
  | 
          
branchname | 
            
               Then name of the branch to use (defaults to 'main' for easybuilders org, 'master' otherwise) 
                  
                    DEFAULT:
                        | 
          
username | 
            
               (optional) your github username. 
                  
                    DEFAULT:
                        | 
          
password | 
            
               (optional) your github password. 
                  
                    DEFAULT:
                        | 
          
token | 
            
               (optional) a github api token. 
                  
                    DEFAULT:
                        | 
          
            get_path(path)
¶
    returns the path as a Github object (from agithub)
            get_repo()
¶
    Returns the repo as a Github object (from agithub)
            isdir(githubobj)
  
      staticmethod
  
¶
    Check if this path points to a directory
            isfile(githubobj)
  
      staticmethod
  
¶
    Check if this path points to a file
            join(*args)
  
      staticmethod
  
¶
    This method joins 'paths' inside a github repository
            listdir(path)
¶
    List the contents of a directory
            read(path, api=True)
¶
    Read the contents of a file and return it Or, if api=False it will download the file and return the location of the downloaded file
            walk(top=None, topdown=True)
¶
    Walk the github repo in an os.walk like fashion.
            add_pr_labels(pr, branch=GITHUB_DEVELOP_BRANCH)
¶
    Try to determine and add labels to PR.
| PARAMETER | DESCRIPTION | 
|---|---|
pr | 
            
               pull request number in easybuild-easyconfigs repo 
  | 
          
branch | 
            
               easybuild-easyconfigs branch to compare with 
                  
                    DEFAULT:
                        | 
          
            check_github()
¶
    Check status of GitHub integration, and report back. * check whether GitHub username is available * check whether a GitHub token is available, and whether it works * check whether git and GitPython are available * check whether push access to own GitHub repositories works * check whether creating gists works * check whether location to local working directories for Git repositories is available (not strictly needed)
            check_online_status()
¶
    Check whether we currently are online Return True if online, else a list of error messages
            check_pr_eligible_to_merge(pr_data)
¶
    Check whether PR is eligible for merging.
| PARAMETER | DESCRIPTION | 
|---|---|
pr_data | 
            
               PR data obtained through GitHub API 
  | 
          
| RETURNS | DESCRIPTION | 
|---|---|
| 
               boolean value indicates whether PR is eligible  | 
          
            close_pr(pr, motivation_msg=None)
¶
    Close specified pull request
| PARAMETER | DESCRIPTION | 
|---|---|
pr | 
            
               PR number 
  | 
          
motivation_msg | 
            
               string containing motivation for closing the PR 
                  
                    DEFAULT:
                        | 
          
            create_gist(txt, fn, descr=None, github_user=None, github_token=None)
¶
    Create a gist with the provided text.
            create_remote(git_repo, account, repo, https=False)
¶
    Create remote in specified git working directory for specified account & repository.
| PARAMETER | DESCRIPTION | 
|---|---|
git_repo | 
            
               git.Repo instance to use (after init_repo & setup_repo) 
  | 
          
account | 
            
               GitHub account name 
  | 
          
repo | 
            
               repository name 
  | 
          
https | 
            
               use https:// URL rather than git@ 
                  
                    DEFAULT:
                        | 
          
            delete_gist(gist_id, github_user=None, github_token=None)
¶
    Delete gist with specified ID.
            det_account_branch_for_pr(pr_id, github_user=None, pr_target_repo=None)
¶
    Determine account & branch corresponding to pull request with specified id.
            det_commit_status(account, repo, commit_sha, github_user)
¶
    Determine status of specified commit (pending, error, failure, success)
We combine two different things here:
- the combined commit status (Travis CI sets a commit status)
 - results of check suites (set by CI run in GitHub Actions)
 
            det_patch_specs(patch_paths, file_info, ec_dirs)
¶
    Determine software names for patch files
            det_pr_labels(file_info, pr_target_repo)
¶
    Determine labels for a pull request based on provided information on files changed by that pull request.
            det_pr_target_repo(paths)
¶
    Determine target repository for pull request from given cagetorized list of files
| PARAMETER | DESCRIPTION | 
|---|---|
paths | 
            
               paths to categorized lists of files (easyconfigs, files to delete, patches, .py files) 
  | 
          
            det_pr_title(ecs)
¶
    Create title for PR based on first easyconfigs
| PARAMETER | DESCRIPTION | 
|---|---|
ecs | 
            
               list of parsed easyconfigs 
  | 
          
            download_repo(repo=GITHUB_EASYCONFIGS_REPO, branch=None, commit=None, account=GITHUB_EB_MAIN, path=None, github_user=None)
¶
    Download entire GitHub repo as a tar.gz archive, and extract it into specified path.
| PARAMETER | DESCRIPTION | 
|---|---|
repo | 
            
               repo to download 
                  
                    DEFAULT:
                        | 
          
branch | 
            
               branch to download 
                  
                    DEFAULT:
                        | 
          
commit | 
            
               commit to download 
                  
                    DEFAULT:
                        | 
          
account | 
            
               GitHub account to download repo from 
                  
                    DEFAULT:
                        | 
          
path | 
            
               path to extract to 
                  
                    DEFAULT:
                        | 
          
github_user | 
            
               name of GitHub user to use 
                  
                    DEFAULT:
                        | 
          
            fetch_easyblocks_from_commit(commit, files=None, path=None)
¶
    Fetch easyblocks from a specified commit.
            fetch_easyblocks_from_pr(pr, path=None, github_user=None)
¶
    Fetch patched easyblocks for a particular PR.
            fetch_easyconfigs_from_commit(commit, files=None, path=None)
¶
    Fetch specified easyconfig files from a specific commit.
            fetch_easyconfigs_from_pr(pr, path=None, github_user=None)
¶
    Fetch patched easyconfig files for a particular PR.
            fetch_files_from_commit(commit, files=None, path=None, github_account=None, github_repo=None)
¶
    Fetch files from a specific commit.
If 'files' is None, all files touched in the commit are used.
            fetch_files_from_pr(pr, path=None, github_user=None, github_account=None, github_repo=None)
¶
    Fetch patched files for a particular PR.
            fetch_github_token(user)
¶
    Fetch GitHub token for specified user from keyring.
            fetch_latest_commit_sha(repo, account, branch=None, github_user=None, token=None)
¶
    Fetch latest SHA1 for a specified repository and branch.
| PARAMETER | DESCRIPTION | 
|---|---|
repo | 
            
               GitHub repository 
  | 
          
account | 
            
               GitHub account 
  | 
          
branch | 
            
               branch to fetch latest SHA1 for 
                  
                    DEFAULT:
                        | 
          
github_user | 
            
               name of GitHub user to use 
                  
                    DEFAULT:
                        | 
          
token | 
            
               GitHub token to use 
                  
                    DEFAULT:
                        | 
          
| RETURNS | DESCRIPTION | 
|---|---|
| 
               latest SHA1  | 
          
            fetch_pr_data(pr, pr_target_account, pr_target_repo, github_user, full=False, **parameters)
¶
    Fetch PR data from GitHub
            find_easybuild_easyconfig(github_user=None)
¶
    Fetches the latest EasyBuild version eb file from GitHub
| PARAMETER | DESCRIPTION | 
|---|---|
github_user | 
            
               name of GitHub user to use when querying GitHub 
                  
                    DEFAULT:
                        | 
          
            find_software_name_for_patch(patch_name, ec_dirs)
¶
    Scan all easyconfigs in the robot path(s) to determine which software a patch file belongs to
| PARAMETER | DESCRIPTION | 
|---|---|
patch_name | 
            
               name of the patch file 
  | 
          
ec_dirs | 
            
               list of directories to consider when looking for easyconfigs 
  | 
          
| RETURNS | DESCRIPTION | 
|---|---|
| 
               name of the software that this patch file belongs to (if found)  | 
          
            github_api_get_request(request_f, github_user=None, token=None, **kwargs)
¶
    Helper method, for performing get requests to GitHub API.
| PARAMETER | DESCRIPTION | 
|---|---|
request_f | 
            
               function that should be called to compose request, providing a RestClient instance 
  | 
          
github_user | 
            
               GitHub user name (to try and obtain matching GitHub token if none is provided) 
                  
                    DEFAULT:
                        | 
          
token | 
            
               GitHub token to use 
                  
                    DEFAULT:
                        | 
          
| RETURNS | DESCRIPTION | 
|---|---|
| 
               tuple with return status and data  | 
          
            github_api_put_request(request_f, github_user=None, token=None, **kwargs)
¶
    Helper method, for performing put requests to GitHub API.
| PARAMETER | DESCRIPTION | 
|---|---|
request_f | 
            
               function that should be called to compose request, providing a RestClient instance 
  | 
          
github_user | 
            
               GitHub user name (to try and obtain matching GitHub token if none is provided) 
                  
                    DEFAULT:
                        | 
          
token | 
            
               GitHub token to use 
                  
                    DEFAULT:
                        | 
          
| RETURNS | DESCRIPTION | 
|---|---|
| 
               tuple with return status and data  | 
          
            init_repo(path, repo_name, silent=False)
¶
    Initialize a new Git repository at the specified location.
| PARAMETER | DESCRIPTION | 
|---|---|
path | 
            
               location where Git repository should be initialized 
  | 
          
repo_name | 
            
               name of Git repository 
  | 
          
silent | 
            
               keep quiet (don't print any messages) 
                  
                    DEFAULT:
                        | 
          
            install_github_token(github_user, silent=False)
¶
    Install specified GitHub token for specified user.
| PARAMETER | DESCRIPTION | 
|---|---|
github_user | 
            
               GitHub user to install token for 
  | 
          
silent | 
            
               keep quiet (don't print any messages) 
                  
                    DEFAULT:
                        | 
          
            is_patch_for(patch_name, ec)
¶
    Check whether specified patch matches any patch in the provided EasyConfig instance.
            list_prs(params, per_page=GITHUB_MAX_PER_PAGE, github_user=None)
¶
    List pull requests according to specified selection/order parameters
| PARAMETER | DESCRIPTION | 
|---|---|
params | 
            
               3-tuple with selection parameters for PRs ( 
  | 
          
            merge_pr(pr)
¶
    Merge specified pull request
            new_branch_github(paths, ecs, commit_msg=None)
¶
    Create new branch on GitHub using specified files
| PARAMETER | DESCRIPTION | 
|---|---|
paths | 
            
               paths to categorized lists of files (easyconfigs, files to delete, patches, files with .py extension) 
  | 
          
ecs | 
            
               list of parsed easyconfigs, incl. for dependencies (if robot is enabled) 
  | 
          
commit_msg | 
            
               commit message to use 
                  
                    DEFAULT:
                        | 
          
            new_pr(paths, ecs, title=None, descr=None, commit_msg=None)
¶
    Open new pull request using specified files
| PARAMETER | DESCRIPTION | 
|---|---|
paths | 
            
               paths to categorized lists of files (easyconfigs, files to delete, patches) 
  | 
          
ecs | 
            
               list of parsed easyconfigs, incl. for dependencies (if robot is enabled) 
  | 
          
title | 
            
               title to use for pull request 
                  
                    DEFAULT:
                        | 
          
descr | 
            
               description to use for description 
                  
                    DEFAULT:
                        | 
          
commit_msg | 
            
               commit message to use 
                  
                    DEFAULT:
                        | 
          
            new_pr_from_branch(branch_name, title=None, descr=None, pr_target_repo=None, pr_metadata=None, commit_msg=None)
¶
    Create new pull request from specified branch on GitHub.
            pick_default_branch(github_owner)
¶
    Determine default name to use.
            post_comment_in_issue(issue, txt, account=GITHUB_EB_MAIN, repo=GITHUB_EASYCONFIGS_REPO, github_user=None)
¶
    Post a comment in the specified PR.
            post_pr_labels(pr, labels)
¶
    Update PR labels
            pr_files_cache(func)
¶
    Decorator to cache result of fetch_files_from_pr.
            push_branch_to_github(git_repo, target_account, target_repo, branch)
¶
    Push specified branch to GitHub from specified git repository.
| PARAMETER | DESCRIPTION | 
|---|---|
git_repo | 
            
               git.Repo instance to use (after init_repo & setup_repo) 
  | 
          
target_account | 
            
               GitHub account name 
  | 
          
target_repo | 
            
               repository name 
  | 
          
branch | 
            
               name of branch to push 
  | 
          
            reasons_for_closing(pr_data)
¶
    Look for valid reasons to close PR by comparing with existing easyconfigs.
            setup_repo(git_repo, target_account, target_repo, branch_name, silent=False, git_only=False)
¶
    Set up repository by checking out specified branch for specfied GitHub account/repository.
| PARAMETER | DESCRIPTION | 
|---|---|
git_repo | 
            
               git.Repo instance 
  | 
          
target_account | 
            
               name of GitHub account that owns GitHub repository 
  | 
          
target_repo | 
            
               name of GitHib repository 
  | 
          
branch_name | 
            
               name of branch to check out 
  | 
          
silent | 
            
               keep quiet (don't print any messages) 
                  
                    DEFAULT:
                        | 
          
git_only | 
            
               only use git@github.com repo URL, skip trying https://github.com first 
                  
                    DEFAULT:
                        | 
          
            setup_repo_from(git_repo, github_url, target_account, branch_name, silent=False)
¶
    Set up repository by checking out specified branch from repository at specified URL.
| PARAMETER | DESCRIPTION | 
|---|---|
git_repo | 
            
               git.Repo instance 
  | 
          
github_url | 
            
               URL to GitHub repository 
  | 
          
target_account | 
            
               name of GitHub account that owns GitHub repository at specified URL 
  | 
          
branch_name | 
            
               name of branch to check out 
  | 
          
silent | 
            
               keep quiet (don't print any messages) 
                  
                    DEFAULT:
                        | 
          
            sync_branch_with_develop(branch_name)
¶
    Sync branch with specified name with current develop branch.
            sync_pr_with_develop(pr_id)
¶
    Sync pull request with specified ID with current develop branch.
            sync_with_develop(git_repo, branch_name, github_account, github_repo)
¶
    Sync specified branch with develop branch.
            update_branch(branch_name, paths, ecs, github_account=None, commit_msg=None)
¶
    Update specified branch in GitHub using specified files
| PARAMETER | DESCRIPTION | 
|---|---|
paths | 
            
               paths to categorized lists of files (easyconfigs, files to delete, patches) 
  | 
          
github_account | 
            
               GitHub account where branch is located 
                  
                    DEFAULT:
                        | 
          
ecs | 
            
               list of parsed easyconfigs, incl. for dependencies (if robot is enabled) 
  | 
          
commit_msg | 
            
               commit message to use 
                  
                    DEFAULT:
                        | 
          
            update_pr(pr_id, paths, ecs, commit_msg=None)
¶
    Update specified pull request using specified files
| PARAMETER | DESCRIPTION | 
|---|---|
pr_id | 
            
               ID of pull request to update 
  | 
          
paths | 
            
               paths to categorized lists of files (easyconfigs, files to delete, patches) 
  | 
          
ecs | 
            
               list of parsed easyconfigs, incl. for dependencies (if robot is enabled) 
  | 
          
commit_msg | 
            
               commit message to use 
                  
                    DEFAULT:
                        | 
          
            validate_github_token(token, github_user)
¶
    Check GitHub token: * see if it conforms expectations (classic GitHub token with only [0-9a-f] characters and length of 40 starting with 'ghp_', or fine-grained GitHub token with only alphanumeric ([a-zA-Z0-9]) characters + '' and length of 93 starting with 'github_pat'), * see if it can be used for authenticated access.