I have some objectId from each files in my directory and some time after I want to find this file by objectId. I can make it only like hard way... but maybe there is/are some another solution/s ?
This is my way
public String findFolderDtoNameByObjectId(Repository repository, String objectId) throws IOException {
Ref head = repository.findRef(Constants.HEAD);
if (head == null) {
throw new NullPointerException();
}
try (RevWalk walk = new RevWalk(repository)) {
RevCommit commit = walk.parseCommit(head.getObjectId());
RevTree tree = commit.getTree();
try (TreeWalk treeWalk = new TreeWalk(repository)) {
treeWalk.addTree(tree);
treeWalk.setRecursive(true);
while (treeWalk.next()) {
if (treeWalk.getObjectId(0).getName().equals(objectId)) {
GitFileDto dto = new GitFileDto();
dto.setFullPath(treeWalk.getPathString());
dto.setName(treeWalk.getNameString());
dto.setObjectId(treeWalk.getObjectId(0).getName());
dto.setContent(getContentFromTree(treeWalk, repository));
return dto;
} else if (treeWalk.isSubtree()) {
treeWalk.enterSubtree();
}
}
}
}
return null;
}
My Answer is
public GitFileDto findFileDtoByObjectId(Repository repository, String objectId) throws IOException {
Ref head = repository.findRef(HEAD);
try (RevWalk walk = new RevWalk(repository)) {
RevCommit commit = walk.parseCommit(head.getObjectId());
RevTree tree = commit.getTree();
try (TreeWalk treeWalk = new TreeWalk(repository)) {
treeWalk.addTree(tree);
treeWalk.setRecursive(true);
while (treeWalk.next()) {
ObjectId objectId1 = treeWalk.getObjectId(0);
if (objectId1 != null && objectId.equals(objectId1.getName())) {
return getGitFileDto(repository, treeWalk);
}
}
}
}
throw new Exception(String.format("There is no file with objectId: %s ", objectId));
}
private GitFileDto getGitFileDto(Repository repository, TreeWalk treeWalk) throws IOException {
GitFileDto dto = new GitFileDto();
dto.setFullPath(treeWalk.getPathString());
dto.setName(treeWalk.getNameString());
ObjectId objectId = treeWalk.getObjectId(0);
dto.setObjectId(objectId.getName());
try (ObjectReader objectReader = repository.newObjectReader()) {
ObjectLoader objectLoader = objectReader.open(objectId);
byte[] bytes = objectLoader.getBytes();
dto.setContent(new String(bytes, StandardCharsets.UTF_8));
}
return dto;
}
But I don't like this, because I have to parse the whole tree by myself and I think it is wierd and slow