Add `raw` option to list merge request diffs API
## Problem to Solve Currently the GitLab API returns diffs in via the [list merge request diffs](https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-request-diffs) API as a JSON object. It's possible to piece these together to produce a raw diff that could be immediately applied, but it's cumbersome for applications to introduce this logic. ## Proposal We should add a new REST API endpoint that replicates the behavior of the internal `.diff` endpoint. This would make it easier for applications to programmatically access diffs and use them. We can re-use the `send_git_diff` workhorse helper and make it usable in our rest API. An example of how we do this in our API (not raw diff but a raw blob) can be found in `lib/api/repositories.rb` for `get ':id/repository/blobs/:sha/raw'` endpoint. This REST API endpoint will send back a raw blob which workhorse will fetch and inject internally. <details> <summary>Old Description</summary> ### Summary The response of "Get single MR changes" API is different from documentation. ### Steps to reproduce ```bash $ curl -H "Authorization: Bearer XXXXXXXXXXXXXXXXXXX" https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab/merge_requests/45705/changes | jq { "id": 75095749, ... "changes": [ { ... "renamed_file": false, "deleted_file": false, "diff": "@@ -43,7 +43,7 @@\n \"@babel/preset-env\": \"^7.10.1\",\n \"@gitlab/at.js\": \"1.5.5\",\n \"@gitlab/svgs\": \"1.171.0\",\n- \"@gitlab/ui\": \"21.34.1\",\n+ \"@gitlab/ui\": \"21.34.2\",\n \"@gitlab/visual-review-tools\": \"1.6.1\",\n \"@rails/actioncable\": \"^6.0.3-3\",\n \"@rails/ujs\": \"^6.0.3-2\",\n" }, ... ] } ``` ### Example Project N/A ### What is the current *bug* behavior? "get single MR changes" API returns diff text that doesn't have two-line header about from-file/to-file. ```bash ... "diff": "@@ -43,7 +43,7 @@\n \"@babel/preset-env\": \"^7.10.1\",\n \"@gitlab/at.js\": \"1.5.5\",\n \"@gitlab/svgs\": \"1.171.0\",\n- \"@gitlab/ui\": \"21.34.1\",\n+ \"@gitlab/ui\": \"21.34.2\",\n \"@gitlab/visual-review-tools\": \"1.6.1\",\n \"@rails/actioncable\": \"^6.0.3-3\",\n \"@rails/ujs\": \"^6.0.3-2\",\n" ... ``` ### What is the expected *correct* behavior? I expect that diff text has two-line header about from-file/to-file as documented. https://docs.gitlab.com/ee/api/merge_requests.html#get-single-mr-changes ```bash ... "diff": "--- a/VERSION\ +++ b/VERSION\ @@ -1 +1 @@\ -1.9.7\ +1.9.8", ... ``` ### Relevant logs and/or screenshots Described in `Steps to reproduce` ### Output of checks This bug happens on GitLab.com #### Results of GitLab environment info N/A #### Results of GitLab application Check N/A ### Possible fixes It's easy way to fix API document. But, I prefer to fix the response of API, because some library (I'm using [java-diff-utils](https://github.com/java-diff-utils/java-diff-utils)) expect that diff text has two-line header. </details>
issue