Question

J'utilise SVNKit pour obtenir le contenu d'un fichier à partir du dépôt. Je voudrais changer que le contenu dans le code et valider les modifications sans avoir à saisir la caisse d'abord le fichier. Je cherchai le web déjà et seulement trouvé des solutions qui nécessitent une caisse au système de fichiers local.

Quelqu'un sait-il un moyen pour le faire?

Était-ce utile?

La solution

Théoriquement, cela devrait être possible, mais pratique, il semble être impossible avec SVNKit.

Pour autant que je peux voir tous les check-in opérations de la base directement ou indirectement sur org.tmatesoft.svn.core.wc.SVNCommitItem et cette classe nécessite un chemin de fichier de copie de travail dans le constructeur de lui.

Vous pouvez être en mesure de passer outre cette classe et essayer de mettre en œuvre votre propre version qui ne nécessite pas de travail-copie, mais je n'ai pas vérifié en détail.

Autres conseils

J'ai parlé aux gens de logiciels TMate, et il semble que ce soit en effet possible. La façon dont ils expliqué, oui, vous pouvez utiliser un fichier local et générer des checksums avec le nouveau contenu et l'envoyer à Subversion, mais (le cas échéant) cela ne va Subversion vous aider à vérifier avez le bon et le dernier dans votre copie locale . A la fin de la journée, Subversion va faire ses propres diffs et deltas de toute façon.

Donc, si vous ne possédez pas de copie locale, vous pouvez simplement créer une somme de contrôle comme si le fichier était nouveau. Voici le code brut, extrait de mon projet plus vaste. Notez que la vérification du ahead SVNDirEntry de temps n'est pas nécessaire, si vous savez déjà si le fichier existe; Je fournis ici à des fins explicatives.

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();

Ne pas oublier, après avoir obtenu un commettras éditeur, pour envelopper tout à closeEdit() dans un bloc de try...catch de sorte que vous pouvez annuler l'édition en cas de problème.

Je l'ai essayé et il passe tous mes tests à l'aide svnkit 1.3.7 (par exemple de 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>

Il n'y a pas vraiment une façon. Fondamentalement, SVN fonctionne sur un modèle caisse-edit-commit. Il peut y avoir des applications qui cacher loin de vous, mais ils encore être l'exécution d'une caisse pour exemple un répertoire temporaire dans les coulisses.

Je viens d'essayer. Vous pouvez obtenir les octets du fichier à modifier. Modifier le contenu en mémoire. Enfin, vérifier dans le code. Voici le sniped:

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();
}

=============================================== ===

à partir du code d'échantillon de 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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top