IntelliJ IDEA VCS插件:保存时刷新VCS窗口

时间:2016-10-28 13:47:28

标签: java intellij-idea version-control intellij-plugin plasticscm

我正在为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;
    }
}

1 个答案:

答案 0 :(得分:0)

所以,我终于想通了这个&#34;神秘&#34;是关于... SCM提供商(Plastic SCM CLI解析器)返回带有小写驱动器号的Windows绝对路径。这与存储的IDEA数据不匹配,后者执行区分大小写的比较。结果是未检测到任何更改,因为来自SCM的更改与磁盘上的任何实际文件都不对应。

是。对我感到羞耻。