From 628b66ffbfc58f0c0fb453b895c7a942c9155a28 Mon Sep 17 00:00:00 2001
From: Sergio Zharinov <zharinov@users.noreply.github.com>
Date: Mon, 5 Aug 2019 17:00:16 +0400
Subject: [PATCH] fix(maven): Fix cyclic parents chain resolution (#4215)

---
 lib/manager/maven/extract.ts                        | 13 ++++++++++---
 test/manager/maven/__snapshots__/index.spec.ts.snap |  1 +
 test/manager/maven/_fixtures/parent.pom.xml         |  7 +++++++
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/lib/manager/maven/extract.ts b/lib/manager/maven/extract.ts
index bf535024ef..bfd5057152 100644
--- a/lib/manager/maven/extract.ts
+++ b/lib/manager/maven/extract.ts
@@ -179,8 +179,9 @@ export function extractPackage(rawContent: string, packageFile: string = null) {
     });
   }
 
-  const parentPath = project.valueWithPath('parent.relativePath');
-  if (parentPath) {
+  if (packageFile && project.childNamed('parent')) {
+    const parentPath =
+      project.valueWithPath('parent.relativePath') || '../pom.xml';
     result.parent = resolveParentFile(packageFile, parentPath);
   }
 
@@ -204,10 +205,16 @@ export function resolveProps(packages: PackageFile[]): PackageFile[] {
   // which allows inheritance/overriding.
   packageFileNames.forEach(name => {
     const hierarchy: Record<string, MavenProp>[] = [];
+    const alreadyExtracted: Record<string, boolean> = {};
     let pkg = extractedPackages[name];
     while (pkg) {
       hierarchy.unshift(pkg.mavenProps);
-      pkg = extractedPackages[pkg.parent];
+      if (pkg.parent && !alreadyExtracted[pkg.parent]) {
+        alreadyExtracted[pkg.parent] = true;
+        pkg = extractedPackages[pkg.parent];
+      } else {
+        pkg = null;
+      }
     }
     hierarchy.unshift({});
     // @ts-ignore
diff --git a/test/manager/maven/__snapshots__/index.spec.ts.snap b/test/manager/maven/__snapshots__/index.spec.ts.snap
index c9dc7c4655..0c5c78c660 100644
--- a/test/manager/maven/__snapshots__/index.spec.ts.snap
+++ b/test/manager/maven/__snapshots__/index.spec.ts.snap
@@ -143,6 +143,7 @@ Array [
       },
     ],
     "packageFile": "random.pom.xml",
+    "parent": "../pom.xml",
   },
 ]
 `;
diff --git a/test/manager/maven/_fixtures/parent.pom.xml b/test/manager/maven/_fixtures/parent.pom.xml
index 2da5281232..aea9626f8e 100644
--- a/test/manager/maven/_fixtures/parent.pom.xml
+++ b/test/manager/maven/_fixtures/parent.pom.xml
@@ -1,5 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0">
+  <parent>
+    <groupId>org.example</groupId>
+    <artifactId>child</artifactId>
+    <version>42</version>
+    <relativePath>child.pom.xml</relativePath>
+  </parent>
+
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.example</groupId>
   <artifactId>ExamplePomParent</artifactId>
-- 
GitLab