Передача измененного файла через SVNKit без локальной проверки?
Я использую SVNKit, чтобы получить содержимое файла из нашего хранилища. Я хотел бы изменить это содержимое в коде и зафиксировать изменения без предварительной проверки файла. Я уже искал в Интернете и нашел только решения, которые требуют проверки в локальной файловой системе.
Кто-нибудь знает способ сделать это?
4 ответа
Теоретически это должно быть выполнимо, но практически невозможно с использованием SVNKit.
Насколько я вижу, все операции регистрации прямо или косвенно основаны на http://svnkit.com/javadoc/org/tmatesoft/svn/core/wc/SVNCommitItem.html, и этому классу требуется путь к файлу рабочей копии в его конструкторе.
Вы можете переопределить этот класс и попытаться реализовать свою собственную версию, для которой не требуется рабочая копия, но я не проверял это подробно.
Я говорил с людьми из TMate Software, и кажется, что это действительно возможно. Как они это объяснили, да, вы можете использовать локальный файл и генерировать контрольные суммы с новым контентом и отправлять его в Subversion, но (если что-то) это только поможет Subversion проверить, что у вас есть правильная и последняя версия в вашей локальной копии, В конце дня Subversion собирается делать свои собственные различия и дельты в любом случае.
Поэтому, если у вас нет локальной копии, вы можете просто создать контрольную сумму, как если бы файл был новым. Вот грубый код, извлеченный из моего более крупного проекта. Обратите внимание, что проверка SVNDirEntry
опережать время не требуется, если вы уже знаете, существует ли файл; Я предоставляю это здесь для пояснительных целей.
SVNDirEntry dirEntry = svnRepository.info(filePath, -1);
ISVNEditor editor = svnRepository.getCommitEditor("example modification", null, true, null);
editor.openRoot(-1);
if(dirEntry.getKind() == SVNNodeKind.NONE)
{
editor.addFile(filePath, null, -1);
}
else
{
editor.openFile(filePath, -1);
}
editor.applyTextDelta(filePath, null);
final SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
final String checksum = deltaGenerator.sendDelta(filePath, inputStream, editor, true);
editor.closeFile(filePath, checksum);
editor.closeDir(); //close the root
editor.closeEdit();
Не забудьте, после получения редактора коммитов, обернуть все до closeEdit()
в try...catch
заблокировать, так что вы можете прервать редактирование, если что-то пойдет не так.
Я попробовал это, и он проходит все мои тесты, используя SVNKIt 1.3.7 (например, от Maven):
<repositories>
<repository>
<id>svnkit-repository</id>
<name>SVNKit Repository</name>
<url>http://maven.tmatesoft.com/content/repositories/releases/</url>
</repository>
</repositories>
...
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.3.7</version>
</dependency>
Там действительно нет пути. По сути, SVN работает над моделью checkout-edit-commit. Могут быть приложения, которые скрывают это от вас, но они все равно будут выполнять проверку, например, за кулисами временного каталога.
Я только что попробовал. Вы можете получить байты изменяемого файла. Измените содержимое в памяти. Наконец, проверьте в коде. Вот этот снайпер:
byte[] in = checkOutPom(project+"/"+ destinationPathQualifier + tag+ "/pom.xml");
BufferedReader bin = new BufferedReader(new InputStreamReader(
new ByteArrayInputStream(in)));
MyPomHandler h = new MyPomHandler(); //replaces strings in the file
ByteArrayOutputStream os = new ByteArrayOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
os));
h.replace(bin, writer, "1.0.0-SNAPSHOT", tag);
ISVNEditor editor = getRepository().getCommitEditor(
"Patching POM with tag:"+tag, null);
modifyFile(editor, project + "/" + destinationPathQualifier + tag, project + "/" + destinationPathQualifier + tag+"/pom.xml",in, os.toByteArray());
================================================== знак равно
public byte[] checkOutPom(String filename)
throws SVNException {
SVNProperties fileProperties = new SVNProperties();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
getRepository().getFile(filename, -1, fileProperties, baos);
return baos.toByteArray();
}
==================================================
из svnkit пример кода:
public SVNCommitInfo modifyFile(ISVNEditor editor, String dirPath,
String filePath, byte[] oldData, byte[] newData)
throws SVNException {
editor.openRoot(-1);
editor.openDir(dirPath, -1);
editor.openFile(filePath, -1);
editor.applyTextDelta(filePath, null);
SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
String checksum = deltaGenerator.sendDelta(filePath,
new ByteArrayInputStream(oldData), 0, new ByteArrayInputStream(
newData), editor, true);
editor.closeFile(filePath, checksum);
editor.closeDir();
editor.closeDir();
return editor.closeEdit();
}