GitLab API to post inline comment to Merge Request - gitlab

Using GitLab API it is possible to post a comment to a commit "on a particular line of a particular file" (see here).
On Merge Request in order to add comments it's required to use the notes resource (see here) but the note object does not seem to contain any parameter to comment on a particular line.
However from the GitLab UI I'm able to add inline comments to a Merge Request in the Changes tab but when I call the API and look at the corresponding note object created from my inline comment there is nothing about the inline, it is only a regular note object without any line or line_type parameter...
Anyone knows how to use the GitLab API to add inline comments to a Merge Request ?

In order to add inline comments for merge requests, there is Discussions API: https://docs.gitlab.com/ce/api/discussions.html
Each discussion can contain a position in the code, like that:
"position": {
"base_sha": "b5d6e7b1613fca24d250fa8e5bc7bcc3dd6002ef",
"start_sha": "7c9c2ead8a320fb7ba0b4e234bd9529a2614e306",
"head_sha": "4803c71e6b1833ca72b8b26ef2ecd5adc8a38031",
"old_path": "package.json",
"new_path": "package.json",
"position_type": "text",
"old_line": 27,
"new_line": 27
},

The notes API is used to only add comments to the Merge Request.
In order to add inline comments to the source code, you must use this other API endpoint:
https://docs.gitlab.com/ce/api/commits.html#post-comment-to-commit
But this API sets the comment in the commit list. You will not see the comment anywhere in the "Merge Request" page.

Code
functions.yml
.commit_comment:
script:
- export GITLAB_TOKEN="PROJECT_ACCESS_TOKEN"
- |
commit_comment() {
curl --location --request POST "https://gitlab.com/api/v4/projects/$CI_MERGE_REQUEST_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes" --header "PRIVATE-TOKEN: $GITLAB_TOKEN" --header "Content-Type: application/json" --data-raw "{ \"body\": \"$1\" }"
}
How to Use?
# ...
script:
- !reference [.commit_comment, script]
- commit_comment "YOUR_MESSAGE"
# ...
ℹ️ Markdown is allowed for the message
Generating Token
Go to Your Project > Settings > Access Tokens
Enter a Token name
Choose Reporter as role
Select the api scope. You can add more scopes but this is all we need here
Generate the token
P.s. Here, I have created a function to use with multiple jobs but you also directly use the curl command anywhere directly by replacing $1 with your message.
Ref

I am using the python gitlab module and this is the format to add an inline comment. Please note that adding comments will fail If the line is not modified.
import gitlab
gl = gitlab.Gitlab(ci_server_url, oauth_token)
merge_request = gl.projects.get(project_id).mergerequests.get(merge_request_iid)
position = {
"base_sha": merge_request.diff_refs["base_sha"],
"head_sha": merge_request.diff_refs["head_sha"],
"start_sha": merge_request.diff_refs["start_sha"],
"new_path": "1.py",
"new_line": 18,
'position_type': 'text'
}
disc = merge_request.discussions.create({"body": "This is a comment on line 18", "position": position})

Related

How can I use the REST API to Remove Hold on a Bill?

I've created a bill using the REST API - but now I want to release it (which exists as an action) - but I'm assuming I have to remove the HOLD before I do that. I don't see that as an action. How would I go about doing that? And if this topic exists somewhere in the documentation, please let me know - I haven't been able to find anything.
Thanks...
You can extend the Bills endpoint and add action to it.
You need to add a new action to the Actions node of the Bills endpoint in the extended Web Service Endpoint like below
Then you can use that action like the below:
curl --request POST 'http://localhost/Acumatica/entity/DefaultExt/22.200.001/Bill/ReleaseFromHold'
--data-raw '{
"Entity": {
"Type": {"value":"Bill"},
"ReferenceNbr":{"value":"003238"}
}
}'
Since the hold status is still defined using the hold field, you can achieve that result by passing the false value to the Hold field.
{{BaseUrl}}/entity/default/22.200.001/Bill
{
"id": "589535fc-4a60-ed11-84a8-00e04cc71f57",
"Hold": {"value": false}
}

creating a selector for document's name

I am using CouchDB v3.1.0 and am trying to create a selector for /{db}/_find to find documents named "foobar".
In the docs section 1.3.6.1.1 Selector Basics, there are several mentions of a $title:
"selector": {
"$title": "Live And Let Die"
}
However, when I try to use it like so:
curl -X POST -H "Content-Type: application/json" \
http://my-host-machine:5984/testdb/_find \
-d '{"selector":{"$title":"foobar"}}' --user admin | jq .
The following error message is output:
{
"error": "invalid_operator",
"reason": "Invalid operator: $title"
}
What does work is using the _id field in the selector: '{"selector":{"_id":"foobar"}}'
However, this doesn't feel correct to use a document's unique identifier. My questions:
Does $title work? (Am I just using it incorrectly)
Is _id an appropriate method?
If a name field has a dollar sign ($) prefix, CouchDB interprets it as an operator. $title however isn't a valid operator and the related selector samples in the documentation seem to be wrong.
On the other hand, when you need to select documents by a field that is preceded by a dollar sign ($), this answer may be useful.

commitlint config-conventional - Add prefix for commit messages

I am trying to implement commitlint for one of my repo so all the commit messages are standard. However, we have requirement to ADD JIRA ID as part of prefix.
currently, commitlint format is as below
subject(scope): message
I need as mentioned below
JIRA-ID: subject(scope): message
following works
parserPreset: {
parserOpts: {
issuePrefixes: ['w{2,4}-[0.9]{2,4}']
}
}
However it validates that JIRA id should be at the end. someething like below
subject(scope): message JIRA-ID
You can use this package https://github.com/Gherciu/commitlint-jira it works good out of the box with Jira commits style ;)
For Tips and Advanced Usage you can read this Blog Post

swagger-js: how to add authorization headers?

I'm trying to do something very simple: add api key authorization header in a post request.
What I tried so far:
add it under headers key in requestOptions
add it when creating the client under authorization key
this is where the search space begins to expand: which key do I add? the security type apiKey? Whatever key I gave it in my spec? The actual header name? (none of those worked, btw)
Unfortunately, I could not find any helpful info in documentation (actually I could not find any documentation other than the README and the FAQ pages which do not provide disambiguation in this matter).
So, any practical example and/or point to un/official docs that show how to work with this thing would be greatly appreciated.
So, from digging around in swagger-js code, "Whatever key I gave it in my spec" is the way to go. Meaning, if your security schemes look like this:
components:
securitySchemes:
ymlSpecAuthKeyName: # <-- also swagger-js key
type: apiKey
name: X-Auth-Header-Name
in: header
and you want your request to look like this:
curl -X POST "http://your-api-url.com/doc-you-want-to-create" \
-H "X-Auth-Header-Name: api-key-header-value" \
-H "Content-Type: application/json" \
-d "{\"json-request-body\": \"goes-here\"}"
Then you should make a swagger-js client like this:
let client = await Swagger({
spec: spec,
authorizations: {
ymlSpecAuthKeyName: 'api-key-header-value',
}
});

How to tag a Commit in API using curl command

I am trying to use a curl command to tag a commit. Is this possible? I went through the create-a-tag-object link from GitHub, but it doesn't work.
Creating a tag is a bit complicated, but if you just follow the API docs you should be fine. Note that the API docs say:
Note that creating a tag object does not create the reference that makes a tag in Git. If you want to create an annotated tag in Git, you have to do this call to create the tag object, and then create the refs/tags/[tag] reference. If you want to create a lightweight tag, you simply have to create the reference - this call would be unnecessary.
So, before you continue with creating a tag, you should know what kind of tag you want to create -- annotated or lightweight. Basically, an annotated tag is the same as a lightweight, but it also contains a message of the tag, info about the author of the tag, and the date and time when the tag was created. A lightweight tag is just a named pointer to a specific commit in your history.
Ok, so, what the API docs basically say is: if you want to create an annotated tag - you will have to make 2 API calls, and if you want to create a lightweight tag - you will have to make just 1 call. So, I'll give an example of creating an annotated tag with the 2 API calls, and if you want to create a lightweight tag - just skip the first API call and go to the second.
To create an annotated tag, you have to:
Step 1
Create a tag object using the tags API. The API docs are a bit unclear here how the parameters should be passed. What's missing is an example of the message that you need to send to the server. So, create a file called tag_object_req.json on your local disk, and put the following JSON document in it:
{
"tag": "v0.0.1",
"object": "c5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b",
"message": "creating a tag",
"tagger": {
"name": "Ivan Zuzak",
"email": "izuzak#gmail.com",
"date": "2012-06-17T14:53:35-07:00"
},
"type": "commit"
}
Obviously, you have to replace the information in the document to reflect your situation. The meaning of the parameters are described in the API docs here.
After you have saved the file, you can make an API call using curl to create the tag object:
curl -v -X POST -d #tag_object_req.json --header "Content-Type:application/json" -u izuzak "https://api.github.com/repos/izuzak/test/git/tags"
So, the -v part will force curl to output all HTTP headers, the -X POST part means that an HTTP POST request must be made, -d #tag_object_req.json specifies which file will be used as the content (body) of the POST request, --header "Content-Type:application/json" specifies the media type of the request (JSON message), and -u izuzak specifies your username for authorization (and curl will ask you for your password when you make the request).
The response you get should be a 201 Created HTTP response, with the JSON message structured as this:
{
"sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267",
"url": "https://api.github.com/repos/izuzak/test/git/tags/e6d9fb6b9a13cab11923345e2400d5cf8df97267",
"tagger": {
"name": "Ivan Zuzak",
"email": "izuzak#gmail.com",
"date": "2012-06-17T21:53:35Z"
},
"object": {
"sha": "c5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b",
"type": "commit",
"url": "https://api.github.com/repos/izuzak/test/git/commits/c5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b"
},
"tag": "v0.0.1",
"message": "creating a tag"
}
Before continuing, notice the sha attribute of the object you just created (e6d9fb6b9a13cab11923345e2400d5cf8df97267) because you will use this value in the next step.
Step 2
Create a tag reference using the references API. The API docs are much clearer here about what the request should look like. So, you first have to create another file on the disk, named tag_ref_req.json, and put this content inside:
{
"ref": "refs/tags/v0.0.1",
"sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267"
}
However, notice that the value of the sha in this JSON depends on the type of tag you are creating. If you are creating an annotated tag, the value of the sha is the same value you got from the previous step - the sha of the tag object (e6d9fb6b9a13cab11923345e2400d5cf8df97267). However, if you are creating a lightweight tag, the value of the sha is the sha of the commit object you are tagging with the tag, because you have not created a tag object. In my case, you can see in step 1 that the commit object I am tagging is c5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b, and this will be different in your case of course if you are creating a lightweight tag.
Ok, so after you have created this file and defined the sha and the name of the tag, you can make an API request in a similar way as in the previous step, using curl:
curl -v -X POST -d #tag_ref_req.json --header "Content-Type:application/json" -u izuzak "https://api.github.com/repos/izuzak/test/git/refs"
Notice that we are now making a request to https://api.github.com/repos/izuzak/test/git/refs with the second file as the content.
The response should again be a 201 Created HTTP response, and the body will be a JSON document looking like this:
{
"ref": "refs/tags/v0.0.1",
"url": "https://api.github.com/repos/izuzak/test/git/refs/tags/v0.0.1",
"object": {
"sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267",
"type": "tag",
"url": "https://api.github.com/repos/izuzak/test/git/tags/e6d9fb6b9a13cab11923345e2400d5cf8df97267"
}
}
And now you can navigate to your project on GitHub and go to "Switch branches/tags" and see your tag there.
Hope this helps!
You can also try the new Releases API
http://developer.github.com/v3/repos/releases/#create-a-release
curl \
--user <username> \
--header "Accept: application/vnd.github.manifold-preview" \
--data "tag_name=mytagname" \
"https://api.github.com/repos/<username>/<repository>/releases"
This is curl will create Releases. (But as ChucK mentioned it may create only lightweight tag, I haven't personally verified this )
curl \
--user <Your Github username> \
--header "Accept: application/vnd.github.manifold-preview" \
--data '{"tag_name": "v1.0.0", "target_commitish": "master", "name": "v1.0.0", "body": "Description of the release", "draft": false, "prerelease": false }' \
"https://api.github.com/repos/<OrganizationName>/<RepoName>/releases" -X POST
Adding this here, incase anybody come looking for this, like me.

Resources