diff --git a/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java b/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java index d1fa1c01c4c..4565778abde 100644 --- a/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java @@ -23,10 +23,13 @@ import org.apache.commons.lang3.function.Consumers; import org.checkerframework.checker.nullness.qual.Nullable; import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.MergeCommand; -import org.eclipse.jgit.api.PullResult; +import org.eclipse.jgit.api.ResetCommand; +import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.TransportException; import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.merge.ContentMergeStrategy; +import org.eclipse.jgit.merge.MergeStrategy; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -102,14 +105,25 @@ private static CompletableFuture loadRepository() { try { if (Files.isDirectory(NEURepoManager.LOCAL_REPO_DIR)) { try (Git localRepo = Git.open(NEURepoManager.LOCAL_REPO_DIR.toFile())) { - PullResult result = localRepo.pull().setRebase(false).setFastForward(MergeCommand.FastForwardMode.FF_ONLY).call(); - if (result.isSuccessful()) { - LOGGER.info("[Skyblocker NEU Repo] NEU Repository updated with merge status: {}", result.getMergeResult().getMergeStatus()); - } else { - LOGGER.error("[Skyblocker NEU Repo] Update failed with merge status: {}. Downloading new repository", result.getMergeResult().getMergeStatus()); - Scheduler.INSTANCE.schedule(() -> deleteAndDownloadRepositoryInternal(MinecraftClient.getInstance().player), 1); - success = false; + boolean stashed = localRepo.stashCreate().call() != null; + localRepo.fetch() + .setRefSpecs("+refs/heads/master:refs/remotes/origin/master") + .setThin(true) + .setDepth(1) + .call(); + Ref ref = localRepo.reset() + .setRef("refs/remotes/origin/master") + .setMode(ResetCommand.ResetType.HARD) + .disableRefLog(true) + .call(); + if (stashed) { + localRepo.stashApply() + .setContentMergeStrategy(ContentMergeStrategy.THEIRS) + .call(); + localRepo.stashDrop().call(); + LOGGER.info("[Skyblocker NEU Repo] Auto stash has been applied to the NEU Repository"); } + LOGGER.info("[Skyblocker NEU Repo] NEU Repository was updated to {}", ref.getObjectId().getName()); } } else { Git.cloneRepository() @@ -117,14 +131,14 @@ private static CompletableFuture loadRepository() { .setDirectory(NEURepoManager.LOCAL_REPO_DIR.toFile()) .setBranchesToClone(List.of("refs/heads/master")) .setBranch("refs/heads/master") - .setDepth(1) // do shallow clone + .setDepth(1) .call().close(); LOGGER.info("[Skyblocker NEU Repo] NEU Repository Downloaded"); } } catch (TransportException e) { LOGGER.error("[Skyblocker NEU Repo] Transport operation failed. Most likely unable to connect to the remote NEU repo on github", e); success = false; - } catch (RepositoryNotFoundException e) { + } catch (GitAPIException | RepositoryNotFoundException e) { LOGGER.warn("[Skyblocker NEU Repo] Local NEU Repository not found or corrupted, downloading new one", e); Scheduler.INSTANCE.schedule(() -> deleteAndDownloadRepositoryInternal(MinecraftClient.getInstance().player), 1); success = false;