4

如何获取不在最新版本中但属于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

如何让它运作良好?

4

1 回答 1

1

虽然 javadocIConfiguration.determineAncestorsInHistory没有指定,但服务器端等效项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。

将考虑的文件的特定状态由配置决定。这主要是因为虽然变更集中文件的状态会告诉您该文件的名称,但它不会告诉您父文件夹的名称。这将取决于特定时间工作区中存在的文件夹的状态,并且对于不同的工作区可能会有所不同

您基本上需要在接受/创建更改集时获得一个代表您的工作区的 IConfiguration。

我看到这样做的方法是获取IWorkspaceConnection.changeHistory(component)(这实际上是在 IFlowNodeConnection 上定义的)。您需要通过调用来回顾历史,IChangeHistory.previousHistory(monitor)直到找到包含您的变更集的IChangeHistory.recent(monitor). 一旦找到合适的 IChangeHistoryIChangeHistory.configuration()用于确定AncestorsInHistory 调用。

请注意,此配置表示特定 IChangeHistory 结束时工作区的状态,因此要完全准确,您需要检查 IChangeHistory.recent 更改后发生的变更集,以查看其中是否有任何修改了您的文件名(或任何包含文件夹的文件名)。

(另一种选择是使用包含变更集的历史之前的历史配置 1,然后查看更改之前发生的更改的影响)

于 2013-05-28T15:31:19.467 回答