2013-05-07 55 views
4

如何获取不是最新版本的文件的路径,但它是RTC scm中以前更改列表的一部分。在RTC中解析IVersionableHandle的路径

我能到目前为止实现是这样的:

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 

如何使它工作好?

回答

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。

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

您基本上需要在变更集被接受时获得代表工作空间的IConfiguration /创建。

我看到要做到这一点的方式是得到IWorkspaceConnection.changeHistory(component)(这实际上是在IFlowNodeConnection上定义的)。您需要回拨历史记录IChangeHistory.previousHistory(monitor),直到找到包含您的变更集的文件IChangeHistory.recent(monitor)。 一旦你找到合适的IChangeHistory,使用IChangeHistory.configuration()作为判定调用历史调用。

请注意,此配置表示该特定IChangeHistory结束时的工作空间状态,因此为了完全准确,您需要检查在更改IChangeHistory.recent之后发生的变更集,以查看它们中的任何一个修改你的文件名(或者任何包含文件夹的文件名)。

(另一种替代方法是使用包含变更集的历史记录之前的历史记录配置1,然后查看变更之前发生的变更的影响)