Как я могу программно оформить заказ на редактирование в TFS? - PullRequest
39 голосов
/ 24 февраля 2011

Я работаю над утилитой, обрабатывающей файлы, находящиеся под контролем исходного кода с использованием TFS 2010.

Если элемент еще не извлечен для редактирования, я получаю исключение, которое определенно предсказуемо, поскольку файл находится в режиме только для чтения.

Какие существуют способы извлечения файла?

P.S. Я хочу что-то для программирования, а не Process.Start("tf.exe", "...");, если это применимо.

Ответы [ 6 ]

37 голосов
/ 23 февраля 2012

Некоторые из других упомянутых здесь подходов работают только для определенных версий TFS или используют устаревшие методы. Если вы получаете 404, используемый вами подход, вероятно, несовместим с версией вашего сервера.

Этот подход работает в 2005, 2008 и 2010 годах. Я больше не использую TFS, поэтому я не тестировал 2013 год.

var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName);
using (var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri))
{
    var workspace = workspaceInfo.GetWorkspace(server);    
    workspace.PendEdit(fileName);
}
6 голосов
/ 26 ноября 2012
private const string tfsServer = @"http://tfsserver.org:8080/tfs";

public void CheckOutFromTFS(string fileName)
{
    using (TfsTeamProjectCollection pc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsServer)))        
    {
        if (pc != null)
        {
            WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName);
            if (null != workspaceInfo)
            {                   
                Workspace workspace = workspaceInfo.GetWorkspace(pc);
                workspace.PendEdit(fileName);
            }
        }
    }
    FileInfo fi = new FileInfo(fileName);
}

Обратите внимание, что Microsoft.TeamFoundation.Client.TeamFoundationServerFactory устарел: класс TeamFoundationServer устарел. Используйте классы TeamFoundationProjectCollection или TfsConfigurationServer для общения с Team Foundation Server 2010. Чтобы общаться с Team Foundation Server 2005 или 2008 года, используйте класс TeamFoundationProjectCollection. Соответствующий фабричный класс для этого является TfsTeamProjectCollectionFactory.

4 голосов
/ 24 февраля 2011

Вы можете использовать клиентский API Team Foundation Version Control. Метод PendEdit ()

workspace.PendEdit(fileName);

Оформить заказ на MSDN http://blogs.msdn.com/b/buckh/archive/2006/03/15/552288.aspx

2 голосов
/ 27 июня 2011

Сначала получите рабочее пространство

var tfs = new TeamFoundationServer("http://server:8080/tfs/collection");
var version = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
var workspace = version.GetWorkspace("WORKSPACE-NAME", version.AuthorizedUser);

В рабочей области вы можете оформить заказ на файл

workspace.PendEdit(fileName);
1 голос
/ 27 июня 2011
var registerdCollection = RegisteredTfsConnections.GetProjectCollections().First();
var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(registerdCollection);
var versionControl = projectCollection.GetService<VersionControlServer>();

var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(_fileName);
var server = new TeamFoundationServer(workspaceInfo.ServerUri.ToString());
var workspace = workspaceInfo.GetWorkspace(server);

workspace.PendEdit(fileName);
0 голосов
/ 04 июля 2016

У меня есть два подхода, как это сделать: простой и продвинутый.

1). Простой:

  #region Check Out
    public bool CheckOut(string path)
    {
        using (TfsTeamProjectCollection pc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(ConstTfsServerUri)))
        {
            if (pc == null) return false;

            WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(path);
            Workspace workspace = workspaceInfo?.GetWorkspace(pc);
            return workspace?.PendEdit(path, RecursionType.Full) == 1;
        }
    }

    public async Task<bool> CheckoutAsync(string path)
    {
        return await Task.Run(() => CheckOut(path));
    }
    #endregion

2). Продвинутый (со статусом получения):

    private static string GetOwnerDisplayName(PendingSet[] pending)
    {
        var result = pending.FirstOrDefault(pendingSet => pendingSet.Computer != Environment.MachineName) ?? pending[0];
        return result.OwnerDisplayName;
    }
    private string CheckoutFileInternal(string[] wsFiles, string folder = null)
    {
        try
        {

            var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(folder);
            var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri);
            var workspace = workspaceInfo.GetWorkspace(server);
            var request = new GetRequest(folder, RecursionType.Full, VersionSpec.Latest);
            GetStatus status = workspace.Get(request, GetOptions.None);
            int result = workspace.PendEdit(wsFiles, RecursionType.Full, null, LockLevel.None);
            if (result == wsFiles.Length)
            {
                //TODO: write info (succeed) to log here - messageText
                return null;
            }
            var pending = server.GetService<VersionControlServer>().QueryPendingSets(wsFiles, RecursionType.None, null, null);
            var messageText = "Failed to checkout !.";
            if (pending.Any())
            {
                messageText = string.Format("{0}\nFile is locked by {1}", messageText, GetOwnerDisplayName(pending));
            }

            //TODO: write error to log here - messageText
            return messageText;
        }
        catch (Exception ex)
        {
            UIHelper.Instance.RunOnUiThread(() =>
            {
                MessageBox.Show(Application.Current.MainWindow, string.Format("Failed checking out TFS files : {0}", ex.Message), "Check-out from TFS",
                               MessageBoxButton.OK, MessageBoxImage.Error);
            });
            return null;
        }
    }

    public async Task<string> CheckoutFileInternalAsync(string[] wsFiles, string folder)
    {
        return await Task.Run(() => CheckoutFileInternal(wsFiles, folder));
    }
...