2013-05-28 12 views
5

Utilizzando TFS, ho il bagagliaio $/project/trunk e un ramo $/project/dev/feature/new_one.Trova il percorso tfs del ramo unito

ho unito il mio ramo dentro il tronco come segue:

C33($/project/trunk) 
| \ 
| \ 
| C32($/project/dev/feature/new_one) 
|  | 
|  | 
|  | 
... 

io uso l'API TFS e riesco a trovare il C33 merge di modifiche. Con il metodo QueryMerges(), sono in grado di trovare il changeset C32 genitore con tutte le modifiche sui file, ma non le informazioni che ho bisogno :(

C'è un modo, utilizzando l'API TFS, per trovare il repository percorso del ramo fusa $/project/dev/feature/new_one?

Con il changeset C32, io sono solo in grado di ottenere i percorsi di file modificati, come $/project/dev/feature/new_one/path/to/file.txt ma sono in grado di estrarre il percorso del ramo il percorso completo del file :(

PS: Una soluzione funzionante da TFS2008 sarà la migliore, ma se funziona solo dal 2010, dovrebbe essere buona ...

PS2: la soluzione di questo problema vi aiuterà a gestire unire gruppi di modifiche in git-TFS quali progetto ...

risposta

5

Purtroppo non esiste un metodo API per ottenere un ramo per un determinato percorso di voce, che si potrebbe pensare è un caso d'uso abbastanza comune.

TFS dal 2010 in poi è possibile utilizzare VersionControlServer.QueryRootBranchObjects per interrogare tutti i rami nel controllo di versione. Utilizzando RecursionType.Full come parametro di questo metodo, si otterrà una matrice BranchObject di tutti i rami con nessun genitore e tutti i relativi discendenti. È quindi possibile determinare un ramo per un determinato percorso di file come segue:

var collection = new TfsTeamProjectCollection(new Uri("http://tfsuri")); 
var versionControl = collection.GetService<VersionControlServer>(); 

var branchObjects = versionControl.QueryRootBranchObjects(RecursionType.Full); 

var mergeFilePath = "$/project/dev/feature/new_one/path/to/file.txt"; 
var branch = branchObjects.SingleOrDefault(b => { 
      var branchPath = b.Properties.RootItem.Item; 
      return mergeFilePath.StartsWith(branchPath.EndsWith("/") ? branchPath : branchPath + "/"); 
     }); 

Console.WriteLine(branch.Properties.RootItem.Item); 

Come mostrato, il percorso del ramo è a BranchObject.Properties.RootItem.Item. Credo che sia sicuro trovare l'oggetto BranchObject nell'array semplicemente controllando quale percorso del ramo è contenuto nel percorso del file di unione (dato che è possibile solo la corrispondenza al massimo un ramo dato che TFS impone che solo un ramo possa esistere in una determinata cartella gerarchia).

solo per essere consapevoli, sono stato bruciato dal this problema Collegare quando si utilizza QueryRootBranchObjects in TFS 2012. La causa sono stati alcuni rami spuri che dovevano apostrofi nel nome del ramo.

Per ovviare a questo problema, utilizzare VersionControlServer.QueryBranchObjects, tuttavia è necessario un identificatore di articolo che rappresenta esattamente il percorso del ramo. Chiaramente non si conosce il percorso del ramo a questo punto in quanto tutto ciò che si ha è un percorso di file, quindi è necessario reclamare le directory del percorso file chiamando QueryBranchObjects ogni volta fino a quando non si ottiene una corrispondenza.

+0

Questa soluzione è il mio fallback ma non mi soddisfa per 2 motivi: 1. se il ramo principale non è un ramo ma è ancora una cartella in tfs, è possibile ottenerlo con QueryRootBranchObjects() e non può Trovalo 2. se hai più diramazioni nome dev, dev/test, dev/test2, dev/test3 e nel tuo codice sorgente hai una cartella 'test' potrebbe scoprire che il buon ramo padre è 'dev' e infatti era "dev/test". Non puoi essere sicuro al 100% :(Anche se si tratta di casi rari ... – Philippe

+0

Ho fatto una modifica 2. È abbastanza facile da risolvere, in più non è possibile avere un ramo '$/dev' quindi un altro ramo sotto di esso a '$/dev/test'. TFS non lo consente in fase di ramificazione. –

Problemi correlati