Perforce Api - 如何命令"获得修订[changelist number]"

时间:2014-01-27 07:17:13

标签: c# perforce p4api.net

我想使用Perforce .NET API(C#)实现Perforce命令“Get Revision [Changelist Number]”。我目前的代码将“获得最新版本”,但我需要修改它以获得特定的更改列表。

要将数据与更改列表编号同步,我该怎么办?

来源

// --------Connenct----------------
Perforce.P4.Server server = new Perforce.P4.Server(
    new Perforce.P4.ServerAddress("127.0.0.1:9999"));
Perforce.P4.Repository rep = new Perforce.P4.Repository(server);
Perforce.P4.Connection con = rep.Connection;

con.UserName = m_P4ID;
string password = m_P4PASS;

Perforce.P4.Options opconnect = new Perforce.P4.Options();
opconnect.Add("-p", password);
con.Connect(opconnect);

if (con.Credential == null)
    con.Login(password);

//----------Download----------
string clientPath = @"C:\P4V\";
string ws_client = clientPath;
Perforce.P4.Client client = new Perforce.P4.Client();
client.Name = ws_client;
client.Initialize(con);

con.CommandTimeout = new TimeSpan(0);
IList<Perforce.P4.FileSpec> fileList = client.SyncFiles(new Perforce.P4.Options());

//----------Disconnect------------
con.Disconnect();
con.Dispose();

编辑:尝试1

Perforce.P4.DepotPath depot = new Perforce.P4.DepotPath("//P4V//");
Perforce.P4.LocalPath local = new Perforce.P4.LocalPath(ws_client);
Perforce.P4.FileSpec fs = new Perforce.P4.FileSpec(depot, null, local,
    Perforce.P4.VersionSpec.Head);

IList<Perforce.P4.FileSpec> listFiles = new List<Perforce.P4.FileSpec>();
listFiles.Add(fs);
IList<Perforce.P4.FileSpec> foundFiles = rep.GetDepotFiles(listFiles,
    new Perforce.P4.Options(1234)); // 1234 = Changelist number

client.SyncFiles(foundFiles, null);

错误消息

  

用法:files / print [-o localFile -q] files ...无效选项:-c。

我不知道任何争论的问题。

或者与此参考源无关?

修改2

我试图解决这个问题。但是,它还没有解决问题。

Perforce.P4.Changelist changelist = rep.GetChangelist(1234);
IList<Perforce.P4.FileMetaData> fileMeta = changelist.Files;

在这种情况下,我只能获得更改列表中的文件。我想在更改列表1234时同步客户端的所有文件。

3 个答案:

答案 0 :(得分:2)

SyncFiles采用可选的FileSpec arg。您可以使用该FileSpec arg指定文件路径和修订说明符。以下是相关文档:

FileSpec object docs

SyncFiles method docs

您不需要运行GetDepotFiles()来获取FileSpec对象;您可以直接创建一个,如FileSpec对象文档中所示。您使用GetDepotFiles()获得的错误是因为它期望将更改编号指定为作为GetDepotFiles()的第一个参数传入的FileSpec对象的一部分。

为了进一步扩展,GetDepotFiles()在与Perforce对话时调用'p4 files'命令。 new Perforce.P4.Options(1234)生成'-c 1234'选项,'p4 files'不接受。这就是为什么错误消息是'Usage:files / print [-o localFile -q] files ...无效选项:-c。'

答案 1 :(得分:1)

我也遇到了同样的问题。最后根据马特的回答,我得到了它的工作。请参阅下面的简单示例。

        using (Connection con = rep.Connection)
        {
            //setting up client object with viewmap
            Client client = new Client();
            client.Name = "p4apinet_solution_builder_sample_application_client";
            client.OwnerName = "p4username";
            client.Root = "c:\\clientRootPath";
            client.Options = ClientOption.AllWrite;
            client.LineEnd = LineEnd.Local;
            client.SubmitOptions = new ClientSubmitOptions(false, SubmitType.RevertUnchanged);
            client.ViewMap = new ViewMap();
            client.ViewMap.Add("//depotpath/to/your/file.txt", "//" + client.Name + "/clientpath/to/your/file.txt", MapType.Include);

            //connecting to p4 and creating client on p4 server
            Options options = new Options();
            options["Password"] = "p4password";
            con.UserName = "p4username";
            con.Client = new Client();
            con.Connect(options);
            con.Client = rep.CreateClient(client);

            //syncing all files (in this case 1) defined in client's viewmap to the changelist level of 12345
            Options syncFlags = new Options(SyncFilesCmdFlags.Force, 100);
            VersionSpec changeListLevel = new ChangelistIdVersion(12345);
            List<FileSpec> filesToBeSynced = con.Client.ViewMap.Select<MapEntry, FileSpec>(me => new FileSpec(me.Left, changeListLevel)).ToList();
            IList<FileSpec> results = con.Client.SyncFiles(filesToBeSynced, syncFlags);
        }

答案 2 :(得分:0)

以下代码应允许您将软件仓库同步到特定版本(更改列表编号)。

string uri = "...";
string user = "...";
string workspace = "...";
string pass = "..."; 
int id = 12345; // the actual changelist number
string depotPath = "//depot/foo/main/...";
int maxItemsToSync = 10000;

Server server = new Server(new ServerAddress(uri));
Repository rep = new Repository(server);

server = new Server(new ServerAddress(uri));
rep = new Repository(server);
Connection con = rep.Connection;
con.UserName = user;
con.Client = new Client();
con.Client.Name = workspace;

// connect
bool connected = con.Connect(null);
if (connected)
{
    try
    {
        // attempt a login
        Perforce.P4.Credential cred = con.Login(pass);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        con.Disconnect();
        connected = false;
    }

    if (connected)
    {
        // get p4 info and show successful connection
        ServerMetaData info = rep.GetServerMetaData(null);
        Console.WriteLine("CONNECTED TO " + info.Address.Uri);
        Console.WriteLine("");

        try
        {
            Options opts = new Options();

            // uncomment below lines to only get a preview of the sync w/o updating the workspace
            //SyncFilesCmdOptions syncOpts = new SyncFilesCmdOptions(SyncFilesCmdFlags.Preview, maxItemsToSync);
            SyncFilesCmdOptions syncOpts = new SyncFilesCmdOptions(SyncFilesCmdFlags.None, maxItemsToSync);

            VersionSpec version = new ChangelistIdVersion(id);
            PathSpec path = new DepotPath(depotPath);
            FileSpec depotFile = new FileSpec(path, version);

            IList<FileSpec> syncedFiles = rep.Connection.Client.SyncFiles(syncOpts, depotFile);
            //foreach (var file in syncedFiles)
            //{
            //    Console.WriteLine(file.ToString());
            //}
            Console.WriteLine($"{syncedFiles.Count} files got synced!");
        }
        catch (Exception ex)
        {
            Console.WriteLine("");
            Console.WriteLine(ex.Message);
            Console.WriteLine("");
        }
        finally
        {
            con.Disconnect();
        }
    }
}

如果您正在寻找其他方法来构建文件规范,例如仅将特定文件列表同步到“head”等,请访问此link并搜索“构建FileSpec”