/// <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>
        /// <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));
        }
示例#3
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);
                }
            }
        }
 /// <summary>
 ///     Возвращает поток на чтение файла из хранилища
 /// </summary>
 /// <param name="commit"></param>
 /// <returns></returns>
 public Stream Pick(VcsCommit commit)
 {
     return(VcsStorageUtils.CorrectCommitCode(commit) ? PickCommit(commit) : PickLatestCommit(commit));
 }