1{
2 lib,
3 fetchFromGitHub,
4 makeWrapper,
5 jdk_headless,
6 jre_minimal,
7 maven,
8 writeShellApplication,
9 curl,
10 pcre,
11 common-updater-scripts,
12 jq,
13 gnused,
14}:
15
16let
17 jre = jre_minimal.override {
18 modules = [
19 "java.base"
20 "java.logging"
21 "java.xml"
22 ];
23 jdk = jdk_headless;
24 };
25in
26maven.buildMavenPackage rec {
27 pname = "lemminx";
28 version = "0.31.0";
29
30 src = fetchFromGitHub {
31 owner = "eclipse";
32 repo = "lemminx";
33 rev = version;
34 hash = "sha256-a+9RN1265fsmYAUMuUTxA+VqJv7xPlzuc8HqoZwmR4M=";
35 # Lemminx reads this git information at runtime from a git.properties
36 # file on the classpath
37 leaveDotGit = true;
38 postFetch = ''
39 cat > $out/org.eclipse.lemminx/src/main/resources/git.properties << EOF
40 git.build.version=${version}
41 git.commit.id.abbrev=$(git -C $out rev-parse --short HEAD)
42 git.commit.message.short=$(git -C $out log -1 --pretty=format:%s)
43 git.branch=main
44 EOF
45 rm -rf $out/.git
46 '';
47 };
48
49 mvnJdk = jdk_headless;
50 mvnHash = "sha256-0KnaXr5Mmwm0pV4o5bAX0MWKl6f/cvlO6cyV9UcgXeo=";
51
52 # Disable gitcommitid plugin which needs a .git folder which we don't have.
53 # Disable failing tests which either need internet access or are flaky.
54 mvnParameters = lib.escapeShellArgs [
55 "-Dmaven.gitcommitid.skip=true"
56 "-Dtest=!XMLValidationCommandTest,
57 !XMLValidationExternalResourcesBasedOnDTDTest,
58 !XMLSchemaPublishDiagnosticsTest,
59 !PlatformTest,
60 !XMLValidationExternalResourcesBasedOnXSDTest,
61 !XMLExternalTest,
62 !XMLSchemaCompletionExtensionsTest,
63 !XMLSchemaDiagnosticsTest,
64 !MissingChildElementCodeActionTest,
65 !XSDValidationExternalResourcesTest,
66 !DocumentLifecycleParticipantTest,
67 !DTDValidationExternalResourcesTest,
68 !DTDHoverExtensionsTest,
69 !CacheResourcesManagerTest"
70 ];
71
72 installPhase = ''
73 runHook preInstall
74
75 mkdir -p $out/bin $out/share
76 install -Dm644 org.eclipse.lemminx/target/org.eclipse.lemminx-uber.jar $out/share
77
78 makeWrapper ${jre}/bin/java $out/bin/lemminx \
79 --add-flags "-jar $out/share/org.eclipse.lemminx-uber.jar"
80
81 runHook postInstall
82 '';
83
84 nativeBuildInputs = [ makeWrapper ];
85
86 passthru = {
87 updateScript =
88 let
89 pkgFile = builtins.toString ./package.nix;
90 in
91 lib.getExe (writeShellApplication {
92 name = "update-${pname}";
93 runtimeInputs = [
94 curl
95 pcre
96 common-updater-scripts
97 jq
98 gnused
99 ];
100 text = ''
101 if [ -z "''${GITHUB_TOKEN:-}" ]; then
102 echo "no GITHUB_TOKEN provided - you could meet API request limiting" >&2
103 fi
104
105 LATEST_TAG=$(curl -H "Accept: application/vnd.github+json" \
106 ''${GITHUB_TOKEN:+-H "Authorization: bearer $GITHUB_TOKEN"} \
107 -Lsf https://api.github.com/repos/${src.owner}/${src.repo}/tags | \
108 jq -r '[.[] | select(.name | test("^[0-9]"))] | sort_by(.name | split(".") |
109 map(tonumber)) | reverse | .[0].name')
110 update-source-version ${pname} "$LATEST_TAG"
111 sed -i '0,/mvnHash *= *"[^"]*"/{s/mvnHash = "[^"]*"/mvnHash = ""/}' ${pkgFile}
112
113 echo -e "\nFetching all mvn dependencies to calculate the mvnHash. This may take a while ..."
114 nix-build -A ${pname}.fetchedMavenDeps 2> ${pname}-stderr.log || true
115
116 NEW_MVN_HASH=$(grep "got:" ${pname}-stderr.log | awk '{print ''$2}')
117 rm ${pname}-stderr.log
118 # escaping double quotes looks ugly but is needed for variable substitution
119 # use # instead of / as separator because the sha256 might contain the / character
120 sed -i "0,/mvnHash *= *\"[^\"]*\"/{s#mvnHash = \"[^\"]*\"#mvnHash = \"$NEW_MVN_HASH\"#}" ${pkgFile}
121 '';
122 });
123 };
124
125 meta = with lib; {
126 description = "XML Language Server";
127 mainProgram = "lemminx";
128 homepage = "https://github.com/eclipse/lemminx";
129 license = licenses.epl20;
130 maintainers = with maintainers; [ tricktron ];
131 };
132}