From 4a73596ce4308a59813dd14b74bec2ce7a406b80 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 11 Mar 2010 12:02:27 -0800 Subject: [PATCH] eclipse-iplog: Skip the initial contribution The initial contribution was handled through a CQ, and does not need to be reported as an individual bug record in the project's IP log. Its an odd corner case that the EMO IP team doesn't want to see, even though its technically a contribution written by at least some non-committers. The project.skipCommit variable can now be used to mask out any particular change from the IP log. Currently within JGit we want to mask only the initial commit, but others could be masked if the need arises. Change-Id: I598e08137ddc5913284471ee2aa545f4df685023 Signed-off-by: Shawn O. Pearce --- .eclipse_iplog | 2 ++ .../src/org/eclipse/jgit/iplog/IpLogGenerator.java | 14 +++++++++++--- .../src/org/eclipse/jgit/iplog/IpLogMeta.java | 5 +++++ .../src/org/eclipse/jgit/iplog/Project.java | 14 ++++++++++++++ .../org/eclipse/jgit/lib/ObjectIdSubclassMap.java | 11 +++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/.eclipse_iplog b/.eclipse_iplog index c7bf1b48e..b6d6e9bbb 100644 --- a/.eclipse_iplog +++ b/.eclipse_iplog @@ -2,6 +2,8 @@ name = JGit license = Eclipse Distribution License v1.0 + skipCommit = 1a6964c8274c50f0253db75f010d78ef0e739343 + [CQ "3454"] description = args4j Version: 2.0.12 license = BSD License diff --git a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java index 417c50655..d8956afe1 100644 --- a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java +++ b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java @@ -130,6 +130,9 @@ public class IpLogGenerator { /** Root commits which were scanned to gather project data. */ private final Set commits = new HashSet(); + /** The meta file we loaded to bootstrap our definitions. */ + private IpLogMeta meta; + private String characterEncoding = "UTF-8"; private Repository db; @@ -185,7 +188,7 @@ public void scan(Repository repo, RevCommit startCommit, String version) loadEclipseIpLog(version, c); loadCommitters(repo); - scanProjectCommits(c); + scanProjectCommits(meta.getProjects().get(0), c); commits.add(c); } finally { WindowCursor.release(curs); @@ -202,7 +205,7 @@ private void loadEclipseIpLog(String version, RevCommit commit) if (log == null) return; - IpLogMeta meta = new IpLogMeta(); + meta = new IpLogMeta(); try { meta.loadFrom(new BlobBasedConfig(null, db, log.getObjectId(0))); } catch (ConfigInvalidException e) { @@ -277,12 +280,17 @@ private Date parseDate(SimpleDateFormat dt, String value) } } - private void scanProjectCommits(RevCommit start) throws IOException { + private void scanProjectCommits(Project proj, RevCommit start) + throws IOException { rw.reset(); rw.markStart(start); RevCommit commit; while ((commit = rw.next()) != null) { + if (proj.isSkippedCommit(commit)) { + continue; + } + final PersonIdent author = commit.getAuthorIdent(); final Date when = author.getWhen(); diff --git a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java index 38b7d417b..d0a5279ab 100644 --- a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java +++ b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java @@ -59,6 +59,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileBasedConfig; import org.eclipse.jgit.lib.LockFile; +import org.eclipse.jgit.lib.ObjectId; /** * Manages the {@code .eclipse_iplog} file in a project. @@ -75,6 +76,8 @@ public class IpLogMeta { private static final String K_COMMENTS = "comments"; + private static final String K_SKIP_COMMIT = "skipCommit"; + private static final String K_LICENSE = "license"; private static final String K_DESCRIPTION = "description"; @@ -104,6 +107,8 @@ void loadFrom(Config cfg) { Project project = new Project(id, name); project.setComments(cfg.getString(S_PROJECT, id, K_COMMENTS)); + for (String c : cfg.getStringList(S_PROJECT, id, K_SKIP_COMMIT)) + project.addSkipCommit(ObjectId.fromString(c)); for (String license : cfg.getStringList(S_PROJECT, id, K_LICENSE)) project.addLicense(license); projects.add(project); diff --git a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/Project.java b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/Project.java index 6495d38ff..15b79cede 100644 --- a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/Project.java +++ b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/Project.java @@ -48,6 +48,10 @@ import java.util.Set; import java.util.TreeSet; +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectIdSubclassMap; + /** Description of a project. */ class Project { /** Sorts projects by unique identities. */ @@ -65,6 +69,8 @@ public int compare(Project a, Project b) { private final Set licenses = new TreeSet(); + private final ObjectIdSubclassMap skipCommits = new ObjectIdSubclassMap(); + private String version; /** @@ -104,6 +110,14 @@ void addLicense(String licenseName) { licenses.add(licenseName); } + void addSkipCommit(AnyObjectId commit) { + skipCommits.add(commit.copy()); + } + + boolean isSkippedCommit(AnyObjectId commit) { + return skipCommits.contains(commit); + } + String getVersion() { return version; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java index bd57c061b..a0b6d0ed2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdSubclassMap.java @@ -97,6 +97,17 @@ public V get(final AnyObjectId toFind) { return null; } + /** + * Returns true if this map contains the specified object. + * + * @param toFind + * object to find. + * @return true if the mapping exists for this object; false otherwise. + */ + public boolean contains(final AnyObjectId toFind) { + return get(toFind) != null; + } + /** * Store an object for future lookup. *