summaryrefslogtreecommitdiff
path: root/scalalib/src/publish/VersionControl.scala
diff options
context:
space:
mode:
Diffstat (limited to 'scalalib/src/publish/VersionControl.scala')
-rw-r--r--scalalib/src/publish/VersionControl.scala131
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