/* * ==================================================================== * Copyright (c) 2004-2007 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package test.bcb; 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.fs.FSRepositoryFactory; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.wc.SVNWCUtil; /* * This example shows how to get the repository tree at the latest (HEAD) * revision starting with the directory that is the path/to/repository part of * the repository location URL. The main point is SVNRepository.getDir() method * that is called recursively for each directory (till the end of the tree). * getDir collects all entries located inside a directory and returns them as a * java.util.Collection. As an example here's one of the program layouts (for * the default url used in the program ): * * Repository Root: http://svn.svnkit.com/repos/svnkit Repository UUID: * 0a862816-5deb-0310-9199-c792c6ae6c6e * * /examples (author: 'sa'; revision: 2794; date: Tue Nov 14 03:21:11 NOVT 2006) * /examples/svnkit-examples.iml (author: 'alex'; revision: 2775; date: Fri Nov * 10 02:08:45 NOVT 2006) /examples/src (author: 'sa'; revision: 2794; date: Tue * Nov 14 03:21:11 NOVT 2006) /examples/src/org (author: 'sa'; revision: 2794; * date: Tue Nov 14 03:21:11 NOVT 2006) /examples/src/org/tmatesoft (author: * 'sa'; revision: 2794; date: Tue Nov 14 03:21:11 NOVT 2006) * /examples/src/org/tmatesoft/svn (author: 'sa'; revision: 2794; date: Tue Nov * 14 03:21:11 NOVT 2006) /examples/src/org/tmatesoft/svn/examples (author: * 'sa'; revision: 2794; date: Tue Nov 14 03:21:11 NOVT 2006) * /examples/src/org/tmatesoft/svn/examples/wc (author: 'alex'; revision: 2776; * date: Fri Nov 10 02:25:08 NOVT 2006) * ...................................................... * --------------------------------------------- Repository latest revision: * 2802 */ public class DisplayRepositoryTree { /* * args parameter is used to obtain a repository location URL, user's * account name & password to authenticate him to the server. */ public static void main(String[] args) { /* * default values: */ String url = "http://svn.svnkit.com/repos/svnkit"; String name = "anonymous"; String password = "anonymous"; /* * initializes the library (it must be done before ever using the * library itself) */ setupLibrary(); if (args != null) { /* * obtains a repository location URL */ url = (args.length >= 1) ? args[0] : url; /* * obtains an account name (will be used to authenticate the user to * the server) */ name = (args.length >= 2) ? args[1] : name; /* * obtains a password */ password = (args.length >= 3) ? args[2] : password; } SVNRepository repository = null; try { /* * Creates an instance of SVNRepository to work with the repository. * All user's requests to the repository are relative to the * repository location used to create this SVNRepository. SVNURL is * a wrapper for URL strings that refer to repository locations. */ repository = SVNRepositoryFactory.create(SVNURL .parseURIEncoded(url)); } catch (SVNException svne) { /* * Perhaps a malformed URL is the cause of this exception */ System.err .println("error while creating an SVNRepository for location '" + url + "': " + svne.getMessage()); System.exit(1); } /* * User's authentication information (name/password) is provided via an * ISVNAuthenticationManager instance. SVNWCUtil creates a default * authentication manager given user's name and password. * * Default authentication manager first attempts to use provided user * name and password and then falls back to the credentials stored in * the default Subversion credentials storage that is located in * Subversion configuration area. If you'd like to use provided user * name and password only you may use BasicAuthenticationManager class * instead of default authentication manager: * * authManager = new BasicAuthenticationsManager(userName, * userPassword); * * You may also skip this point - anonymous access will be used. */ ISVNAuthenticationManager authManager = SVNWCUtil .createDefaultAuthenticationManager(name, password); repository.setAuthenticationManager(authManager); try { /* * Checks up if the specified path/to/repository part of the URL * really corresponds to a directory. If doesn't the program exits. * SVNNodeKind is that one who says what is located at a path in a * revision. -1 means the latest revision. */ SVNNodeKind nodeKind = repository.checkPath("", -1); if (nodeKind == SVNNodeKind.NONE) { System.err.println("There is no entry at '" + url + "'."); System.exit(1); } else if (nodeKind == SVNNodeKind.FILE) { System.err.println("The entry at '" + url + "' is a file while a directory was expected."); System.exit(1); } /* * getRepositoryRoot() returns the actual root directory where the * repository was created. 'true' forces to connect to the * repository if the root url is not cached yet. */ System.out.println("Repository Root: " + repository.getRepositoryRoot(true)); /* * getRepositoryUUID() returns Universal Unique IDentifier (UUID) of * the repository. 'true' forces to connect to the repository if the * UUID is not cached yet. */ System.out.println("Repository UUID: " + repository.getRepositoryUUID(true)); System.out.println(""); /* * Displays the repository tree at the current path - "" (what means * the path/to/repository directory) */ listEntries(repository, ""); } catch (SVNException svne) { System.err.println("error while listing entries: " + svne.getMessage()); System.exit(1); } /* * Gets the latest revision number of the repository */ long latestRevision = -1; try { latestRevision = repository.getLatestRevision(); } catch (SVNException svne) { System.err .println("error while fetching the latest repository revision: " + svne.getMessage()); System.exit(1); } System.out.println(""); System.out.println("---------------------------------------------"); System.out.println("Repository latest revision: " + latestRevision); System.exit(0); } /* * Initializes the library to work with a repository via different * protocols. */ private static void setupLibrary() { /* * For using over http:// and https:// */ DAVRepositoryFactory.setup(); /* * For using over svn:// and svn+xxx:// */ SVNRepositoryFactoryImpl.setup(); /* * For using over file:/// */ FSRepositoryFactory.setup(); } /* * Called recursively to obtain all entries that make up the repository tree * repository - an SVNRepository which interface is used to carry out the * request, in this case it's a request to get all entries in the directory * located at the path parameter; * * path is a directory path relative to the repository location path (that * is a part of the URL used to create an SVNRepository instance); * */ public static void listEntries(SVNRepository repository, String path) throws SVNException { /* * Gets the contents of the directory specified by path at the latest * revision (for this purpose -1 is used here as the revision number to * mean HEAD-revision) getDir returns a Collection of SVNDirEntry * elements. SVNDirEntry represents information about the directory * entry. Here this information is used to get the entry name, the name * of the person who last changed this entry, the number of the revision * when it was last changed and the entry type to determine whether it's * a directory or a file. If it's a directory listEntries steps into a * next recursion to display the contents of this directory. The third * parameter of getDir is null and means that a user is not interested * in directory properties. The fourth one is null, too - the user * doesn't provide its own Collection instance and uses the one returned * by getDir. */ Collection entries = repository.getDir(path, -1, null, (Collection) null); Iterator iterator = entries.iterator(); while (iterator.hasNext()) { SVNDirEntry entry = (SVNDirEntry) iterator.next(); System.out.println("/" + (path.equals("") ? "" : path + "/") + entry.getName() + " (author: '" + entry.getAuthor() + "'; revision: " + entry.getRevision() + "; date: " + entry.getDate() + ")"); /* * Checking up if the entry is a directory. */ if (entry.getKind() == SVNNodeKind.DIR) { listEntries(repository, (path.equals("")) ? entry.getName() : path + "/" + entry.getName()); } } } }