繁体   English   中英

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

[英]IntelliJ IDEA VCS Plugin: refresh VCS window on save

我正在为IDEA开发Plastic SCM插件,每次保存文件时,我都很难弄清楚如何刷新Version Control Local Changes窗口(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;
    }
}

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

是。 对我感到羞耻。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM