API v4: GET repository/commits/.../diff cuts off long diffs and does not provide way to get full diff
<!--IssueSummary start--> <details> <summary> Everyone can contribute. [Help move this issue forward](https://handbook.gitlab.com/handbook/marketing/developer-relations/contributor-success/community-contributors-workflows/#contributor-links) while earning points, leveling up and collecting rewards. </summary> - [Close this issue](https://contributors.gitlab.com/manage-issue?action=close&projectId=278964&issueIid=26731) </details> <!--IssueSummary end--> ### Summary I am filing this ticket as a follow-up to https://gitlab.com/gitlab-org/gitlab-ce/issues/50014. I will re-iterate the summary: If I have a commit in my repository, where the UI shows the following message: > This source diff could not be displayed because it is too large. You can view the blob instead. then the API call ``` GET /api/v4/projects/<project>/repository/commits/<SHA>/diff ``` will give the following result: ``` [ { "old_path": "npm-shrinkwrap.json", "new_path": "npm-shrinkwrap.json", "a_mode": "100644", "b_mode": "100644", "new_file": false, "renamed_file": false, "deleted_file": false, "diff": "" } ] ``` @oswaldo stated on the original ticket: > As of `11.3` we started cutting-off 'too large' diffs (this case) in the source (Gitaly). The only way of accessing these right now is by fetching the *blob* content. This appears to be the case, but there is no field in the API response telling me that the diff has been cut-off. There should be a boolean called `pruned` that lets me know if I cannot rely on the diff field. Also, Oswaldo's response that we should use the `blob` endpoint does not address the problem: the `blob` endpoint gives us the file content, not the diff content. Thus, if the response from `GET /api/v4/projects/<project>/repository/commits/<SHA>/diff` is cut-off I know of no good way for us to get the full diff from the API. ### Steps to reproduce * Clone the repository from https://gitlab.com/rothkamp/testrepo to a GitLab CE server * Make the API call: GET /api/v4/projects/rothkamp%2Ftestrepo/repository/commits/469d79cb3f70c7c51dc673d78df7ea98e2e1f84f/diff ### Example Project https://gitlab.com/rothkamp/testrepo ### What is the current *bug* behavior? * There is no field in the API response indicating that the file diff has been cut-off. * There is no known way to get the full diff for a file if the `commits/.../diff` is cut-off ### What is the expected *correct* behavior? * The API response indicates per-file whether the `diff` field is cut-off or not. * The v4 API provides a way to get the full diff for a file in a commit. #### Results of GitLab environment info <details> <summary>Expand for output related to GitLab environment info</summary> <pre> GitLab Enterprise Edition 11.4.8-ee </pre> </details>
issue