コード例 #1
0
        /// <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);
        }
コード例 #2
0
 /// <summary>
 ///     Производит прокатку записи журнала на диск
 /// </summary>
 private void Dump()
 {
     Engine.Set(
         new FileDescriptor {
         Path = Path.Combine(VcsStorageDefaults.BinLogDirectory, BinLogGuid + "." + VcsStorageDefaults.BinLogExtension)
     },
         VcsStorageUtils.StringToStream(BinLog.ToString())
         );
 }
コード例 #3
0
 /// <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()
                    ));
     }
 }
コード例 #4
0
 /// <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())
         );
 }
コード例 #5
0
        /// <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());
            }
        }
コード例 #6
0
        /// <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));
        }
コード例 #7
0
        /// <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);
                }
            }
        }
コード例 #8
0
 /// <summary>
 ///     Возвращает поток на чтение файла из хранилища
 /// </summary>
 /// <param name="commit"></param>
 /// <returns></returns>
 public Stream Pick(VcsCommit commit)
 {
     return(VcsStorageUtils.CorrectCommitCode(commit) ? PickCommit(commit) : PickLatestCommit(commit));
 }