2015-06-02 4 views
1

Чтобы получить p4-печать произвольного файла, я ищу способ найти правильно разрешенный файл, используя только спецификацию потока, а не клиент один.Найдите файл в потоковом хранилище, используя только спецификацию потока задач

Например,

Основной поток есть файл

//toto/main/file.txt 

Второй поток // тото/тест/ представляет собой поток задачи основателями к основному потоку, используя следующую спецификацию

share ... 

Когда я пытаюсь найти и распечатать toto.txt в потоке тест с использованием

p4 print //toto/test/file.txt 

Я получаю различные выходные данные в зависимости от разных факторов.

  • Если файл не был представлен в тестовом потоке

    • Если я в клиенте (с помощью -c Client_Test или любого другого способа установки клиента) в правильном потоке, файл находится на p4 и печатается правильно.

    • Если я не уточняя клиент, или не давая Р4 никаких указаний относительно того, какой клиента он должен использовать, я получаю следующую ошибку

// тото/тест/file.txt - нет таких файлов.

  • Если файл был отправить на тестовый поток, файл расположен и распечатаны правильно.

Моя цель состоит в том, чтобы иметь возможность печатать произвольный файл без использования рабочего пространства, как если бы я правильно понял, спецификация потока должна иметь возможность находить файл в иерархии потоков.

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

p4 print //toto/main/file.txt 

Но это решение не будет работать в том случае, если файл файл.TXT»исходит из другого потока с последующим отображением

import file.txt //toto/otherTaskStream/file.txt 

Кажется, что нет никакого способа, чтобы найти этот тип файла без указания клиента (рабочей области), чтобы работать с (и, к сожалению, не является приемлемым решением в наш Environnement)

+1

Не могли бы вы объяснить, почему вы не можете использовать спецификацию клиента? Решение этой проблемы в основном «реализует эквивалент спецификации клиента», что выполнимо ... но учитывая, что Perforce уже реализует эту вещь (то есть клиентскую спецификацию), было бы проще использовать то, что там есть. –

+0

Поскольку вы знаете имя потока задач, файлы которого вы пытаетесь распечатать, вы можете иметь рабочее пространство клиента, которое вы используете только для этого инструмента печати, а затем выполните «p4 client -s -S // toto/test», или «p4 client -s -S // tot/otherTaskStream», если необходимо, перед запуском 'p4 print'. –

+0

@SamStafford В системе непрерывной интеграции, где я бы хотел, чтобы сервер просматривал файлы без необходимости рабочего пространства. Даже если я использую рабочее пространство, цикл «switch stream - look in file» будет по меньшей мере тратить время, в худшем случае, на бесполезное давление на сервер P4. – Jibai

ответ

0

Учитывая, что ваша главная забота, чтобы сделать это настолько эффективно, насколько это возможно (минимальное воздействие на сервере и минимальных сценариях), я предложил бы делать следующее:

p4 -c Client_Test client -s -S //toto/test 
p4 -c Client_Test print //Client_Test/file.txt 

«клиент -s "команда не имеет заметного сервера накладные расходы, поскольку он не управляет каким-либо файловым содержимым или даже метаданными файлов; он просто создает «представление», в котором поток формирует шаблон, который, в свою очередь, предоставляет контекст для запуска других команд, определяя, какие файлы депо вы работаете в контексте этого потока. Это то, что делает синтаксическую карту «//Client_Test/file.txt» подходящим файлом, независимо от того, находится ли она в «теневой таблице» потока задач или общедоступной части хранилища, или импортировать из другого потока, или переназначенный путь в родительском потоке и т. д.

Если по философским причинам вы решили не использовать клиент спецификацию, вы могли бы сделать:

p4 -c nonexistentclientspec client -o -S //toto/test 

Это покажет вам мнение клиента без фактического создания клиента спецификации в базе данных. Используя один из API-интерфейсов Perforce scripting, не так сложно захватить поле «Просмотр», а затем превратить его в объект «Карта» - вот как вы поймете, откуда импортируется импорт, позволяя вам обрабатывать указанное вами исключение, с некоторым трудом.

Если вы философски не можете даже взглянуть на гипотетический вид клиента с помощью команды «p4 client», то ваш следующий лучший вариант - проанализировать спецификацию потока; есть, конечно, детерминированная система для создания представления из спецификации потока, поэтому вы можете повторно реализовать эту систему самостоятельно, с гораздо большим количеством трудностей.

Однако, если основные проблемы - это эффективность и легкость, я бы рекомендовал использовать спецификацию клиента. Если вы все еще скептически относится к служебному серверу, выполнять эти команды с «-Ztrack», чтобы увидеть, как мало работу, они должны сделать, например:

C:\p4\test>p4 -Ztrack -c Client_Test client -s -S //stream/task 
Client Client_Test switched. 
--- lapse .015s 
--- rpc msgs/size in+out 0+1/0mb+0mb himarks 2000/2000 snd/rcv .000s/.000s 
--- db.user 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 1+0+0 0+0 
--- db.group 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0 
--- db.stream 
--- pages in+out+cached 7+0+2 
--- locks read/write 5/0 rows get+pos+scan put+del 1+11+11 0+0 
--- db.domain 
--- pages in+out+cached 14+8+2 
--- locks read/write 8/2 rows get+pos+scan put+del 10+0+0 2+0 
--- db.template 
--- pages in+out+cached 8+0+2 
--- locks read/write 6/0 rows get+pos+scan put+del 0+6+12 0+0 
--- db.view 
--- pages in+out+cached 6+4+2 
--- locks read/write 2/1 rows get+pos+scan put+del 0+2+4 1+1 
--- db.have 
--- pages in+out+cached 3+0+2 
--- locks read/write 0/0 rows get+pos+scan put+del 0+1+1 0+0 
--- peek count 1 wait+held total/max 0ms+0ms/0ms+0ms 
--- db.working 
--- pages in+out+cached 5+0+2 
--- locks read/write 2/0 rows get+pos+scan put+del 0+3+3 0+0 
--- peek count 1 wait+held total/max 0ms+0ms/0ms+0ms 
--- db.trigger 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0 
--- db.bodtext 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 2+0+0 0+0 
--- db.protect 
--- pages in+out+cached 3+0+2 
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+3 0+0 
--- db.monitor 
--- pages in+out+cached 6+6+2 
--- locks read/write 0/2 rows get+pos+scan put+del 0+0+0 2+0 

Обратите внимание, что только один элемент базы данных был переписан для фактического клиентский переключатель; основная часть накладных расходов - это в основном незначительная сумма, связанная с аутентификацией и выходом (одна строка говорит мне, что это удалось).

+0

Большое спасибо за точный ответ. Я рассмотрю создание карты в решении API. Основная причина избежать использования клиента - это, как я сказал, в контексте Continuous Build System, где сервер может нести ответственность за проверку заданного файла на высокой частоте в многопоточной среде.Я думал, что смогу найти способ сделать это исключительно на стороне сервера, чтобы избежать условий гонки или блокировок при переключении потока, а затем ищет файл только на одном рабочем пространстве. (И избегайте создания десятков несинхронизированных рабочих пространств с единственной целью поиска и печати/сглаживания файла). – Jibai

+0

В описанной ситуации у меня будет только один выделенный (пустой) клиент для потока - команда «p4 print» не повлияет на состояние клиента, поэтому несколько пользователей/потоков могут запускать команды «p4 print» против одного клиента без наступая друг на друга. Пустые клиенты очень маленькие, поэтому иметь одну для каждого потока для этой цели не так много накладных расходов (это, по-видимому, минимально по сравнению с самими потоками). Вы также можете быть заинтересованы в команде «sync -p», которая предназначена именно для того, что вы описываете ... –