diff --git a/app/server/appsmith-git/src/main/java/com/appsmith/git/service/ce/GitExecutorCEImpl.java b/app/server/appsmith-git/src/main/java/com/appsmith/git/service/ce/GitExecutorCEImpl.java index 3f85ca56399d..05c9d01f7dc1 100644 --- a/app/server/appsmith-git/src/main/java/com/appsmith/git/service/ce/GitExecutorCEImpl.java +++ b/app/server/appsmith-git/src/main/java/com/appsmith/git/service/ce/GitExecutorCEImpl.java @@ -499,7 +499,7 @@ public Mono pullApplication( } } }) - .onErrorResume(error -> Mono.error(error)) + .onErrorResume(error -> resetToLastCommit(git).flatMap(ignore -> Mono.error(error))) .timeout(Duration.ofMillis(Constraint.TIMEOUT_MILLIS)) .name(GitSpan.FS_PULL) .tap(Micrometer.observation(observationRegistry)), @@ -626,6 +626,15 @@ public Mono getStatus(Path repoPath, String branchName) { response.setRemoteBranch("untracked"); } + // Remove modified changes from current branch so that checkout to other branches + // will be possible + if (!status.isClean()) { + return resetToLastCommit(git).map(ref -> { + processStopwatch.stopAndLogTimeInMillis(); + jgitStatusSpan.end(); + return response; + }); + } processStopwatch.stopAndLogTimeInMillis(); jgitStatusSpan.end(); return Mono.just(response); @@ -844,7 +853,13 @@ public Mono mergeBranch(Path repoSuffix, String sourceBranch, String des } }) .onErrorResume(error -> { - return Mono.error(error); + try { + return resetToLastCommit(repoSuffix, destinationBranch) + .thenReturn(error.getMessage()); + } catch (GitAPIException | IOException e) { + log.error("Error while hard resetting to latest commit {0}", e); + return Mono.error(e); + } }) .timeout(Duration.ofMillis(Constraint.TIMEOUT_MILLIS)) .name(GitSpan.FS_MERGE) @@ -1013,6 +1028,19 @@ public Mono isMergeBranch(Path repoSuffix, String sourceBranch, mergeResult.getMergeStatus().name()); return mergeStatus; }) + .flatMap(status -> { + try { + // Revert uncommitted changes if any + return resetToLastCommit(repoSuffix, destinationBranch) + .map(ignore -> { + processStopwatch.stopAndLogTimeInMillis(); + return status; + }); + } catch (GitAPIException | IOException e) { + log.error("Error for hard resetting to latest commit {0}", e); + return Mono.error(e); + } + }) .timeout(Duration.ofMillis(Constraint.TIMEOUT_MILLIS)), Git::close) .subscribeOn(scheduler); @@ -1093,12 +1121,12 @@ private Mono resetToLastCommit(Git git) { .subscribeOn(scheduler); } - public Mono resetToLastCommit(Path repoSuffix, String branchName) { + public Mono resetToLastCommit(Path repoSuffix, String branchName) throws GitAPIException, IOException { return Mono.using( () -> Git.open(createRepoPath(repoSuffix).toFile()), git -> this.resetToLastCommit(git) .flatMap(ref -> checkoutToBranch(repoSuffix, branchName)) - .thenReturn(true), + .flatMap(checkedOut -> resetToLastCommit(git).thenReturn(true)), Git::close); } @@ -1128,7 +1156,7 @@ public Mono resetHard(Path repoSuffix, String branchName) { } public Mono rebaseBranch(Path repoSuffix, String branchName) { - return this.resetToLastCommit(repoSuffix, branchName).flatMap(isCheckedOut -> Mono.using( + return this.checkoutToBranch(repoSuffix, branchName).flatMap(isCheckedOut -> Mono.using( () -> Git.open(createRepoPath(repoSuffix).toFile()), git -> Mono.fromCallable(() -> { Span jgitRebaseSpan = observationHelper.createSpan(GitSpan.JGIT_REBASE);