使用 p4api 为 Perforce 命令指定全局选项 运行
Specify global options for a Perforce command run using p4api
我正在使用 Perforce,a.k.a。 Helix Core,C++ API 以编程方式 运行 Perforce 命令。如何为命令指定全局选项?
例如,我想以编程方式 运行 clients
命令和多个全局选项。如果来自命令 shell 的 运行,它将如下所示。
p4 -z tag -F %client% clients -u mikef
据我所知,我想要的全局选项 -z
和 -F
不是您可以通过环境变量指定的。但即使你可以,我也不能指望用户来设置它们。
幸运的是,我将全局选项添加到提供给 ClientApi
对象的参数数组中。例如:
#include <p4/clientapi.h>
#include "CustomClientUser.h" // A class I derived from ClientUser
// Connect to server.
StrBuf msg;
Error e;
ClientApi client;
client.SetProtocol( "tag", "" );
client.Init( &e );
if ( e.Test() )
{
e.Fmt( &msg );
fprintf( "%s\n", msg.Text() );
return;
}
// Use my own client user.
CustomClientUser cu;
// Run the command. Try adding global options at the beginning of the arg array.
char * argv[] = { "-z", "tag", "-u", "td27117" };
int argc = sizeof( argv ) / sizeof( char * );
client.SetArgv( argc, argv );
client.Run( "clients", &cu );
但是,那没有用。当你给它一个它不理解的命令选项时,错误输出就是你所期望的。
Usage: clients [ -t ] [ -u user ] [ -U ] [ [-e|-E] query -m max ] [ -a | -s serverID ] [ -S stream ]
Invalid option: -z.
全局选项是客户端应用程序而非服务器的参数。 Run()
方法用于向服务器发送commands/arguments;如果您向它发送 client-side args,它将不知道如何处理它们。
要告诉客户端设置 "tag" 协议,请执行:
client.SetProtocol("tag", "");
请注意,在调用 Run()
之前 必须调用此方法,因为它修改了 Run()
使用的协议。
如果你想了解各种全局选项是如何实现的,你可以直接查看p4
源代码。
- 这里是设置连接设置的地方:
https://swarm.workshop.perforce.com/files/guest/perforce_software/p4/2018-2/client/clientmain.cc#286
- 这里是设置协议变量的地方:
https://swarm.workshop.perforce.com/files/guest/perforce_software/p4/2018-2/client/clientmain.cc#508
- 这里是 -F 标志的实现位置:https://swarm.workshop.perforce.com/files/guest/perforce_software/p4/2018-2/client/clientmain.cc#562
请注意,大多数全局选项直接对应于 ClientApi
方法,您可以在 header (clientapi.h
) 或文档中看到:https://www.perforce.com/manuals/v15.1/p4api/chapter.methods.html#clientapi
我正在使用 Perforce,a.k.a。 Helix Core,C++ API 以编程方式 运行 Perforce 命令。如何为命令指定全局选项?
例如,我想以编程方式 运行 clients
命令和多个全局选项。如果来自命令 shell 的 运行,它将如下所示。
p4 -z tag -F %client% clients -u mikef
据我所知,我想要的全局选项 -z
和 -F
不是您可以通过环境变量指定的。但即使你可以,我也不能指望用户来设置它们。
幸运的是,我将全局选项添加到提供给 ClientApi
对象的参数数组中。例如:
#include <p4/clientapi.h>
#include "CustomClientUser.h" // A class I derived from ClientUser
// Connect to server.
StrBuf msg;
Error e;
ClientApi client;
client.SetProtocol( "tag", "" );
client.Init( &e );
if ( e.Test() )
{
e.Fmt( &msg );
fprintf( "%s\n", msg.Text() );
return;
}
// Use my own client user.
CustomClientUser cu;
// Run the command. Try adding global options at the beginning of the arg array.
char * argv[] = { "-z", "tag", "-u", "td27117" };
int argc = sizeof( argv ) / sizeof( char * );
client.SetArgv( argc, argv );
client.Run( "clients", &cu );
但是,那没有用。当你给它一个它不理解的命令选项时,错误输出就是你所期望的。
Usage: clients [ -t ] [ -u user ] [ -U ] [ [-e|-E] query -m max ] [ -a | -s serverID ] [ -S stream ]
Invalid option: -z.
全局选项是客户端应用程序而非服务器的参数。 Run()
方法用于向服务器发送commands/arguments;如果您向它发送 client-side args,它将不知道如何处理它们。
要告诉客户端设置 "tag" 协议,请执行:
client.SetProtocol("tag", "");
请注意,在调用 Run()
之前 必须调用此方法,因为它修改了 Run()
使用的协议。
如果你想了解各种全局选项是如何实现的,你可以直接查看p4
源代码。
- 这里是设置连接设置的地方: https://swarm.workshop.perforce.com/files/guest/perforce_software/p4/2018-2/client/clientmain.cc#286
- 这里是设置协议变量的地方: https://swarm.workshop.perforce.com/files/guest/perforce_software/p4/2018-2/client/clientmain.cc#508
- 这里是 -F 标志的实现位置:https://swarm.workshop.perforce.com/files/guest/perforce_software/p4/2018-2/client/clientmain.cc#562
请注意,大多数全局选项直接对应于 ClientApi
方法,您可以在 header (clientapi.h
) 或文档中看到:https://www.perforce.com/manuals/v15.1/p4api/chapter.methods.html#clientapi