Commit f50d7d11 authored by Miguel Angel Reina Ortega's avatar Miguel Angel Reina Ortega
Browse files

Add support for private/internal repositories

parent 85a86e58
Loading
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -14,8 +14,8 @@ import logging
import requests
from unidiff import PatchSet

def fetch(url : str, expected_content_type : str = None) -> requests.Response:
    r = requests.get(url)
def fetch(url : str, expected_content_type : str = None, headers = None) -> requests.Response:
    r = requests.get(url, headers = headers)
    logging.debug(f"Fetching {url}")
    if (r.status_code != 200):
        errorMessage = f"Failed attempting to retrieve {url}, status code {r.status_code}"
@@ -28,12 +28,12 @@ def fetch(url : str, expected_content_type : str = None) -> requests.Response:
            raise ValueError(errorMessage)
    return r

def fetch_text(url : str, expected_content_type : str = None) -> str:
    r = fetch(url, expected_content_type)
def fetch_text(url : str, expected_content_type : str = None, headers = None) -> str:
    r = fetch(url, expected_content_type, headers)
    return r.text

def fetch_json(url : str, expected_content_type : str = None) -> requests.Response:
    r = fetch(url, expected_content_type)
def fetch_json(url : str, expected_content_type : str = None, headers = None) -> requests.Response:
    r = fetch(url, expected_content_type, headers)
    return r.json()

def readMDFile(progress:Progress, document:str) -> list[str]:
@@ -131,26 +131,27 @@ def find_all_clauses(progress:Progress, mdLines:list[str]):
    return clauses

class MR:
    def __init__(self, project_id, mr_id, root = "https://git.onem2m.org"):
    def __init__(self, project_id, mr_id, root = "https://git.onem2m.org", headers = None):
        self.project_id = project_id
        self.mr_id = mr_id
        self.root = root
        self.raw_project_details = fetch_json(self.api_url())
        self.raw_project_details = fetch_json(self.api_url(), headers = headers)
        self.web_url = self.raw_project_details['web_url']
        self.raw_mr_details = fetch_json(self.api_url(f'/merge_requests/{self.mr_id}'))
        self.raw_mr_details = fetch_json(self.api_url(f'/merge_requests/{self.mr_id}'), headers = headers)
        self.author = self.raw_mr_details['author']['name']
        self.date = self.raw_mr_details['updated_at']
        self.target_branch = self.raw_mr_details['target_branch']
        self.source_branch = self.raw_mr_details['source_branch']
        self.title = self.raw_mr_details['title']
        self.description = self.raw_mr_details['description']
        self.raw_diff = fetch_text(f'{self.web_url}/-/merge_requests/{self.mr_id}.diff', expected_content_type='text/plain')
        self.raw_diff = fetch_text(f'{self.web_url}/-/merge_requests/{self.mr_id}.diff', expected_content_type='text/plain', headers = headers)
        self.patch_set = PatchSet.from_string(self.raw_diff)
        self.headers = headers

    def api_url(self, route : str = "") -> str:
        return f"{self.root}/api/v4/projects/{self.project_id}/{route}"
    def retrieve_text(self, branch: str, filename: str) -> str:
        return fetch_text(f"{self.web_url}/-/raw/{branch}/{filename}")
        return fetch_text(f"{self.web_url}/-/raw/{branch}/{filename}", headers = self.headers)

def find_changed_clauses(progress:Progress, mdLines:list[str], clauses:list[Clause], mr:MR, outDirectory:str ):
    '''
@@ -585,6 +586,7 @@ def main(args=None):
    # Parse command line arguments
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--outdir', '-o', action='store', dest='outDirectory', default = 'out', metavar = '<output directory>',  help = 'specify output directory')
    parser.add_argument('-t', '--token', default = None, help="Token required for internal/private repositories")
    parser.add_argument('rootURL',      help="Forge root URL")
    parser.add_argument('projectID',    help="Forge project ID")
    parser.add_argument('mergeID',      help="Merge IID")
@@ -596,7 +598,16 @@ def main(args=None):

    os.makedirs(pargs.outDirectory, exist_ok = True)

    mr = MR(pargs.projectID, pargs.mergeID, pargs.rootURL)
    if pargs.token:
        headers = {'PRIVATE-TOKEN' : pargs.token}
    else:
        logging.debug(f"No token provided, repository MUST BE PUBLIC")
        headers = None
    try:
        mr = MR(pargs.projectID, pargs.mergeID, pargs.rootURL, headers)
    except ValueError as e:
        logging.debug(f"Error creating MR object: {e}. Repository may not be public or token is incorrect")
        return 1

    for patched_file in mr.patch_set:
        if not patched_file.source_file.startswith("a/README") and patched_file.source_file.endswith(".md"):