| | |
| | | import java.util.HashMap;
|
| | | import java.util.List;
|
| | | import java.util.Map;
|
| | | import java.util.Set;
|
| | | import java.util.TimeZone;
|
| | | import java.util.TreeSet;
|
| | |
|
| | | import org.eclipse.jgit.lib.Constants;
|
| | | import org.eclipse.jgit.lib.ObjectId;
|
| | | import org.eclipse.jgit.lib.Repository;
|
| | | import org.eclipse.jgit.revwalk.RevCommit;
|
| | |
|
| | | import com.gitblit.GitBlit;
|
| | | import com.gitblit.IStoredSettings;
|
| | | import com.gitblit.Keys;
|
| | | import com.gitblit.manager.IRepositoryManager;
|
| | | import com.gitblit.models.Activity;
|
| | | import com.gitblit.models.GravatarProfile;
|
| | | import com.gitblit.models.RefModel;
|
| | |
| | |
|
| | | /**
|
| | | * Utility class for building activity information from repositories.
|
| | | * |
| | | *
|
| | | * @author James Moger
|
| | | * |
| | | *
|
| | | */
|
| | | public class ActivityUtils {
|
| | |
|
| | | /**
|
| | | * Gets the recent activity from the repositories for the last daysBack days
|
| | | * on the specified branch.
|
| | | * |
| | | *
|
| | | * @param settings
|
| | | * the runtime settings
|
| | | * @param repositoryManager
|
| | | * the repository manager
|
| | | * @param models
|
| | | * the list of repositories to query
|
| | | * @param daysBack
|
| | |
| | | * the timezone for aggregating commits
|
| | | * @return
|
| | | */
|
| | | public static List<Activity> getRecentActivity(List<RepositoryModel> models, int daysBack,
|
| | | String objectId, TimeZone timezone) {
|
| | | public static List<Activity> getRecentActivity(
|
| | | IStoredSettings settings,
|
| | | IRepositoryManager repositoryManager,
|
| | | List<RepositoryModel> models,
|
| | | int daysBack,
|
| | | String objectId,
|
| | | TimeZone timezone) {
|
| | |
|
| | | // Activity panel shows last daysBack of activity across all
|
| | | // repositories.
|
| | |
| | | Calendar cal = Calendar.getInstance();
|
| | | cal.setTimeZone(timezone);
|
| | |
|
| | | // aggregate author exclusions
|
| | | Set<String> authorExclusions = new TreeSet<String>();
|
| | | authorExclusions.addAll(settings.getStrings(Keys.web.metricAuthorExclusions));
|
| | | for (RepositoryModel model : models) {
|
| | | if (!ArrayUtils.isEmpty(model.metricAuthorExclusions)) {
|
| | | authorExclusions.addAll(model.metricAuthorExclusions);
|
| | | }
|
| | | }
|
| | |
|
| | | Map<String, Activity> activity = new HashMap<String, Activity>();
|
| | | for (RepositoryModel model : models) {
|
| | | if (model.maxActivityCommits == -1) {
|
| | | if (!model.isShowActivity()) {
|
| | | // skip this repository
|
| | | continue;
|
| | | }
|
| | |
| | | if (model.isCollectingGarbage) {
|
| | | continue;
|
| | | }
|
| | | Repository repository = GitBlit.self()
|
| | | .getRepository(model.name);
|
| | | Repository repository = repositoryManager.getRepository(model.name);
|
| | | List<String> branches = new ArrayList<String>();
|
| | | if (StringUtils.isEmpty(objectId)) {
|
| | | for (RefModel local : JGitUtils.getLocalBranches(
|
| | | repository, true, -1)) {
|
| | | if (!local.getDate().after(thresholdDate)) {
|
| | | // branch not recently updated
|
| | | continue;
|
| | | }
|
| | | branches.add(local.getName());
|
| | | }
|
| | | } else {
|
| | | branches.add(objectId);
|
| | | }
|
| | | Map<ObjectId, List<RefModel>> allRefs = JGitUtils
|
| | | .getAllRefs(repository, model.showRemoteBranches);
|
| | |
|
| | | for (String branch : branches) {
|
| | | String shortName = branch;
|
| | | if (shortName.startsWith(Constants.R_HEADS)) {
|
| | | shortName = shortName.substring(Constants.R_HEADS.length());
|
| | | }
|
| | | List<RevCommit> commits = JGitUtils.getRevLog(repository,
|
| | | branch, thresholdDate);
|
| | | List<RepositoryCommit> commits = CommitCache.instance().getCommits(model.name, repository, branch, thresholdDate);
|
| | | if (model.maxActivityCommits > 0 && commits.size() > model.maxActivityCommits) {
|
| | | // trim commits to maximum count
|
| | | commits = commits.subList(0, model.maxActivityCommits);
|
| | | }
|
| | | for (RevCommit commit : commits) { |
| | | Date date = JGitUtils.getCommitDate(commit);
|
| | | for (RepositoryCommit commit : commits) {
|
| | | Date date = commit.getCommitDate();
|
| | | String dateStr = df.format(date);
|
| | | if (!activity.containsKey(dateStr)) {
|
| | | // Normalize the date to midnight
|
| | |
| | | cal.set(Calendar.MINUTE, 0);
|
| | | cal.set(Calendar.SECOND, 0);
|
| | | cal.set(Calendar.MILLISECOND, 0);
|
| | | activity.put(dateStr, new Activity(cal.getTime()));
|
| | | Activity a = new Activity(cal.getTime());
|
| | | a.excludeAuthors(authorExclusions);
|
| | | activity.put(dateStr, a);
|
| | | }
|
| | | RepositoryCommit commitModel = activity.get(dateStr)
|
| | | .addCommit(model.name, shortName, commit);
|
| | | if (commitModel != null) {
|
| | | commitModel.setRefs(allRefs.get(commit.getId()));
|
| | | }
|
| | | activity.get(dateStr).addCommit(commit);
|
| | | }
|
| | | }
|
| | | |
| | |
|
| | | // close the repository
|
| | | repository.close();
|
| | | }
|
| | |
| | | /**
|
| | | * Returns the Gravatar profile, if available, for the specified email
|
| | | * address.
|
| | | * |
| | | *
|
| | | * @param emailaddress
|
| | | * @return a Gravatar Profile
|
| | | * @throws IOException
|
| | |
| | |
|
| | | /**
|
| | | * Creates a Gravatar thumbnail url from the specified email address.
|
| | | * |
| | | *
|
| | | * @param email
|
| | | * address to query Gravatar
|
| | | * @param width
|
| | |
| | | "https://www.gravatar.com/avatar/{0}?s={1,number,0}&d=identicon", emailHash, width);
|
| | | return url;
|
| | | }
|
| | | |
| | |
|
| | | /**
|
| | | * Creates a Gravatar thumbnail url from the specified email address.
|
| | | * |
| | | *
|
| | | * @param email
|
| | | * address to query Gravatar
|
| | | * @param width
|
| | |
| | | /**
|
| | | * Returns the Gravatar profile, if available, for the specified hashcode.
|
| | | * address.
|
| | | * |
| | | *
|
| | | * @param hash
|
| | | * the hash of the email address
|
| | | * @return a Gravatar Profile
|