From 5d00e3bd8eec6d902c40af5c2b93a91e4a3f93cd Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 21 Oct 2009 09:37:12 +0400 Subject: [PATCH] Git: detect file status is modified for not-jet-saved-document --- .../src/git4idea/GitContentRevision.java | 11 ++++ .../git4idea/changes/GitChangeProvider.java | 58 ++++++++++++++++++- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/plugins/git4idea/src/git4idea/GitContentRevision.java b/plugins/git4idea/src/git4idea/GitContentRevision.java index 4eeed34c70e3..e7cbb2a0ef92 100644 --- a/plugins/git4idea/src/git4idea/GitContentRevision.java +++ b/plugins/git4idea/src/git4idea/GitContentRevision.java @@ -17,6 +17,7 @@ package git4idea; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.FilePath; +import com.intellij.openapi.vcs.FilePathImpl; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.ContentRevision; import com.intellij.openapi.vcs.changes.CurrentContentRevision; @@ -124,4 +125,14 @@ public class GitContentRevision implements ContentRevision { return CurrentContentRevision.create(file); } } + + public static ContentRevision createRevision(final VirtualFile file, final VcsRevisionNumber revisionNumber, final Project project) throws VcsException { + final FilePathImpl filePath = new FilePathImpl(file); + if (revisionNumber != null) { + return new GitContentRevision(filePath, (GitRevisionNumber)revisionNumber, project); + } + else { + return CurrentContentRevision.create(filePath); + } + } } diff --git a/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java b/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java index 2aa76be7ff06..d51ead92934e 100644 --- a/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java +++ b/plugins/git4idea/src/git4idea/changes/GitChangeProvider.java @@ -15,17 +15,21 @@ */ package git4idea.changes; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vfs.VirtualFile; +import git4idea.GitContentRevision; +import git4idea.GitRevisionNumber; import git4idea.GitUtil; import git4idea.GitVcs; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.List; +import java.util.Set; /** * Git repository change provider @@ -53,14 +57,62 @@ public class GitChangeProvider implements ChangeProvider { final ProgressIndicator progress, final ChangeListManagerGate addGate) throws VcsException { Collection roots = GitUtil.gitRootsForPaths(dirtyScope.getAffectedContentRoots()); + + final MyNonChangedHolder holder = new MyNonChangedHolder(myProject, dirtyScope.getDirtyFilesNoExpand()); + for (VirtualFile root : roots) { ChangeCollector c = new ChangeCollector(myProject, dirtyScope, root); - for (Change file : c.changes()) { + final Collection changes = c.changes(); + holder.changed(changes); + for (Change file : changes) { builder.processChange(file, GitVcs.getKey()); } for (VirtualFile f : c.unversioned()) { builder.processUnversionedFile(f); } + holder.feedBuilder(builder); + } + } + + private static class MyNonChangedHolder { + private final Project myProject; + private final Set myDirty; + + private MyNonChangedHolder(final Project project, final Set dirty) { + myProject = project; + myDirty = dirty; + } + + public void changed(final Collection changes) { + for (Change change : changes) { + final FilePath beforePath = ChangesUtil.getBeforePath(change); + if (beforePath != null) { + myDirty.remove(beforePath); + } + final FilePath afterPath = ChangesUtil.getBeforePath(change); + if (afterPath != null) { + myDirty.remove(afterPath); + } + } + } + + public void feedBuilder(final ChangelistBuilder builder) throws VcsException { + final VcsKey gitKey = GitVcs.getKey(); + final ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(myProject); + final FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); + for (FilePath filePath : myDirty) { + final VirtualFile vf = filePath.getVirtualFile(); + if (vf != null) { + if (fileDocumentManager.isFileModifiedAndDocumentUnsaved(vf)) { + final VirtualFile root = vcsManager.getVcsRootFor(vf); + if (root != null) { + final GitRevisionNumber beforeRevisionNumber = GitChangeUtils.loadRevision(myProject, root, "HEAD"); + builder.processChange(new Change(GitContentRevision.createRevision(vf, beforeRevisionNumber, myProject), + GitContentRevision.createRevision(vf, null, myProject), FileStatus.MODIFIED), gitKey); + } + } + } + } } } @@ -68,7 +120,7 @@ public class GitChangeProvider implements ChangeProvider { * {@inheritDoc} */ public boolean isModifiedDocumentTrackingRequired() { - return false; + return true; } /**