Search code examples
javajgit

How to get file by ObjectId in jgit


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;
}

Solution

  • 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