Передача измененного файла через SVNKit без локальной проверки? - PullRequest
3 голосов
/ 17 января 2011

Я использую SVNKit для получения содержимого файла из нашего репозитория. Я хотел бы изменить это содержимое в коде и зафиксировать изменения без предварительной проверки файла. Я уже искал в Интернете и нашел только решения, которые требуют проверки в локальной файловой системе.

Кто-нибудь знает способ сделать это?

Ответы [ 4 ]

6 голосов
/ 29 декабря 2011

Я говорил с людьми из 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>
0 голосов
/ 17 января 2011

Теоретически это должно быть выполнимо, но на практике это представляется невозможным при использовании SVNKit.

Насколько я вижу, все операции регистрации прямо или косвенно основаны на org.tmatesoft.svn.core.wc.SVNCommitItem , и этому классу требуется путь к файлу рабочей копии в его конструкторе.

Возможно, вы сможете переопределить этот класс и попытаться реализовать свою собственную версию, для которой не требуется рабочая копия, но я не проверял это подробно.

0 голосов
/ 06 апреля 2011

Я только что попробовал. Вы можете получить байты изменяемого файла. Измените содержимое в памяти. Наконец, проверьте в коде. Вот этот снайпер:

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();
}
0 голосов
/ 17 января 2011

На самом деле пути нет.По сути, SVN работает над моделью checkout-edit-commit.Могут быть приложения, которые скрывают это от вас, но они все равно будут выполнять извлечение, например, временного каталога за кулисами.

...