Определите используемую систему контроля версий для локальной папки (Subversion или TFS) - PullRequest
2 голосов
/ 05 марта 2009

Сводка. Как определить конфигурацию управления исходным кодом TFS для локальной папки.

Пояснение:

На нашей фабрике программного обеспечения я создаю файлы конфигурации CruiseControl.NET автоматически на основе локальной папки, в которой находится код из системы управления версиями. В настоящее время я хочу только поддерживать Subversion и TFS. Определить, что Subversion используется в качестве системы управления исходным кодом, и определить местоположение хранилища легко с помощью команды info svn.exe, как показано в коде PowerShell ниже. Но как я могу это сделать, когда используется TFS?

Одна из «проблем» заключается в том, что зарегистрированный в данный момент пользователь НЕ имеет доступа к серверу TFS. Мы не можем использовать интегрированную защиту, потому что машины разработчика не присоединены к домену.

Самое близкое, что я получил, это tf dir, я должен ввести учетные данные во всплывающем окне. Не удалось найти аргументы командной строки для указания пользователя и пароля. Свойства tf также выглядят многообещающе, но вы должны пройти аутентификацию для выполнения вызова. Subversion может предоставить информацию без аутентификации.

Мой текущий код в PowerShell с рабочим кодом для SubVersion, код TFS отсутствует ;-) Обратите внимание, что для фактического создания блока CruiseCOntrol.NET у нас есть настроенное имя пользователя и пароль для контроля исходных текстов, доступные в глобальных переменных.

#
#   
#       
#           https://svn.mycompany.nl/svn/Acme.Intranet
#       
#   
#
#   If under source control return a CruiseControl.NET source control configuration block in
#   the following format:
#   
#       https://svn.mycompany.nl/svn/Acme.Intranet
#       c:\project\Acme.Intranet.Build\WorkingDirectory\$configuration
#       acmebuild
#       acmepassword
#           
#.Parameter configuration
#   Either "Debug" or "Release"
# .Returns
#   A string with the configuration block, or $null if not under Subversion source control.
##>
function GetSubversionSourceControlBlock
{
    param
    (
        $configuration
    )

    $svn_exe = Join-Path -Path $productfolder -ChildPath "tools\DotNet2\svn-win32-1.5.2\svn.exe"
    $svnProductInfo = [xml](& $svn_exe info `"$productFolder`" --xml)
    $trunkUrl = $svnProductInfo.info.entry.url
    if ($trunkUrl -ne $null)
    {
@"
        
            $trunkUrl
            $buildfolder\WorkingDirectory\$configuration
            $MastConfigurationGlobal_SourceControlUserName
            $MastConfigurationGlobal_SourceControlPassword
                
"@
        Verbose "Under Subversion source control. Trunk Url: $trunkUrl"
    }
    else
    {
        Verbose "Not under Subversion source control"
        $null
    }
}   

#
#       tfs.mycompany.nl
#       $/Acme.Intranet
#       c:\project\Acme.Intranet.Build\WorkingDirectory\$configuration
#       acmebuild
#       acmepassword
#           
#.Parameter configuration
#   Either "Debug" or "Release"
# .Returns
#   A string with the configuration block, or $null if not under Tfs source control.
##>
function GetTfsSourceControlBlock
{
    param
    (
        $configuration
    )

    $null
}   

Ответы [ 2 ]

2 голосов
/ 06 марта 2009

История продолжается:

Если вы выполните команду tf из командной строки cmd, все будет так, как описано в предыдущем ответе. Если вы сделаете это из командной строки PowerShell, вы получите следующее:

PS C:\> & tf.exe workfold c:\projects\Macaw.SolutionsFactory\FactoryIdeTools\trunk /login:macaw\serge,Trasimeno5
TF10125: The path 'c:\projects\Macaw.SolutionsFactory\FactoryIdeTools\trunk' must start with $/

выдает ошибку!

Я перепробовал все, но безрезультатно. Я даже попробовал это через объектную модель TFS, но это стало действительно сложным. Чтобы получить рабочее пространство для локальной папки, вам сначала нужно указать имя сервера tfs. Вероятно, можно выполнить итерацию всех отображенных в настоящий момент рабочих областей и выполнить итерацию по определенным там серверам (что, вероятно, и делает tf.exe), чтобы проверить, принадлежит ли локальная папка этой рабочей области.

Я наконец-то нашел следующее решение:

Я создаю простой командный файл ExecTfWorkprodCommand.bat со следующим кодом:

@echo off
rem This is a kind of strange batch file, needed because execution of this command in PowerShell gives an error.
rem This script retrieves TFS sourcecontrol information about a local folder using the following command:
rem tf workfold  /login:domain\user,password
rem %1 is path to the tf.exe executable
rem %2 is the local path
rem %3 is the domain\user [optional, integrated security used if ommited]
rem %4 is the password    [optional, if %3 is not specified]
rem Output is in format:
rem ===============================================================================
rem Workspace: Macaw.SolutionsFactory@VS-D-SVDOMOSS-1 (Serge)
rem Server   : tfs.macaw.nl
rem $/Macaw.SolutionsFactory/FactoryIdeTools/trunk: C:\Projects\Macaw.SolutionsFactory\FactoryIdeTools\trunk

if [%3]==[] goto integratedsecurity
%1 workfold "%2" /login:%3,%4
goto end

:integratedsecurity
%1 workfold "%2"

:end

И я вызываю этот пакетный скрипт из PowerShell. Из результата хочу разобрать:

  • Имя сервера Tfs
  • Папка на сервере

Пример кода для решения этой проблемы:

$tfsProductInfo = & "ExecTfWorkprodCommand.bat "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe" "c:\projects\Macaw.SolutionsFactory\FactoryIdeTools\trunk" domain\user password
if ($tfsProductInfo -eq $null)
{
    Write-Output "Can't determine Tfs source control information on local folder"
}
else
{
    $tfsserver = [Regex]::Split($tfsProductInfo[2], ": ")[1].Trim()
    $serverpath = [Regex]::Split($tfsProductInfo[3], ": ")[0].Trim()
    $localpath = [Regex]::Split($tfsProductInfo[3], ": ")[1].Trim()
    Write-Output "Server     : $tfsserver"
    Write-Output "Server path: $serverpath"
    Write-Output "Local path : $localpath"
}
1 голос
/ 05 марта 2009

Хорошо, нашел ответ сам. Прежде всего: есть wat, чтобы указать учетные данные для инструмента командной строки tf.exe. Используйте /login:domain\user,password.

Теперь, если я выполню:

tf workfold c:\projects\Macaw.SolutionsFactory\FactoryIdeTools\trunk /login:domain\user,password

Я получаю следующие результаты:

===========================================================================================================================================
Workspace: Macaw.SolutionsFactory@VS-D-SVDOMOSS-1 (Serge)
Server   : tfs.mycompany.nl
 $/Macaw.SolutionsFactory/FactoryIdeTools/trunk: C:\Projects\Macaw.SolutionsFactory\FactoryIdeTools\trunk

Это вся информация, которая мне нужна!

...