/// <summary> /// Discards selected changes from the selected project. /// </summary> public void Discard(string[] files) { if (CheckProjects()) { return; } ClientUI.ShowProgress("Discarding..."); try { var diffs = CurrentProject.BuildDiff(); var diff = diffs.Where(file => files.Any(x => x == file.FileName)).ToList(); var commit = Commit.FromDiff(diff.ToArray()); CurrentProject.Discard(commit.Files, x => { ClientUI.SetProgress("Discarding " + diff.Count + " change(s). " + x); }); } catch (Exception ex) { ClientUI.ShowMessage("Error when discarding, no changes were discared, message: <br>" + ex.Message, true); } ClientUI.HideProgress(); ClientUI.ShowProgress("Discarding done! Loading..."); CurrentProject.Refresh(delegate { UpdateView(); ClientUI.HideProgress(); }); }
/// <summary> /// Pueshes selected changes from the selected project. /// </summary> public void Push(string[] files) { if (CheckProjects()) { return; } if (files.Length == 0) { ClientUI.ShowMessage("No file changes selected, select some."); return; } try { ClientUI.ShowProgress("Building commit..."); var diffs = CurrentProject.BuildDiff(); var diff = diffs.Where(file => files.Any(x => x == file.FileName)).ToList(); if (diff.Count == 0) { ClientUI.ShowMessage("No file changes selected, select some."); return; } var commit = Commit.FromDiff(diff.ToArray()); var datafile = commit.Build(CurrentProject.RootDir, CurrentProject.RootDir + ".mysync\\commit.zip", x => { ClientUI.SetProgress("Building commit... " + x); }); ClientUI.SetProgress("Pushing " + diff.Count + " change(s)."); CurrentProject.Push(commit, datafile, x => { ClientUI.SetProgress("Pushing " + diff.Count + " change(s). " + x); }); ClientUI.HideProgress(); ClientUI.ShowProgress("Push done! Loading..."); CurrentProject.Refresh(delegate { UpdateView(); ClientUI.HideProgress(); }); } catch (Exception ex) { ClientUI.HideProgress(); ClientUI.ShowMessage("Error when pushing, no changes were pushed, message: <br>" + ex.Message, true); } }
private static void Main() { Console.Write(@"Username: "******"Access token: "); var token = PasswordHasher.Hash(username, Console.ReadLine()); var settings = JsonConvert.DeserializeObject <ClientSettings>(File.ReadAllText("client.json")); Console.WriteLine(@"Select project: "); for (var i = 0; i < settings.Projects.Length; i++) { Console.WriteLine(i + @") " + settings.Projects[i].Name); } Console.Write(@"Project: "); var projectSettings = settings.Projects[int.Parse(Console.ReadLine())]; Console.WriteLine(@"Using project: " + projectSettings.Name); var project = Project.OpenWorkingCopy(projectSettings.Address, projectSettings.RootDir); project.Authority = new ProjectAuthority { ProjectName = projectSettings.Name, Username = username, AccessToken = token }; Console.WriteLine(@"Select: PUSH or PULL"); var op = Console.ReadLine(); if (op == "PUSH") { var diffs = project.BuildDiff(); var diff = new List <Filemap.FileDiff>(); Console.WriteLine(@"Select files: "); foreach (var file in diffs) { Console.WriteLine(file.FileName + @" - operation: " + file.DiffType + @" - [ENTER to ACCEPT] or [ANY key and ENTER to IGNORE]"); if (Console.ReadLine().Length == 0) { diff.Add(file); } } if (diff.Count == 0) { Console.WriteLine(@"Press any key to exit..."); Console.ReadLine(); return; } Console.WriteLine(@"Press any key to PUSH..."); Console.ReadLine(); var commit = Commit.FromDiff(diff.ToArray()); var datafile = commit.Build(project.RootDir, project.RootDir + ".mysync\\commit.zip"); project.Push(commit, datafile); } else if (op == "PULL") { project.Pull(); } Console.WriteLine(@"Press any key to exit..."); Console.ReadLine(); }
public static void Discard(string body, HttpListenerResponse response) { var projectName = ""; using (var writer = new BinaryWriter(response.OutputStream)) { try { var input = DiscardInput.FromJson(body); projectName = input.Authority.ProjectName; if (!Authorization.HasAuthority(input.Authority.AccessToken, projectName)) { writer.Write("Failed - project not found!"); return; } // request project lock if (ProjectLock.TryLock(projectName, ProjectLock.LockMode.Upload) == ProjectLock.LockMode.Any) { writer.Write("Failed - project is locked!"); return; } var projectCollection = ServerCore.Database.GetCollection <CommitModel>(projectName); var commits = projectCollection.Find(x => x.CommitId >= 0).ToList().OrderBy(x => x.CommitId).ToArray(); // select files then pack them // and send to the client var diff = new List <Filemap.FileDiff>(); foreach (var file in input.Files) { // select commits which contains this file(which is not removed by the commit) then order by commit and select the first commit. var validCommit = commits.Where(x => x.Files.Any(n => n.Name == file.FileName && n.Operation != 2)).OrderByDescending(x => x.CommitId).FirstOrDefault(); if (validCommit != null) { // select the file var validFile = validCommit.Files.First(x => x.Name == file.FileName); diff.Add(new Filemap.FileDiff { FileName = validFile.Name, DiffType = Filemap.FileDiff.Type.Changed, Version = validFile.Version }); } else { Console.WriteLine("Commit not found for file " + file.FileName); } } // create commit var commit = Commit.FromDiff(diff.ToArray()); // write commit in json format var commitJson = commit.ToJson(); writer.Write(commitJson); // build commit diff data file var dir = "data/" + projectName + "/"; var tempDataFile = "temp_send_" + input.Authority.Username + ".zip"; commit.Build(dir, tempDataFile, delegate(int progress) { var lastSend = DateTime.Now; if ((DateTime.Now - lastSend).TotalSeconds >= 1.0f) { writer.Write(false); writer.Write(progress); } }); writer.Write(true); // send commit diff data file using (var nfs = new NetFileStream(tempDataFile, onError: delegate { // user lost connection or closed the client // before the whole data file is sent Console.WriteLine("User '" + input.Authority.Username + "' canceled commit download."); ProjectLock.Unlock(projectName); })) { nfs.Upload(response.OutputStream); } File.Delete(tempDataFile); } catch (Exception ex) { writer.Write("Failed - invalid protocol/connection error! Error: " + ex); Console.WriteLine(ex); ProjectLock.Unlock(projectName); } } ProjectLock.Unlock(projectName); }