Skip to content

Commit

Permalink
[FIXED JENKINS-18165]
Browse files Browse the repository at this point in the history
AbstractProject->GitHubRepositoryName[] conversion is useful outside trigger

As indicated by the pull request #27, it is useful to be able to figure
out a list of repositories associated with the project even in the
absence of the trigger setting.

So I moved out this code into GitHubRepositoryName. This eliminated the
need for the GitHubCommitNotifier to require a GitHubPushTrigger, which
is the motivation for the pull request #27.
  • Loading branch information
kohsuke committed Jul 7, 2013
1 parent 5ca76ad commit e89bfe7
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 45 deletions.
6 changes: 3 additions & 3 deletions src/main/java/com/cloudbees/jenkins/Cleaner.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ public class Cleaner extends PeriodicWork {
/**
* Called when a {@link GitHubPushTrigger} is about to be removed.
*/
synchronized void onStop(GitHubPushTrigger trigger) {
couldHaveBeenRemoved.addAll(trigger.getGitHubRepositories());
synchronized void onStop(AbstractProject<?,?> job) {
couldHaveBeenRemoved.addAll(GitHubRepositoryName.from(job));
}

@Override
Expand All @@ -55,7 +55,7 @@ protected void doRun() throws Exception {
for (AbstractProject<?,?> job : Hudson.getInstance().getItems(AbstractProject.class)) {
GitHubPushTrigger trigger = job.getTrigger(GitHubPushTrigger.class);
if (trigger!=null) {
names.removeAll(trigger.getGitHubRepositories());
names.removeAll(GitHubRepositoryName.from(job));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListen
BuildData buildData = build.getAction(BuildData.class);
String sha1 = ObjectId.toString(buildData.getLastBuiltRevision().getSha1());

GitHubTrigger trigger = build.getProject().getTrigger(GitHubPushTrigger.class);
for (GitHubRepositoryName gitHubRepositoryName : trigger.getGitHubRepositories()) {
for (GitHubRepositoryName gitHubRepositoryName : GitHubRepositoryName.from(build.getProject())) {
for (GHRepository repository : gitHubRepositoryName.resolve()) {
GHCommitState state;
String msg;
Expand Down
44 changes: 5 additions & 39 deletions src/main/java/com/cloudbees/jenkins/GitHubPushTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
import hudson.model.Item;
import hudson.model.AbstractProject;
import hudson.model.Project;
import hudson.plugins.git.GitSCM;
import hudson.scm.SCM;
import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import hudson.util.SequentialExecutionQueue;
Expand All @@ -36,9 +34,6 @@
import net.sf.json.JSONObject;

import org.apache.commons.jelly.XMLOutput;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;
import org.jenkinsci.plugins.multiplescms.MultiSCM;
import org.kohsuke.github.GHException;
import org.kohsuke.github.GHRepository;
import org.kohsuke.stapler.DataBoundConstructor;
Expand Down Expand Up @@ -128,48 +123,19 @@ public File getLogFile() {
}

/**
* Does this project read from a repository of the given user name and the
* given repository name?
* @deprecated
* Use {@link GitHubRepositoryName#from(AbstractProject)}
*/
public Set<GitHubRepositoryName> getGitHubRepositories() {
Set<GitHubRepositoryName> r = new HashSet<GitHubRepositoryName>();
if (Hudson.getInstance().getPlugin("multiple-scms") != null
&& job.getScm() instanceof MultiSCM) {
MultiSCM multiSCM = (MultiSCM) job.getScm();
List<SCM> scmList = multiSCM.getConfiguredSCMs();
for (SCM scm : scmList) {
addRepositories(r, scm);
}
} else {
addRepositories(r, job.getScm());
}
return r;
}

/**
* @since 1.1
*/
protected void addRepositories(Set<GitHubRepositoryName> r, SCM scm) {
if (scm instanceof GitSCM) {
GitSCM git = (GitSCM) scm;
for (RemoteConfig rc : git.getRepositories()) {
for (URIish uri : rc.getURIs()) {
String url = uri.toString();
GitHubRepositoryName repo = GitHubRepositoryName.create(url);
if (repo != null) {
r.add(repo);
}
}
}
}
return new HashSet<GitHubRepositoryName>(GitHubRepositoryName.from(job));
}

@Override
public void start(AbstractProject<?,?> project, boolean newInstance) {
super.start(project, newInstance);
if (newInstance && getDescriptor().isManageHook()) {
// make sure we have hooks installed. do this lazily to avoid blocking the UI thread.
final Set<GitHubRepositoryName> names = getGitHubRepositories();
final Collection<GitHubRepositoryName> names = GitHubRepositoryName.from(job);

getDescriptor().queue.execute(new Runnable() {
public void run() {
Expand Down Expand Up @@ -205,7 +171,7 @@ public void stop() {
if (getDescriptor().isManageHook()) {
Cleaner cleaner = Cleaner.get();
if (cleaner != null) {
cleaner.onStop(this);
cleaner.onStop(job);
}
}
}
Expand Down
51 changes: 51 additions & 0 deletions src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package com.cloudbees.jenkins;

import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.plugins.git.GitSCM;
import hudson.scm.SCM;
import hudson.util.AdaptedIterator;
import hudson.util.Iterators.FilterIterator;
import jenkins.model.Jenkins;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;
import org.jenkinsci.plugins.multiplescms.MultiSCM;
import org.kohsuke.github.GHCommitPointer;
import org.kohsuke.github.GHOrganization;
import org.kohsuke.github.GHPerson;
Expand All @@ -12,7 +20,11 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
Expand Down Expand Up @@ -172,5 +184,44 @@ public String toString() {
return "GitHubRepository[host="+host+",username="+userName+",repository="+repositoryName+"]";
}

/**
* Does this project read from a repository of the given user name and the
* given repository name?
*
* If so, return those.
*/
public static Collection<GitHubRepositoryName> from(AbstractProject<?, ?> job) {
Set<GitHubRepositoryName> r = new HashSet<GitHubRepositoryName>();
if (Jenkins.getInstance().getPlugin("multiple-scms") != null
&& job.getScm() instanceof MultiSCM) {
MultiSCM multiSCM = (MultiSCM) job.getScm();
List<SCM> scmList = multiSCM.getConfiguredSCMs();
for (SCM scm : scmList) {
addRepositories(r, scm);
}
} else {
addRepositories(r, job.getScm());
}
return r;
}

/**
* @since 1.1
*/
private static void addRepositories(Set<GitHubRepositoryName> r, SCM scm) {
if (scm instanceof GitSCM) {
GitSCM git = (GitSCM) scm;
for (RemoteConfig rc : git.getRepositories()) {
for (URIish uri : rc.getURIs()) {
String url = uri.toString();
GitHubRepositoryName repo = GitHubRepositoryName.create(url);
if (repo != null) {
r.add(repo);
}
}
}
}
}

private static final Logger LOGGER = Logger.getLogger(GitHubRepositoryName.class.getName());
}
6 changes: 6 additions & 0 deletions src/main/java/com/cloudbees/jenkins/GitHubTrigger.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.cloudbees.jenkins;

import hudson.model.AbstractProject;

import java.util.Set;

/**
Expand All @@ -12,5 +14,9 @@ public interface GitHubTrigger {
@Deprecated
public void onPost();
public void onPost(String triggeredByUser);
/**
* @deprecated
* Use {@link GitHubRepositoryName#from(AbstractProject)}
*/
public Set<GitHubRepositoryName> getGitHubRepositories();
}
2 changes: 1 addition & 1 deletion src/main/java/com/cloudbees/jenkins/GitHubWebHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ public void processGitHubPayload(String payload, Class<? extends Trigger<?>> tri
GitHubTrigger trigger = (GitHubTrigger) job.getTrigger(triggerClass);
if (trigger!=null) {
LOGGER.fine("Considering to poke "+job.getFullDisplayName());
if (trigger.getGitHubRepositories().contains(changedRepository)) {
if (GitHubRepositoryName.from(job).contains(changedRepository)) {
LOGGER.info("Poked "+job.getFullDisplayName());
trigger.onPost(pusherName);
} else
Expand Down

0 comments on commit e89bfe7

Please sign in to comment.