Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pull Request Metrics in Stash

We've been asked to generate metrics around how many code reviews we have been doing. Is there a way in Stash/Git to extract historic pull requests performed on the repo? In particular, the following would be useful:

  • Date/Time of the request
  • Requestor Name
  • Approver Name
  • Date/Time of the approval
like image 516
Fuzzy Purple Monkey Avatar asked Sep 12 '25 22:09

Fuzzy Purple Monkey


1 Answers

As already suggested by Robbie Averill, you can use the Stash REST APIs for this, more specifically the Stash Core REST API, which provides REST resources for core Stash functionality such as server administration, projects, repositories, pull requests and user management:

GET /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests yields the paged list of open pull requests against the repo in question. The response contains most of the information you are looking for already, notably the pull request dates, the author, reviewers and even participants:

{
    "size": 1,
    "limit": 25,
    "isLastPage": true,
    "values": [
        {
            "id": 101,
            "version": 1,
            "title": "Talking Nerdy",
            "description": "It’s a kludge, but put the tuple from the database in the cache.",
            "state": "OPEN",
            "open": true,
            "closed": false,
            "createdDate": 1359075920,
            "updatedDate": 1359085920,
            "fromRef": {
                "id": "refs/heads/feature-ABC-123",
                "repository": {
                    "slug": "my-repo",
                    "name": null,
                    "project": {
                        "key": "PRJ"
                    }
                }
            },
            "toRef": {
                "id": "refs/heads/master",
                "repository": {
                    "slug": "my-repo",
                    "name": null,
                    "project": {
                        "key": "PRJ"
                    }
                }
            },
            "locked": false,
            "author": {
                "user": {
                    "name": "tom",
                    "emailAddress": "[email protected]",
                    "id": 115026,
                    "displayName": "Tom",
                    "active": true,
                    "slug": "tom",
                    "type": "NORMAL"
                },
                "role": "AUTHOR",
                "approved": true
            },
            "reviewers": [
                {
                    "user": {
                        "name": "jcitizen",
                        "emailAddress": "[email protected]",
                        "id": 101,
                        "displayName": "Jane Citizen",
                        "active": true,
                        "slug": "jcitizen",
                        "type": "NORMAL"
                    },
                    "role": "REVIEWER",
                    "approved": true
                }
            ],
            "participants": [
                {
                    "user": {
                        "name": "dick",
                        "emailAddress": "[email protected]",
                        "id": 3083181,
                        "displayName": "Dick",
                        "active": true,
                        "slug": "dick",
                        "type": "NORMAL"
                    },
                    "role": "PARTICIPANT",
                    "approved": false
                },
                {
                    "user": {
                        "name": "harry",
                        "emailAddress": "[email protected]",
                        "id": 99049120,
                        "displayName": "Harry",
                        "active": true,
                        "slug": "harry",
                        "type": "NORMAL"
                    },
                    "role": "PARTICIPANT",
                    "approved": true
                }
            ],
            "link": {
                "url": "http://link/to/pullrequest",
                "rel": "self"
            },
            "links": {
                "self": [
                    {
                        "href": "http://link/to/pullrequest"
                    }
                ]
            }
        }
    ],
    "start": 0
}

Approval Dates

What is missing still is the exact date of approval, though you can approximate it from the pull request closed date if you happen to use Checks for merging pull requests and require at least one approval.

  • Ideally a GET on /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/activities should return these details per reviewer, but unfortunately the fromType is only documented to support either COMMENT or ACTIVITY, but not APPROVAL.
  • If you desire this functionality, I suggest to watch(vote/comment on the related issue Indicate which pull request approvals are "out of date" (BSERV-3887) (or open a more precise new one of course).
like image 175
Steffen Opel Avatar answered Sep 14 '25 11:09

Steffen Opel