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 3f85ca5639..05c9d01f7d 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 class GitExecutorCEImpl implements GitExecutor { } } }) - .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 class GitExecutorCEImpl implements GitExecutor { 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 class GitExecutorCEImpl implements GitExecutor { } }) .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 class GitExecutorCEImpl implements GitExecutor { 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 @@ public class GitExecutorCEImpl implements GitExecutor { .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 class GitExecutorCEImpl implements GitExecutor { } 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);