如何使用 SharpSVN 修改文件 xml 并提交修改后的文件
How to use SharpSVN to modify file xml and commit modified file
我是 SharpSVN 新手。
我们目前正忙于品牌重塑,这需要用新颜色等更新我们所有的报告。手动完成的报告太多,所以我正在寻找一种方法来查找和替换 colours/fonts 等等。
我们的报告被序列化并存储在数据库中,这很容易替换,但我们也想在我们的源代码管理中应用 .rdl 报告中的更改,即 Subversion。
我的问题如下:
我知道您可以使用 SharpSVN 将文件写入流,我已经这样做了,现在我想将更新的 xml 作为最新版本推送回 Subversion。
这是可能吗?如果是这样,我将如何去做呢?我用谷歌搜索了很多,但一直没能找到任何明确的答案。
到目前为止我的代码(记住这是一次性的事情,所以我不太关心干净的代码等):
private void ReplaceFiles()
{
SvnCommitArgs args = new SvnCommitArgs();
SvnCommitResult result;
args.LogMessage = "Rebranding - Replace fonts, colours, and font sizes";
using (SvnClient client = new SvnClient())
{
client.Authentication.DefaultCredentials = new NetworkCredential("mkassa", "Welcome1");
client.CheckOut(SvnUriTarget.FromString(txtSubversionDirectory.Text), txtCheckoutDirectory.Text);
client.Update(txtCheckoutDirectory.Text);
SvnUpdateResult upResult;
client.Update(txtCheckoutDirectory.Text, out upResult);
ProcessDirectory(txtCheckoutDirectory.Text, args, client);
}
MessageBox.Show("Done");
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public void ProcessDirectory(string targetDirectory, SvnCommitArgs args, SvnClient client)
{
var ext = new List<string> { ".rdl" };
// Process the list of files found in the directory.
IEnumerable<string> fileEntries = Directory.EnumerateFiles(targetDirectory, "*.*", SearchOption.AllDirectories)
.Where(s => ext.Any(e=> s.EndsWith(e)));
foreach (string fileName in fileEntries)
ProcessFile(fileName, args, client);
}
private void ProcessFile(string fileName, SvnCommitArgs args, SvnClient client)
{
using (MemoryStream stream = new MemoryStream())
{
SvnCommitResult result;
if (client.Write(SvnTarget.FromString(fileName), stream))
{
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
string contents = reader.ReadToEnd();
DoReplacement(contents);
client.Commit(txtCheckoutDirectory.Text, args, out result);
//if (result != null)
// MessageBox.Show(result.PostCommitError);
}
}
}
}
感谢任何可以提供一些见解的人!
我设法完成了这件事。发布答案以供将来参考。
基本上我所要做的就是使用修改后的 XML 创建一个新的 .rdl 文件,并在提交之前用新文件替换签出的文件。
string contents = reader.ReadToEnd();
contents = DoReplacement(contents);
// Create an XML document
XmlDocument doc = new XmlDocument();
string xmlData = contents;
doc.Load(new StringReader(xmlData));
//Save XML document to file
doc.Save(fileName);
client.Commit(txtCheckoutDirectory.Text, args, out result);
希望这对任何需要这样做的人有所帮助。
您不想对文件执行合并,因为您只会用它来将更改从一个位置合并到另一个位置。
如果您不能只检查整个树并替换+提交它,您可以使用基于以下内容的东西:
string tmpDir = "C:\tmp\mytmp";
using(SvnClient svn = new SvnClient())
{
List<Uri> toProcess = new List<Uri>();
svn.List(new Uri("http://my-repos/trunk"), new SvnListArgs() { Depth=Infinity }),
delegate(object sender, SvnListEventArgs e)
{
if (e.Path.EndsWith(".rdl", StringComparison.OrdinalIgnoreCase))
toProcess.Add(e.Uri);
});
foreach(Uri i in toProcess)
{
Console.WriteLine("Processing {0}", i);
Directory.Delete(tmpDir, true);
// Create a sparse checkout with just one file (see svnbook.org)
string name = SvnTools.GetFileName(i);
string fileName = Path.Join(tmpDir, name)
svn.CheckOut(new Uri(toProcess, "./"), new SvnCheckOutArgs { Depth=Empty });
svn.Update(fileName);
ProcessFile(fileName); // Read file and save in same location
// Note that the following commit is a no-op if the file wasn't
// changed, so you don't have to check for that yourself
svn.Commit(fileName, new SvnCommitArgs { LogMessage="Processed" });
}
}
更新主干后,我会建议将该更改合并到您的维护分支...如果有必要,只在之后修复它们。否则进一步的合并将比必要的更难执行。
我是 SharpSVN 新手。
我们目前正忙于品牌重塑,这需要用新颜色等更新我们所有的报告。手动完成的报告太多,所以我正在寻找一种方法来查找和替换 colours/fonts 等等。 我们的报告被序列化并存储在数据库中,这很容易替换,但我们也想在我们的源代码管理中应用 .rdl 报告中的更改,即 Subversion。
我的问题如下: 我知道您可以使用 SharpSVN 将文件写入流,我已经这样做了,现在我想将更新的 xml 作为最新版本推送回 Subversion。 这是可能吗?如果是这样,我将如何去做呢?我用谷歌搜索了很多,但一直没能找到任何明确的答案。
到目前为止我的代码(记住这是一次性的事情,所以我不太关心干净的代码等):
private void ReplaceFiles()
{
SvnCommitArgs args = new SvnCommitArgs();
SvnCommitResult result;
args.LogMessage = "Rebranding - Replace fonts, colours, and font sizes";
using (SvnClient client = new SvnClient())
{
client.Authentication.DefaultCredentials = new NetworkCredential("mkassa", "Welcome1");
client.CheckOut(SvnUriTarget.FromString(txtSubversionDirectory.Text), txtCheckoutDirectory.Text);
client.Update(txtCheckoutDirectory.Text);
SvnUpdateResult upResult;
client.Update(txtCheckoutDirectory.Text, out upResult);
ProcessDirectory(txtCheckoutDirectory.Text, args, client);
}
MessageBox.Show("Done");
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public void ProcessDirectory(string targetDirectory, SvnCommitArgs args, SvnClient client)
{
var ext = new List<string> { ".rdl" };
// Process the list of files found in the directory.
IEnumerable<string> fileEntries = Directory.EnumerateFiles(targetDirectory, "*.*", SearchOption.AllDirectories)
.Where(s => ext.Any(e=> s.EndsWith(e)));
foreach (string fileName in fileEntries)
ProcessFile(fileName, args, client);
}
private void ProcessFile(string fileName, SvnCommitArgs args, SvnClient client)
{
using (MemoryStream stream = new MemoryStream())
{
SvnCommitResult result;
if (client.Write(SvnTarget.FromString(fileName), stream))
{
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
string contents = reader.ReadToEnd();
DoReplacement(contents);
client.Commit(txtCheckoutDirectory.Text, args, out result);
//if (result != null)
// MessageBox.Show(result.PostCommitError);
}
}
}
}
感谢任何可以提供一些见解的人!
我设法完成了这件事。发布答案以供将来参考。
基本上我所要做的就是使用修改后的 XML 创建一个新的 .rdl 文件,并在提交之前用新文件替换签出的文件。
string contents = reader.ReadToEnd();
contents = DoReplacement(contents);
// Create an XML document
XmlDocument doc = new XmlDocument();
string xmlData = contents;
doc.Load(new StringReader(xmlData));
//Save XML document to file
doc.Save(fileName);
client.Commit(txtCheckoutDirectory.Text, args, out result);
希望这对任何需要这样做的人有所帮助。
您不想对文件执行合并,因为您只会用它来将更改从一个位置合并到另一个位置。
如果您不能只检查整个树并替换+提交它,您可以使用基于以下内容的东西:
string tmpDir = "C:\tmp\mytmp";
using(SvnClient svn = new SvnClient())
{
List<Uri> toProcess = new List<Uri>();
svn.List(new Uri("http://my-repos/trunk"), new SvnListArgs() { Depth=Infinity }),
delegate(object sender, SvnListEventArgs e)
{
if (e.Path.EndsWith(".rdl", StringComparison.OrdinalIgnoreCase))
toProcess.Add(e.Uri);
});
foreach(Uri i in toProcess)
{
Console.WriteLine("Processing {0}", i);
Directory.Delete(tmpDir, true);
// Create a sparse checkout with just one file (see svnbook.org)
string name = SvnTools.GetFileName(i);
string fileName = Path.Join(tmpDir, name)
svn.CheckOut(new Uri(toProcess, "./"), new SvnCheckOutArgs { Depth=Empty });
svn.Update(fileName);
ProcessFile(fileName); // Read file and save in same location
// Note that the following commit is a no-op if the file wasn't
// changed, so you don't have to check for that yourself
svn.Commit(fileName, new SvnCommitArgs { LogMessage="Processed" });
}
}
更新主干后,我会建议将该更改合并到您的维护分支...如果有必要,只在之后修复它们。否则进一步的合并将比必要的更难执行。