Exemplo n.º 1
0
        /// <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();
            });
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
        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);
        }