It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

REST API: how to check if a PR has conflict(s)

As far as I know, the /pullrequests API (https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/pullrequests) doesn't offer a way of checking if a PR has conflicts.

I'm aware of the state attribute (MERGED, SUPERSEDED, DECLINED), but it won't help here, because all it shows is the status of the PR after an action has been taken.

I've also checked the pullrequests/{pull_request_id}/statuses endpoint, which also returns a state attribute, but again it only makes sense after some other thing has happened (a Pipelines build, for example):
SUCCESSFUL, FAILED, INPROGRESS, STOPPED. None of these help.

Ideally, as soon as a PR has been opened (independently of Pipelines or any further human interaction), some API endpoint should allow me to check if that PR contains conflicts or not.

Does anybody know of an indirect way of doing this? Preferably through an endpoint that does exist ;)

Thanks

4 answers

One solution is to get a diff of the PR from the api and grep it for for instances of "<<<<<<<"  That will indicate if there is a conflict.

https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/pullrequests/%7Bpull_request_id%7D/diff

That worked for me! Thank you!

My paid add-on, Bit-Booster - Rebase Squash Amend, makes that info available through its own internal API (servlet/bb_rb).

e.g., if you install my add-on, then this endpoint becomes available:

/plugins/servlet/bb_rb/projects/PROJECT_1/repos/rep_1/pull-requests/1

Look for the "isConflicted" key in the API response.

You can see the API whines about the add-on license being expired, but it never stops working.


Result:

{"enabled" : true,
"warn" : "Bit-Booster <a class='bbErr' target='_blank' href='http://localhost:7990/bitbucket/plugins/servlet/upm#manage/com.bit-booster.bb'>license expired</a>. 10 free rebases remain for today.",
"userHasWrite" : true,
"commitCount" : "1 commit",
"fromBranch" : "m",
"toBranch" : "basic_branching",
"tipMsg" : "b",
"isSquashed" : true,
"isRebased" : false,
"isConflicted" : false,
"blockMsg" : "",
"authors" : ["Administrator &lt;admin@example.com&gt;","Sylvie Davies &lt;sylvie@bit-booster.com&gt;"],
"defaultAuthor" : "Sylvie Davies &lt;sylvie@bit-booster.com&gt;",
"amendAuthor" : "Sylvie Davies &lt;sylvie@bit-booster.com&gt;",
"squashMsg" : "b",
"eof":"eof"}

 

But if you disable the Rebase, Squash, Amend functionality through Bit-Booster's config screen, then the API just returns this:

 

{"enabled" : false,
"warn" : "Bit-Booster <a class='bbErr' target='_blank' href='http://localhost:7990/bitbucket/plugins/servlet/upm#manage/com.bit-booster.bb'>license expired</a>. 10 free rebases remain for today.",
"eof":"eof"}

 

Looks like it covers what we need. Does that addon work for Bitbucket Cloud as well?

Oh, sorry, Bitbucket Server (on-prem) only.   To implement this for cloud we'd need to store git repos for every customer, which is something we're not interested in doing at this time.

Here's the code (Java, using the JGit library) we use to calculate if the merge has a conflict or not:

ThreeWayMerger merger = MergeStrategy.RECURSIVE.newMerger(fileRepo, true);
ObjectId b1 = ObjectId.fromString(branch1);
ObjectId b2 = ObjectId.fromString(branch2);
boolean canMerge = merger.merge(b1, b2);

You might be able to suit that to your needs.  Note: that code creates a new tree-object in the git object database (the result of the merge), but since we never bother creating any pointers to the tree-object, subsequent "git gc" invocations clear it out.

Thanks for your help, @G. Sylvie Davies -bit-booster.com- (and for sharing your code)

Hey,

So was in the same pinch, checked source code of the pull request html page and found out that there is indeed an endpoint for checking conflicts. 

And that is *Drumroll please*

https://bitbucket.org/api/1.0/repositories/<org_or_profile>/<repo_name>/pullrequests/<pull_request_id>/conflict-status

For example I got the pull request id from:

https://api.bitbucket.org/2.0/repositories/<org_or_profile>/<repo_name>/pullrequests/?fields=values.id

Then used that ID in the above conflict-check endpoint. 

Cheers! 

1.0 api will be deprecated at the end of the year. Is there a way to get the conflict-status on 2.0?

Like # people like this

In Bitbucket Server:

https://<hostname>/rest/api/1.0/projects/<project>/repos/<repo>/pull-requests/<pull-request-id>/merge

returns:

{"canMerge":false,"conflicted":true,"outcome":"CONFLICTED","vetoes":[...]}

 

Suggest an answer

Log in or Sign up to answer
Community showcase
Published in Bitbucket

Atlassian supported Jenkins integration for Bitbucket Server

We’ve been building a plugin to integrate Bitbucket Server and Jenkins CI, and I’m excited to announce that our alpha is ready to download and install. It lets you seamlessly configure a Jenkins job ...

423 views 0 9
Read article

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you