Как интегрировать 2 ветки программно
У меня есть 2 филиала в моем депо.
//depot/project/mainline/...
//depot/project/staging/...
Я использую собственный инструмент, который управляет сборкой проекта, и хотел бы создать шаг сборки, который автоматически переводит все файлы из основной линии в промежуточную. Я пытался написать его с помощью API p4.net, следуя следующему примеру. Я могу запускать команды powershell из инструмента сборки. Мой план состоял в том, чтобы написать консольное приложение aC#, скомпилировать его с помощью инструмента, а затем выполнить как этап сборки. К сожалению, я не получаю ничего с этим примером. Я могу создать клиента, создать спецификацию ветки и даже синхронизировать файлы, но я на всю жизнь не могу понять, как отправить интеграцию. Я чувствую, что пытаюсь переосмыслить мысль о решении. Это то, что должно быть легко сделать. Я прилагаю мой сломанный код ниже. Если это не имеет смысла, это потому, что я использую метод проб и ошибок, чтобы выяснить вещи и еще не сделал окончательный проход через это. Тем не менее, если мне не нужно использовать API p4, тем лучше. Единственное требование заключается в том, что для запуска команд не требуется ввод пользователя. Если возникает конфликт слияния, я хочу автоматически принять источник.
Спасибо
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);
1 ответ
Из командной строки это:
p4 integrate //depot/project/mainline/... //depot/project/staging/...
p4 resolve -am
p4 resolve -at
p4 resolve -ay
p4 submit -d "Integrate."
"Resol -am" автоматически объединяет все файлы без конфликтов. "Resol -at" принимает источник всех оставшихся файлов. По самой вероятности, есть исходные файлы, которые не могут быть приняты (например, исходные ревизии были стерты, или исходные и целевые действия несовместимы), "resol -ay" игнорирует их.