Probleme mit javasvn/svnkit



  • Ich habe ein Programm, welches prinzipiell nichts weiter tut, als ein Verzeichnissystem mit Unterverzeichnissen und Dateien in SVN einzuchecken.

    Mein Problem ist, dass die Dateien (hab ne maven-quickstart-app zum Testen genommen) direkt ins root gespeichert werden. Beim Erstellen der Verzeichnisse gibts scheinbar keine Probleme, aber auch diese sind nicht zu sehen (die history zeigt deren Erstellung auch nicht an)

    Ich nutze svnkit 1.0.4 und hab nen subversion 1.3 auf dem Server.

    package de.docjunior.svn;
    
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Collection;
    import java.util.Iterator;
    
    import org.tmatesoft.svn.core.SVNDirEntry;
    import org.tmatesoft.svn.core.SVNException;
    import org.tmatesoft.svn.core.SVNNodeKind;
    import org.tmatesoft.svn.core.SVNURL;
    import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
    import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
    import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
    import org.tmatesoft.svn.core.io.ISVNEditor;
    import org.tmatesoft.svn.core.io.SVNRepository;
    import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
    import org.tmatesoft.svn.core.io.diff.SVNDeltaGenerator;
    import org.tmatesoft.svn.core.wc.SVNWCUtil;
    
    public class SVNConnection
    {
        protected SVNRepository reader;
        protected SVNRepository writer;
    
        protected ISVNEditor editor = null;
    
        String repository;
        String username;
        String passwort;
    
        String localdir;
        String basedir = "/trunk/";
    
        /**
         * Öffnet den Bearbeitungsmodus
         * 
         * @param pComment
         * @throws SVNException
         */
        public void openEdit(String pComment) throws SVNException
        {
            this.writer = this.getRepository();
            if (this.editor == null)
            {
                this.editor = this.writer.getCommitEditor(pComment, null);
            }
        }
    
        /**
         * Schließt den Bearbeitungsmodus
         * 
         * @throws SVNException
         */
        public void closeEdit() throws SVNException
        {
            if (this.editor != null)
            {
                this.editor.closeEdit();
            }
            this.editor = null;
            this.closeConnection(this.writer);
            this.writer = null;
        }
    
        /**
         * Setzt das lokale Basisverzeichnis
         * 
         * @param pPfad
         */
        public void setLocalDir(String pPfad)
        {
            this.localdir = pPfad;
            if (this.localdir.length() != 0 && !this.localdir.endsWith("/"))
            {
                this.localdir += "/";
            }
        }
    
        /**
         * Setzt das Basisverzeichnis im Repository
         * 
         * @param pPfad
         */
        public void setBaseDir(String pPfad)
        {
            this.basedir = "/trunk/"+pPfad;
            if (this.basedir.length() != 0 && !this.basedir.endsWith("/"))
            {
                this.basedir += "/";
            }
        }
    
        /**
         * Erzeugt ein Verzeichnis im Repository
         * 
         * @param verzeichnis
         * @return
         * @throws Exception
         */
        public boolean createDir(String verzeichnis)
        {
            try {
                if (this.reader.checkPath(verzeichnis, -1) == SVNNodeKind.NONE) {
                    this.editor.openRoot(-1);
                        this.editor.addDir(verzeichnis, null, -1);
                        this.editor.closeDir();
                    this.editor.closeDir();
                    System.out.println(verzeichnis + " erstellt.");
                }
            } catch (SVNException e) {
                e.printStackTrace();
            }
            return false;
        }
    
        /**
         * schreibt eine Datei ins Repository
         * 
         * @param dateiName
         * @param pTag
         * @throws Exception
         */
        public void putFile(String pDateiName, String pTag) throws Exception
        {
            String inputFile = this.localdir + pDateiName;
            String outputFile = this.basedir + pDateiName;
    
            // lies datei
            File datei = new File(inputFile);
            byte data[] = new byte[(int) datei.length()];
            FileInputStream fis = new FileInputStream(datei);
            fis.read(data);
    
            System.out.println("Schreibe " + outputFile);
            // schreibe Datei
            this.editor.openRoot(-1);
            if (pDateiName != "" && this.reader.checkPath(outputFile, -1) == SVNNodeKind.NONE)
            {
                System.out.println("Checke neue Datei ein: " + outputFile);
                this.editor.addFile(outputFile, null, -1);
            } else
            {
                System.out.println("Checke geänderte Datei ein: " + outputFile);
                this.editor.openFile(outputFile, -1);
            }
            this.editor.applyTextDelta(outputFile, null);
    
            SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
            String checksum = deltaGenerator.sendDelta(outputFile,
                    new ByteArrayInputStream(data), this.editor, true);
    
            this.editor.closeFile(outputFile, checksum);
            this.editor.closeDir();
        }
    
        /**
         * Checkt einen Dateipfad ins Repository ein
         * 
         * @param pPfad
         *            der Datei-Pfad
         * @param pTag
         *            das Tag im Repository (wenn denn)
         * @throws Exception
         *             Falls etwas schief geht..
         */
        public void checkin(String pPfad, String pTag) throws Exception
        {
            File dir = new File(this.localdir + pPfad);
            if (dir.isDirectory())
            {
                System.out.println(pPfad + " ist ein Verzeichnis");
                // Der Pfad muss mit einem '/' enden
                if (pPfad.length() > 0 && !pPfad.endsWith("/"))
                {
                    pPfad = pPfad + "/";
                }
                // Wenn aktueller Pfad ein Verzeichnis ist,
                // Erstelle ein entsprechendes Verzeichnis im Repository
                this.createDir(this.basedir+pPfad);
                // Lies das Verzeichnis aus
                File[] files = dir.listFiles();
                // und rufe dich selbst für jede Datei auf
                for (int i = 0; i < files.length; i++)
                {
                    this.checkin(pPfad + files[i].getName(), pTag);
                }
            } else
            {
                // Schreibe die Datei in das Repository
                System.out.println("Schreibe File " + dir.getPath());
                this.putFile(pPfad, pTag);
            }
        }
    
    }
    

    Mein Testprogramm sieht so aus:

    /**
         * @param args
         */
        public static void main(String[] args)
        {
            SVNConnection svn;
            System.out.println("Logge mich ein..");
            svn = new SVNConnection();
            svn.login("http://localhost/svn/meinrepos", "user", "test");
            svn.setBaseDir("");
            svn.setLocalDir("c:/Temp/mvntest/src/main/java/");
            System.out.println("Login erfolgreich..");
    
            System.out.println("Test-Checkin");
            try
            {
                svn.openEdit("Checkin for testing..");
                svn.checkin("", null);
                svn.closeEdit();
    
            } catch (Exception e)
            {
                e.printStackTrace();
                svn.logout();
            }
    
            System.out.println("Logge mich aus..");
            svn.logout();
            System.out.println("Logout erfolgreich..");
    
        }
    

    Edit: hab mal die SVNConnection gekürzt auf die relevanten Teile.. der Rest funktioniert ja auch (login, checkout, ..)



  • Wenn's wer braucht: Das Problem ist, dass vor dem Schreiben einer Datei sämtliche übergeordneten Pfade mittels openDir() geöffnet werden müssen.

    Das hab ich der Mailinglist entnommen..


Anmelden zum Antworten