我正在为IDEA开发Plastic SCM插件,每次保存文件时,我都很难弄清楚如何刷新版本控制本地更改窗口(Alt + 9) 。我成功实现了ChangeProvider
接口,以使用方法
void getChanges(VcsDirtyScope, ChangelistBuilder, ProgressIndicator, ChangelistManagerGate)
我检查过将IDEA窗口置于前台会触发此方法,并单击“版本控制”窗口中的刷新按钮。两种方案都成功刷新了更改列表,“版本控制”窗口反映了当前的工作区状态。
但是,保存修改后的文档也会触发ChangeProvider.getChanges
方法,但不会更新窗口中的更改列表。我检查了我的更改是否正在从Plastic SCM中正确检索,并使用方法
void ChangelistBuilder.processChange(Change, VcsKey)
这还不足以让IDEA因某些原因确认新的更改,因此用户仍需要手动刷新版本控制窗口。缺乏文档也没有帮助: - /
我错过了什么?关于这个问题的任何提示都将不胜感激!
EDITED
这是Change
个对象的创建方式:
private void addChangedFiles(ChangelistBuilder builder, ProjectStatus status) {
Set<String> modified = new HashSet<String>(status.CheckedOut);
modified.removeAll(status.Added);
modified.addAll(status.Changed);
modified.addAll(status.Moved);
modified.addAll(status.Copied);
for (String path : modified)
{
ContentRevision beforeRevision = PlasticContentRevision.createParentRevision(
mPlasticVcs.getProject(), path, false);
ContentRevision afterRevision = PlasticContentRevision.createRevision(
mPlasticVcs.getProject(), path, null, false);
Change ch = new Change(beforeRevision, afterRevision, FileStatus.MODIFIED);
builder.processChange(ch, mPlasticVcs.getKeyInstanceMethod());
}
}
ProjectStatus
类是PlasticSCM类,它存储cm status
命令的结果。
我发现在返回的beforeRevision
对象中可能存在问题,因为它是父修订版,它使用自定义VcsRevisionNumber:
class PlasticVcsParentRevisionNumber implements VcsRevisionNumber {
private PlasticFile mPlasticFile;
public PlasticVcsParentRevisionNumber(PlasticFile plasticFile) {
mPlasticFile = plasticFile;
}
public String asString() {
return "parent revision";
}
public int compareTo(VcsRevisionNumber other) {
if (other == this) {
return 0;
long parentRevId = mPlasticFile.getRevisionInfo().getParentRevId();
if (!(other instanceof PlasticVcsParentRevisionNumber))
return -1;
PlasticVcsParentRevisionNumber plasticRevNumber =
(PlasticVcsParentRevisionNumber)other;
long otherParentRevId =
plasticRevNumber.mPlasticFile.getRevisionInfo().getParentRevId();
if (parentRevId > otherParentRevId)
return 1;
if (parentRevId == otherParentRevId)
return 0;
return -1;
}
}
答案 0 :(得分:0)
所以,我终于想通了这个&#34;神秘&#34;是关于... SCM提供商(Plastic SCM CLI解析器)返回带有小写驱动器号的Windows绝对路径。这与存储的IDEA数据不匹配,后者执行区分大小写的比较。结果是未检测到任何更改,因为来自SCM的更改与磁盘上的任何实际文件都不对应。
是。对我感到羞耻。