diff options
Diffstat (limited to 'plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java')
-rw-r--r-- | plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java index 02e49354f3ab..14a288171504 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgChangeProvider.java @@ -17,19 +17,24 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.changes.*; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.JBColor; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.zmlx.hg4idea.*; import org.zmlx.hg4idea.command.HgResolveCommand; import org.zmlx.hg4idea.command.HgResolveStatusEnum; import org.zmlx.hg4idea.command.HgStatusCommand; import org.zmlx.hg4idea.command.HgWorkingCopyRevisionsCommand; +import org.zmlx.hg4idea.repo.HgRepository; import org.zmlx.hg4idea.util.HgUtil; -import java.awt.*; +import java.io.File; import java.util.*; -import java.util.List; public class HgChangeProvider implements ChangeProvider { @@ -38,7 +43,7 @@ public class HgChangeProvider implements ChangeProvider { public static final FileStatus COPIED = FileStatusFactory.getInstance().createFileStatus("COPIED", "Copied", FileStatus.COLOR_ADDED); public static final FileStatus RENAMED = FileStatusFactory.getInstance().createFileStatus("RENAMED", "Renamed", - Color.cyan.darker().darker()); + JBColor.CYAN.darker().darker()); private static final EnumMap<HgFileStatusEnum, HgChangeProcessor> PROCESSORS = new EnumMap<HgFileStatusEnum, HgChangeProcessor>(HgFileStatusEnum.class); @@ -85,21 +90,42 @@ public class HgChangeProvider implements ChangeProvider { final Map<HgFile, HgResolveStatusEnum> list = new HgResolveCommand(myProject).getListSynchronously(repo); hgChanges.addAll(new HgStatusCommand.Builder(true).build(myProject).execute(repo, entry.getValue())); + final HgRepository hgRepo = HgUtil.getRepositoryForFile(myProject, repo); + if (hgRepo != null && hgRepo.hasSubrepos()) { + hgChanges.addAll(ContainerUtil.mapNotNull(hgRepo.getSubrepos(), new Function<HgNameWithHashInfo, HgChange>() { + @Override + public HgChange fun(HgNameWithHashInfo info) { + return findChange(hgRepo, info); + } + })); + } + sendChanges(builder, hgChanges, list, workingRevision, parentRevision); } return hgChanges; } + @Nullable + private HgChange findChange(@NotNull HgRepository hgRepo, @NotNull HgNameWithHashInfo info) { + File file = new File(hgRepo.getRoot().getPath(), info.getName()); + VirtualFile virtualSubrepoFile = VfsUtil.findFileByIoFile(file, false); + HgRepository subrepo = HgUtil.getRepositoryForFile(myProject, virtualSubrepoFile); + if (subrepo != null && !info.getHash().asString().equals(subrepo.getCurrentRevision())) { + return new HgChange(new HgFile(hgRepo.getRoot(), new FilePathImpl(virtualSubrepoFile)), HgFileStatusEnum.MODIFIED); + } + return null; + } + private void sendChanges(ChangelistBuilder builder, Set<HgChange> changes, - Map<HgFile, HgResolveStatusEnum> resolveStatus, HgRevisionNumber workingRevision, - HgRevisionNumber parentRevision) { + Map<HgFile, HgResolveStatusEnum> resolveStatus, HgRevisionNumber workingRevision, + HgRevisionNumber parentRevision) { for (HgChange change : changes) { HgFile afterFile = change.afterFile(); HgFile beforeFile = change.beforeFile(); HgFileStatusEnum status = change.getStatus(); if (resolveStatus.containsKey(afterFile) - && resolveStatus.get(afterFile) == HgResolveStatusEnum.UNRESOLVED) { + && resolveStatus.get(afterFile) == HgResolveStatusEnum.UNRESOLVED) { builder.processChange( new Change( new HgContentRevision(myProject, beforeFile, parentRevision), @@ -286,9 +312,9 @@ public class HgChangeProvider implements ChangeProvider { HgFile afterFile ); - final void processChange(ContentRevision contentRevisionBefore, - ContentRevision contentRevisionAfter, FileStatus fileStatus, - ChangelistBuilder builder, VcsKey vcsKey) { + static void processChange(ContentRevision contentRevisionBefore, + ContentRevision contentRevisionAfter, FileStatus fileStatus, + ChangelistBuilder builder, VcsKey vcsKey) { if (contentRevisionBefore == null && contentRevisionAfter == null) { return; } |