JGit에서 git branch -a --contains <commit id> --merged
을 어떻게 복제 할 수 있습니까?JGit은 "git branch -a --contains <commit id> --merged"와 같습니다.
이하, --merged
없이 복제하지만 변경 사항이 병합 된보고 분기에만 필터를 추가하는 방법과 병합 지점 이후에 생성 된 모든 분기를 포함하지 않는 방법을 잘 모르겠습니다.
명령 줄에서 수행 할 수있는 경우 JGit도 실행될 수 있다고 예상되지만 방법은 잘 모르겠습니다.
참고 : 아래 코드는 JGit 주위의 래퍼 인 GitController를 사용하므로 일부 방법은 순수한 JGit이 아닙니다.
코드
public List<String> getBranchesContainingCommit(File localWorkingCopy, String id, boolean onlymerged = true) {
List<String> branches = new ArrayList<>()
// Access Repository
Git git = openExistingRepository(localWorkingCopy)
// Find commit
RevWalk walk = new RevWalk(git.repository)
ObjectId foundId = git.repository.resolve(id + "^0")
RevCommit commit = walk.parseCommit(foundId)
// For all Remote Branches
getBranches(git,true).each{ Ref ref ->
if (walk.isMergedInto(
walk.parseCommit(ref.getObjectId()), commit)) {
branches.add(branchNameFromRefName(ref.name))
}
}
walk.close()
walk.dispose()
return branches
}
테스트 오류
java.lang.AssertionError: Wrong number of branches found
Expected: [feature/branchContainsMerged, feature/branchContainsBase]
Actual: [feature/branchContainsAfterMerge, feature/branchContainsBase, feature/branchContainsMerged, master]
Expected :2
Actual :4
<Click to see difference>
테스트 케이스
/**
* 1. Create baseBranch
* 2. branch branchMergedChangeSrc
* 3. Make change
* 4. merge branchMergedChangeSrc to baseBranch
* 5. branch branchUnmergedChangeSrc
* 6. Make change
* 7. Branch branchAfterMerge from baseBranch
*
* Expect: with merges filter
* idMerged on branchMergedChangeSrc, baseBranch
* idUnmerged on branchUnmergedChangeSrc
*/
String baseBranch="feature/branchContainsBase"
String branchMergedChangeSrc="feature/branchContainsMerged"
String idMerged = "f342575605aa297778047a940ac1f47b74c29d81"
String branchUnmergedChangeSrc="feature/branchContainsUnMerged"
String idUnmerged = "e1dbd1e371d60af235a1a0e82f95c25a9c0049b6"
String branchAfterMerge="feature/branchContainsAfterMerge"
@Before
void setup() {
controller = (GitController) getSCM(SCMType.Git)
workspace = createEmptyTestDir()
// Clone Skeleton
controller.cloneRepository(new File("testdata/skeleton.git").toURI().toString(), workspace)
}
@Test
void mergedBranchesForMergedCommitTest() {
List<String> containingBranches = controller.getBranchesContainingCommit(workspace, idMerged)
// Unmerged Change on Branch
checkBranches([branchMergedChangeSrc, baseBranch], containingBranches)
}
@Test
void unmergedBranchesForMergedCommitTest() {
List<String> containingBranches = controller.getBranchesContainingCommit(workspace, idUnmerged)
// Unmerged Change on Branch
checkBranches([branchUnmergedChangeSrc], containingBranches)
}
void checkBranches(List<String> expectedBranchNames, List<String> actual) {
assertEquals("""Wrong number of branches found
Expected: ${expectedBranchNames}
Actual: ${actual}""", expectedBranchNames.size(), actual.size())
expectedBranchNames.each { String branch ->
assertTrue("Expected ${branch} in containing: ${actual}", actual.contains(branch))
}
}