Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the raw content of a file through GitLab REST API?

Tags:

git

rest

gitlab

The following REST Url of GitLab API gives me the repository tree of a project.

Get Repo Tree (WORKS)

https://gitlab.gspt.net/api/v3/projects/2931/repository/tree?private_token=XXXX

Output:

[
    {
        "id": "a49d11794ed56db7f935abfd61002aef67159d10",
        "name": "src",
        "type": "tree",
        "path": "src",
        "mode": "040000"
    },
    {
        "id": "0fbd98527d4b36e3d22c164293d8fd8eee4d18cd",
        "name": ".gitignore",
        "type": "blob",
        "path": ".gitignore",
        "mode": "100644"
    },
    {
        "id": "0ef0da472176f2e6a24843ac9d4bb738c8310d23",
        "name": "pom.xml",
        "type": "blob",
        "path": "pom.xml",
        "mode": "100644"
    }
]

But I am not able to get the raw content of a file, pom.xml to be precise.

Get Raw Content of a file (DOES NOT WORK - Gives 404)

https://gitlab.gspt.net/api/v3/projects/2931/repository/files/pom%2Exml/raw?private_token=xxxx&ref_name=master

Output:

{
    "error": "404 Not Found"
}

As per the documentation here (https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository) I am specify the correct rest url. The only thing that's different however is the use of V4 instead of V3 in the rest api endpoint. I searched around but could not find the endpoint of v3 api.

like image 503
Nital Avatar asked Jun 30 '17 02:06

Nital


People also ask

What is GitLab REST API?

The GitLab API allows you to perform many of the actions you typically do when using the user interface. Using the API allows us to automate the process and eliminate any user interaction. The GitLab API comes in two flavors: the REST API and the GraphQL API.

How do I find my GitLab file?

The file finder feature allows you to search for a file in a repository using the GitLab UI. To use it: Go to your project's Repository > Files. In the upper right corner, select Find File.


1 Answers

First, just in case, don't percent encode the ".":

.../files/pom.xml/raw?...
            ^^

Second, you can check how the files endpoint was affected from v3 to v4 in the merge request 9637 and this comparison

v3:
GET /projects/:id/repository/raw_blobs/:sha
v4:
GET /projects/:id/repository/blobs/:sha/raw

You can see the examples (in v3) did not percent encode the dot.

curl --request GET --header 'PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK' \
  'https://gitlab.example.com/api/v3/projects/13083/repository/files?file_path=app/models/key.rb&ref=master'

However, the v3 API only allows to get raw blobs, not a raw file.
See merge request 16834:

  • Modify /projects/:id/repository/files to /projects/:id/repository/files/:filepath (:filepath should be URL-encoded)
  • Move /projects/:id/repository/blobs/:sha to /projects/:id/repository/files/:filepath/raw

Only v4 API allows for a :filepath parameters.

See "Git objects SHA-1 are file contents or file names?" to decode the raw blob you get from API v3.

like image 58
VonC Avatar answered Oct 01 '22 01:10

VonC