代码之家  ›  专栏  ›  技术社区  ›  tofi9

SVN将在飞行中快速移动

  •  3
  • tofi9  · 技术社区  · 15 年前

    我已在Windows 2003服务器上安装了VisualSVN,并将其配置为提供匿名读取访问。据我所知,VisualSVN只使用apache和下面的官方SVN存储库服务器。

    SourceForge Codeplex 请务必提供此功能。

    3 回复  |  直到 15 年前
        1
  •  5
  •   tofi9    15 年前

    我找到了一个解决方案,并希望与您分享,以防其他人想要实现相同的解决方案。

    分析后 WebSvn

    我在下面C#中的解决方案是使用 SharpSVN DotNetZip . 完整的源代码可以在 my SVN repository .

    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;
                }
            }
        }
    }
    
        2
  •  1
  •   Marc Gravell    15 年前

    如果速度太慢,您可能会使用提交钩子或计划作业(每隔几分钟或其他时间)将预先准备好的zip放在方便的地方,您可以直接返回—使用“创建为不同的名称,然后在准备就绪时重命名”技巧,以尽量减少其锁定/不可用的时间。或者用修订号命名。

        3
  •  0
  •   i_am_jorf    15 年前