如何获取不是最新版本但是RTC scm
中之前更改列表的一部分的文件路径。
到目前为止,我所能做到的只有:
IFileItemHandle fileItemHandle = (IFileItemHandle) IFileItem.ITEM_TYPE.createItemHandle(change.afterState().getItemId(), change.afterState().getStateId());
file = versionableManager.fetchCompleteState(fileItemHandle, monitor);
if (file instanceof IFolder) {
IFolder folder = (IFolder) file;
relativePath = getFilePath(file, workspaceConnection.configuration(changeSet.getComponent()), monitor);
fileName = folder.getName();
} else {
relativePath = getFilePath(file, workspaceConnection.configuration(changeSet.getComponent()), monitor);
fileName = ((FileItem) file).getName();
}
getFilePath 的位置是:
private String getFilePath(IVersionableHandle folder, IConfiguration config, IProgressMonitor monitor, Boolean searchInHistory) throws TeamRepositoryException {
List lst = new ArrayList<IVersionableHandle>(), ancestors;
lst.add(folder);
if (searchInHistory) {
ancestors = config.determineAncestorsInHistory(lst, monitor);
} else {
ancestors = config.locateAncestors(lst, monitor);
}
return getFullPath(ancestors);
}
private String getFullPath(List ancestor) throws TeamRepositoryException {
String directoryPath = "";
for (Object ancestorObj : ancestor) {
IAncestorReport ancestorImpl = (IAncestorReport) ancestorObj;
for (Object nameItemPairObj : ancestorImpl.getNameItemPairs()) {
INameItemPair nameItemPair = (INameItemPair) nameItemPairObj;
String pathName = nameItemPair.getName();
if (pathName != null && !pathName.equals("")) {
directoryPath = directoryPath + "\\" + pathName;
}
}
}
return directoryPath;
}
不幸的是它并不完美。如果在以下更改列表中更改了文件名,例如:
Changelist 1:
add file: src/newFile.java
Changelist 2:
modify file: src/newFile.java
Changelist 3:
rename file: src/newFile.java -> src/newFile_rename.java
第一个更改列表中解析的相对路径为:
src/newFile_rename.java
而不是
src/newFile.java
如何让它运作良好?
答案 0 :(得分:1)
虽然IConfiguration.determineAncestorsInHistory
的javadoc未指定,但服务器端等效IScmService.configurationDetermineAncestorsInHistory
(最终被调用的内容)在javadoc中说明了这一点:
* @param versionableItemHandles * a list of versionable items; only the item ids are needed; * must not be <code>null</code>
基本上,determineAncestorsInHistory不查看文件句柄上的状态id,它只查看项目id。
将考虑的文件的特定状态由配置决定。这主要是因为虽然changeset中的文件状态会告诉您该文件的名称,但它不会告诉您父文件夹的名称。这将取决于特定时间工作空间中存在的文件夹的状态,并且对于不同的工作空间可能会有所不同
在接受/创建更改集时,您基本上需要获取代表工作空间的IConfiguration。
我看到这样做的方法是获取IWorkspaceConnection.changeHistory(component)
(这实际上是在IFlowNodeConnection上定义的)。您需要通过致电IChangeHistory.previousHistory(monitor)
来浏览历史记录,直到找到包含IChangeHistory.recent(monitor)
中的变更集的内容。
找到合适的IChangeHistory后,使用IChangeHistory.configuration()
进行determineAncestorsInHistory调用。
请注意,此配置表示特定IChangeHistory末尾的工作空间状态,因此要完全准确,您需要检查更改IChangeHistory.recent后发生的更改集,以查看是否有任何修改过您的文件名(或任何包含文件夹的文件名)。
(另一种方法是使用包含变更集的历史记录之前的历史记录配置1,然后查看更改之前发生的更改的效果)