Search code examples
pythongitgitlabyamlgitlab-api

Get data from Git commit and put it into a YAML (Gitlab)


as the title says I want to read information of my git commit (user ID, message) and put it into a yaml file, which will be created in my current project folder and push the changes with the yaml file into git. I think I have to work with the GITLAB API but I'm not sure how.

It sounds complicated but the idea is to save yaml files with the information of every commit and these files will be added into a another change list.

This is my code so far, I just implemented the input option, but I want it automatically filled. Does someone know how?

import yaml

data = dict(
    gittag='',
    gittagdate='',
    userID=str(input('autor: ')),
    change_id=str(input('change_id: ')),
    message=str(input('description: ')),

)
with open('test.yml', 'w') as outfile:
    yaml.dump(data, outfile, default_flow_style=False)

Solution

  • You can use Gitlab commits API directly like this :

    import yaml
    import requests
    
    access_token = "YOUR_ACCESS_TOKEN"
    gitlab_host = "your.gitlab.host" #gitlab.com or your.host for gitlab CE
    project_id = "24" #change this with your project id
    
    r = requests.get(f"https://{gitlab_host}/api/v4/projects/{project_id}/repository/commits",
        params = {
            "per_page": 100
        },
        headers= {
            "Authorization": f"Bearer {access_token}"
    })
    commits = r.json()
    
    print(len(commits))
    with open('commits.yml', 'w') as outfile:
        yaml.dump(commits, outfile, default_flow_style=False)
    

    which will write the list of commits in a yaml file like :

    - author_email: user@acme.com
      author_name: user123
      authored_date: '2020-09-16T15:03:20.000+02:00'
      committed_date: '2020-09-16T15:03:20.000+02:00'
      committer_email: user@acme.com
      committer_name: user123
      created_at: '2020-09-16T15:03:20.000+02:00'
      id: b076af18c1db5b15714cd78714a674d4cc97605f
      message: 'version 1.5.1
    
        '
      parent_ids:
      - 53aa56f53aadf3eb709d799cdda2ad852c50aa3a
      short_id: b076af17
      title: version 1.5.1
    - .......
    

    You will also need to create a personal access token in Gitlab and get your project id

    The code above gives you the last 100 commits, in order to paginate through results, you need to check the Link header and parse it. But there is this python Gitlab library that does it for you with the docs here

    The following will iterate through all commits and create the yaml file:

    import yaml
    import gitlab
    
    gl = gitlab.Gitlab('https://your.gitlab.host', private_token='YOUR_ACCESS_TOKEN')
    commits_obj = gl.projects.get(24).commits.list(all=True)
    commits = [t.attributes for t in commits_obj]
    print(len(commits))
    with open('commits.yml', 'w') as outfile:
        yaml.dump(commits, outfile, default_flow_style=False)
    

    Also checkout this