From 3d5f7722978e5f039552aaa110b92952586392ce Mon Sep 17 00:00:00 2001 From: Chris Rebert Date: Wed, 3 Jun 2015 02:03:58 -0700 Subject: progress on jcabi-github porting --- build.sbt | 5 +---- src/main/resources/application.conf | 1 + .../getbootstrap/savage/github/Credentials.scala | 9 ++++++++ .../savage/github/GitHubActorWithLogging.scala | 5 +---- .../com/getbootstrap/savage/http/SuperWire.scala | 20 +++++++++++++++++ .../com/getbootstrap/savage/http/UserAgent.scala | 3 +++ .../getbootstrap/savage/http/UserAgentWire.scala | 25 ++++++++++++++++++++++ .../getbootstrap/savage/server/BranchDeleter.scala | 4 ++-- .../com/getbootstrap/savage/server/Settings.scala | 16 +++++++++----- 9 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 src/main/scala/com/getbootstrap/savage/github/Credentials.scala create mode 100644 src/main/scala/com/getbootstrap/savage/http/SuperWire.scala create mode 100644 src/main/scala/com/getbootstrap/savage/http/UserAgent.scala create mode 100644 src/main/scala/com/getbootstrap/savage/http/UserAgentWire.scala diff --git a/build.sbt b/build.sbt index d1cc7f5..43ecdca 100644 --- a/build.sbt +++ b/build.sbt @@ -12,10 +12,7 @@ resolvers += "Eclipse Foundation Releases" at "https://repo.eclipse.org/content/ resolvers += "Eclipse Foundation Snapshots" at "https://repo.eclipse.org/content/repositories/snapshots/" -libraryDependencies += "org.eclipse.mylyn.github" % "org.eclipse.egit.github.core" % "4.0.0.201503231230-m1" - -// egit-github needs Gson, but doesn't explicitly require it -libraryDependencies += "com.google.code.gson" % "gson" % "2.3.1" +libraryDependencies += "com.jcabi" % "jcabi-github" % "0.23" libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2" diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index c05219e..266cb6f 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -30,6 +30,7 @@ savage { github-test-repo = "twbs-savage/bootstrap" ignore-branches-from-watched-repo = true trusted-orgs = [ "twbs" ] + github-rate-limit-threshold = 10 whitelist = [ "**.md", "/bower.json", diff --git a/src/main/scala/com/getbootstrap/savage/github/Credentials.scala b/src/main/scala/com/getbootstrap/savage/github/Credentials.scala new file mode 100644 index 0000000..054531b --- /dev/null +++ b/src/main/scala/com/getbootstrap/savage/github/Credentials.scala @@ -0,0 +1,9 @@ +package com.getbootstrap.savage.github + +import com.jcabi.github.{Github, RtGithub} +import com.getbootstrap.savage.http.{UserAgent, SuperWire} + +case class Credentials(username: String, password: String) { + private def basicGithub: Github = new RtGithub(username, password) + def github(threshold: Int)(implicit userAgent: UserAgent): Github = new RtGithub(basicGithub.entry.through(classOf[SuperWire], userAgent, new Integer(threshold))) +} diff --git a/src/main/scala/com/getbootstrap/savage/github/GitHubActorWithLogging.scala b/src/main/scala/com/getbootstrap/savage/github/GitHubActorWithLogging.scala index 9b231f3..79fec81 100644 --- a/src/main/scala/com/getbootstrap/savage/github/GitHubActorWithLogging.scala +++ b/src/main/scala/com/getbootstrap/savage/github/GitHubActorWithLogging.scala @@ -1,11 +1,8 @@ package com.getbootstrap.savage.github -import org.eclipse.egit.github.core.client.GitHubClient import com.getbootstrap.savage.server.{Settings, ActorWithLogging} abstract class GitHubActorWithLogging extends ActorWithLogging { protected implicit val settings = Settings(context.system) - protected val gitHubClient = new GitHubClient() - gitHubClient.setUserAgent(settings.UserAgent) - gitHubClient.setCredentials(settings.BotUsername, settings.BotPassword) + protected val gitHubClient = settings.github() } diff --git a/src/main/scala/com/getbootstrap/savage/http/SuperWire.scala b/src/main/scala/com/getbootstrap/savage/http/SuperWire.scala new file mode 100644 index 0000000..87b49da --- /dev/null +++ b/src/main/scala/com/getbootstrap/savage/http/SuperWire.scala @@ -0,0 +1,20 @@ +package com.getbootstrap.savage.http + +import java.util.{Collection=>JavaCollection} +import java.util.Map.{Entry=>MapEntry} +import java.io.InputStream +import com.jcabi.github.wire.RetryCarefulWire +import com.jcabi.http.{Wire,Request,Response} + +case class SuperWire(private val wire: Wire, userAgent: UserAgent, threshold: Int) extends Wire { + private val wrappedWire = UserAgentWire(wire = new RetryCarefulWire(wire, threshold), userAgent = userAgent) + + @Override + def send( + request: Request, + home: String, + method: String, + headers: JavaCollection[MapEntry[String, String]], + content: InputStream + ): Response = wrappedWire.send(request, home, method, headers, content) +} diff --git a/src/main/scala/com/getbootstrap/savage/http/UserAgent.scala b/src/main/scala/com/getbootstrap/savage/http/UserAgent.scala new file mode 100644 index 0000000..e7e8419 --- /dev/null +++ b/src/main/scala/com/getbootstrap/savage/http/UserAgent.scala @@ -0,0 +1,3 @@ +package com.getbootstrap.savage.http + +case class UserAgent(userAgent: String) diff --git a/src/main/scala/com/getbootstrap/savage/http/UserAgentWire.scala b/src/main/scala/com/getbootstrap/savage/http/UserAgentWire.scala new file mode 100644 index 0000000..b293d56 --- /dev/null +++ b/src/main/scala/com/getbootstrap/savage/http/UserAgentWire.scala @@ -0,0 +1,25 @@ +package com.getbootstrap.savage.http + +import java.io.InputStream +import java.util.Map.{Entry => MapEntry} +import java.util.{Collection => JavaCollection} +import scala.collection.JavaConverters._ +import com.jcabi.http._ + +object UserAgentWire { + private val userAgentHeader = "User-Agent" +} +case class UserAgentWire(private val wire: Wire, userAgent: UserAgent) extends Wire { + @Override + def send( + request: Request, + home: String, + method: String, + headers: JavaCollection[MapEntry[String, String]], + content: InputStream + ): Response = { + val header = new ImmutableHeader(UserAgentWire.userAgentHeader, userAgent.userAgent) + val newHeaders = header +: headers.asScala.filter{ _.getKey != UserAgentWire.userAgentHeader}.toSeq + wire.send(request, home, method, newHeaders.asJava, content) + } +} diff --git a/src/main/scala/com/getbootstrap/savage/server/BranchDeleter.scala b/src/main/scala/com/getbootstrap/savage/server/BranchDeleter.scala index 8bfd7fa..84cd39f 100644 --- a/src/main/scala/com/getbootstrap/savage/server/BranchDeleter.scala +++ b/src/main/scala/com/getbootstrap/savage/server/BranchDeleter.scala @@ -1,7 +1,6 @@ package com.getbootstrap.savage.server import scala.collection.JavaConverters._ -import org.eclipse.egit.github.core.service.RepositoryService import com.getbootstrap.savage.github.{SavageBranch, GitHubActorWithLogging} import com.getbootstrap.savage.github.util.RichRepositoryId import com.getbootstrap.savage.util.{SuccessfulExit, ErrorExit, SimpleSubprocess} @@ -9,7 +8,8 @@ import com.getbootstrap.savage.util.{SuccessfulExit, ErrorExit, SimpleSubprocess class BranchDeleter extends GitHubActorWithLogging { override def receive = { case branch:SavageBranch => { - val repoService = new RepositoryService(gitHubClient) + val repoService = new RepositoryService() + gitHubClient.repos.get(settings.TestRepoId).br val maybeRepoBranch = repoService.getBranches(settings.TestRepoId).asScala.find{ _.getName == branch.branch.name } maybeRepoBranch match { case None => log.info(s"Nothing to delete; ${branch} does not exist in ${settings.TestRepoId}") diff --git a/src/main/scala/com/getbootstrap/savage/server/Settings.scala b/src/main/scala/com/getbootstrap/savage/server/Settings.scala index d01c62d..75ee9ac 100644 --- a/src/main/scala/com/getbootstrap/savage/server/Settings.scala +++ b/src/main/scala/com/getbootstrap/savage/server/Settings.scala @@ -9,17 +9,23 @@ import akka.actor.ExtensionId import akka.actor.ExtensionIdProvider import akka.actor.ExtendedActorSystem import akka.util.ByteString -import org.eclipse.egit.github.core.RepositoryId +import com.jcabi.github.Github +import com.jcabi.github.Coordinates.{Simple=>RepoId} +import com.getbootstrap.savage.github.Credentials +import com.getbootstrap.savage.http.{UserAgent=>UA} import com.getbootstrap.savage.util.{FilePathWhitelist,FilePathWatchlist,Utf8String,RichConfig} class SettingsImpl(config: Config) extends Extension { - val MainRepoId: RepositoryId = RepositoryId.createFromId(config.getString("savage.github-repo-to-watch")) - val TestRepoId: RepositoryId = RepositoryId.createFromId(config.getString("savage.github-test-repo")) + val MainRepoId: RepoId = new RepoId(config.getString("savage.github-repo-to-watch")) + val TestRepoId: RepoId = new RepoId(config.getString("savage.github-test-repo")) val BotUsername: String = config.getString("savage.username") - val BotPassword: String = config.getString("savage.password") + private val botPassword: String = config.getString("savage.password") + private val botCredentials: Credentials = Credentials(username = BotUsername, password = botPassword) + private val githubRateLimitThreshold: Int = config.getInt("savage.github-rate-limit-threshold") + def github(): Github = botCredentials.github(githubRateLimitThreshold)(UserAgent) val GitHubWebHookSecretKey: ByteString = ByteString(config.getString("savage.github-web-hook-secret-key").utf8Bytes) val TravisToken: String = config.getString("savage.travis-token") - val UserAgent: String = config.getString("spray.can.client.user-agent-header") + val UserAgent: UA = UA(config.getString("spray.can.client.user-agent-header")) val DefaultPort: Int = config.getInt("savage.default-port") val SquelchInvalidHttpLogging: Boolean = config.getBoolean("savage.squelch-invalid-http-logging") val Whitelist: FilePathWhitelist = new FilePathWhitelist(config.getStringList("savage.whitelist").asScala) -- cgit v1.2.3