SharpSVN - Как получить предыдущую версию?

Я пытаюсь найти эффективный способ получить предыдущую версию файла для сравнения текста с использованием SharpSVN.

using (SvnClient c = new SvnClient())
{
    c.Authentication.DefaultCredentials = new NetworkCredential(
          ConfigurationManager.AppSettings.Get("SvnServiceUserName")
        , ConfigurationManager.AppSettings.Get("SvnServicePassword")
        , ConfigurationManager.AppSettings.Get("SvnServiceDomain")
        );
    c.Authentication.SslServerTrustHandlers += new EventHandler<SvnSslServerTrustEventArgs>(Authentication_SslServerTrustHandlers);

    Collection<SvnFileVersionEventArgs> fileVersionCollection = new Collection<SvnFileVersionEventArgs>();
    SvnRevisionRange range = new SvnRevisionRange(0, this.hooks.Revision);
    SvnFileVersionsArgs args = new SvnFileVersionsArgs();
    args.RetrieveProperties = true;
    args.Range = range;

    foreach (SvnChangeItem item in log.ChangedPaths)
    {
        string path = this.repositoryPath + item.Path;

        bool gotFileVersions = false;

        try
        {
            if (item.NodeKind == SvnNodeKind.File)
                gotFileVersions = c.GetFileVersions(SvnTarget.FromString(path), args, out fileVersionCollection);

Приведенный выше код является примером выполнения моего запроса, однако он крайне неэффективен. Моя цель - иметь возможность выбрать ревизию, а также предыдущую ревизию. Например, если мой репозиторий имеет версию r185, но я хочу просмотреть файл версии 100, а также просмотреть предыдущую версию того же файла (о которой я не знаю), как это можно сделать?

Я просмотрел c.GetInfo(), но, похоже, это только возвращает предыдущую версию к самой последней фиксации.

Спасибо!


person ISZ    schedule 01.07.2011    source источник


Ответы (2)


Попробуйте получить только те версии, которые вы ищете. Я предполагаю, что log является экземпляром SvnLoggingEventArgs?

Если это так, используйте:

args.Range = new SvnRevisionRange(log.Revision, log.Revision - 1);

Таким образом, вы получите изменения только из этой версии, а поскольку log.Revision гарантированно будет номером версии изменения, если вы вычтете единицу, у вас будет предыдущая версия.

person Sander Rijken    schedule 02.07.2011

Нужна ли вам предыдущая версия (версия до последней фиксации) или локальная неизмененная версия.

Библиотека рабочих копий Subversion имеет следующие «магические» версии.

Working    (SvnRevision.None)     - What you have in your working copy 
                                    (includes local modifications)

Head       (SvnRevision.Head)     - The last committed version of a url in the
                                    repository

Base       (SvnRevision.Base)     - The version you last committed or updated to.

Committed  (SvnRevision.Comitted) - The last revision <= BASE in which the path was
                                    modified

Previous   (SvnRevision.Previous) - The last revision before Committed.
                                    (Literally Committed-1)

Чтобы получить одну из этих версий, вы можете использовать SvnClient.Write().

using (SvnClient c = new SvnClient())
using (Stream to = File.Create(@"C:\temp\my.tmp"))
{
   c.Write(new SvnPathTarget(@"F:\projects\file.cs", SvnRevision.Base), to);
}

Файлы для Work и Base доступны локально. Для других версий Subversion должна связаться с репозиторием.

person Bert Huijben    schedule 19.07.2011
comment
Вместо SvnRevision.None мне нужно было использовать SvnRevision.Working - person 8128; 23.07.2018