SVN ZIP на лету - PullRequest
       32

SVN ZIP на лету

3 голосов
/ 08 мая 2009

Я установил VisualSVN на свой сервер Windows 2003 и настроил его для предоставления анонимного доступа для чтения. Насколько я понимаю, VisualSVN просто использует apache и официальный сервер репозитория SVN.

Теперь я хотел бы расширить веб-страницу SVN, чтобы обеспечить функциональность «загрузить HEAD как ZIP». Веб-порталы, такие как SourceForge и Codeplex , предоставляют эту функцию.

Есть ли для этого плагин для сервера репозитория SVN? Или может быть отдельный веб-клиент (желательно ASP.NET)?

Ответы [ 3 ]

5 голосов
/ 09 мая 2009

Я нашел решение и хотел бы поделиться им с вами, если кто-то другой захочет найти такое же решение.

После анализа WebSvn я обнаружил, что они используют функцию каталога экспорта SVN для загрузки исходного кода в локальную папку, а затем архивируют каталог на лету. Производительность довольно хорошая.

Мое решение в C # ниже, использует SharpSVN и DotNetZip . Полный исходный код можно найти в моем репозитории SVN .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SharpSvn;
using Ionic.Zip;
using System.IO;
using SharpSvn.Security;

namespace SvnExportDirectory
{
    public class SvnToZip
    {
        public Uri SvnUri { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }

        private bool passwordSupplied;

        public SvnToZip() { }

        public SvnToZip(Uri svnUri)
        {
            this.SvnUri = svnUri;
        }

        public SvnToZip(string svnUri)
            : this(new Uri(svnUri)) { }

        public void ToFile(string zipPath)
        {
            if (File.Exists(zipPath))
                File.Delete(zipPath);

            using (FileStream stream = File.OpenWrite(zipPath))
            {
                this.Run(stream);
            }
        }

        public MemoryStream ToStream()
        {
            MemoryStream ms = new MemoryStream();
            this.Run(ms);
            ms.Seek(0, SeekOrigin.Begin);
            return ms;
        }

        private void Run(Stream stream)
        {
            string tmpFolder =
                Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

            try
            {
                using (SvnClient client = new SvnClient())
                {
                    //client.Authentication.Clear();
                    client.Authentication.UserNamePasswordHandlers += Authentication_UserNamePasswordHandlers;

                    SvnUpdateResult res;
                    bool downloaded = client.Export(SvnTarget.FromUri(SvnUri), tmpFolder, out res);
                    if (downloaded == false)
                        throw new Exception("Download Failed");
                }

                using (ZipFile zipFile = new ZipFile())
                {
                    zipFile.AddDirectory(tmpFolder, GetFolderName());
                    zipFile.Save(stream);
                }
            }
            finally
            {
                if (File.Exists(tmpFolder))
                    File.Delete(tmpFolder);
            }
        }


        private string GetFolderName()
        {
            foreach (var potential in SvnUri.Segments.Reverse())
            {
                if (string.Equals(potential, "trunk", StringComparison.InvariantCultureIgnoreCase) == false)
                    return potential;
            }
            return null;
        }

        void Authentication_UserNamePasswordHandlers(object sender, SvnUserNamePasswordEventArgs e)
        {
            if (passwordSupplied)
            {
                e.Break = true;
            }
            else
            {
                if (this.Username != null)
                    e.UserName = this.Username;

                if (this.Password != null)
                    e.Password = this.Password;

                passwordSupplied = true;
            }
        }
    }
}
1 голос
/ 08 мая 2009

Я не знаю о "встроенном", но вы можете попробовать написать страницу, которая использует SharpSVN и #ZipLib для работы ...

Если это слишком медленно, вы, вероятно, могли бы использовать ловушку для фиксации или запланированное задание (каждые несколько минут или что-то в этом роде), чтобы сохранить заранее подготовленный zip-файл где-то, что вы можете просто вернуть - используя «create as other» name затем переименуйте, когда будете готовы, трюк, чтобы минимизировать количество времени, которое он заблокирован / недоступен. Или назовите его номером ревизии.

0 голосов
/ 08 мая 2009

TortoiseSVN регистрирует некоторый подключаемый протокол, который распознает браузер. svn: // blahblahblah ... вы можете посмотреть на это. Но тогда вы должны использовать TortoiseSVN ...

...