我在Windows 2003服务器上安装了VisualSVN,并将其配置为提供匿名读访问。根据我的理解,VisualSVN只使用apache和下面的官方SVN Repository服务器。
现在,我想扩展SVN网页以提供“下载HEAD as ZIP”功能。像SourceForge和Codeplex这样的门户网站确实提供了此功能。
SVN Repository服务器是否有插件?或者可能是一个单独的Web客户端(最好是ASP.NET)?
答案 0 :(得分:5)
我找到了一个解决方案,并希望与您分享,以防其他人想要实现相同的解决方案。
在分析WebSvn之后,我发现他们使用SVN导出目录功能将源下载到本地文件夹,然后即时压缩目录。表现非常好。
我在下面的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;
}
}
}
}
答案 1 :(得分:1)
我不知道“内置”,但您可以尝试编写一个使用SharpSVN和#ZipLib来完成工作的页面......
如果这太慢了,你可能会使用一个提交钩子或一个预定的工作(每隔几分钟或者什么)来保持一个预先准备好的拉链方便你可以返回的地方 - 使用“创建一个不同的名称然后在准备好时重命名“技巧以最小化它被锁定/不可用的时间。或者用修订号命名。
答案 2 :(得分:0)
TortoiseSVN注册了一些浏览器可识别的可插拔协议。 svn:// blahblahblah ......你可以调查一下。但是你必须使用TortoiseSVN ......