diff --git a/project/CopyrightHeader.scala b/project/CopyrightHeader.scala index 981eca848e..274e6fb2e8 100644 --- a/project/CopyrightHeader.scala +++ b/project/CopyrightHeader.scala @@ -1,3 +1,12 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * license agreements; and to You under the Apache License, version 2.0: + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * This file is part of the Apache Pekko project, derived from Akka. + */ + /* * Copyright (C) 2018-2022 Lightbend Inc. */ @@ -6,8 +15,9 @@ package org.apache.pekko import org.apache.pekko.PekkoValidatePullRequest.additionalTasks import de.heikoseeberger.sbtheader.HeaderPlugin.autoImport._ -import de.heikoseeberger.sbtheader.{ CommentCreator, HeaderPlugin } +import de.heikoseeberger.sbtheader.{ CommentCreator, HeaderPlugin, NewLine } import com.typesafe.sbt.MultiJvmPlugin.MultiJvmKeys._ +import org.apache.commons.lang3.StringUtils import sbt.Keys._ import sbt._ @@ -21,7 +31,7 @@ trait CopyrightHeader extends AutoPlugin { Seq(Compile, Test, MultiJvm).flatMap { config => inConfig(config)( Seq( - headerLicense := Some(HeaderLicense.Custom(headerFor(CurrentYear))), + headerLicense := Some(HeaderLicense.Custom(apacheHeader)), headerMappings := headerMappings.value ++ Map( HeaderFileType.scala -> cStyleComment, HeaderFileType.java -> cStyleComment, @@ -40,60 +50,56 @@ trait CopyrightHeader extends AutoPlugin { (Test / compile).value }) - // We hard-code this so PR's created in year X will not suddenly fail in X+1. - // Of course we should remember to update it early in the year. - val CurrentYear = "2022" - val CopyrightPattern = "Copyright \\([Cc]\\) (\\d{4}([-–]\\d{4})?) (Lightbend|Typesafe) Inc. <.*>".r - val CopyrightHeaderPattern = s"(?s).*${CopyrightPattern}.*".r - def headerFor(year: String): String = s"Copyright (C) $year Lightbend Inc. " + def apacheHeader: String = + """Licensed to the Apache Software Foundation (ASF) under one or more + |license agreements; and to You under the Apache License, version 2.0: + | + | https://www.apache.org/licenses/LICENSE-2.0 + | + |This file is part of the Apache Pekko project, derived from Akka. + |""".stripMargin + val cStyleComment = HeaderCommentStyle.cStyleBlockComment.copy(commentCreator = new CommentCreator() { - def updateLightbendHeader(header: String): String = header match { - case CopyrightHeaderPattern(years, null, _) => - if (years != CurrentYear) - CopyrightPattern.replaceFirstIn(header, headerFor(years + "-" + CurrentYear)) - else - CopyrightPattern.replaceFirstIn(header, headerFor(years)) - case CopyrightHeaderPattern(years, endYears, _) => - CopyrightPattern.replaceFirstIn(header, headerFor(years.replace(endYears, "-" + CurrentYear))) - case _ => - header - } - - def parseStartAndEndYear(header: String): Option[(String, Option[String])] = header match { - case CopyrightHeaderPattern(years, null, _) => - Some((years, None)) - case CopyrightHeaderPattern(years, endYears, _) => - Some((years, Some(endYears))) - case _ => - None - } - override def apply(text: String, existingText: Option[String]): String = { val formatted = existingText match { + case Some(existedText) if isValidCopyRightAnnotated(existedText) => + existedText + case Some(existedText) if isOnlyLightbendCopyRightAnnotated(existedText) => + HeaderCommentStyle.cStyleBlockComment.commentCreator(text, existingText) + NewLine * 2 + existedText case Some(existedText) => - parseStartAndEndYear(existedText) match { - case Some((years, None)) => - if (years != CurrentYear) { - val header = headerFor(years + "-" + CurrentYear) - HeaderCommentStyle.cStyleBlockComment.commentCreator(header, existingText) - } else { - HeaderCommentStyle.cStyleBlockComment.commentCreator(headerFor(CurrentYear), existingText) - } - case Some((years, Some(endYears))) => - val header = headerFor(years.replace(endYears, "-" + CurrentYear)) - HeaderCommentStyle.cStyleBlockComment.commentCreator(header, existingText) - case None => - existedText - } + throw new IllegalStateException(s"Unable to detect copyright for header:[${existedText}]") case None => HeaderCommentStyle.cStyleBlockComment.commentCreator(text, existingText) } formatted.trim } + + private def isApacheCopyRighted(text: String): Boolean = + StringUtils.containsIgnoreCase(text, "licensed to the apache software foundation (asf)") || + StringUtils.containsIgnoreCase(text, "www.apache.org/licenses/license-2.0") + + private def isLAMPCopyRighted(text: String): Boolean = + StringUtils.containsIgnoreCase(text, "lamp/epfl") + + private def isLightbendCopyRighted(text: String): Boolean = + StringUtils.containsIgnoreCase(text, "lightbend inc.") + + private def isDebianCopyRighted(text: String): Boolean = + StringUtils.containsIgnoreCase(text, "debian.org") + + private def isValidCopyRightAnnotated(text: String): Boolean = { + isApacheCopyRighted(text) || isLAMPCopyRighted(text) || isDebianCopyRighted(text) + } + + private def isOnlyLightbendCopyRightAnnotated(text: String): Boolean = { + isLightbendCopyRighted(text) && !(isApacheCopyRighted(text) || isLAMPCopyRighted(text) || isDebianCopyRighted( + text)) + } + }) }