Как удалить созданный каталог, если команда Jgit clone не удалась? - PullRequest
0 голосов
/ 09 апреля 2019

Я написал простую функцию для клонирования репозитория с помощью Jgit CloneCommand.Это работает хорошо.Но локальный каталог, созданный в процессе, не может быть удален в случае сбоя процесса клонирования по любой причине, например, из-за неправильного имени пользователя или пароля.Потому что папка содержит активный репозиторий Git.

Я пытался "cloneCommand.getRepository (). Close ();"внутри блока catch это дает NullPointerException

File file = new File(localDirectory("Files/Application"));

CloneCommand cloneCommand = Git.cloneRepository();
        cloneCommand.setURI(repo.getUrl());
        cloneCommand.setDirectory(file);
cloneCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(repo.getUsername(), repo.getPassword()));
try {
    cloneCommand.call();
} catch (GitAPIException e) {
    if (file.exists()) {
            file.delete();
    }
}

1 Ответ

0 голосов
/ 09 апреля 2019

Вам нужно рекурсивно удалять файлы в правильном порядке.Некоторые файлы могут скоро отсутствовать (например, git locks file), поэтому удалять их нужно только в том случае, если файл все еще существует.

Git реализует AutoCloseable, поэтому его следует использовать с try-with-resources оператор.

Я сделаю что-то вроде этого:

try (Git git = Git.cloneRepository()
    .setDirectory(file)
    .call()) {
} catch (GitAPIException e) {
    Files.walkFileTree(file.toPath(), new DeleteFileVisitor())
}

DeleteFileVisitor.java

public class DeleteFileVisitor extends SimpleFileVisitor<Path> {

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes basicFileAttributes) throws IOException {
        Files.deleteIfExists(file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path directory, IOException ioException) throws IOException {
        Files.deleteIfExists(directory);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exception) {
        // log error
        return FileVisitResult.CONTINUE;
    }
}
...