Как интегрировать 2 ветки программно

У меня в депо 2 филиала.

  //depot/project/mainline/...
  //depot/project/staging/...

Я использую внутренний инструмент, который управляет сборкой проекта, и хотел бы создать шаг сборки, который автоматически продвигает все файлы из основной ветки в промежуточную. Я пытался написать его с помощью p4.net API, следуя следующему примеру. Я могу запускать команды powershell из инструмента сборки. Мой план состоял в том, чтобы написать консольное приложение на С#, скомпилировать его с помощью инструмента, а затем выполнить как шаг сборки. К сожалению, я ничего не получаю с этим примером. Я могу создать клиент, создать спецификацию ветки и даже синхронизировать файлы, но я всю жизнь не могу понять, как отправить интеграцию. Я чувствую, что пытаюсь перепроектировать мысль о решении. Это то, что должно быть легко сделать. Я прикрепляю свой сломанный код ниже. Если это не имеет смысла, то это потому, что я использую метод проб и ошибок, чтобы разобраться во всем, и еще не прошел через него окончательно. Тем не менее, если мне не нужно использовать p4 API, тем лучше. Единственное требование состоит в том, чтобы для запуска команд не требовался ввод данных пользователем. Если есть конфликт слияния, я хочу автоматически принять источник.

Спасибо

        string uri = "server";
        string user = "user";
        string pass = null;
        string ws_client = "Project-Temp-"+ Guid.NewGuid().ToString();


        Server server = new Server(new ServerAddress(uri));
        Repository rep = new Repository(server);
        Connection con = rep.Connection;

        con.UserName = user;
        con.Client = new Client();
        con.Client.Name = ws_client;
        con.Client.ViewMap = new ViewMap();

        con.Connect(null);
        Credential cred = con.Login(pass, null, null);
        rep.DeleteClient(con.Client, null);
        rep.CreateClient(con.Client);
        con.Client.ViewMap.Clear();
        con.Client.ViewMap.Add("//depot/project/...", String.Format("//{0}/...", con.Client.Name), MapType.Include);
        rep.UpdateClient(con.Client);

        var files = con.Client.SyncFiles(new SyncFilesCmdOptions(SyncFilesCmdFlags.None, -1));

        ViewMap vm = new ViewMap();
        vm.Add(new MapEntry(MapType.Include,new ClientPath("//depot/project/mainline/..."), new ClientPath("//depot/project/staging/...")));
        string msg = "Mainline to Staging";
        BranchSpec bs = new BranchSpec("Project-Temp", user, DateTime.Now, DateTime.Now, msg, true, vm, null, null);
        int change = -1;
        IntegrateFilesCmdOptions BranchOptions = new IntegrateFilesCmdOptions(IntegrateFilesCmdFlags.None, change, -1, "Project-Temp", null, null);
        rep.CreateBranchSpec(bs);
        rep.UpdateClient(con.Client);


        var integrated = con.Client.IntegrateFiles(BranchOptions);
        con.Client.ResolveFiles(files, new ResolveCmdOptions(ResolveFilesCmdFlags.AutomaticYoursMode, change));


        rep.DeleteClient(con.Client, null);

person Smartelf    schedule 29.09.2015    source источник


Ответы (1)


Из командной строки это:

p4 integrate //depot/project/mainline/... //depot/project/staging/...
p4 resolve -am
p4 resolve -at
p4 resolve -ay
p4 submit -d "Integrate."

«Resolve -am» автоматически объединяет все файлы без конфликтов. «Resolve -at» принимает источник всех оставшихся файлов. В крайнем случае есть исходные файлы, которые не могут быть приняты (например, исходные версии были стерты или исходное и целевое действия несовместимы), «разрешить -ay» их игнорирует.

person Samwise    schedule 29.09.2015
comment
Спасибо, сработало отлично и намного проще, чем мое оригинальное решение. - person Smartelf; 30.09.2015