diff options
Diffstat (limited to 'scalalib/src/publish/VersionControl.scala')
-rw-r--r-- | scalalib/src/publish/VersionControl.scala | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/scalalib/src/publish/VersionControl.scala b/scalalib/src/publish/VersionControl.scala new file mode 100644 index 00000000..aad38ac3 --- /dev/null +++ b/scalalib/src/publish/VersionControl.scala @@ -0,0 +1,131 @@ +package mill.scalalib.publish + +// https://maven.apache.org/pom.html#SCM +/* + * @param browsableRepository: a publicly browsable repository + * (example: https://github.com/lihaoyi/mill) + * @param connection: read-only connection to repository + * (example: scm:git:git://github.com/lihaoyi/mill.git) + * @param developerConnection: read-write connection to repository + * (example: scm:git:git@github.com:lihaoyi/mill.git) + * @param tag: tag that was created for this release. This is useful for + * git and mercurial since it's not possible to include the tag in + * the connection url. + * (example: v2.12.4, HEAD, my-branch, fd8a2567ad32c11bcf8adbaca85bdba72bb4f935, ...) + */ +case class VersionControl( + browsableRepository: Option[String] = None, + connection: Option[String] = None, + developerConnection: Option[String] = None, + tag: Option[String] = None +) + +@deprecated("use VersionControl", "0.1.3") +case class SCM( + url: String, + connection: String +) + +object VersionControl { + def github(owner: String, repo: String, tag: Option[String] = None): VersionControl = + VersionControl( + browsableRepository = Some(s"https://github.com/$owner/$repo"), + connection = Some(VersionControlConnection.gitGit("github.com", s"$owner/$repo.git")), + developerConnection = Some(VersionControlConnection.gitSsh("github.com", s":$owner/$repo.git", username = Some("git"))), + tag = tag + ) + def gitlab(owner: String, repo: String, tag: Option[String] = None): VersionControl = + VersionControl( + browsableRepository = Some(s"https://gitlab.com/$owner/$repo"), + connection = Some(VersionControlConnection.gitGit("gitlab.com", s"$owner/$repo.git")), + developerConnection = Some(VersionControlConnection.gitSsh("gitlab.com", s":$owner/$repo.git", username = Some("git"))), + tag = tag + ) +} + +object VersionControlConnection { + def network(scm: String, + protocol: String, + hostname: String, + path: String, + username: Option[String] = None, + password: Option[String] = None, + port: Option[Int] = None): String = { + val portPart = port.map(":" + _).getOrElse("") + val credentials = + username match { + case Some(user) => + val pass = password.map(":" + _).getOrElse("") + s"${user}${pass}@" + case None => + password match { + case Some(p) => sys.error(s"no username set for password: $p") + case _ => "" + } + } + + val path0 = + if(path.startsWith(":") || path.startsWith("/")) path + else "/" + path + + s"scm:${scm}:${protocol}://${credentials}${hostname}${portPart}${path0}" + } + + def file(scm: String, path: String): String = { + s"scm:$scm:file://$path" + } + + def gitGit(hostname: String, + path: String = "", + port: Option[Int] = None): String = + network("git", "git", hostname, path, port = port) + + def gitHttp(hostname: String, + path: String = "", + port: Option[Int] = None): String = + network("git", "http", hostname, path, port = port) + + def gitHttps(hostname: String, + path: String = "", + port: Option[Int] = None): String = + network("git", "https", hostname, path, port = port) + + def gitSsh(hostname: String, + path: String = "", + username: Option[String] = None, + port: Option[Int] = None): String = + network("git", "ssh", hostname, path, username = username, port = port) + + def gitFile(path: String): String = + file("git", path) + + def svnSsh(hostname: String, + path: String = "", + username: Option[String] = None, + port: Option[Int] = None): String = + network("svn", "svn+ssh", hostname, path, username, None, port) + + def svnHttp(hostname: String, + path: String = "", + username: Option[String] = None, + password: Option[String] = None, + port: Option[Int] = None): String = + network("svn", "http", hostname, path, username, password, port) + + def svnHttps(hostname: String, + path: String = "", + username: Option[String] = None, + password: Option[String] = None, + port: Option[Int] = None): String = + network("svn", "https", hostname, path, username, password, port) + + def svnSvn(hostname: String, + path: String = "", + username: Option[String] = None, + password: Option[String] = None, + port: Option[Int] = None): String = + network("svn", "svn", hostname, path, username, password, port) + + def svnFile(path: String): String = + file("svn", path) +}
\ No newline at end of file |