2013-05-07 95 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,然後查看變更之前發生的變更的影響)