mirror of
https://github.com/tadfisher/gradle2nix.git
synced 2026-01-12 07:50:53 -05:00
Rewrite plugin, use filenames in lockfile
This commit is contained in:
185
gradle-env.nix
185
gradle-env.nix
@@ -25,6 +25,7 @@
|
||||
, fetchs3
|
||||
, fetchurl
|
||||
, gradleGen
|
||||
, maven
|
||||
, runCommandLocal
|
||||
, symlinkJoin
|
||||
, writeText
|
||||
@@ -32,7 +33,7 @@
|
||||
}:
|
||||
|
||||
{
|
||||
# Path to the environment spec generated by gradle2nix (e.g. gradle-env.json).
|
||||
# Path to the environment spec generated by gradle2nix (e.g. gradle-env.json).
|
||||
envSpec
|
||||
, pname ? "project"
|
||||
, version ? null
|
||||
@@ -70,12 +71,12 @@
|
||||
|
||||
let
|
||||
inherit (builtins)
|
||||
attrValues concatStringsSep elemAt filter fromJSON getAttr head match
|
||||
attrValues concatStringsSep elemAt filter fromJSON getAttr hasAttr head length match
|
||||
replaceStrings sort;
|
||||
|
||||
inherit (lib)
|
||||
assertMsg concatMapStringsSep groupBy' hasSuffix hasPrefix last mapAttrs
|
||||
mapAttrsToList optionalString readFile removeSuffix unique versionAtLeast
|
||||
assertMsg concatMapStringsSep foldl' groupBy' hasSuffix hasPrefix last mapAttrs
|
||||
mapAttrsToList optionalAttrs optionalString readFile removeSuffix unique versionAtLeast
|
||||
versionOlder;
|
||||
|
||||
inherit (lib.strings) sanitizeDerivationName;
|
||||
@@ -88,6 +89,31 @@ let
|
||||
module = elemAt coords 2;
|
||||
};
|
||||
|
||||
parseVersion = version:
|
||||
let
|
||||
parts = builtins.split ":" version;
|
||||
base = elemAt parts 0;
|
||||
in
|
||||
{
|
||||
inherit base;
|
||||
exact = base;
|
||||
}
|
||||
// optionalAttrs (length parts >= 2) (
|
||||
let
|
||||
snapshot = elemAt parts 2;
|
||||
exact = replaceStrings [ "-SNAPSHOT" ] [ "-${snapshot}" ] base;
|
||||
parts = builtins.split "-" timestamp;
|
||||
timestamp = findFirst (match "[0-9]{8}\.[0-9]{6}") parts;
|
||||
buildNumber = let lastPart = last parts; in if match "[0-9]+" lastPart then lastPart else null;
|
||||
in
|
||||
{ inherit snapshot exact timestamp buildNumber; }
|
||||
);
|
||||
|
||||
snapshotVersion = { revision, snapshot ? null, ... }:
|
||||
if snapshot == null
|
||||
then revision
|
||||
else replaceStrings ["SNAPSHOT"] [snapshot] revision;
|
||||
|
||||
fetchers' = {
|
||||
http = fetchurl;
|
||||
https = fetchurl;
|
||||
@@ -105,14 +131,63 @@ let
|
||||
in
|
||||
fetch' { urls = urls'; inherit hash; };
|
||||
|
||||
mkDep = id: version: artifacts:
|
||||
mkModuleMetadata = deps:
|
||||
let
|
||||
coords = toCoordinates id;
|
||||
modulePath = "${replaceStrings ["."] ["/"] coords.group}/${coords.module}/${version}";
|
||||
metadata = group: module: versions:
|
||||
let
|
||||
latest = foldl'
|
||||
(l: v: if l == null || versionOlder l v then v else l)
|
||||
null
|
||||
versions;
|
||||
|
||||
release = foldl'
|
||||
(l: v: if !(hasSuffix "-SNAPSHOT" v) && (l == null || versionOlder l v) then v else l)
|
||||
null
|
||||
versions;
|
||||
|
||||
path = "${replaceStrings ["."] ["/"] group}/${module}/maven-metadata.xml";
|
||||
|
||||
in
|
||||
writeTextDir path ''
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata modelVersion="1.1">
|
||||
<groupId>${group}</groupId>
|
||||
<artifactId>${module}</artifactId>
|
||||
<versioning>
|
||||
${optionalString (latest != null) "<latest>${latest}</latest>"}
|
||||
${optionalString (release != null) "<release>${release}</release>"}
|
||||
<versions>
|
||||
${concatMapStringsSep "\n " (v: "<version>${v}</version>") versions}
|
||||
</versions>
|
||||
</versioning>
|
||||
</metadata>
|
||||
'';
|
||||
|
||||
groupedModules = groupBy
|
||||
({ organisation, module, ... }: "${organisation}:${module}")
|
||||
(mapAttrsToList (_: dep: dep.attrs) deps);
|
||||
|
||||
in
|
||||
map
|
||||
|
||||
|
||||
# mkSnapshotMetadata = { group, module }: version: artifacts:
|
||||
# let
|
||||
# versions' = filter (hasAttr "timestamp") versions;
|
||||
|
||||
|
||||
# in
|
||||
# map ({ base, exact, snapshot, timestamp, buildNumber }:
|
||||
|
||||
# ) versions';
|
||||
|
||||
mkModule = { attrs, artifacts }:
|
||||
let
|
||||
modulePath = "${replaceStrings ["."] ["/"] attrs.orgPath}/${attrs.module}/${attrs.revision}";
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
pname = "${coords.group}-${coords.module}";
|
||||
version = version;
|
||||
pname = "${attrs.group}-${attrs.module}";
|
||||
version = snapshotVersion attrs.revision;
|
||||
|
||||
srcs = mapAttrsToList fetch artifacts;
|
||||
|
||||
@@ -136,55 +211,8 @@ let
|
||||
allowSubstitutes = false;
|
||||
};
|
||||
|
||||
mkModule = id: versions:
|
||||
mapAttrsToList (version: artifacts: mkDep id version artifacts) versions;
|
||||
|
||||
mkModuleMetadata = id: versions:
|
||||
let
|
||||
|
||||
modules = groupBy'
|
||||
(meta: id:
|
||||
let
|
||||
isNewer = versionOlder meta.latest id.version;
|
||||
isNewerRelease =
|
||||
!(hasSuffix "-SNAPSHOT" id.version) &&
|
||||
versionOlder meta.release id.version;
|
||||
in {
|
||||
groupId = id.group;
|
||||
artifactId = id.name;
|
||||
latest = if isNewer then id.version else meta.latest;
|
||||
release = if isNewerRelease then id.version else meta.release;
|
||||
versions = meta.versions ++ [id.version];
|
||||
}
|
||||
)
|
||||
{
|
||||
latest = "";
|
||||
release = "";
|
||||
versions = [];
|
||||
}
|
||||
(id: "${replaceStrings ["."] ["/"] id.group}/${id.name}/maven-metadata.xml")
|
||||
ids;
|
||||
|
||||
in
|
||||
attrValues (mapAttrs (path: meta:
|
||||
let
|
||||
versions' = sort versionOlder (unique meta.versions);
|
||||
in
|
||||
with meta; writeTextDir path ''
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata modelVersion="1.1">
|
||||
<groupId>${groupId}</groupId>
|
||||
<artifactId>${artifactId}</artifactId>
|
||||
<versioning>
|
||||
${optionalString (latest != "") "<latest>${latest}</latest>"}
|
||||
${optionalString (release != "") "<release>${release}</release>"}
|
||||
<versions>
|
||||
${concatMapStringsSep "\n " (v: "<version>${v}</version>") versions'}
|
||||
</versions>
|
||||
</versioning>
|
||||
</metadata>
|
||||
''
|
||||
) modules);
|
||||
mkModules = deps:
|
||||
mapAttrsToList (_: m: mkModule m) deps;
|
||||
|
||||
# mkSnapshotMetadata = deps:
|
||||
# let
|
||||
@@ -254,9 +282,8 @@ let
|
||||
# ) modules);
|
||||
|
||||
mkRepo = name: deps: symlinkJoin {
|
||||
name = "${name}-gradle-env";
|
||||
# paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps;
|
||||
paths = mapAttrsToList mkModule deps;
|
||||
name = "${name}-gradle-repo";
|
||||
paths = mkModules deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps;
|
||||
};
|
||||
|
||||
mkInitScript = projectSpec: gradle:
|
||||
@@ -396,31 +423,31 @@ let
|
||||
|
||||
buildRootProject = buildProject projectEnv gradleFlags;
|
||||
|
||||
# in stdenv.mkDerivation (args // {
|
||||
# in stdenv.mkDerivation (args // {
|
||||
|
||||
# inherit pname version;
|
||||
# inherit pname version;
|
||||
|
||||
# nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ projectEnv.gradle ];
|
||||
# nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ projectEnv.gradle ];
|
||||
|
||||
# buildPhase = args.buildPhase or ''
|
||||
# runHook preBuild
|
||||
# buildPhase = args.buildPhase or ''
|
||||
# runHook preBuild
|
||||
|
||||
# (
|
||||
# set -eux
|
||||
# (
|
||||
# set -eux
|
||||
|
||||
# # Work around https://github.com/gradle/gradle/issues/1055
|
||||
# TMPHOME="$(mktemp -d)"
|
||||
# mkdir -p "$TMPHOME/init.d"
|
||||
# export GRADLE_USER_HOME="$TMPHOME"
|
||||
# # Work around https://github.com/gradle/gradle/issues/1055
|
||||
# TMPHOME="$(mktemp -d)"
|
||||
# mkdir -p "$TMPHOME/init.d"
|
||||
# export GRADLE_USER_HOME="$TMPHOME"
|
||||
|
||||
# ${buildIncludedProjects}
|
||||
# ${buildRootProject}
|
||||
# )
|
||||
# ${buildIncludedProjects}
|
||||
# ${buildRootProject}
|
||||
# )
|
||||
|
||||
# runHook postBuild
|
||||
# '';
|
||||
# runHook postBuild
|
||||
# '';
|
||||
|
||||
# dontStrip = true;
|
||||
# })
|
||||
# dontStrip = true;
|
||||
# })
|
||||
|
||||
in mkRepo pname (fromJSON (readFile envSpec))
|
||||
|
||||
Reference in New Issue
Block a user