2015-09-29 2 views
1

У меня есть 2 филиала в моем депо.Как интегрировать 2 ветви программно

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

Я использую инструмент в доме, который управляет сборками проекта, и хотел бы создать шаг сборки, который автоматически продвигает все файлы из магистрали в постановку. Я пытаюсь написать его с помощью p4.net API, следуя следующим example. Я могу запускать команды powershell из инструмента построения. Мой план состоял в том, чтобы написать консольное приложение C#, скомпилировать его с помощью инструмента, а затем выполнить его как шаг сборки. К сожалению, я не получаю нигде с этим примером. Я могу создать клиента, создать спецификацию ветки и даже синхронизировать файлы, но я на всю жизнь не могу понять, как отправить интеграцию. Я чувствую, что пытаюсь переусердствовать с решением. Это то, что должно быть легко сделать. Я прикрепляю свой сломанный код ниже. Если доза не имеет смысла, это потому, что я использую пробную версию и ошибку, чтобы нарисовать материал и еще не сделал окончательного прохождения. Тем не менее, если мне не нужно использовать 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); 

ответ

2

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

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

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

+0

Спасибо, отлично работал и намного проще, чем мое оригинальное решение. – Smartelf

Смежные вопросы