2013-11-08 2 views
0

Я хочу зафиксировать модифицированный отдельный файл. По http://wiki.svnkit.com/Committing_To_A_Repository я использую следующий код:SVNKit: SVNException при фиксации заблокированного файла

public static SVNCommitInfo modifyFile(ISVNEditor editor, String dirPath, String filePath, InputStream is, long size) throws SVNException { 
    try { 
     SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator(); 

     editor.openRoot(-1); 
     editor.openDir(dirPath, -1); 
     editor.openFile(filePath, -1); 
     editor.applyTextDelta(filePath, null); 

     String chksm = deltaGenerator.sendDelta(filePath, is, editor, true); 

     editor.textDeltaEnd(filePath); 
     editor.closeFile(filePath, chksm);          

     /* 
     * Closes the directory. 
     */ 
     editor.closeDir(); 
     /* 
     * Closes the root directory. 
     */ 
     editor.closeDir(); 
     return editor.closeEdit(); 
    } catch (SVNException e) { 
     if (editor != null) { 
      try { 
       editor.abortEdit(); 
      } catch (Exception ex) { 
      } 
     }  
     throw e; 
    } 
} 

Но несчастливо я получаю исключение, несмотря на фиксацию осуществляется пользователем, которому принадлежит вид:

org.tmatesoft.svn.core.SVNException: svn: E175002: PUT of '/spielwiese/!svn/wrk/e9019037-4201-0010-b534-277444c0b279/postcommittesten.txt': 423 Locked (http://localhost:8081) 
svn: E175002: PUT request failed on '/spielwiese/!svn/wrk/e9019037-4201-0010-b534-277444c0b279/postcommittesten.txt' 
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:106) 
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:90) 
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:739) 
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:369) 
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:728) 
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.doPutDiff(DAVConnection.java:514) 
at org.tmatesoft.svn.core.internal.io.dav.DAVCommitEditor.closeFile(DAVCommitEditor.java:335) 

Что я не так? Каков правильный путь?

Я попытался использовать SVNCommitClient. Но SVNCommitClient нуждается в локальной рабочей копии для фиксации отдельных файлов, и я не хочу создавать локальную рабочую копию. Поэтому я хочу напрямую передать файл в репозиторий в определенном месте.

Как я могу зафиксировать файл, который заблокирован текущим пользователем?

+0

Что версия SVNKit? Какова версия сервера SVN? Какова версия рабочего формата SVN? Был ли замок в рабочей копии получен с помощью SVNKit? –

+0

SVNKit 1.7.9. Нет рабочей копии, потому что мы напрямую передаем удаленный репозиторий. – shylynx

ответ

0

Спасибо @ Бен Reser. Вы попадаете в яблочко. Я использовал SVNRepository # getCommitEditor (String, ISVNWorkspaceMediator). Но на самом деле его метод с неправильной подписью.

Теперь мой код читает и все работает отлично:

// Discover lock on the file 
SVNLock lockedItem = this.repository.getLock(fileUrl); 
Map<String, String> locks = new HashMap<String, String>(); 
if (lockedItem != null) { 
    locks.put(lockedItem.getPath(), lockedItem.getID()); 
} 

// Retrieve a commiteditor and provide the lock tokens 
ISVNEditor editor = this.repository.getCommitEditor(
    comment, locks, true, new WorkspaceMediator()); 
SVNCommitInfo commitInfo = SVNUtils.modifyFile(editor, 
    dirUrl, fileUrl, fileReader, size); 
2

Subversion и DAV требуют больше, чем просто быть пользователем, которому принадлежит блокировка, чтобы вносить изменения в заблокированный файл. Вы также должны иметь lock token для этого файла. reasoning for that - это предотвратить проблему, когда одна программа имеет блокировку, а другая программа изменяет файл, который оба запускается одним и тем же пользователем. Обычно токен блокировки хранится на рабочей копии, где выполняется блокировка, и код будет извлекать ее там. Однако кажется, что вы пытаетесь зафиксировать изменения в файле без рабочей копии.

Если вы хотите зафиксировать заблокированные файлы, вам нужно будет предоставить токены блокировки, когда вы получите ISVNEditor, которого нет в коде, который вы предоставили. В примере кода по предоставленной ссылке это делается путем вызова метода getCommitEditor класса SVNRepository. Есть пара signatures of the getCommitEditor, которые принимают Map к токенам замка, которые вы можете использовать.

Для того, чтобы иметь токены блокировки, вам придется хранить их при создании блокировки. Если у вас нет токенов блокировки, вы можете просто украсть замок. Вы можете сделать это, вызвав lock method on the SVNRepository class с аргументом force, установленным в True (при условии, что у вас есть разрешения на кражу блокировок на сервере). Существует метод getLock и getLocks на SVNRepository, но я не помню, если вы можете извлечь токены блокировки таким образом, возможно, стоит попробовать.

Смежные вопросы