Skip to content

Commit

Permalink
Add authentication file support (bazeltools#293)
Browse files Browse the repository at this point in the history
* Add authentication file support

This is useful to access private repositories

* Add parsing test for auth file support
  • Loading branch information
lgirault authored Nov 19, 2020
1 parent dbd90f1 commit e921685
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 38 deletions.
22 changes: 11 additions & 11 deletions 3rdparty/workspace.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@
def _jar_artifact_impl(ctx):
jar_name = "%s.jar" % ctx.name
ctx.download(
output=ctx.path("jar/%s" % jar_name),
url=ctx.attr.urls,
sha256=ctx.attr.sha256,
executable=False
output = ctx.path("jar/%s" % jar_name),
url = ctx.attr.urls,
sha256 = ctx.attr.sha256,
executable = False
)
src_name="%s-sources.jar" % ctx.name
srcjar_attr=""
src_name = "%s-sources.jar" % ctx.name
srcjar_attr = ""
has_sources = len(ctx.attr.src_urls) != 0
if has_sources:
ctx.download(
output=ctx.path("jar/%s" % src_name),
url=ctx.attr.src_urls,
sha256=ctx.attr.src_sha256,
executable=False
output = ctx.path("jar/%s" % src_name),
url = ctx.attr.src_urls,
sha256 = ctx.attr.src_sha256,
executable = False
)
srcjar_attr ='\n srcjar = ":%s",' % src_name
srcjar_attr = '\n srcjar = ":%s",' % src_name

build_file_contents = """
package(default_visibility = ['//visibility:public'])
Expand Down
22 changes: 17 additions & 5 deletions src/scala/com/github/johnynek/bazel_deps/DepsModel.scala
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,14 @@ case class Model(

yamlMap(List(opts, deps, reps).collect { case Some(kv) => kv }, 2) + Doc.line
}

def hasAuthFile: Boolean = options.exists(_.authFile.nonEmpty)
def getAuthFile: Option[String] =
options.flatMap(_.authFile).map { auth =>
if(auth.startsWith("$"))
sys.env.getOrElse(auth.substring(1), s"env var ${auth} not found")
else auth
}
}

object Model {
Expand Down Expand Up @@ -1222,7 +1230,8 @@ case class Options(
licenses: Option[Set[String]],
resolverType: Option[ResolverType],
strictVisibility: Option[StrictVisibility],
buildFileName: Option[String]
buildFileName: Option[String],
authFile: Option[String]
) {
def isDefault: Boolean =
versionConflictPolicy.isEmpty &&
Expand All @@ -1236,7 +1245,8 @@ case class Options(
licenses.isEmpty &&
resolverType.isEmpty &&
strictVisibility.isEmpty &&
buildFileName.isEmpty
buildFileName.isEmpty &&
authFile.isEmpty

def getLicenses: Set[String] =
licenses.getOrElse(Set.empty)
Expand Down Expand Up @@ -1305,7 +1315,8 @@ case class Options(
licenses.map { l => list(l.toList.sorted)(quoteDoc) }),
("strictVisibility", strictVisibility.map { x => Doc.text(x.enabled.toString)}),
("resolverType", resolverType.map(r => quoteDoc(r.asString))),
("buildFileName", buildFileName.map(name => Doc.text(name)))
("buildFileName", buildFileName.map(name => Doc.text(name))),
("authFile", authFile.map(name => Doc.text(name)))
).sortBy(_._1)
.collect { case (k, Some(v)) => (k, v) }

Expand All @@ -1327,7 +1338,7 @@ object Options {
* A monoid on options that is just the point-wise monoid
*/
implicit val optionsMonoid: Monoid[Options] = new Monoid[Options] {
val empty = Options(None, None, None, None, None, None, None, None, None, None, None, None)
val empty = Options(None, None, None, None, None, None, None, None, None, None, None, None, None)

def combine(a: Options, b: Options): Options = {
val vcp = Monoid[Option[VersionConflictPolicy]].combine(a.versionConflictPolicy, b.versionConflictPolicy)
Expand All @@ -1342,7 +1353,8 @@ object Options {
val resolverType = Monoid[Option[ResolverType]].combine(a.resolverType, b.resolverType)
val strictVisibility = Monoid[Option[StrictVisibility]].combine(a.strictVisibility, b.strictVisibility)
val buildFileName = Monoid[Option[String]].combine(a.buildFileName, b.buildFileName)
Options(vcp, tpd, langs, resolvers, trans, headers, resolverCache, namePrefix, licenses, resolverType, strictVisibility, buildFileName)
val authFile = Monoid[Option[String]].combine(a.authFile, b.authFile)
Options(vcp, tpd, langs, resolvers, trans, headers, resolverCache, namePrefix, licenses, resolverType, strictVisibility, buildFileName, authFile)
}
}
}
34 changes: 34 additions & 0 deletions src/scala/com/github/johnynek/bazel_deps/Writer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,41 @@ object Writer {
}
.mkString("\n")

val ifAuth : String => String =
if(model.hasAuthFile) identity
else _ => ""

val jarArtifactImpl =
s"""${
if(model.hasAuthFile)
s"""|load("@bazel_tools//tools/build_defs/repo:utils.bzl", "read_netrc", "use_netrc")
|
|def _jar_artifact_impl(ctx):
| netrc = read_netrc(ctx, "${model.getAuthFile.get}")
| auth = use_netrc(netrc, ctx.attr.urls, {})
|""".stripMargin
else "def _jar_artifact_impl(ctx):"
}
| jar_name = "%s.jar" % ctx.name
| ctx.download(
| output = ctx.path("jar/%s" % jar_name),
| url = ctx.attr.urls,
| sha256 = ctx.attr.sha256,
| executable = False${ifAuth(",\n auth = auth")}
| )
| src_name = "%s-sources.jar" % ctx.name
| srcjar_attr = ""
| has_sources = len(ctx.attr.src_urls) != 0
| if has_sources:${ifAuth("\n src_auth = use_netrc(netrc, ctx.attr.src_urls, {})")}
| ctx.download(
| output = ctx.path("jar/%s" % src_name),
| url = ctx.attr.src_urls,
| sha256 = ctx.attr.src_sha256,
| executable = False${ifAuth(",\n auth = src_auth")}
| )""".stripMargin

s"""# Do not edit. bazel-deps autogenerates this file from $depsFile.
|$jarArtifactImpl
|$jarArtifactBackend
|
|def list_dependencies():
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,4 @@
def _jar_artifact_impl(ctx):
jar_name = "%s.jar" % ctx.name
ctx.download(
output=ctx.path("jar/%s" % jar_name),
url=ctx.attr.urls,
sha256=ctx.attr.sha256,
executable=False
)
src_name="%s-sources.jar" % ctx.name
srcjar_attr=""
has_sources = len(ctx.attr.src_urls) != 0
if has_sources:
ctx.download(
output=ctx.path("jar/%s" % src_name),
url=ctx.attr.src_urls,
sha256=ctx.attr.src_sha256,
executable=False
)
srcjar_attr ='\n srcjar = ":%s",' % src_name
srcjar_attr = '\n srcjar = ":%s",' % src_name

build_file_contents = """
package(default_visibility = ['//visibility:public'])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ object ModelGenerators {
resolverType <- Gen.option(Gen.oneOf(ResolverType.Aether, ResolverType.Coursier))
strictVisibility <- Gen.option(Gen.oneOf(StrictVisibility(true), StrictVisibility(false)))
buildFileName <- Gen.option(Gen.oneOf("BUILD", "BUILD.bazel"))
} yield Options(vcp, dir, langs, res, trans, heads, cache, prefix, licenses, resolverType, strictVisibility, buildFileName)
} yield Options(vcp, dir, langs, res, trans, heads, cache, prefix, licenses, resolverType, strictVisibility, buildFileName, None)

val modelGen: Gen[Model] = for {
o <- Gen.option(optionGen)
Expand Down
5 changes: 4 additions & 1 deletion test/scala/com/github/johnynek/bazel_deps/ParseTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class ParseTest extends FunSuite {
| resolverCache: bazel_output_base
| licenses: ["unencumbered", "permissive"]
| buildFileName: "BUILD.bazel"
| authFile: $BAZEL_NETRC
|""".stripMargin('|')

assert(Decoders.decodeModel(Yaml, str) ==
Expand Down Expand Up @@ -79,7 +80,8 @@ class ParseTest extends FunSuite {
Some(Set("unencumbered", "permissive")),
None,
None,
Some("BUILD.bazel"))))))
Some("BUILD.bazel"),
Some("$BAZEL_NETRC"))))))
}
test("parse empty subproject version") {
val str = """dependencies:
Expand Down Expand Up @@ -122,6 +124,7 @@ class ParseTest extends FunSuite {
None,
None,
None,
None,
None)))))

assert(MavenArtifactId(ArtifactOrProject("a"), Subproject("")).asString === "a")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class ParseTestCasesTest extends FunSuite {
law(model)

val model1 = Model(Dependencies.empty,Some(Replacements.empty),Some(Options(None,None,None,None,None,Some(List()),
Some(ResolverCache.Local), Some(NamePrefix("y")), None, None, None, None)))
Some(ResolverCache.Local), Some(NamePrefix("y")), None, None, None, None, None)))
//println(model1.toDoc.render(70))
law(model1)
}
Expand Down

0 comments on commit e921685

Please sign in to comment.