gpt4 book ai didi

c# - SVN 即时 ZIP

转载 作者:行者123 更新时间:2023-11-30 14:44:07 30 4
gpt4 key购买 nike

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

现在,我想扩展 SVN 网页以提供“将 HEAD 下载为 ZIP”功能。门户网站,如 SourceForgeCodeplex提供此功能。

是否有用于 SVN 存储库服务器的插件?或者可能是一个单独的 Web 客户端(最好是 ASP.NET)?

最佳答案

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

经过分析WebSvn ,我发现他们使用 SVN 导出目录功能将源代码下载到本地文件夹,然后即时压缩目录。性能相当不错。

我在下面的 C# 中的解决方案是使用 SharpSVNDotNetZip .完整的源代码可以在 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;
}
}
}
}

关于c# - SVN 即时 ZIP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837541/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com