/** Helper for {@link #get(File, Repository)}. */ private History getHistory(File file, Repository repository, boolean withFiles) throws HistoryException, SQLException { final String filePath = getSourceRootRelativePath(file); final String reposPath = toUnixPath(repository.getDirectoryName()); final ArrayList<HistoryEntry> entries = new ArrayList<HistoryEntry>(); final ConnectionResource conn = connectionManager.getConnectionResource(); try { final PreparedStatement ps; if (file.isDirectory()) { // Fetch history for all files under this directory. ps = conn.getStatement(GET_DIR_HISTORY); ps.setString(2, filePath); } else { // Fetch history for a single file only. ps = conn.getStatement(GET_FILE_HISTORY); ps.setString(2, getParentPath(filePath)); ps.setString(3, getBaseName(filePath)); } ps.setString(1, reposPath); final PreparedStatement filePS = withFiles ? conn.getStatement(GET_CS_FILES) : null; try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { // Get the information about a changeset String revision = rs.getString(1); String author = rs.getString(2); Timestamp time = rs.getTimestamp(3); String message = rs.getString(4); HistoryEntry entry = new HistoryEntry(revision, time, author, null, message, true); entries.add(entry); // Fill the list of files touched by the changeset, if // requested. if (withFiles) { int changeset = rs.getInt(5); filePS.setInt(1, changeset); try (ResultSet fileRS = filePS.executeQuery()) { while (fileRS.next()) { entry.addFile(fileRS.getString(1)); } } } } } } finally { connectionManager.releaseConnection(conn); } History history = new History(); history.setHistoryEntries(entries); RuntimeEnvironment env = RuntimeEnvironment.getInstance(); if (env.isTagsEnabled() && repository.hasFileBasedTags()) { repository.assignTagsInHistory(history); } return history; }
/** * Create a history log cache for all files in this repository. {@code getHistory()} is used to * fetch the history for the entire repository. If {@code hasHistoryForDirectories()} returns * {@code false}, this method is a no-op. * * @param cache the cache instance in which to store the history log * @param sinceRevision if non-null, incrementally update the cache with all revisions after the * specified revision; otherwise, create the full history starting with the initial revision * @throws HistoryException on error */ final void createCache(HistoryCache cache, String sinceRevision) throws HistoryException { if (!isWorking()) { return; } // If we don't have a directory parser, we can't create the cache // this way. Just give up and return. if (!hasHistoryForDirectories()) { Logger.getLogger(getClass().getName()) .log( Level.INFO, "Skipping creation of history cache for {0}, since retrieval " + "of history for directories is not implemented for this " + "repository type.", getDirectoryName()); return; } File directory = new File(getDirectoryName()); History history; try { history = getHistory(directory, sinceRevision); } catch (HistoryException he) { if (sinceRevision == null) { // Failed to get full history, so fail. throw he; } // Failed to get partial history. This may have been caused // by changes in the revision numbers since the last update // (bug #14724) so we'll try to regenerate the cache from // scratch instead. OpenGrokLogger.getLogger() .log( Level.INFO, "Failed to get partial history. Attempting to " + "recreate the history cache from scratch.", he); history = null; } if (sinceRevision != null && history == null) { // Failed to get partial history, now get full history instead. history = getHistory(directory); // Got full history successfully. Clear the history cache so that // we can recreate it from scratch. cache.clear(this); } // We need to refresh list of tags for incremental reindex. RuntimeEnvironment env = RuntimeEnvironment.getInstance(); if (env.isTagsEnabled() && this.hasFileBasedTags()) { this.buildTagList(new File(this.directoryName)); } if (history != null) { cache.store(history, this); } }
@Override History getHistory(File file, String sinceRevision) throws HistoryException { RuntimeEnvironment env = RuntimeEnvironment.getInstance(); History result = new BazaarHistoryParser(this).parse(file, sinceRevision); // Assign tags to changesets they represent // We don't need to check if this repository supports tags, because we know it:-) if (env.isTagsEnabled()) { assignTagsInHistory(result); } return result; }