diff --git a/.circleci/config.yml b/.circleci/config.yml index 49a04d7e..c28756ed 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,12 +1,12 @@ version: 2.1 orbs: - codacy: codacy/base@12.1.2 + codacy: codacy/base@12.2.0 references: circleci_job: &circleci_job docker: - - image: circleci/circleci-cli:0.1.29041 + - image: circleci/circleci-cli:0.1.32638 working_directory: ~/workdir commands: diff --git a/.gitignore b/.gitignore index 4a130515..1a025c05 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,7 @@ musl.tar.gz src/graal/bundle project/metals.sbt site -.bsp \ No newline at end of file +.bsp + +#Ignore vscode AI rules +.github/copilot-instructions.md diff --git a/api-scala/src/main/scala/com/codacy/api/client/CodacyClient.scala b/api-scala/src/main/scala/com/codacy/api/client/CodacyClient.scala index 99f32d4a..055a6c0c 100644 --- a/api-scala/src/main/scala/com/codacy/api/client/CodacyClient.scala +++ b/api-scala/src/main/scala/com/codacy/api/client/CodacyClient.scala @@ -4,7 +4,7 @@ import play.api.libs.json._ import com.codacy.api.util.JsonOps import scalaj.http.{Http, HttpOptions} -import java.net.URL +import java.net.{URI, URL} import scala.util.{Failure, Success, Try} import scala.util.control.NonFatal @@ -23,11 +23,12 @@ class CodacyClient( private val tokens = Map.empty[String, String] ++ apiToken.map(t => "api-token" -> t) ++ projectToken.map(t => "project-token" -> t) ++ - // This is deprecated and is kept for backward compatibility. It will removed in the context of CY-1272 + // This is deprecated and is kept for backward compatibility. It will be removed in the context of CY-1272 apiToken.map(t => "api_token" -> t) ++ projectToken.map(t => "project_token" -> t) - private val remoteUrl = new URL(new URL(apiUrl.getOrElse("https://api.codacy.com")), "/2.0").toString() + private val baseUri = new URI(apiUrl.getOrElse("https://api.codacy.com")) + private val remoteUrl = baseUri.resolve("/2.0").toURL.toString private def httpOptions = if (allowUnsafeSSL) Seq(HttpOptions.allowUnsafeSSL) else Seq.empty @@ -66,7 +67,8 @@ class CodacyClient( case success => success } } catch { - case NonFatal(ex) => retryPost(request, value, timeoutOpt, sleepTime, numRetries.map(x => x - 1), ex.getMessage) + case NonFatal(ex) => + retryPost(request, value, timeoutOpt, sleepTime, numRetries.map(x => x - 1), ex.getMessage) } } diff --git a/src/main/scala/com/codacy/rules/ConfigurationRules.scala b/src/main/scala/com/codacy/rules/ConfigurationRules.scala index 6902ad35..48656bcd 100644 --- a/src/main/scala/com/codacy/rules/ConfigurationRules.scala +++ b/src/main/scala/com/codacy/rules/ConfigurationRules.scala @@ -4,7 +4,7 @@ import com.codacy.api.OrganizationProvider import com.codacy.api.client.RequestTimeout import java.io.File -import java.net.URL +import java.net.{URI, URL} import scala.util.Try import wvlet.log.LogSupport import com.codacy.configuration.parser.{BaseCommandConfig, CommandConfiguration, Final, Report} @@ -176,7 +176,13 @@ class ConfigurationRules(cmdConfig: CommandConfiguration, envVars: Map[String, S * @return true for valid url, false if not */ private[rules] def validUrl(baseUrl: String): Boolean = { - Try(new URL(baseUrl)).toOption.isDefined + Try(new URI(baseUrl.trim)).toOption.exists { uri => + val scheme = uri.getScheme + val host = uri.getHost + scheme != null && + (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) && + host != null && host.nonEmpty + } } /** diff --git a/src/main/scala/com/codacy/rules/ReportRules.scala b/src/main/scala/com/codacy/rules/ReportRules.scala index d5f4631d..220d4d1a 100644 --- a/src/main/scala/com/codacy/rules/ReportRules.scala +++ b/src/main/scala/com/codacy/rules/ReportRules.scala @@ -329,17 +329,13 @@ class ReportRules(coverageServices: => CoverageServices, gitFileFetcher: GitFile report: CoverageReport )(config: ReportConfig, commitUUID: String, acceptableFileNames: Either[String, Seq[String]]): CoverageReport = { val transformations: Seq[Transformation] = acceptableFileNames - .fold( - error => { - logger.warn(s"Report files will not be matched against git files, reason: $error") - Seq(new PathPrefixer(config.prefix)) - }, - filenames => - Seq(new PathPrefixer(config.prefix), { - val acceptableFileNamesMap = filenames.groupBy(getFilenameFromPath).view.toMap - new GitFileNameUpdaterAndFilter(acceptableFileNamesMap) - }) - ) + .fold(error => { + logger.warn(s"Report files will not be matched against git files, reason: $error") + Seq(new PathPrefixer(config.prefix)) + }, filenames => { + val acceptableFileNamesMap = filenames.groupBy(getFilenameFromPath).view.toMap + Seq(new GitFileNameUpdaterAndFilter(acceptableFileNamesMap), new PathPrefixer(config.prefix)) + }) transformations.foldLeft(report) { (report, transformation) => transformation.execute(report) diff --git a/src/test/scala/com/codacy/rules/commituuid/providers/GitHubActionProviderSpec.scala b/src/test/scala/com/codacy/rules/commituuid/providers/GitHubActionProviderSpec.scala index ff4ff968..8f1e5ce2 100644 --- a/src/test/scala/com/codacy/rules/commituuid/providers/GitHubActionProviderSpec.scala +++ b/src/test/scala/com/codacy/rules/commituuid/providers/GitHubActionProviderSpec.scala @@ -27,7 +27,7 @@ class GitHubActionProviderSpec extends AnyWordSpec with Matchers with EitherValu val envVars = Map( "GITHUB_EVENT_NAME" -> "pull_request", "GITHUB_SHA" -> invalidPullRequestCommitUuid, - "GITHUB_EVENT_PATH" -> "src/test/resources/invalid-github-action-pull-request-event.json" + "GITHUB_EVENT_PATH" -> "src/test/resources/invalid-github-action-event.json" ) val commitUuidEither = provider.getValidCommitUUID(envVars) commitUuidEither should be(Symbol("left"))