Учитывая, что ваша главная забота, чтобы сделать это настолько эффективно, насколько это возможно (минимальное воздействие на сервере и минимальных сценариях), я предложил бы делать следующее:
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
Обратите внимание, что только один элемент базы данных был переписан для фактического клиентский переключатель; основная часть накладных расходов - это в основном незначительная сумма, связанная с аутентификацией и выходом (одна строка говорит мне, что это удалось).
Не могли бы вы объяснить, почему вы не можете использовать спецификацию клиента? Решение этой проблемы в основном «реализует эквивалент спецификации клиента», что выполнимо ... но учитывая, что Perforce уже реализует эту вещь (то есть клиентскую спецификацию), было бы проще использовать то, что там есть. –
Поскольку вы знаете имя потока задач, файлы которого вы пытаетесь распечатать, вы можете иметь рабочее пространство клиента, которое вы используете только для этого инструмента печати, а затем выполните «p4 client -s -S // toto/test», или «p4 client -s -S // tot/otherTaskStream», если необходимо, перед запуском 'p4 print'. –
@SamStafford В системе непрерывной интеграции, где я бы хотел, чтобы сервер просматривал файлы без необходимости рабочего пространства. Даже если я использую рабочее пространство, цикл «switch stream - look in file» будет по меньшей мере тратить время, в худшем случае, на бесполезное давление на сервер P4. – Jibai