public CommitInfo(SnapshotInfo info, string message) { Date = DateTime.Now; Previos = info.Previos; Message = message; Files = info.Files; Id = info.Id; }
//делает коммит используя инфу из снепшота public static CommitInfo Commit(SnapshotInfo snapshot, DirectoryInfo workspace, string message) { string snapshotsDir = Path.Combine(workspace.FullName, Global.SnapshotsDirPath); string snapshotDir = Path.Combine(snapshotsDir, snapshot.Id); Directory.CreateDirectory(snapshotDir); CopyAllExceptRepository(workspace.FullName, snapshotDir); var commit = new CommitInfo(snapshot, message); WriteCommit(workspace, commit); return commit; }
//метод который знает рабочую папку,предыдущий снепшот и вычисляет изменение public static SnapshotInfo CreateSnapshot(DirectoryInfo workspace, SnapshotInfo previos) { Environment.CurrentDirectory = workspace.FullName; var snapshot = new SnapshotInfo(); if (previos == null) { snapshot.Files = new List<TrackedFileInfo>(); foreach (string file in FileFinder.GetAllFiles(workspace)) snapshot.Files.Add(new TrackedFileInfo(file) {Status = FileStatus.New}); snapshot.Id = Global.MasterCommitName; } else { var previosDictionary = new Dictionary<string, KeyValuePair<byte[], FileStatus>>(); // previos var currentDictionary = new Dictionary<string, KeyValuePair<byte[], FileStatus>>(); // current var hashes = new List<byte[]>(); snapshot.Files = new List<TrackedFileInfo>(); foreach (string file in FileFinder.GetAllFiles(workspace)) snapshot.Files.Add(new TrackedFileInfo(file)); foreach (TrackedFileInfo f in previos.Files) previosDictionary.Add(f.Name, new KeyValuePair<byte[], FileStatus>(f.Hash, f.Status)); foreach (TrackedFileInfo f in snapshot.Files) currentDictionary.Add(f.Name, new KeyValuePair<byte[], FileStatus>(f.Hash, f.Status)); snapshot.Files = WorkspaceDiff(previosDictionary, currentDictionary);//сравнивает 2 словаря возвращает разницу foreach (TrackedFileInfo f in snapshot.Files) hashes.Add(f.Hash);//формируем список хешей всех файлов snapshot.Previos = previos.Id; snapshot.Id = BitConverter.ToString(Hasher.MergeHashes(hashes)).Replace("-", ""); } return snapshot; }