diff --git a/README.md b/README.md index c65d5d50..4554619f 100644 --- a/README.md +++ b/README.md @@ -37,11 +37,29 @@ Then set it in your terminal, replacing %Project_Token% with your own token: export CODACY_PROJECT_TOKEN=%Project_Token% ``` -**Enterprise** +### CommitUUID Detection -To send coverage in the enterprise version you should: +Codacy automatically detects the CommitUUID from several sources: + +**Environment Variables** + +* CI_COMMIT +* TRAVIS_PULL_REQUEST_SHA +* TRAVIS_COMMIT +* DRONE_COMMIT +* CIRCLE_SHA1 +* CI_COMMIT_ID +* WERCKER_GIT_COMMIT + +**Git directory** + +* If it finds a git directory it will get current commit. + +**Force CommitUUID** + +* You may want to enforce a specific commitUUID with: ``` -export CODACY_API_BASE_URL=:16006 +codacy-coverage-reporter -l Java --commitUUID "mycommituuid" -r coverage.xml ``` **Upload coverage** @@ -54,6 +72,13 @@ codacy-coverage-reporter -l Java -r coverage.xml > Note: You should keep your API token well **protected**, as it grants owner permissions to your projects. +###Enterprise + +To send coverage in the enterprise version you should: +``` +export CODACY_API_BASE_URL=:16006 +``` + ## Java 6 Due to a limitation in Java 6, the plugin is unable to establish a connection to codacy.com. diff --git a/src/main/scala/com/codacy/CodacyCoverageReporter.scala b/src/main/scala/com/codacy/CodacyCoverageReporter.scala index 950dc8da..d0db2c69 100644 --- a/src/main/scala/com/codacy/CodacyCoverageReporter.scala +++ b/src/main/scala/com/codacy/CodacyCoverageReporter.scala @@ -30,7 +30,8 @@ object CodacyCoverageReporter { coverageReport: File = new File("coverage.xml"), codacyApiBaseUrl: String = getApiBaseUrl, prefix: String = "", - debug: Boolean = false) + debug: Boolean = false, + commitUUID: Option[String] = commitUUIDOpt) implicit def languageRead: Read[Language.Value] = Read.reads { (s: String) => Language.withName(s) @@ -44,6 +45,17 @@ object CodacyCoverageReporter { sys.env.getOrElse("CODACY_PROJECT_TOKEN", "") } + lazy val commitUUIDOpt: Option[String] = { + getNonEmptyEnv("CI_COMMIT") orElse + getNonEmptyEnv("TRAVIS_PULL_REQUEST_SHA") orElse + getNonEmptyEnv("TRAVIS_COMMIT") orElse + getNonEmptyEnv("DRONE_COMMIT") orElse + getNonEmptyEnv("CIRCLE_SHA1") orElse + getNonEmptyEnv("CI_COMMIT_ID") orElse + getNonEmptyEnv("WERCKER_GIT_COMMIT") + .filter(_.trim.nonEmpty) + } + private def validUrl(baseUrl: String) = { Try(new URL(baseUrl)).toOption.isDefined } @@ -55,7 +67,7 @@ object CodacyCoverageReporter { parser.parse(args, Config()) match { case Some(config) if !validUrl(config.codacyApiBaseUrl) => logger.error(s"Error: Invalid CODACY_API_BASE_URL: ${config.codacyApiBaseUrl}") - if(!config.codacyApiBaseUrl.startsWith("http")) { + if (!config.codacyApiBaseUrl.startsWith("http")) { logger.error("Maybe you forgot the http:// or https:// ?") } @@ -90,6 +102,9 @@ object CodacyCoverageReporter { }.text("the base URL for the Codacy API") opt[String]("prefix").optional().action { (x, c) => c.copy(prefix = x) + }.text("your commitUUID") + opt[String]("commitUUID").optional().action { (x, c) => + c.copy(commitUUID = Some(x)) }.text("the project path prefix") opt[Unit]("debug").optional().hidden().action { (_, c) => c.copy(debug = true) @@ -99,17 +114,7 @@ object CodacyCoverageReporter { } def coverageWithTokenAndCommit(config: Config): Either[String, String] = { - val commitUUID = - sys.env.get("CI_COMMIT") orElse - sys.env.get("TRAVIS_PULL_REQUEST_SHA") orElse - sys.env.get("TRAVIS_COMMIT") orElse - sys.env.get("DRONE_COMMIT") orElse - sys.env.get("CIRCLE_SHA1") orElse - sys.env.get("CI_COMMIT_ID") orElse - sys.env.get("WERCKER_GIT_COMMIT") - .filter(_.trim.nonEmpty) - - FileHelper.withTokenAndCommit(Some(config.projectToken), commitUUID) { + FileHelper.withTokenAndCommit(Some(config.projectToken), config.commitUUID) { case (projectToken, commitUUID) => logger.debug(s"Project token: $projectToken") @@ -152,6 +157,10 @@ object CodacyCoverageReporter { } } + private def getNonEmptyEnv(key: String): Option[String] = { + sys.env.get(key).filter(_.trim.nonEmpty) + } + private def transform[A](report: CoverageReport)(config: Config)(f: CoverageReport => A): A = { val transformations = Set(new PathPrefixer(config.prefix)) val transformedReport = transformations.foldLeft(report) {