Quel est l'équivalent jgit pour "git merge-base – fork-point branchA twigB"

Quel est le codeo équivalent à jgit pour "git merge-base –fork-point twigA twigB"?

J'ai essayé le code ci-dessous mais je ne reçois pas la bonne réponse. J'utilise ceci pour chasser pour l'origine de twig. foreach.branch (git merge-base – fork-point mybranch leurbranch) ne donnera un identifiant de validation nul que pour le point d'origine.

Donc, tout ce que je dois faire est de comprendre comment faire cela en jgit et j'ai une méthode pour calculer l'origine de la twig quand je ne le connais pas déjà.

private Ssortingng getMergeBase(Repository repository, ObjectId commitIdA, ObjectId commitIdB) { RevWalk walk = new RevWalk(repository) try { RevCommit revA = walk.lookupCommit(commitIdA) RevCommit revB = walk.lookupCommit(commitIdB) walk.setRevFilter(RevFilter.MERGE_BASE) walk.markStart([revA,revB]) RevCommit mergeBase = walk.next() if (! mergeBase) { return null } return mergeBase.name } catch(Exception e) { project.logger.error("GetMergeBase Failed: ${commitIdA}, ${commitIdB} because ${e.message}") } return null } 

Solutions Collecting From Web of "Quel est l'équivalent jgit pour "git merge-base – fork-point branchA twigB""

Voici un moyen de le résoudre. note, j'écris dans Gradle / Groovy donc le code peut paraître un peu génial.

  • twigs getAll
  • pour chaque twig get la base de fusion commit – puisque tout vient du master, tous en findont un
  • itérer à travers les validations et arrêter sur le premier trouvé dans la list de base de fusion

`

 /** * Obtain GitWorkingCopyLog for all changes on branch with (svn --stop-on-copy equivalent) * @param repoDir * @return GitWorkingCopyLog */ private GitWorkingCopyLog getLogs(File repoDir) { List<RevCommit> commits = [] Git git = openExistingRepository(repoDir) ObjectId head = getHead(git.repository) // tip of current branch // find common merge ancestor branch points for all twigs List<Ssortingng> forkCandidates = mergeBaseForAllBranches(git, head) for (RevCommit r in git.log().call()) { if (r.name in forkCandidates) { break // stop looping on first rev in common merge base } commits.add(r) } return new GitWorkingCopyLog(git.repository, commits) } /** * Generate list of commit ids for merge base with all candidates. All twigs come from master * so all twigs share a common point of origin even if unrelated. * @param git jgit controller * @param head head revision for target branch * @return list of commit ids */ private ArrayList mergeBaseForAllBranches(Git git, ObjectId head) { def baseCandidates = [] getBranches(git).each { Ref other -> if (other.objectId != head) { Ssortingng base = getMergeBase(git.repository, head, other.objectId) baseCandidates.add(base) } } baseCandidates } /** * * @param repository * @param commitIdA * @param commitIdB * @return divergence point between the two twigs (even if seemingly unrelated all must come back to master) */ private Ssortingng getMergeBase(Repository repository, ObjectId commitIdA, ObjectId commitIdB) { RevWalk walk = new RevWalk(repository) try { RevCommit revA = walk.lookupCommit(commitIdA) RevCommit revB = walk.lookupCommit(commitIdB) walk.setRevFilter(RevFilter.MERGE_BASE) walk.markStart(revA) walk.markStart(revB) RevCommit mergeBase = walk.next() println "\tA: ${revA.name}\n\tB: ${revB.name}\n\tM: ${mergeBase.name}" if (! mergeBase) { return null } return mergeBase.name } catch(Exception e) { project.logger.error("GetMergeBase Failed: ${commitIdA}, ${commitIdB} because ${e.message}") } return null } /** * Get Refs for all twigs * @param git * @return Ref list */ private List<Ref> getBranches(Git git) { List<Ref> branchRefs = git.branchList().call() return branchRefs } `