RFR: Add topological merge bot

Jorn Vernee via github.com duke at openjdk.java.net
Thu Aug 29 14:20:17 UTC 2019


On Thu, 29 Aug 2019 13:19:39 GMT, mcimadamore via github.com <duke at openjdk.java.net> wrote:

> On Thu, 29 Aug 2019 12:28:41 GMT, Jorn Vernee via github.com <duke at openjdk.java.net> wrote:
> 
>> This PR adds a bot that does a topological merge of the branches in a repo.
>> 
>> The branches can declare a dependencies file, which lists the branches that they depend on. This bot will crawl the branches, collect the dependencies for each branch, and topologically sort them based on their dependencies. Following that it will attempt to merge each dependency into the dependent in this order (this is mainly done so that we get less merges/failures if one of the root merges fails).
>> 
>> Branches that do not declare a dependency file implicitly depend on the master branch. Therefore the list of branches that the bot considers is passed in during configuration.
>> 
>> ---
>> 
>> Aside from that, it also fixes a minor problem with `Repository::clone` on Windows.
>> 
>> ----------------
>> 
>> Commits:
>>  - 4a8f3610:	Added top bot module
>> 
>> Pull request:
>> https://git.openjdk.java.net/skara/pull/105
>> 
>> Webrev:
>> https://webrevs.openjdk.java.net/skara/105/webrev.00
>> 
>> Patch:
>> https://git.openjdk.java.net/skara/pull/105.diff
>> 
>> Fetch command:
>> git fetch https://git.openjdk.java.net/skara pull/105/head:pull/105
> 
> bots/topological/src/main/java/org/openjdk/skara/bots/topological/TopologicalBot.java line 152:
> 
>> 151:             var isFastForward = repo.isAncestor(repo.head(), fromHash);
>> 152:             repo.merge(fromHash);
>> 153:             if (!isFastForward) {
> 
> All the logic in this routine is very dependent on the behavior of the VCS, and on which actual concrete commands do these API method map to, so it's hard to check whether this code is correct. One issue you already pointed oit yourself: with the abortMerge() method. Another issue I see is the behavior with respect to a merge conflict. In the old script we had to tweak the standard behavior a bit to try and auto-resolve conflicts as much as possible. I don't know what the standard merge behavior is in Git.
> 
> PR: https://git.openjdk.java.net/skara/pull/105

There are 2 kinds of merges that can go on. 1.) where the child branch has not diverted, e.g. by making it's own commits, from the parent branch. In that case a 'fast forward' happens, and no merge commit is made. 2.) In the case the child branch has diverted, we make merge commit that shows a merge from the parent has happened.

I don't think there are cases where we can get 2 commits (since `merge` alone never makes a commit [1](https://github.com/openjdk/skara/blob/master/vcs/src/main/java/org/openjdk/skara/vcs/git/GitRepository.java#L873)), but we could for instance disable the fast forward behaviour and then we always make a commit?

PR: https://git.openjdk.java.net/skara/pull/105


More information about the skara-dev mailing list