diff --git a/lib/modules/platform/gerrit/client.spec.ts b/lib/modules/platform/gerrit/client.spec.ts index 9ebdc67b7a8ed3f6c836beee0bc8aa3b9dfc4db1..dbae6713445b6e3a475c03ce2ff7a5e52a78eaa3 100644 --- a/lib/modules/platform/gerrit/client.spec.ts +++ b/lib/modules/platform/gerrit/client.spec.ts @@ -118,6 +118,22 @@ describe('modules/platform/gerrit/client', () => { prTitle: 'fix(deps): update dependency react-router-dom to v6.21.2', }, ], + [ + 'message:"fix(deps): update dependency react-router-dom to ~> v6.21.2"', + { + branchName: 'dependency-xyz', + prTitle: + 'fix(deps): update dependency react-router-dom to ~> "v6.21.2"', + }, + ], + [ + 'message:"fix(deps): update dependency react-router-dom to ~> v6.21.2"', + { + branchName: 'dependency-xyz', + prTitle: + 'fix(deps): "update dependency react-router-dom to ~> "v6.21.2""', + }, + ], ])( 'query contains %p', async (expectedQueryPart: string, config: GerritFindPRConfig) => { diff --git a/lib/modules/platform/gerrit/client.ts b/lib/modules/platform/gerrit/client.ts index 087d27097c72f3a625ff01ff268f43f7f10d7fdb..ff11a0a69f8bcc61cf8549ce320ec9822dc81b37 100644 --- a/lib/modules/platform/gerrit/client.ts +++ b/lib/modules/platform/gerrit/client.ts @@ -1,6 +1,7 @@ import { REPOSITORY_ARCHIVED } from '../../../constants/error-messages'; import { logger } from '../../../logger'; import { GerritHttp } from '../../../util/http/gerrit'; +import { regEx } from '../../../util/regex'; import type { GerritAccountInfo, GerritBranchInfo, @@ -12,6 +13,8 @@ import type { } from './types'; import { mapPrStateToGerritFilter } from './utils'; +const QUOTES_REGEX = regEx('"', 'g'); + class GerritClient { private requestDetails = [ 'SUBMITTABLE', //include the submittable field in ChangeInfo, which can be used to tell if the change is reviewed and ready for submit. @@ -235,8 +238,10 @@ class GerritClient { filters.push(`label:Code-Review=${searchConfig.label}`); } if (searchConfig.prTitle) { + // escaping support in Gerrit is not great, so we need to remove quotes + // special characters are ignored anyway in the search so it does not create any issues filters.push( - `message:${encodeURIComponent('"' + searchConfig.prTitle + '"')}`, + `message:${encodeURIComponent('"' + searchConfig.prTitle.replace(QUOTES_REGEX, '') + '"')}`, ); } return filters;