/// <summary> /// Производит реверт элемента на коммит, указанный в поле IVcsStorageElement::commit /// </summary> /// <param name="commit">Представление элемента</param> public VcsCommit Revert(VcsCommit commit) { if (!VcsStorageUtils.CorrectCommitCode(commit)) { throw new Exception("Incorrect commit code!"); } if (!CommitExists(commit)) { throw new Exception("Transaction not exists!"); } var sourceStream = Engine.Get(new FileDescriptor { Path = Path.Combine(VcsStorageDefaults.ObjFilesDirectory, commit.Code) }).GetStream(FileAccess.Read); var revertedCode = ComputeCommitCode(sourceStream); var reverted = new VcsCommit { File = new FileDescriptor { Path = Path.Combine(VcsStorageDefaults.ObjFilesDirectory, revertedCode) }, Code = revertedCode }; Transaction(commit, VcsStorageTransactionType.Revert); Engine.Set(reverted.File, sourceStream); return(reverted); }
/// <summary> /// Производит прокатку записи журнала на диск /// </summary> private void Dump() { Engine.Set( new FileDescriptor { Path = Path.Combine(VcsStorageDefaults.BinLogDirectory, BinLogGuid + "." + VcsStorageDefaults.BinLogExtension) }, VcsStorageUtils.StringToStream(BinLog.ToString()) ); }
/// <summary> /// Вычисляет код коммита по содержимому, добавляю компонент случайности /// во избежание коллизий /// </summary> /// <param name="stream">Исходный поток</param> /// <returns></returns> private static string ComputeCommitCode(Stream stream) { using (var internalStream = new MemoryStream()) { stream.CopyTo(internalStream); return(VcsStorageUtils.ComputeShaFromString( VcsStorageUtils.StreamToString(internalStream) + Guid.NewGuid().ToString() )); } }
/// <summary> /// Сбрасыват карту на диск /// </summary> private void Dump() { Map.SetAttributeValue("EndWriting", DateTime.Now); Engine.Set( new FileDescriptor { Path = Path.Combine(VcsStorageDefaults.MapFilesDirectory, "master." + VcsStorageDefaults.MapFileExtension) }, VcsStorageUtils.StringToStream(Map.ToString()) ); }
/// <summary> /// Мержит текущую карту, если таковая существует /// </summary> private void MergeCurrentMap() { var currentMapStream = Engine.Get(new FileDescriptor { Path = Path.Combine(VcsStorageDefaults.MapFilesDirectory, "master." + VcsStorageDefaults.MapFileExtension) }).GetStream(FileAccess.Read); if (currentMapStream != null) { Map.Add(XElement.Parse( VcsStorageUtils.StreamToString(currentMapStream) ).Elements()); } }
/// <summary> /// Проверяет существование элемента в маппинге. Если указан коммит, /// то проверяет жёстко по коммиту /// </summary> /// <param name="commit">Представление элемента</param> /// <returns></returns> public bool Exists(VcsCommit commit) { var found = Find(commit); if (!found.Any()) { return(false); } // если код коммита имеет некорректную форму или не указан, а элемент // найден - просто вернём true if (!VcsStorageUtils.CorrectCommitCode(commit)) { return(true); } return(found.Any(c => c.Code == commit.Code)); }
/// <summary> /// Удаляет элемент из маппинга. Если указан коммит, то только /// данный коммит, в противном случае - весь элемент /// </summary> /// <param name="commit">Представление коммита</param> public void Remove(VcsCommit commit) { var container = GetElement(commit); if (!VcsStorageUtils.CorrectCommitCode(commit)) { container.SetAttributeValue("Removed", true); } else { var xmlCommit = container.XPathSelectElement("/Element/Commit[@Code='" + commit.Code + "']"); if (xmlCommit != null) { xmlCommit.SetAttributeValue("Removed", true); } if (!container.Elements().All(el => el.IsRemovedElement())) { container.SetAttributeValue("Removed", true); } } }
/// <summary> /// Возвращает поток на чтение файла из хранилища /// </summary> /// <param name="commit"></param> /// <returns></returns> public Stream Pick(VcsCommit commit) { return(VcsStorageUtils.CorrectCommitCode(commit) ? PickCommit(commit) : PickLatestCommit(commit)); }