From 60609dcf594f5de3574bee838ed9695bc7af95f5 Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Thu, 4 Aug 2022 21:13:36 +0300
Subject: [PATCH] fix(leiningen): Don't extract deps from commented vectors
 (#16978)

* fix(leiningen): Don't extract deps from commented vectors

* More precise detection
---
 .../manager/leiningen/__fixtures__/project.clj    |  2 ++
 lib/modules/manager/leiningen/extract.spec.ts     |  1 +
 lib/modules/manager/leiningen/extract.ts          | 15 ++++++++++++++-
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/lib/modules/manager/leiningen/__fixtures__/project.clj b/lib/modules/manager/leiningen/__fixtures__/project.clj
index 1f6714ddb5..d9e3416048 100644
--- a/lib/modules/manager/leiningen/__fixtures__/project.clj
+++ b/lib/modules/manager/leiningen/__fixtures__/project.clj
@@ -51,6 +51,7 @@
   ;; You can also strings like ["group-id/name" version] for instances
   ;; where the dependency name isn't a valid symbol literal.
   :dependencies [[org.clojure/clojure,"1.3.0"]
+                 #_[org.clojure/clojure "9.9.9"]
                  [org.jclouds/jclouds "1.0" :classifier "jdk15"]
                  [net.sf.ehcache/ehcache "2.3.1" :extension "pom"]
                  [log4j "1.2.15" :exclusions [[javax.mail/mail :extension "jar"]
@@ -59,6 +60,7 @@
                                               com.sun.jmx/jmxri]]
                  ["net.3scale/3scale-api" "3.0.2"]
                  [org.lwjgl.lwjgl/lwjgl "2.8.5"]
+                 #_[org.lwjgl.lwjgl/lwjgl "0.0.0"]
                  [org.lwjgl.lwjgl/lwjgl-platform "2.8.5"
                   :classifier "natives-osx"
                   ;; LWJGL stores natives in the root of the jar; this
diff --git a/lib/modules/manager/leiningen/extract.spec.ts b/lib/modules/manager/leiningen/extract.spec.ts
index 9ef40825c6..e6f741e7d1 100644
--- a/lib/modules/manager/leiningen/extract.spec.ts
+++ b/lib/modules/manager/leiningen/extract.spec.ts
@@ -16,6 +16,7 @@ describe('modules/manager/leiningen/extract', () => {
     expect(extractFromVectors('')).toBeEmptyArray();
     expect(extractFromVectors('[]')).toBeEmptyArray();
     expect(extractFromVectors('[[]]')).toBeEmptyArray();
+    expect(extractFromVectors('[#_[foo/bar "1.2.3"]]')).toBeEmptyArray();
     expect(extractFromVectors('[[foo/bar "1.2.3"]]')).toEqual([
       {
         datasource: ClojureDatasource.id,
diff --git a/lib/modules/manager/leiningen/extract.ts b/lib/modules/manager/leiningen/extract.ts
index 0f89e5b465..1b1e257253 100644
--- a/lib/modules/manager/leiningen/extract.ts
+++ b/lib/modules/manager/leiningen/extract.ts
@@ -35,6 +35,7 @@ export function extractFromVectors(
   let vecPos = 0;
   let artifactId = '';
   let version = '';
+  let commentLevel = 0;
 
   const isSpace = (ch: string | null): boolean =>
     !!ch && regEx(/[\s,]/).test(ch);
@@ -43,7 +44,7 @@ export function extractFromVectors(
     s.replace(regEx(/^"/), '').replace(regEx(/"$/), '');
 
   const yieldDep = (): void => {
-    if (artifactId && version) {
+    if (!commentLevel && artifactId && version) {
       const depName = expandDepName(cleanStrLiteral(artifactId));
       if (version.startsWith('~')) {
         const varName = version.replace(regEx(/^~\s*/), '');
@@ -73,6 +74,11 @@ export function extractFromVectors(
   let prevChar: string | null = null;
   while (idx < str.length) {
     const char = str.charAt(idx);
+
+    if (str.substring(idx).startsWith('#_[')) {
+      commentLevel = balance;
+    }
+
     if (char === '[') {
       balance += 1;
       if (balance === 2) {
@@ -80,6 +86,13 @@ export function extractFromVectors(
       }
     } else if (char === ']') {
       balance -= 1;
+
+      if (commentLevel === balance) {
+        artifactId = '';
+        version = '';
+        commentLevel = 0;
+      }
+
       if (balance === 1) {
         yieldDep();
       } else if (balance === 0) {
-- 
GitLab