From 39d0e5071a58a38c07fa35f6943111f1338b7de9 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sat, 23 Nov 2019 10:39:34 +0100
Subject: [PATCH] fix: safeLoad yaml in json mode to allow key duplicates

---
 lib/datasource/helm/index.js             | 2 +-
 lib/manager/gitlabci-include/extract.ts  | 2 +-
 lib/manager/helm-requirements/extract.ts | 4 ++--
 lib/manager/helm-requirements/update.ts  | 4 ++--
 lib/manager/travis/extract.ts            | 2 +-
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/lib/datasource/helm/index.js b/lib/datasource/helm/index.js
index f80da4b394..10722a2ab2 100644
--- a/lib/datasource/helm/index.js
+++ b/lib/datasource/helm/index.js
@@ -62,7 +62,7 @@ export async function getRepositoryData(repository) {
   }
   let result;
   try {
-    const doc = yaml.safeLoad(res.body);
+    const doc = yaml.safeLoad(res.body, { json: true });
     if (!doc) {
       logger.warn(`Failed to parse index.yaml from ${repository}`);
       return null;
diff --git a/lib/manager/gitlabci-include/extract.ts b/lib/manager/gitlabci-include/extract.ts
index 42cee41ae4..e403214a45 100644
--- a/lib/manager/gitlabci-include/extract.ts
+++ b/lib/manager/gitlabci-include/extract.ts
@@ -31,7 +31,7 @@ export function extractPackageFile(
 ): PackageFile | null {
   const deps: PackageDependency[] = [];
   try {
-    const doc = yaml.safeLoad(content);
+    const doc = yaml.safeLoad(content, { json: true });
     if (doc.include && is.array(doc.include)) {
       for (const includeObj of doc.include) {
         const dep = extractDepFromInclude(includeObj);
diff --git a/lib/manager/helm-requirements/extract.ts b/lib/manager/helm-requirements/extract.ts
index 6a9339764c..1cb380779e 100644
--- a/lib/manager/helm-requirements/extract.ts
+++ b/lib/manager/helm-requirements/extract.ts
@@ -18,7 +18,7 @@ export async function extractPackageFile(
       logger.debug({ fileName }, 'Failed to find helm Chart.yaml');
       return null;
     }
-    const chart = yaml.safeLoad(chartContents);
+    const chart = yaml.safeLoad(chartContents, { json: true });
     if (!(chart && chart.apiVersion && chart.name && chart.version)) {
       logger.debug(
         { fileName },
@@ -33,7 +33,7 @@ export async function extractPackageFile(
   let deps = [];
   let doc;
   try {
-    doc = yaml.safeLoad(content);
+    doc = yaml.safeLoad(content, { json: true });
   } catch (err) {
     logger.debug({ fileName }, 'Failed to parse helm requirements.yaml');
     return null;
diff --git a/lib/manager/helm-requirements/update.ts b/lib/manager/helm-requirements/update.ts
index e17c23e73c..ff0f651608 100644
--- a/lib/manager/helm-requirements/update.ts
+++ b/lib/manager/helm-requirements/update.ts
@@ -10,7 +10,7 @@ export function updateDependency(fileContent, upgrade) {
     logger.debug('Failed to update dependency, invalid upgrade');
     return fileContent;
   }
-  const doc = yaml.safeLoad(fileContent);
+  const doc = yaml.safeLoad(fileContent, { json: true });
   if (!doc || !is.array(doc.dependencies)) {
     logger.debug('Failed to update dependency, invalid requirements.yaml file');
     return fileContent;
@@ -48,7 +48,7 @@ export function updateDependency(fileContent, upgrade) {
         newString
       );
       // Compare the parsed yaml structure of old and new
-      if (_.isEqual(doc, yaml.safeLoad(testContent))) {
+      if (_.isEqual(doc, yaml.safeLoad(testContent, { json: true }))) {
         newFileContent = testContent;
         break;
       } else {
diff --git a/lib/manager/travis/extract.ts b/lib/manager/travis/extract.ts
index 554ecb7a71..302d706216 100644
--- a/lib/manager/travis/extract.ts
+++ b/lib/manager/travis/extract.ts
@@ -6,7 +6,7 @@ import { logger } from '../../logger';
 export function extractPackageFile(content: string): PackageFile | null {
   let doc;
   try {
-    doc = yaml.safeLoad(content);
+    doc = yaml.safeLoad(content, { json: true });
   } catch (err) {
     logger.warn({ err, content }, 'Failed to parse .travis.yml file.');
     return null;
-- 
GitLab