Rewrite plugin, use filenames in lockfile

This commit is contained in:
Tad Fisher
2024-05-17 14:52:02 -07:00
parent e83e42f9d4
commit 8d2ec45ad4
144 changed files with 8679 additions and 7507 deletions

View File

@@ -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))