/** * Handles a next log entry producing corresponding xml. * * @param logEntry log entry * @throws SVNException */ public void handleLogEntry(SVNLogEntry logEntry) throws SVNException { if (logEntry.getChangedPaths() != null && relativePath != null) { // convert external path reference to local relative path Map<String, SVNLogEntryPath> changedPaths = new HashMap<String, SVNLogEntryPath>(); for (SVNLogEntryPath entry : logEntry.getChangedPaths().values()) { String localPath = entry.getPath().substring(1); // path in svn log start with a '/' if (localPath.startsWith(relativeUrl)) { localPath = relativePath + localPath.substring(relativeUrl.length()); } // can't use entry.setPath(localPath) as FSPathChange duplicate myPath attribute then // setPath().getPath() don't return same value changedPaths.put( localPath, new SVNLogEntryPath( localPath, entry.getType(), entry.getCopyPath(), entry.getCopyRevision())); } logEntry.getChangedPaths().clear(); logEntry.getChangedPaths().putAll(changedPaths); } try { if (filter == null || !filter.hasExclusionRule() || filter.isIncluded(logEntry)) { sendToHandler(logEntry); } } catch (SAXException e) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.XML_MALFORMED, e.getLocalizedMessage()); SVNErrorManager.error(err, e, SVNLogType.DEFAULT); } }
@SuppressWarnings("unchecked") private List<ChangeInfo> logEntryToChangeInfos( final String rootPath, final String loggedPath, final SVNLogEntry entry, final boolean pathOnly) { final String fullLoggedPathFromAppend = SVNPathUtil.append(rootPath, loggedPath); final String fullLoggedPath = (!fullLoggedPathFromAppend.startsWith("/")) ? "/" + fullLoggedPathFromAppend : fullLoggedPathFromAppend; final List<ChangeInfo> results = new LinkedList<ChangeInfo>(); for (String changedPath : (Iterable<String>) entry.getChangedPaths().keySet()) { if (SVNPathUtil.isAncestor(rootPath, changedPath) && (!pathOnly || fullLoggedPath.equals(changedPath))) { ChangeInfo change = classifiedChange(entry, rootPath, changedPath); // Might want to put this at a higher level if we can ever do // something useful with 'other' changes. if (change.getKind() != StoreKind.OTHER) { results.add(change); } } } return results; }
public ArrayList<SVNCommit> getAllRevisions() { if (latestRevision < 1l) return revisions; try { final Collection<SVNLogEntry> logEntries = repository.log( new String[] {""}, null, lastSeenRevision + 1l, latestRevision, true, true); for (final SVNLogEntry logEntry : logEntries) { final SVNCommit revision = new SVNCommit(repository, this, logEntry); revision.setId("" + logEntry.getRevision()); if (logEntry.getAuthor() == null) revision.setCommitter(logEntry.getAuthor()); else revision.setCommitter("anonymous"); revision.setDate(logEntry.getDate()); revision.setMessage(logEntry.getMessage()); if (logEntry.getChangedPaths() != null && logEntry.getChangedPaths().size() > 0) { final HashMap<String, String> rChangedPaths = new HashMap<String, String>(); final HashMap<String, String> rRemovedPaths = new HashMap<String, String>(); final HashMap<String, String> rAddedPaths = new HashMap<String, String>(); for (final Iterator changedPaths = logEntry.getChangedPaths().keySet().iterator(); changedPaths.hasNext(); ) { final SVNLogEntryPath entryPath = (SVNLogEntryPath) logEntry.getChangedPaths().get(changedPaths.next()); if (repository.checkPath(entryPath.getPath(), logEntry.getRevision()) == SVNNodeKind.FILE) { if (entryPath.getType() == SVNLogEntryPath.TYPE_DELETED) rRemovedPaths.put(entryPath.getPath(), entryPath.getCopyPath()); else if (entryPath.getType() == SVNLogEntryPath.TYPE_ADDED) rAddedPaths.put(entryPath.getPath(), entryPath.getCopyPath()); else rChangedPaths.put(entryPath.getPath(), entryPath.getCopyPath()); } } revision.setChangedPaths(rChangedPaths); revision.setRemovedPaths(rRemovedPaths); revision.setAddedPaths(rAddedPaths); } this.revisions.add(revision); } } catch (final SVNException e) { e.printStackTrace(); } return revisions; }
public void getCommits(SVNLogEntry svnlogEntry) { this.type = "SVN"; this.date = Calendar.getInstance(); if (svnlogEntry.getDate() != null) this.date.setTime(svnlogEntry.getDate()); this.author = svnlogEntry.getAuthor(); this.message = svnlogEntry.getMessage(); if (this.message != null) this.message = this.message.replace(",", ".").replace("\n", "|"); this.revision = svnlogEntry.getRevision(); Map myChangedPaths = svnlogEntry.getChangedPaths(); if (myChangedPaths != null && !myChangedPaths.isEmpty()) { for (Iterator paths = myChangedPaths.values().iterator(); paths.hasNext(); ) { SVNLogEntryPath path = (SVNLogEntryPath) paths.next(); getDiff(this.revision, path.getPath(), path.getType(), 0); } } System.out.println(""); }
/** * 获取svn日志 * * @param repository repos对象 * @param path svn目录(相对与repos根目录) * @param datumRevision 基准版本 * @param expectRevision 目标版本 * @return 日志记录集合 * @throws Exception */ private static Collection<SVNLog> getLog( SVNRepository repository, String path, long datumRevision, long expectRevision) throws Exception { Collection<SVNLogEntry> coll = new LinkedList<SVNLogEntry>(); repository.log(new String[] {path}, coll, datumRevision + 1, expectRevision, true, true); Map<String, SVNLog> logMap = new HashMap<String, SVNLog>(); for (SVNLogEntry e : coll) { Map<String, SVNLogEntryPath> map = e.getChangedPaths(); if (map != null) { for (SVNLogEntryPath p : map.values()) { String sPath = p.getPath(); if (sPath.startsWith(path)) { sPath = sPath.substring(path.length()); } // 操作类型 String opt = null; if (p.getType() == SVNLogEntryPath.TYPE_DELETED) { opt = "-"; } if (p.getType() == SVNLogEntryPath.TYPE_ADDED || p.getType() == SVNLogEntryPath.TYPE_MODIFIED || p.getType() == SVNLogEntryPath.TYPE_REPLACED) { opt = "+"; } int entryKind = 0; if (p.getKind() == SVNNodeKind.DIR) { entryKind = SVNLog.ENTRY_DIR; } if (p.getKind() == SVNNodeKind.FILE) { entryKind = SVNLog.ENTRY_FILE; } logMap.put(sPath, new SVNLog(e.getRevision(), sPath, opt, entryKind)); } } } return logMap.values(); }
static ChangeInfo classifiedChange(final SVNLogEntry entry, String rootPath, final String path) { StoreKind kind = StoreKind.OTHER; // Be sure the root path ends with a slash because the 'path' will always have the slash. if (!rootPath.endsWith("/")) { rootPath = rootPath + "/"; } String name = path.length() > rootPath.length() ? path.substring(rootPath.length()) : path; String page = null; Matcher matcher = PAGE_PATH.matcher(name); if (matcher.matches() && !name.endsWith("-attachments")) { kind = StoreKind.PAGE; page = name; } else { matcher = ATTACHMENT_PATH.matcher(name); if (matcher.matches()) { kind = StoreKind.ATTACHMENT; page = matcher.group(1); name = matcher.group(2); } } String user = entry.getAuthor(); Date date = entry.getDate(); SVNLogEntryPath logForPath = (SVNLogEntryPath) entry.getChangedPaths().get(path); String copiedFrom = logForPath.getCopyPath(); long copiedFromRevision = -1; if (SVNPathUtil.isAncestor(rootPath, copiedFrom)) { copiedFrom = SVNPathUtil.tail(copiedFrom); copiedFromRevision = logForPath.getCopyRevision(); } else { copiedFrom = null; } return new ChangeInfo( page, name, user, date, entry.getRevision(), entry.getMessage(), kind, ChangeType.forCode(logForPath.getType()), copiedFrom, copiedFromRevision); }
public void accept(final SVNLogEntry entry) { final Map changedPaths = entry.getChangedPaths(); if (changedPaths == null) return; for (Object o : changedPaths.values()) { final SVNLogEntryPath entryPath = (SVNLogEntryPath) o; if (entryPath != null && 'A' == entryPath.getType() && entryPath.getCopyPath() != null) { if (myCurrentPath.equals(entryPath.getPath())) { myHadChanged = true; myCurrentPath = entryPath.getCopyPath(); return; } else if (SVNPathUtil.isAncestor(entryPath.getPath(), myCurrentPath)) { final String relativePath = SVNPathUtil.getRelativePath(entryPath.getPath(), myCurrentPath); myCurrentPath = SVNPathUtil.append(entryPath.getCopyPath(), relativePath); myHadChanged = true; return; } } } }
@Override public void handleLogEntry(SVNLogEntry logEntry) throws SVNException { Map<String, SVNLogEntryPath> map = logEntry.getChangedPaths(); if (map != null && map.size() > 0) { getDBUtil() .insertIntoRevision( logEntry.getRevision(), logEntry.getAuthor(), sdfdb.format(logEntry.getDate()), logEntry.getMessage()); for (String key : map.keySet()) { SVNLogEntryPath entry = map.get(key); if (isNeedStore(key)) { getDBUtil() .insertIntoFileInfo( entry.getPath(), logEntry.getRevision(), getType(entry.getType()), entry.getCopyPath()); } } } }
// unfortunately, the original method is private, so we need to copy / paste it // copied from SVNXMLLogHandler // protected void sendToHandler(SVNLogEntry logEntry) throws SAXException { if (logEntry.getRevision() == 0 && logEntry.getMessage() == null) { return; } addAttribute(REVISION_ATTR, logEntry.getRevision() + ""); openTag(LOGENTRY_TAG); if (logEntry.getAuthor() != null) { addTag(AUTHOR_TAG, logEntry.getAuthor()); } if (logEntry.getDate() != null && logEntry.getDate().getTime() != 0) { addTag(DATE_TAG, SVNDate.formatDate(logEntry.getDate())); } if (logEntry.getChangedPaths() != null && !logEntry.getChangedPaths().isEmpty()) { openTag(PATHS_TAG); for (Iterator<String> paths = logEntry.getChangedPaths().keySet().iterator(); paths.hasNext(); ) { String key = paths.next(); SVNLogEntryPath path = (SVNLogEntryPath) logEntry.getChangedPaths().get(key); addAttribute(ACTION_ATTR, path.getType() + ""); if (path.getCopyPath() != null) { addAttribute(COPYFROM_PATH_ATTR, path.getCopyPath()); addAttribute(COPYFROM_REV_ATTR, path.getCopyRevision() + ""); } if (path.getKind() != null) { addAttribute(KIND_ATTR, path.getKind().toString()); } addTag(PATH_TAG, path.getPath()); } closeTag(PATHS_TAG); } if (!myIsOmitLogMessage) { String message = logEntry.getMessage(); message = message == null ? "" : message; addTag(MSG_TAG, message); } if (myMergeStack != null && !myMergeStack.isEmpty()) { MergeFrame frame = (MergeFrame) myMergeStack.getLast(); frame.myNumberOfChildrenRemaining--; } if (logEntry.hasChildren()) { MergeFrame frame = new MergeFrame(); if (myMergeStack == null) { myMergeStack = new LinkedList<MergeFrame>(); } myMergeStack.addLast(frame); } else { while (myMergeStack != null && !myMergeStack.isEmpty()) { MergeFrame frame = (MergeFrame) myMergeStack.getLast(); if (frame.myNumberOfChildrenRemaining == 0) { closeTag(LOGENTRY_TAG); myMergeStack.removeLast(); } else { break; } } closeTag(LOGENTRY_TAG); } }
@Override protected String getChangeFileNames(String lastFinishDateTimeString) throws Exception { /* * Default values: */ String url = Globals.getProperty("svn.url"); String name = Globals.getProperty("svn.user"); String password = Globals.getProperty("svn.password"); long startRevision = 0; long endRevision = -1; // HEAD (the latest) revision setupLibrary(); SVNRepository repository = null; try { 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 the location '" + url + "': " + svne.getMessage()); System.exit(1); } ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password); repository.setAuthenticationManager(authManager); /* * Gets the latest revision number of the repository */ try { endRevision = repository.getLatestRevision(); startRevision = endRevision; } catch (SVNException svne) { System.err.println( "error while fetching the latest repository revision: " + svne.getMessage()); System.exit(1); } Collection logEntries = null; try { /* * Collects SVNLogEntry objects for all revisions in the range * defined by its start and end points [startRevision, endRevision]. * For each revision commit information is represented by * SVNLogEntry. * * the 1st parameter (targetPaths - an array of path strings) is set * when restricting the [startRevision, endRevision] range to only * those revisions when the paths in targetPaths were changed. * * the 2nd parameter if non-null - is a user's Collection that will * be filled up with found SVNLogEntry objects; it's just another * way to reach the scope. * * startRevision, endRevision - to define a range of revisions you are * interested in; by default in this program - startRevision=0, endRevision= * the latest (HEAD) revision of the repository. * * the 5th parameter - a boolean flag changedPath - if true then for * each revision a corresponding SVNLogEntry will contain a map of * all paths which were changed in that revision. * * the 6th parameter - a boolean flag strictNode - if false and a * changed path is a copy (branch) of an existing one in the repository * then the history for its origin will be traversed; it means the * history of changes of the target URL (and all that there's in that * URL) will include the history of the origin path(s). * Otherwise if strictNode is true then the origin path history won't be * included. * * The return value is a Collection filled up with SVNLogEntry Objects. */ logEntries = repository.log(new String[] {""}, null, startRevision, endRevision, true, true); } catch (SVNException svne) { System.out.println( "error while collecting log information for '" + url + "': " + svne.getMessage()); System.exit(1); } for (Iterator entries = logEntries.iterator(); entries.hasNext(); ) { /* * gets a next SVNLogEntry */ SVNLogEntry logEntry = (SVNLogEntry) entries.next(); System.out.println("---------------------------------------------"); /* * gets the revision number */ System.out.println("revision: " + logEntry.getRevision()); /* * gets the author of the changes made in that revision */ System.out.println("author: " + logEntry.getAuthor()); /* * gets the time moment when the changes were committed */ System.out.println("date: " + logEntry.getDate()); /* * gets the commit log message */ System.out.println("log message: " + logEntry.getMessage()); /* * displaying all paths that were changed in that revision; cahnged * path information is represented by SVNLogEntryPath. */ if (logEntry.getChangedPaths().size() > 0) { System.out.println(); System.out.println("changed paths:"); /* * keys are changed paths */ Set changedPathsSet = logEntry.getChangedPaths().keySet(); for (Iterator changedPaths = changedPathsSet.iterator(); changedPaths.hasNext(); ) { /* * obtains a next SVNLogEntryPath */ SVNLogEntryPath entryPath = (SVNLogEntryPath) logEntry.getChangedPaths().get(changedPaths.next()); /* * SVNLogEntryPath.getPath returns the changed path itself; * * SVNLogEntryPath.getType returns a charecter describing * how the path was changed ('A' - added, 'D' - deleted or * 'M' - modified); * * If the path was copied from another one (branched) then * SVNLogEntryPath.getCopyPath & * SVNLogEntryPath.getCopyRevision tells where it was copied * from and what revision the origin path was at. */ System.out.println( " " + entryPath.getType() + " " + entryPath.getPath() + ((entryPath.getCopyPath() != null) ? " (from " + entryPath.getCopyPath() + " revision " + entryPath.getCopyRevision() + ")" : "")); } } } return ""; }