VCS Integration Plugins
此页面概述了IntelliJ IDEA 7.0中的版本控制集成API.
此处描述的大多数概念也适用于IntelliJ IDEA 6.0.
VCS API在版本6.0中进行了重大重构,本文档未描述旧版本的API.
## 关键概念
### 文件路径
A FilePath
表示磁盘或VCS存储库中文件或目录的路径.
不像
一个
[文件路径(upsource:///platform/vcs-api/vcs-api-core/src/com/intellij/openapi/vcs/FilePath.java)
可以表示磁盘上不存在的文件的路径.
一个主要区别
[文件路径(upsource:///platform/vcs-api/vcs-api-core/src/com/intellij/openapi/vcs/FilePath.java)
和a
是那个
[文件路径(upsource:///platform/vcs-api/vcs-api-core/src/com/intellij/openapi/vcs/FilePath.java)
缓存
对应于路径,因此可以在不进行VFS搜索的情况下检索它.
创建实例
[文件路径(upsource:///platform/vcs-api/vcs-api-core/src/com/intellij/openapi/vcs/FilePath.java),
该
使用API.
它可以作为PeerFactory.getInstance()访问.getVcsContextFactory()
[文件路径(upsource:///platform/vcs-api/vcs-api-core/src/com/intellij/openapi/vcs/FilePath.java)
表示使用VCS存储库而不是本地路径中的路径
VcsContextFactory.createFilePathOnNonLocal()
.
FilePath.isNonLocal()
为这些文件返回true.
###修订号
一个
表示文件的修订号.
如果VCS将修订号存储为简单整数,则为标准
可以使用Int实现.
如果VCS具有更复杂的版本号格式(如CVS,它使用一系列用点分隔的数字),则插件可以提供自定义实现.
ContentRevision
一个
表示文件的特定修订,它存在于本地或VCS存储库中.
它有三个主要属性:
*FilePath
指定这是一个修订版的文件.
如果本地存在某个版本的文件,则应该是本地路径.
VcsRevisionNumber
指定修订版的修订号,或者如果修订仅在本地存在,则为VcsRevisionNumber.NULL
.
*修订内容.
内容以字符串形式返回,VCS插件负责将二进制文件内容转换为正确的编码.
要根据IDE设置和字节顺序标记自动检测编码,可以使用方法CharsetToolkit.bytesToString()
(此API是IDEA 7.0.2中的新增功能).
二进制文件的修订版也可以表示为BinaryContentRevision,它是ContentRevision的子类.
对于二进制修订版,getContent()的结果是未定义的,并且getBinaryContent()可用于将内容检索为字节数组.
可用于表示特定文件的当前磁盘版本的有用类是
FileStatus
一个
表示与VCS相关的文件状态(未版本控制,未更改,添加,修改等).
它确定用于在UI中呈现文件名称的颜色.
###改变
一个
从VCS的角度来看,表示单个文件操作(创建,修改,移动/重命名或删除).
变更可以表示用户在本地执行但尚未提交的修改,已提交的修改或某种其他类型的修改(例如,搁置的更改或两个任意修订之间的差异).
一个
基本上由两个内容修订组成:
修订前(如果 Change *表示文件创建,则为“null”)
修订后(如果 Change *代表文件删除,则为“null”)
移动或重命名由更改表示,其中修订前和修订后具有不同的文件路径.
可以为a指定自定义文件状态
如果它表示文件的非标准修改(例如,已与冲突合并的文件).
如果尚未指定自定义文件状态,则会根据更改类型自动计算状态.
### 更改列表
一个
[变更表(upsource:///platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeList.java)
表示一组命名的相关更改.
有两种主要的变更清单:
-
LocalChangeList表示用户在本地完成的一组修改. 如果VCS也支持更改列表的概念(如Perforce那样),则VCS插件可以将IDEA的本地更改列表结构与VCS的结构同步. 否则,本地更改列表只是用户签出或修改的文件的子集.
-
CommittedChangeList 表示签入VCS存储库的一组修改. 对于支持原子提交的VCS,每个提交的修订都由CommittedChangeList表示. 对于使用每个文件提交的VCS(如CVS),插件可以使用启发式方法将一系列单个文件提交分组为 CommittedChangeList
##插件组件
本节描述构成VCS集成插件的不同组件,大致与它们应实现的顺序相同.
AbstractVcs
这是VCS插件的主要入口点,IntelliJ平台使用该插件来检索插件提供的所有其他服务.
注册AbstractVcs实现的推荐方法是向plugin.xml添加扩展声明,如以下示例所示:
<idea-plugin>
...
<extensions defaultExtensionNs="com.intellij">
<vcs name="svn" vcsClass="org.jetbrains.idea.svn.SvnVcs"/>
</extensions>
</idea-plugin>
这里name
是VCS的唯一名称(这必须匹配你的AbstractVcs.getName()
实现返回的字符串),* vcsClass *是你的实现类.
ChangeProvider
该组件负责跟踪用户对工作副本的更改,并将这些更改报告给IntelliJ Platform核心.
从此返回此类的实现
AbstractVcs.getChangeProvider().
ChangeProvider与之协同工作
这是IntelliJ平台核心中的一个组件.
跟踪“脏范围” - VCS文件状态可能已过期的文件集.
无论是在磁盘上修改文件还是通过显式调用使其VCS状态无效,都会将文件添加到脏范围
VcsDirtyScopeManager.fileDirty()
要么
VcsDirtyScopeManager.dirDirtyRecursively().
将一些文件添加到脏范围后,将传递脏范围
随着一个
实例,它作为一个接收器
提供有关已更改文件的数据.
此处理在后台线程中异步发生.
该
可以使用遍历脏范围内的所有文件
或者使用getDirtyFiles()
和getDirtyDirectoriesRecursively()
方法检索有关其内容的信息.
如果可以批量检索VCS中有关本地更改的信息,则最好使用第二种方法,因为它可以更好地扩展到大型工作副本.
该
使用以下方法将数据报告给ChangelistBuilder:
*processChange()
用于已检出(或在VCS不使用显式检出模型时修改),计划添加或删除,移动或重命名的文件.
processUnversionedFile()
用于存在于磁盘上的文件,但不由VCS管理,未安排添加,也不通过 .cvsignore *或类似机制忽略.
*processLocallyDeletedFile()
用于存在于VCS存储库中的文件,但不存在于磁盘上且未计划删除.
processIgnoredFile()
是针对不由VCS管理但通过 .cvsignore *或类似机制忽略的文件调用的.
*processSwitchedFile()
用于文件或目录,对于这些文件或目录,工作副本对应于与其父目录的工作副本相比的不同分支.
可以为已调用processSwitchedFile()的相同文件调用此方法.