renovate 44.85.0 → 44.85.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,10 +34,11 @@ declare const REPOSITORY_FORKED = "fork";
34
34
  declare const REPOSITORY_MIRRORED = "mirror";
35
35
  declare const REPOSITORY_NOT_FOUND = "not-found";
36
36
  declare const REPOSITORY_NO_PACKAGE_FILES = "no-package-files";
37
+ declare const REPOSITORY_PENDING_DELETION = "pending-deletion";
37
38
  declare const REPOSITORY_RENAMED = "renamed";
38
39
  declare const REPOSITORY_UNINITIATED = "uninitiated";
39
40
  /** cause repo to be considered as disabled */
40
- declare const RepositoryErrors: readonly ["forbidden", "archived", "blocked", "cannot-fork", "disabled", "disabled-closed-onboarding", "disabled-by-config", "disabled-no-config", "empty", "fork-missing", "fork-mode-forked", "fork", "mirror", "not-found", "no-package-files", "renamed", "uninitiated"];
41
+ declare const RepositoryErrors: readonly ["forbidden", "archived", "blocked", "cannot-fork", "disabled", "disabled-closed-onboarding", "disabled-by-config", "disabled-no-config", "empty", "fork-missing", "fork-mode-forked", "fork", "mirror", "not-found", "no-package-files", "pending-deletion", "renamed", "uninitiated"];
41
42
  declare const REPOSITORY_CHANGED = "repository-changed";
42
43
  declare const TEMPORARY_ERROR = "temporary-error";
43
44
  declare const NO_VULNERABILITY_ALERTS = "no-vulnerability-alerts";
@@ -58,5 +59,5 @@ declare const MISSING_API_CREDENTIALS = "missing-api-credentials";
58
59
  /** Logger not initialized */
59
60
  declare const LOGGER_NOT_INITIALIZED = "logger-not-initialized";
60
61
  //#endregion
61
- export { BUNDLER_INVALID_CREDENTIALS, CONFIG_GIT_URL_UNAVAILABLE, CONFIG_INHERIT_NOT_FOUND, CONFIG_INHERIT_PARSE_ERROR, CONFIG_PRESETS_INVALID, CONFIG_SECRETS_EXPOSED, CONFIG_SECRETS_INVALID, CONFIG_VALIDATION, CONFIG_VARIABLES_INVALID, ConfigErrors, EXTERNAL_HOST_ERROR, FILE_ACCESS_VIOLATION_ERROR, HOST_BLOCKED, HOST_DISABLED, IGNORABLE_HOST_ERROR, INVALID_PATH, LOGGER_NOT_INITIALIZED, MANAGER_LOCKFILE_ERROR, MISSING_API_CREDENTIALS, NO_VULNERABILITY_ALERTS, PAGE_NOT_FOUND_ERROR, PLATFORM_AUTHENTICATION_ERROR, PLATFORM_BAD_CREDENTIALS, PLATFORM_GPG_FAILED, PLATFORM_INTEGRATION_UNAUTHORIZED, PLATFORM_NOT_FOUND, PLATFORM_RATE_LIMIT_EXCEEDED, PLATFORM_UNKNOWN_ERROR, PR_ALREADY_IN_MERGE_QUEUE, PlatformErrors, REPOSITORY_ACCESS_FORBIDDEN, REPOSITORY_ARCHIVED, REPOSITORY_BLOCKED, REPOSITORY_CANNOT_FORK, REPOSITORY_CHANGED, REPOSITORY_CLOSED_ONBOARDING, REPOSITORY_DISABLED, REPOSITORY_DISABLED_BY_CONFIG, REPOSITORY_EMPTY, REPOSITORY_FORKED, REPOSITORY_FORK_MISSING, REPOSITORY_FORK_MODE_FORKED, REPOSITORY_MIRRORED, REPOSITORY_NOT_FOUND, REPOSITORY_NO_CONFIG, REPOSITORY_NO_PACKAGE_FILES, REPOSITORY_RENAMED, REPOSITORY_UNINITIATED, RepositoryErrors, SYSTEM_INSUFFICIENT_DISK_SPACE, SYSTEM_INSUFFICIENT_MEMORY, SystemErrors, TEMPORARY_ERROR, TemporaryErrors, UNKNOWN_ERROR, WORKER_FILE_UPDATE_FAILED };
62
+ export { BUNDLER_INVALID_CREDENTIALS, CONFIG_GIT_URL_UNAVAILABLE, CONFIG_INHERIT_NOT_FOUND, CONFIG_INHERIT_PARSE_ERROR, CONFIG_PRESETS_INVALID, CONFIG_SECRETS_EXPOSED, CONFIG_SECRETS_INVALID, CONFIG_VALIDATION, CONFIG_VARIABLES_INVALID, ConfigErrors, EXTERNAL_HOST_ERROR, FILE_ACCESS_VIOLATION_ERROR, HOST_BLOCKED, HOST_DISABLED, IGNORABLE_HOST_ERROR, INVALID_PATH, LOGGER_NOT_INITIALIZED, MANAGER_LOCKFILE_ERROR, MISSING_API_CREDENTIALS, NO_VULNERABILITY_ALERTS, PAGE_NOT_FOUND_ERROR, PLATFORM_AUTHENTICATION_ERROR, PLATFORM_BAD_CREDENTIALS, PLATFORM_GPG_FAILED, PLATFORM_INTEGRATION_UNAUTHORIZED, PLATFORM_NOT_FOUND, PLATFORM_RATE_LIMIT_EXCEEDED, PLATFORM_UNKNOWN_ERROR, PR_ALREADY_IN_MERGE_QUEUE, PlatformErrors, REPOSITORY_ACCESS_FORBIDDEN, REPOSITORY_ARCHIVED, REPOSITORY_BLOCKED, REPOSITORY_CANNOT_FORK, REPOSITORY_CHANGED, REPOSITORY_CLOSED_ONBOARDING, REPOSITORY_DISABLED, REPOSITORY_DISABLED_BY_CONFIG, REPOSITORY_EMPTY, REPOSITORY_FORKED, REPOSITORY_FORK_MISSING, REPOSITORY_FORK_MODE_FORKED, REPOSITORY_MIRRORED, REPOSITORY_NOT_FOUND, REPOSITORY_NO_CONFIG, REPOSITORY_NO_PACKAGE_FILES, REPOSITORY_PENDING_DELETION, REPOSITORY_RENAMED, REPOSITORY_UNINITIATED, RepositoryErrors, SYSTEM_INSUFFICIENT_DISK_SPACE, SYSTEM_INSUFFICIENT_MEMORY, SystemErrors, TEMPORARY_ERROR, TemporaryErrors, UNKNOWN_ERROR, WORKER_FILE_UPDATE_FAILED };
62
63
  //# sourceMappingURL=error-messages.d.ts.map
@@ -51,6 +51,7 @@ const REPOSITORY_FORKED = "fork";
51
51
  const REPOSITORY_MIRRORED = "mirror";
52
52
  const REPOSITORY_NOT_FOUND = "not-found";
53
53
  const REPOSITORY_NO_PACKAGE_FILES = "no-package-files";
54
+ const REPOSITORY_PENDING_DELETION = "pending-deletion";
54
55
  const REPOSITORY_RENAMED = "renamed";
55
56
  const REPOSITORY_UNINITIATED = "uninitiated";
56
57
  /** cause repo to be considered as disabled */
@@ -70,6 +71,7 @@ const RepositoryErrors = [
70
71
  REPOSITORY_MIRRORED,
71
72
  REPOSITORY_NOT_FOUND,
72
73
  REPOSITORY_NO_PACKAGE_FILES,
74
+ REPOSITORY_PENDING_DELETION,
73
75
  REPOSITORY_RENAMED,
74
76
  REPOSITORY_UNINITIATED
75
77
  ];
@@ -97,6 +99,6 @@ const MISSING_API_CREDENTIALS = "missing-api-credentials";
97
99
  /** Logger not initialized */
98
100
  const LOGGER_NOT_INITIALIZED = "logger-not-initialized";
99
101
  //#endregion
100
- export { BUNDLER_INVALID_CREDENTIALS, CONFIG_GIT_URL_UNAVAILABLE, CONFIG_INHERIT_NOT_FOUND, CONFIG_INHERIT_PARSE_ERROR, CONFIG_PRESETS_INVALID, CONFIG_SECRETS_EXPOSED, CONFIG_SECRETS_INVALID, CONFIG_VALIDATION, CONFIG_VARIABLES_INVALID, ConfigErrors, EXTERNAL_HOST_ERROR, FILE_ACCESS_VIOLATION_ERROR, HOST_BLOCKED, HOST_DISABLED, IGNORABLE_HOST_ERROR, INVALID_PATH, LOGGER_NOT_INITIALIZED, MANAGER_LOCKFILE_ERROR, MISSING_API_CREDENTIALS, NO_VULNERABILITY_ALERTS, PAGE_NOT_FOUND_ERROR, PLATFORM_AUTHENTICATION_ERROR, PLATFORM_BAD_CREDENTIALS, PLATFORM_GPG_FAILED, PLATFORM_INTEGRATION_UNAUTHORIZED, PLATFORM_NOT_FOUND, PLATFORM_RATE_LIMIT_EXCEEDED, PLATFORM_UNKNOWN_ERROR, PR_ALREADY_IN_MERGE_QUEUE, PlatformErrors, REPOSITORY_ACCESS_FORBIDDEN, REPOSITORY_ARCHIVED, REPOSITORY_BLOCKED, REPOSITORY_CANNOT_FORK, REPOSITORY_CHANGED, REPOSITORY_CLOSED_ONBOARDING, REPOSITORY_DISABLED, REPOSITORY_DISABLED_BY_CONFIG, REPOSITORY_EMPTY, REPOSITORY_FORKED, REPOSITORY_FORK_MISSING, REPOSITORY_FORK_MODE_FORKED, REPOSITORY_MIRRORED, REPOSITORY_NOT_FOUND, REPOSITORY_NO_CONFIG, REPOSITORY_NO_PACKAGE_FILES, REPOSITORY_RENAMED, REPOSITORY_UNINITIATED, RepositoryErrors, SYSTEM_INSUFFICIENT_DISK_SPACE, SYSTEM_INSUFFICIENT_MEMORY, SystemErrors, TEMPORARY_ERROR, TemporaryErrors, UNKNOWN_ERROR, WORKER_FILE_UPDATE_FAILED };
102
+ export { BUNDLER_INVALID_CREDENTIALS, CONFIG_GIT_URL_UNAVAILABLE, CONFIG_INHERIT_NOT_FOUND, CONFIG_INHERIT_PARSE_ERROR, CONFIG_PRESETS_INVALID, CONFIG_SECRETS_EXPOSED, CONFIG_SECRETS_INVALID, CONFIG_VALIDATION, CONFIG_VARIABLES_INVALID, ConfigErrors, EXTERNAL_HOST_ERROR, FILE_ACCESS_VIOLATION_ERROR, HOST_BLOCKED, HOST_DISABLED, IGNORABLE_HOST_ERROR, INVALID_PATH, LOGGER_NOT_INITIALIZED, MANAGER_LOCKFILE_ERROR, MISSING_API_CREDENTIALS, NO_VULNERABILITY_ALERTS, PAGE_NOT_FOUND_ERROR, PLATFORM_AUTHENTICATION_ERROR, PLATFORM_BAD_CREDENTIALS, PLATFORM_GPG_FAILED, PLATFORM_INTEGRATION_UNAUTHORIZED, PLATFORM_NOT_FOUND, PLATFORM_RATE_LIMIT_EXCEEDED, PLATFORM_UNKNOWN_ERROR, PR_ALREADY_IN_MERGE_QUEUE, PlatformErrors, REPOSITORY_ACCESS_FORBIDDEN, REPOSITORY_ARCHIVED, REPOSITORY_BLOCKED, REPOSITORY_CANNOT_FORK, REPOSITORY_CHANGED, REPOSITORY_CLOSED_ONBOARDING, REPOSITORY_DISABLED, REPOSITORY_DISABLED_BY_CONFIG, REPOSITORY_EMPTY, REPOSITORY_FORKED, REPOSITORY_FORK_MISSING, REPOSITORY_FORK_MODE_FORKED, REPOSITORY_MIRRORED, REPOSITORY_NOT_FOUND, REPOSITORY_NO_CONFIG, REPOSITORY_NO_PACKAGE_FILES, REPOSITORY_PENDING_DELETION, REPOSITORY_RENAMED, REPOSITORY_UNINITIATED, RepositoryErrors, SYSTEM_INSUFFICIENT_DISK_SPACE, SYSTEM_INSUFFICIENT_MEMORY, SystemErrors, TEMPORARY_ERROR, TemporaryErrors, UNKNOWN_ERROR, WORKER_FILE_UPDATE_FAILED };
101
103
 
102
104
  //# sourceMappingURL=error-messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-messages.js","names":[],"sources":["../../lib/constants/error-messages.ts"],"sourcesContent":["// System error\nexport const SYSTEM_INSUFFICIENT_DISK_SPACE = 'disk-space';\nexport const SYSTEM_INSUFFICIENT_MEMORY = 'out-of-memory';\n\nexport const SystemErrors = [\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n SYSTEM_INSUFFICIENT_MEMORY,\n] as const;\n\n// Platform Error\nexport const PLATFORM_AUTHENTICATION_ERROR = 'authentication-error';\nexport const PLATFORM_BAD_CREDENTIALS = 'bad-credentials';\nexport const PLATFORM_GPG_FAILED = 'gpg-failed';\nexport const PLATFORM_INTEGRATION_UNAUTHORIZED = 'integration-unauthorized';\nexport const PLATFORM_NOT_FOUND = 'platform-not-found';\nexport const PLATFORM_RATE_LIMIT_EXCEEDED = 'rate-limit-exceeded';\nexport const PLATFORM_UNKNOWN_ERROR = 'platform-unknown-error';\n\nexport const PlatformErrors = [\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_GPG_FAILED,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_NOT_FOUND,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n PLATFORM_UNKNOWN_ERROR,\n] as const;\n\n// Config Error\nexport const CONFIG_VALIDATION = 'config-validation';\nexport const CONFIG_PRESETS_INVALID = 'config-presets-invalid';\nexport const CONFIG_SECRETS_EXPOSED = 'config-secrets-exposed';\nexport const CONFIG_SECRETS_INVALID = 'config-secrets-invalid';\nexport const CONFIG_VARIABLES_INVALID = 'config-variables-invalid';\nexport const CONFIG_GIT_URL_UNAVAILABLE = 'config-git-url-unavailable';\nexport const CONFIG_INHERIT_NOT_FOUND = 'config-inherit-not-found';\nexport const CONFIG_INHERIT_PARSE_ERROR = 'config-inherit-parse-error';\n\nexport const ConfigErrors = [\n CONFIG_VALIDATION,\n CONFIG_PRESETS_INVALID,\n CONFIG_SECRETS_EXPOSED,\n CONFIG_SECRETS_INVALID,\n CONFIG_VARIABLES_INVALID,\n CONFIG_GIT_URL_UNAVAILABLE,\n CONFIG_INHERIT_NOT_FOUND,\n CONFIG_INHERIT_PARSE_ERROR,\n] as const;\n\n// Repository Errors - causes repo to be considered as disabled\nexport const REPOSITORY_ACCESS_FORBIDDEN = 'forbidden';\nexport const REPOSITORY_ARCHIVED = 'archived';\nexport const REPOSITORY_BLOCKED = 'blocked';\nexport const REPOSITORY_CANNOT_FORK = 'cannot-fork';\nexport const REPOSITORY_DISABLED = 'disabled';\nexport const REPOSITORY_CLOSED_ONBOARDING = 'disabled-closed-onboarding';\nexport const REPOSITORY_DISABLED_BY_CONFIG = 'disabled-by-config';\nexport const REPOSITORY_NO_CONFIG = 'disabled-no-config';\nexport const REPOSITORY_EMPTY = 'empty';\nexport const REPOSITORY_FORK_MISSING = 'fork-missing';\nexport const REPOSITORY_FORK_MODE_FORKED = 'fork-mode-forked';\nexport const REPOSITORY_FORKED = 'fork';\nexport const REPOSITORY_MIRRORED = 'mirror';\nexport const REPOSITORY_NOT_FOUND = 'not-found';\nexport const REPOSITORY_NO_PACKAGE_FILES = 'no-package-files';\nexport const REPOSITORY_RENAMED = 'renamed';\nexport const REPOSITORY_UNINITIATED = 'uninitiated';\n\n/** cause repo to be considered as disabled */\nexport const RepositoryErrors = [\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CANNOT_FORK,\n REPOSITORY_DISABLED,\n REPOSITORY_CLOSED_ONBOARDING,\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_NO_CONFIG,\n REPOSITORY_EMPTY,\n REPOSITORY_FORK_MISSING,\n REPOSITORY_FORK_MODE_FORKED,\n REPOSITORY_FORKED,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n REPOSITORY_NO_PACKAGE_FILES,\n REPOSITORY_RENAMED,\n REPOSITORY_UNINITIATED,\n] as const;\n\n// Temporary Error\nexport const REPOSITORY_CHANGED = 'repository-changed';\nexport const TEMPORARY_ERROR = 'temporary-error';\nexport const NO_VULNERABILITY_ALERTS = 'no-vulnerability-alerts';\n\nexport const TemporaryErrors = [\n REPOSITORY_CHANGED,\n TEMPORARY_ERROR,\n NO_VULNERABILITY_ALERTS,\n] as const;\n\n// Manager Error\nexport const MANAGER_LOCKFILE_ERROR = 'lockfile-error';\nexport const FILE_ACCESS_VIOLATION_ERROR = 'file-access-violation-error';\n\n// Host error\nexport const EXTERNAL_HOST_ERROR = 'external-host-error';\nexport const IGNORABLE_HOST_ERROR = 'ignorable-host-error';\nexport const HOST_BLOCKED = 'host-blocked';\nexport const HOST_DISABLED = 'host-disabled';\n\n// Worker Error\nexport const WORKER_FILE_UPDATE_FAILED = 'update-failure';\n\n// PR Error\nexport const PR_ALREADY_IN_MERGE_QUEUE = 'pr-already-in-merge-queue';\n\n// Bundler Error\nexport const BUNDLER_INVALID_CREDENTIALS = 'bundler-credentials';\n\n// Unknown Error\nexport const UNKNOWN_ERROR = 'unknown-error';\n\n// PATH Error\nexport const INVALID_PATH = 'invalid-path';\n\n// PAGE NOT FOUND\nexport const PAGE_NOT_FOUND_ERROR = 'page-not-found';\n\n// Missing API required credentials\nexport const MISSING_API_CREDENTIALS = 'missing-api-credentials';\n\n/** Logger not initialized */\nexport const LOGGER_NOT_INITIALIZED = 'logger-not-initialized';\n"],"mappings":";AACA,MAAa,iCAAiC;AAC9C,MAAa,6BAA6B;AAE1C,MAAa,eAAe,CAC1B,gCACA,0BACF;AAGA,MAAa,gCAAgC;AAC7C,MAAa,2BAA2B;AACxC,MAAa,sBAAsB;AACnC,MAAa,oCAAoC;AACjD,MAAa,qBAAqB;AAClC,MAAa,+BAA+B;AAC5C,MAAa,yBAAyB;AAEtC,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,oBAAoB;AACjC,MAAa,yBAAyB;AACtC,MAAa,yBAAyB;AACtC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAE1C,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,8BAA8B;AAC3C,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,sBAAsB;AACnC,MAAa,+BAA+B;AAC5C,MAAa,gCAAgC;AAC7C,MAAa,uBAAuB;AACpC,MAAa,mBAAmB;AAChC,MAAa,0BAA0B;AACvC,MAAa,8BAA8B;AAC3C,MAAa,oBAAoB;AACjC,MAAa,sBAAsB;AACnC,MAAa,uBAAuB;AACpC,MAAa,8BAA8B;AAC3C,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;;AAGtC,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,qBAAqB;AAClC,MAAa,kBAAkB;AAC/B,MAAa,0BAA0B;AAEvC,MAAa,kBAAkB;CAC7B;CACA;CACA;AACF;AAGA,MAAa,yBAAyB;AACtC,MAAa,8BAA8B;AAG3C,MAAa,sBAAsB;AACnC,MAAa,uBAAuB;AACpC,MAAa,eAAe;AAC5B,MAAa,gBAAgB;AAG7B,MAAa,4BAA4B;AAGzC,MAAa,4BAA4B;AAGzC,MAAa,8BAA8B;AAG3C,MAAa,gBAAgB;AAG7B,MAAa,eAAe;AAG5B,MAAa,uBAAuB;AAGpC,MAAa,0BAA0B;;AAGvC,MAAa,yBAAyB"}
1
+ {"version":3,"file":"error-messages.js","names":[],"sources":["../../lib/constants/error-messages.ts"],"sourcesContent":["// System error\nexport const SYSTEM_INSUFFICIENT_DISK_SPACE = 'disk-space';\nexport const SYSTEM_INSUFFICIENT_MEMORY = 'out-of-memory';\n\nexport const SystemErrors = [\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n SYSTEM_INSUFFICIENT_MEMORY,\n] as const;\n\n// Platform Error\nexport const PLATFORM_AUTHENTICATION_ERROR = 'authentication-error';\nexport const PLATFORM_BAD_CREDENTIALS = 'bad-credentials';\nexport const PLATFORM_GPG_FAILED = 'gpg-failed';\nexport const PLATFORM_INTEGRATION_UNAUTHORIZED = 'integration-unauthorized';\nexport const PLATFORM_NOT_FOUND = 'platform-not-found';\nexport const PLATFORM_RATE_LIMIT_EXCEEDED = 'rate-limit-exceeded';\nexport const PLATFORM_UNKNOWN_ERROR = 'platform-unknown-error';\n\nexport const PlatformErrors = [\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_GPG_FAILED,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_NOT_FOUND,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n PLATFORM_UNKNOWN_ERROR,\n] as const;\n\n// Config Error\nexport const CONFIG_VALIDATION = 'config-validation';\nexport const CONFIG_PRESETS_INVALID = 'config-presets-invalid';\nexport const CONFIG_SECRETS_EXPOSED = 'config-secrets-exposed';\nexport const CONFIG_SECRETS_INVALID = 'config-secrets-invalid';\nexport const CONFIG_VARIABLES_INVALID = 'config-variables-invalid';\nexport const CONFIG_GIT_URL_UNAVAILABLE = 'config-git-url-unavailable';\nexport const CONFIG_INHERIT_NOT_FOUND = 'config-inherit-not-found';\nexport const CONFIG_INHERIT_PARSE_ERROR = 'config-inherit-parse-error';\n\nexport const ConfigErrors = [\n CONFIG_VALIDATION,\n CONFIG_PRESETS_INVALID,\n CONFIG_SECRETS_EXPOSED,\n CONFIG_SECRETS_INVALID,\n CONFIG_VARIABLES_INVALID,\n CONFIG_GIT_URL_UNAVAILABLE,\n CONFIG_INHERIT_NOT_FOUND,\n CONFIG_INHERIT_PARSE_ERROR,\n] as const;\n\n// Repository Errors - causes repo to be considered as disabled\nexport const REPOSITORY_ACCESS_FORBIDDEN = 'forbidden';\nexport const REPOSITORY_ARCHIVED = 'archived';\nexport const REPOSITORY_BLOCKED = 'blocked';\nexport const REPOSITORY_CANNOT_FORK = 'cannot-fork';\nexport const REPOSITORY_DISABLED = 'disabled';\nexport const REPOSITORY_CLOSED_ONBOARDING = 'disabled-closed-onboarding';\nexport const REPOSITORY_DISABLED_BY_CONFIG = 'disabled-by-config';\nexport const REPOSITORY_NO_CONFIG = 'disabled-no-config';\nexport const REPOSITORY_EMPTY = 'empty';\nexport const REPOSITORY_FORK_MISSING = 'fork-missing';\nexport const REPOSITORY_FORK_MODE_FORKED = 'fork-mode-forked';\nexport const REPOSITORY_FORKED = 'fork';\nexport const REPOSITORY_MIRRORED = 'mirror';\nexport const REPOSITORY_NOT_FOUND = 'not-found';\nexport const REPOSITORY_NO_PACKAGE_FILES = 'no-package-files';\nexport const REPOSITORY_PENDING_DELETION = 'pending-deletion';\nexport const REPOSITORY_RENAMED = 'renamed';\nexport const REPOSITORY_UNINITIATED = 'uninitiated';\n\n/** cause repo to be considered as disabled */\nexport const RepositoryErrors = [\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CANNOT_FORK,\n REPOSITORY_DISABLED,\n REPOSITORY_CLOSED_ONBOARDING,\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_NO_CONFIG,\n REPOSITORY_EMPTY,\n REPOSITORY_FORK_MISSING,\n REPOSITORY_FORK_MODE_FORKED,\n REPOSITORY_FORKED,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n REPOSITORY_NO_PACKAGE_FILES,\n REPOSITORY_PENDING_DELETION,\n REPOSITORY_RENAMED,\n REPOSITORY_UNINITIATED,\n] as const;\n\n// Temporary Error\nexport const REPOSITORY_CHANGED = 'repository-changed';\nexport const TEMPORARY_ERROR = 'temporary-error';\nexport const NO_VULNERABILITY_ALERTS = 'no-vulnerability-alerts';\n\nexport const TemporaryErrors = [\n REPOSITORY_CHANGED,\n TEMPORARY_ERROR,\n NO_VULNERABILITY_ALERTS,\n] as const;\n\n// Manager Error\nexport const MANAGER_LOCKFILE_ERROR = 'lockfile-error';\nexport const FILE_ACCESS_VIOLATION_ERROR = 'file-access-violation-error';\n\n// Host error\nexport const EXTERNAL_HOST_ERROR = 'external-host-error';\nexport const IGNORABLE_HOST_ERROR = 'ignorable-host-error';\nexport const HOST_BLOCKED = 'host-blocked';\nexport const HOST_DISABLED = 'host-disabled';\n\n// Worker Error\nexport const WORKER_FILE_UPDATE_FAILED = 'update-failure';\n\n// PR Error\nexport const PR_ALREADY_IN_MERGE_QUEUE = 'pr-already-in-merge-queue';\n\n// Bundler Error\nexport const BUNDLER_INVALID_CREDENTIALS = 'bundler-credentials';\n\n// Unknown Error\nexport const UNKNOWN_ERROR = 'unknown-error';\n\n// PATH Error\nexport const INVALID_PATH = 'invalid-path';\n\n// PAGE NOT FOUND\nexport const PAGE_NOT_FOUND_ERROR = 'page-not-found';\n\n// Missing API required credentials\nexport const MISSING_API_CREDENTIALS = 'missing-api-credentials';\n\n/** Logger not initialized */\nexport const LOGGER_NOT_INITIALIZED = 'logger-not-initialized';\n"],"mappings":";AACA,MAAa,iCAAiC;AAC9C,MAAa,6BAA6B;AAE1C,MAAa,eAAe,CAC1B,gCACA,0BACF;AAGA,MAAa,gCAAgC;AAC7C,MAAa,2BAA2B;AACxC,MAAa,sBAAsB;AACnC,MAAa,oCAAoC;AACjD,MAAa,qBAAqB;AAClC,MAAa,+BAA+B;AAC5C,MAAa,yBAAyB;AAEtC,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,oBAAoB;AACjC,MAAa,yBAAyB;AACtC,MAAa,yBAAyB;AACtC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAE1C,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,8BAA8B;AAC3C,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,sBAAsB;AACnC,MAAa,+BAA+B;AAC5C,MAAa,gCAAgC;AAC7C,MAAa,uBAAuB;AACpC,MAAa,mBAAmB;AAChC,MAAa,0BAA0B;AACvC,MAAa,8BAA8B;AAC3C,MAAa,oBAAoB;AACjC,MAAa,sBAAsB;AACnC,MAAa,uBAAuB;AACpC,MAAa,8BAA8B;AAC3C,MAAa,8BAA8B;AAC3C,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;;AAGtC,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,qBAAqB;AAClC,MAAa,kBAAkB;AAC/B,MAAa,0BAA0B;AAEvC,MAAa,kBAAkB;CAC7B;CACA;CACA;AACF;AAGA,MAAa,yBAAyB;AACtC,MAAa,8BAA8B;AAG3C,MAAa,sBAAsB;AACnC,MAAa,uBAAuB;AACpC,MAAa,eAAe;AAC5B,MAAa,gBAAgB;AAG7B,MAAa,4BAA4B;AAGzC,MAAa,4BAA4B;AAGzC,MAAa,8BAA8B;AAG3C,MAAa,gBAAgB;AAG7B,MAAa,eAAe;AAG5B,MAAa,uBAAuB;AAGpC,MAAa,0BAA0B;;AAGvC,MAAa,yBAAyB"}
@@ -1,5 +1,5 @@
1
1
  import { __exportAll } from "../../../_virtual/_rolldown/runtime.js";
2
- import { REPOSITORY_ACCESS_FORBIDDEN, REPOSITORY_ARCHIVED, REPOSITORY_CHANGED, REPOSITORY_DISABLED, REPOSITORY_EMPTY, REPOSITORY_MIRRORED, REPOSITORY_NOT_FOUND, TEMPORARY_ERROR } from "../../../constants/error-messages.js";
2
+ import { REPOSITORY_ACCESS_FORBIDDEN, REPOSITORY_ARCHIVED, REPOSITORY_CHANGED, REPOSITORY_DISABLED, REPOSITORY_EMPTY, REPOSITORY_MIRRORED, REPOSITORY_NOT_FOUND, REPOSITORY_PENDING_DELETION, TEMPORARY_ERROR } from "../../../constants/error-messages.js";
3
3
  import { getEnv } from "../../../util/env.js";
4
4
  import { regEx } from "../../../util/regex.js";
5
5
  import { GlobalConfig } from "../../../config/global.js";
@@ -130,7 +130,7 @@ async function getRepos(config) {
130
130
  try {
131
131
  const repos = (await pMap(urls, (url) => gitlabApi.getJsonUnchecked(url, { paginate: true }), { concurrency: 2 })).flatMap((response) => response.body);
132
132
  logger.debug(`Discovered ${repos.length} project(s)`);
133
- return repos.filter((repo) => !repo.mirror || config?.includeMirrors).map((repo) => repo.path_with_namespace);
133
+ return repos.filter((repo) => !repo.mirror || config?.includeMirrors).filter((repo) => !repo.marked_for_deletion_at).map((repo) => repo.path_with_namespace);
134
134
  } catch (err) {
135
135
  logger.error({ err }, `GitLab getRepos error`);
136
136
  throw err;
@@ -162,6 +162,10 @@ async function initRepo({ repository, cloneSubmodules, cloneSubmodulesFilter, gi
162
162
  logger.debug("Repository is archived - throwing error to abort renovation");
163
163
  throw new Error(REPOSITORY_ARCHIVED);
164
164
  }
165
+ if (res.body.marked_for_deletion_at) {
166
+ logger.debug("Repository is marked for deletion - throwing error to abort renovation");
167
+ throw new Error(REPOSITORY_PENDING_DELETION);
168
+ }
165
169
  if (res.body.mirror && GlobalConfig.get("includeMirrors") !== true) {
166
170
  logger.debug("Repository is a mirror - throwing error to abort renovation");
167
171
  throw new Error(REPOSITORY_MIRRORED);
@@ -194,7 +198,11 @@ async function initRepo({ repository, cloneSubmodules, cloneSubmodulesFilter, gi
194
198
  } catch (err) /* v8 ignore next -- initRepo error mapping needs git-level failures not mocked in specs */ {
195
199
  logger.debug({ err }, "Caught initRepo error");
196
200
  if (err.message.includes("HEAD is not a symbolic ref")) throw new Error(REPOSITORY_EMPTY);
197
- if (["archived", "empty"].includes(err.message)) throw err;
201
+ if ([
202
+ "archived",
203
+ "empty",
204
+ "pending-deletion"
205
+ ].includes(err.message)) throw err;
198
206
  if (err.statusCode === 403) throw new Error(REPOSITORY_ACCESS_FORBIDDEN);
199
207
  if (err.statusCode === 404) throw new Error(REPOSITORY_NOT_FOUND);
200
208
  if (err.message === "disabled") throw err;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["git.initRepo","git.getBranchCommit","git.branchExists","p.all"],"sources":["../../../../lib/modules/platform/gitlab/index.ts"],"sourcesContent":["import { setTimeout } from 'node:timers/promises';\nimport {\n isArray,\n isEmptyArray,\n isNonEmptyArray,\n isString,\n} from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport semver from 'semver';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport {\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_CHANGED,\n REPOSITORY_DISABLED,\n REPOSITORY_EMPTY,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n TEMPORARY_ERROR,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { noLeadingAtSymbol, parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { GitlabHttpOptions } from '../../../util/http/gitlab.ts';\nimport { setBaseUrl } from '../../../util/http/gitlab.ts';\nimport type { HttpResponse } from '../../../util/http/types.ts';\nimport { parseInteger } from '../../../util/number.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport type { EmailAddress } from '../../../util/schema-utils/index.ts';\nimport {\n ensureTrailingSlash,\n getQueryString,\n parseUrl,\n} from '../../../util/url.ts';\nimport type {\n AutodiscoverConfig,\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformPrOptions,\n PlatformResult,\n Pr,\n ReattemptPlatformAutomergeConfig,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport {\n getMemberUserIDs,\n getMemberUsernames,\n getProjectMembersByRole,\n getUserID,\n gitlabApi,\n isUserBusy,\n} from './http.ts';\nimport { getMR, updateMR } from './merge-request.ts';\nimport { GitlabPrCache } from './pr-cache.ts';\nimport { getRoleAccessLevel } from './roles.ts';\nimport type { GitLabMergeRequest } from './schema.ts';\nimport { LastPipelineId, MergeTrainCarStatus } from './schema.ts';\nimport type {\n GitlabComment,\n GitlabIssue,\n GitlabPr,\n MergeMethod,\n RepoResponse,\n} from './types.ts';\nimport {\n DRAFT_PREFIX,\n DRAFT_PREFIX_DEPRECATED,\n defaults,\n getRepoUrl,\n prInfo,\n} from './utils.ts';\n\nexport { extractRulesFromCodeOwnersLines } from './code-owners.ts';\n\nlet config: {\n repository: string;\n email: EmailAddress;\n issueList: GitlabIssue[] | undefined;\n mergeMethod: MergeMethod;\n mergeTrainsEnabled: boolean;\n defaultBranch: string;\n cloneSubmodules: boolean | undefined;\n cloneSubmodulesFilter: string[] | undefined;\n ignorePrAuthor: boolean | undefined;\n squash: boolean;\n} = {} as any;\n\nexport function resetPlatform(): void {\n config = {} as any;\n draftPrefix = DRAFT_PREFIX;\n defaults.hostType = 'gitlab';\n defaults.endpoint = 'https://gitlab.com/api/v4/';\n defaults.version = '0.0.0';\n setBaseUrl(defaults.endpoint);\n}\n\nexport const id = 'gitlab';\n\nlet draftPrefix = DRAFT_PREFIX;\nlet botUserName: string;\n\nexport async function initPlatform({\n endpoint,\n username,\n token,\n gitAuthor,\n}: PlatformParams): Promise<PlatformResult> {\n if (!token) {\n throw new Error('Init: You must configure a GitLab personal access token');\n }\n if (!endpoint) {\n logger.debug(`Using default GitLab endpoint: ${defaults.endpoint}`);\n } else if (parseUrl(endpoint) === null) {\n throw new Error(`Invalid GitLab endpoint URL: ${endpoint}`);\n } else {\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n }\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n let gitlabVersion: string;\n try {\n if (!gitAuthor) {\n const user = (\n await gitlabApi.getJsonUnchecked<{\n email: EmailAddress;\n name: string;\n id: number;\n commit_email?: EmailAddress;\n }>(`user`, { token })\n ).body;\n platformConfig.gitAuthor = `${user.name} <${\n user.commit_email ?? user.email\n }>`;\n botUserName = user.name;\n }\n const env = getEnv();\n /* v8 ignore next: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n gitlabVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } else {\n const version = (\n await gitlabApi.getJsonUnchecked<{ version: string }>('version', {\n token,\n })\n ).body;\n gitlabVersion = version.version;\n }\n logger.debug(`GitLab version is: ${gitlabVersion}`);\n // version is 'x.y.z-edition', so not strictly semver; need to strip edition\n [gitlabVersion] = gitlabVersion.split('-');\n defaults.version = gitlabVersion;\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with GitLab. Check that your token includes \"api\" permissions',\n );\n throw new Error('Init: Authentication failure');\n }\n draftPrefix = semver.lt(defaults.version, '13.2.0')\n ? DRAFT_PREFIX_DEPRECATED\n : DRAFT_PREFIX;\n\n botUserName ??= username!;\n\n return platformConfig;\n}\n\n// Get all repositories that the user has access to\nexport async function getRepos(config?: AutodiscoverConfig): Promise<string[]> {\n logger.debug('Autodiscovering GitLab repositories');\n\n const queryParams: Record<string, any> = {\n membership: true,\n per_page: 100,\n with_merge_requests_enabled: true,\n min_access_level: 30,\n archived: false,\n ...(config?.sort && { order_by: config.sort }),\n ...(config?.order && { sort: config.order }),\n };\n if (config?.topics?.length) {\n queryParams.topic = config.topics.join(',');\n }\n\n const urls = [];\n if (config?.namespaces?.length) {\n queryParams.with_shared = false;\n queryParams.include_subgroups = true;\n urls.push(\n ...config.namespaces.map(\n (namespace) =>\n `groups/${urlEscape(namespace)}/projects?${getQueryString(\n queryParams,\n )}`,\n ),\n );\n } else {\n urls.push(`projects?${getQueryString(queryParams)}`);\n }\n\n try {\n const repos = (\n await pMap(\n urls,\n (url) =>\n gitlabApi.getJsonUnchecked<RepoResponse[]>(url, {\n paginate: true,\n }),\n {\n concurrency: 2,\n },\n )\n ).flatMap((response) => response.body);\n\n logger.debug(`Discovered ${repos.length} project(s)`);\n return repos\n .filter((repo) => !repo.mirror || config?.includeMirrors)\n .map((repo) => repo.path_with_namespace);\n } catch (err) {\n logger.error({ err }, `GitLab getRepos error`);\n throw err;\n }\n}\n\nfunction urlEscape(str: string): string;\nfunction urlEscape(str: string | undefined): string | undefined;\nfunction urlEscape(str: string | undefined): string | undefined {\n return str?.replace(regEx(/\\//g), '%2F');\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const escapedFileName = urlEscape(fileName);\n const repo = urlEscape(repoName) ?? config.repository;\n const url = `projects/${repo}/repository/files/${escapedFileName}?ref=${branchOrTag ?? `HEAD`}`;\n const res = await gitlabApi.getJsonUnchecked<{ content: string }>(url, {\n cacheProvider: memCacheProvider,\n });\n const buf = res.body.content;\n const str = Buffer.from(buf, 'base64').toString();\n return str;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\n// Initialize GitLab by getting base branch\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n config = {} as any;\n config.repository = urlEscape(repository);\n config.cloneSubmodules = cloneSubmodules;\n config.cloneSubmodulesFilter = cloneSubmodulesFilter;\n config.ignorePrAuthor = GlobalConfig.get('ignorePrAuthor');\n\n let res: HttpResponse<RepoResponse>;\n try {\n res = await gitlabApi.getJsonUnchecked<RepoResponse>(\n `projects/${config.repository}`,\n );\n if (res.body.archived) {\n logger.debug(\n 'Repository is archived - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_ARCHIVED);\n }\n\n if (res.body.mirror && GlobalConfig.get('includeMirrors') !== true) {\n logger.debug(\n 'Repository is a mirror - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_MIRRORED);\n }\n if (res.body.repository_access_level === 'disabled') {\n logger.debug(\n 'Repository portion of project is disabled - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_DISABLED);\n }\n if (res.body.merge_requests_access_level === 'disabled') {\n logger.debug(\n 'MRs are disabled for the project - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_DISABLED);\n }\n if (res.body.default_branch === null || res.body.empty_repo) {\n throw new Error(REPOSITORY_EMPTY);\n }\n config.defaultBranch = res.body.default_branch;\n /* v8 ignore next -- unreachable: null/empty default_branch already threw REPOSITORY_EMPTY above */\n if (!config.defaultBranch) {\n logger.warn({ resBody: res.body }, 'Error fetching GitLab project');\n throw new Error(TEMPORARY_ERROR);\n }\n config.mergeMethod = res.body.merge_method || 'merge';\n config.mergeTrainsEnabled = res.body.merge_trains_enabled ?? false;\n if (res.body.squash_option) {\n config.squash =\n res.body.squash_option === 'always' ||\n res.body.squash_option === 'default_on';\n }\n logger.debug(`${repository} default branch = ${config.defaultBranch}`);\n logger.debug('Enabling Git FS');\n const url = getRepoUrl(repository, gitUrl, res);\n await git.initRepo({\n ...config,\n url,\n });\n } catch (err) /* v8 ignore next -- initRepo error mapping needs git-level failures not mocked in specs */ {\n logger.debug({ err }, 'Caught initRepo error');\n if (err.message.includes('HEAD is not a symbolic ref')) {\n throw new Error(REPOSITORY_EMPTY);\n }\n if ([REPOSITORY_ARCHIVED, REPOSITORY_EMPTY].includes(err.message)) {\n throw err;\n }\n if (err.statusCode === 403) {\n throw new Error(REPOSITORY_ACCESS_FORBIDDEN);\n }\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n if (err.message === REPOSITORY_DISABLED) {\n throw err;\n }\n logger.debug({ err }, 'Unknown GitLab initRepo error');\n throw err;\n }\n const repoConfig: RepoResult = {\n defaultBranch: config.defaultBranch,\n isFork: !!res.body.forked_from_project,\n repoFingerprint: repoFingerprint(res.body.id, defaults.endpoint),\n };\n return repoConfig;\n}\n\nexport function getBranchForceRebase(): Promise<boolean> {\n const forceRebase = config?.mergeMethod !== 'merge';\n if (forceRebase) {\n logger.once.debug(\n `mergeMethod is ${config.mergeMethod} so PRs will be kept up-to-date with base branch`,\n );\n }\n return Promise.resolve(forceRebase);\n}\n\n/**\n * Merge trains are GitLab's equivalent of a merge queue. They are enabled per\n * project, so the branch name is not needed.\n * https://docs.gitlab.com/ci/pipelines/merge_trains/\n */\nexport function isBranchMergeQueueEnabled(\n _branchName: string,\n): Promise<boolean> {\n return Promise.resolve(config.mergeTrainsEnabled);\n}\n\n/**\n * GitLab answers with 404 if the MR is not on a merge train. A car that has\n * already been merged is not waiting any more.\n * https://docs.gitlab.com/api/merge_trains/#get-the-status-of-a-merge-request-on-a-merge-train\n */\nexport async function isPrInMergeQueue(id: number): Promise<boolean> {\n if (!config.mergeTrainsEnabled) {\n return false;\n }\n try {\n const { body: status } = await gitlabApi.getJson(\n `projects/${config.repository}/merge_trains/merge_requests/${id}`,\n { memCache: false },\n MergeTrainCarStatus,\n );\n return status !== 'merged';\n } catch (err) {\n if (err.statusCode !== 404) {\n logger.debug({ err }, 'Failed to fetch merge train status');\n }\n return false;\n }\n}\n\ntype BranchState =\n | 'pending'\n | 'created'\n | 'running'\n | 'waiting_for_resource'\n | 'manual'\n | 'success'\n | 'failed'\n | 'canceled'\n | 'skipped'\n | 'scheduled';\n\ninterface GitlabBranchStatus {\n status: BranchState;\n name: string;\n allow_failure?: boolean;\n}\n\nasync function getStatus(\n branchName: string,\n useCache = true,\n): Promise<GitlabBranchStatus[]> {\n const branchSha = git.getBranchCommit(branchName);\n try {\n // TODO: types (#22198)\n const url = `projects/${\n config.repository\n }/repository/commits/${branchSha!}/statuses`;\n\n const opts: GitlabHttpOptions = { paginate: true };\n if (useCache) {\n opts.cacheProvider = memCacheProvider;\n } else {\n opts.memCache = false;\n }\n\n return (await gitlabApi.getJsonUnchecked<GitlabBranchStatus[]>(url, opts))\n .body;\n } catch (err) /* v8 ignore next -- commit status fetch failures map 404 to REPOSITORY_CHANGED, not mocked in specs */ {\n logger.debug({ err }, 'Error getting commit status');\n if (err.response?.statusCode === 404) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n}\n\nconst gitlabToRenovateStatusMapping: Record<BranchState, BranchStatus> = {\n pending: 'yellow',\n created: 'yellow',\n manual: 'yellow',\n running: 'yellow',\n waiting_for_resource: 'yellow',\n success: 'green',\n failed: 'red',\n canceled: 'red',\n skipped: 'red',\n scheduled: 'yellow',\n};\n\n// Returns the combined status for a branch.\nexport async function getBranchStatus(\n branchName: string,\n internalChecksAsSuccess: boolean,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n\n if (!git.branchExists(branchName)) {\n throw new Error(REPOSITORY_CHANGED);\n }\n\n const branchStatuses = await getStatus(branchName);\n /* v8 ignore next -- defensive: getStatus always resolves to an array in specs */\n if (!isArray(branchStatuses)) {\n logger.warn(\n { branchName, branchStatuses },\n 'Empty or unexpected branch statuses',\n );\n return 'yellow';\n }\n logger.debug(`Got res with ${branchStatuses.length} results`);\n\n const mr = await getBranchPr(branchName);\n if (mr && mr.sha !== mr.headPipelineSha && mr.headPipelineStatus) {\n logger.debug(\n 'Merge request head pipeline has different sha to commit, assuming merged results pipeline',\n );\n branchStatuses.push({\n status: mr.headPipelineStatus as BranchState,\n name: 'head_pipeline',\n });\n }\n // ignore all skipped jobs\n const res = branchStatuses.filter((check) => check.status !== 'skipped');\n if (res.length === 0) {\n // Return 'pending' if we have no status checks\n return 'yellow';\n }\n if (\n !internalChecksAsSuccess &&\n branchStatuses.every(\n (check) =>\n check.name?.startsWith('renovate/') &&\n gitlabToRenovateStatusMapping[check.status] === 'green',\n )\n ) {\n logger.debug(\n 'Successful checks are all internal renovate/ checks, so returning \"pending\" branch status',\n );\n return 'yellow';\n }\n let status: BranchStatus = 'green'; // default to green\n res\n .filter((check) => !check.allow_failure)\n .forEach((check) => {\n // v8 ignore else -- TODO: add test #40625\n if (status !== 'red') {\n // if red, stay red\n let mappedStatus: BranchStatus =\n gitlabToRenovateStatusMapping[check.status];\n if (!mappedStatus) {\n logger.warn(\n { check },\n 'Could not map GitLab check.status to Renovate status',\n );\n mappedStatus = 'yellow';\n }\n if (mappedStatus !== 'green') {\n logger.trace({ check }, 'Found non-green check');\n status = mappedStatus;\n }\n }\n });\n return status;\n}\n\n// Pull Request\nexport async function getPrList(): Promise<Pr[]> {\n return await GitlabPrCache.getPrs(\n gitlabApi,\n config.repository,\n botUserName,\n !!config.ignorePrAuthor,\n );\n}\n\nasync function ignoreApprovals(pr: number): Promise<void> {\n try {\n const url = `projects/${config.repository}/merge_requests/${pr}/approval_rules`;\n const { body: rules } = await gitlabApi.getJsonUnchecked<\n {\n name: string;\n rule_type: string;\n id: number;\n }[]\n >(url);\n\n const ruleName = 'renovateIgnoreApprovals';\n\n const existingAnyApproverRule = rules?.find(\n ({ rule_type }) => rule_type === 'any_approver',\n );\n const existingRegularApproverRules = rules?.filter(\n ({ rule_type, name }) =>\n rule_type !== 'any_approver' &&\n name !== ruleName &&\n rule_type !== 'report_approver' &&\n rule_type !== 'code_owner',\n );\n\n if (existingRegularApproverRules?.length) {\n await p.all(\n existingRegularApproverRules.map((rule) => async (): Promise<void> => {\n await gitlabApi.deleteJson(`${url}/${rule.id}`);\n }),\n );\n }\n\n if (existingAnyApproverRule) {\n await gitlabApi.putJson(`${url}/${existingAnyApproverRule.id}`, {\n body: { ...existingAnyApproverRule, approvals_required: 0 },\n });\n return;\n }\n\n const zeroApproversRule = rules?.find(({ name }) => name === ruleName);\n if (!zeroApproversRule) {\n await gitlabApi.postJson(url, {\n body: {\n name: ruleName,\n approvals_required: 0,\n },\n });\n }\n } catch (err) {\n logger.warn({ err }, 'GitLab: Error adding approval rule');\n }\n}\n\nasync function tryPrAutomerge(\n pr: number,\n platformPrOptions: PlatformPrOptions | undefined,\n): Promise<void> {\n try {\n if (platformPrOptions?.gitLabIgnoreApprovals) {\n await ignoreApprovals(pr);\n }\n\n if (platformPrOptions?.usePlatformAutomerge) {\n // https://docs.gitlab.com/ee/api/merge_requests.html#merge-status\n const desiredDetailedMergeStatus = [\n 'mergeable',\n 'ci_still_running',\n 'not_approved',\n ];\n const desiredPipelineStatus = [\n 'failed', // don't lose time if pipeline failed\n 'running', // pipeline is running, no need to wait for it\n ];\n const desiredStatus = 'can_be_merged';\n const env = getEnv();\n // The default value of 5 attempts results in max. 13.75 seconds timeout if no pipeline created.\n const retryTimes = parseInteger(\n env.RENOVATE_X_GITLAB_AUTO_MERGEABLE_CHECK_ATTEMPS,\n 5,\n );\n\n const mergeDelay = parseInteger(\n env.RENOVATE_X_GITLAB_MERGE_REQUEST_DELAY,\n 250,\n );\n\n // Check for correct merge request status before setting `merge_when_pipeline_succeeds` to `true`.\n for (let attempt = 1; attempt <= retryTimes; attempt += 1) {\n const { body } = await gitlabApi.getJsonUnchecked<{\n merge_status?: string;\n detailed_merge_status?: string;\n merge_when_pipeline_succeeds?: boolean;\n pipeline: {\n status: string;\n };\n }>(`projects/${config.repository}/merge_requests/${pr}`, {\n memCache: false,\n });\n\n // Exit early if merge_when_pipeline_succeeds is already set\n if (body.merge_when_pipeline_succeeds === true) {\n logger.debug(\n 'Skipping automerge retry - merge_when_pipeline_succeeds already enabled',\n );\n return;\n }\n // detailed_merge_status is available with Gitlab >=15.6.0\n const use_detailed_merge_status = !!body.detailed_merge_status;\n const detailed_merge_status_check =\n use_detailed_merge_status &&\n desiredDetailedMergeStatus.includes(body.detailed_merge_status!);\n // merge_status is deprecated with Gitlab >= 15.6\n const deprecated_merge_status_check =\n !use_detailed_merge_status && body.merge_status === desiredStatus;\n\n // Only continue if the merge request can be merged and has a pipeline.\n if (\n (detailed_merge_status_check || deprecated_merge_status_check) &&\n body.pipeline !== null &&\n desiredPipelineStatus.includes(body.pipeline.status)\n ) {\n break;\n }\n logger.debug(`PR not yet in mergeable state. Retrying ${attempt}`);\n await setTimeout(mergeDelay * attempt ** 2); // exponential backoff\n }\n\n // The merge_trains endpoint's auto_merge parameter requires GitLab\n // 17.11+. On older versions we fall back to the /merge endpoint so the\n // MR still automerges, just not on the train.\n // https://docs.gitlab.com/api/merge_trains/#add-a-merge-request-to-a-merge-train\n const useMergeTrain =\n config.mergeTrainsEnabled && !semver.lt(defaults.version, '17.11.0');\n if (config.mergeTrainsEnabled && !useMergeTrain) {\n logger.once.warn(\n { version: defaults.version },\n 'Merge trains require GitLab 17.11.0 or later, falling back to /merge endpoint',\n );\n }\n\n // Even if Gitlab returns a \"merge-able\" merge request status, enabling auto-merge sometimes\n // returns a 405 Method Not Allowed. It seems to be a timing issue within Gitlab.\n for (let attempt = 1; attempt <= retryTimes; attempt += 1) {\n try {\n if (useMergeTrain) {\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_trains/merge_requests/${pr}`,\n {\n body: {\n auto_merge: true,\n },\n },\n );\n } else {\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${pr}/merge`,\n {\n body: {\n should_remove_source_branch: true,\n merge_when_pipeline_succeeds: true,\n },\n },\n );\n }\n break;\n } catch (err) {\n logger.debug(\n { err },\n `Automerge on PR creation failed. Retrying ${attempt}`,\n );\n }\n await setTimeout(mergeDelay * attempt ** 2); // exponential backoff\n }\n }\n } catch (err) /* v8 ignore next -- defensive: retry loop already swallows errors, outer catch is a last resort */ {\n logger.debug({ err }, 'Automerge on PR creation failed');\n }\n}\n\nasync function approveMr(mrNumber: number): Promise<void> {\n const env = getEnv();\n const opts: GitlabHttpOptions = {};\n if (env.RENOVATE_X_GITLAB_AUTO_APPROVE_TOKEN) {\n opts.token = env.RENOVATE_X_GITLAB_AUTO_APPROVE_TOKEN;\n }\n logger.debug(`approveMr(${mrNumber})`);\n try {\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_requests/${mrNumber}/approve`,\n opts,\n );\n } catch (err) {\n logger.warn({ err }, 'GitLab: Error approving merge request');\n }\n}\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle,\n prBody: rawDescription,\n draftPR,\n labels,\n platformPrOptions,\n}: CreatePRConfig): Promise<Pr> {\n let title = prTitle;\n if (draftPR) {\n title = draftPrefix + title;\n }\n const description = sanitize(rawDescription);\n logger.debug(`Creating Merge Request: ${title}`);\n const res = await gitlabApi.postJson<GitLabMergeRequest>(\n `projects/${config.repository}/merge_requests`,\n {\n body: {\n source_branch: sourceBranch,\n target_branch: targetBranch,\n remove_source_branch: true,\n title,\n description,\n labels: coerceArray(labels).join(','),\n squash: config.squash,\n },\n },\n );\n\n const pr = prInfo(res.body);\n await GitlabPrCache.setPr(\n gitlabApi,\n config.repository,\n botUserName,\n pr,\n !!config.ignorePrAuthor,\n );\n\n if (platformPrOptions?.autoApprove) {\n await approveMr(pr.number);\n }\n\n await tryPrAutomerge(pr.number, platformPrOptions);\n\n return pr;\n}\n\nexport async function getPr(iid: number): Promise<GitlabPr> {\n logger.debug(`getPr(${iid})`);\n const mr = await getMR(config.repository, iid);\n\n // Harmonize fields with GitHub\n return prInfo(mr);\n}\n\nexport async function updatePr({\n number: iid,\n prTitle,\n prBody: description,\n addLabels,\n removeLabels,\n state,\n platformPrOptions,\n targetBranch,\n}: UpdatePrConfig): Promise<void> {\n let title = prTitle;\n if ((await getPrList()).find((pr) => pr.number === iid)?.isDraft) {\n title = draftPrefix + title;\n }\n const newState = {\n ['closed']: 'close',\n ['open']: 'reopen',\n // TODO: null check (#22198)\n }[state!];\n\n const body: any = {\n title,\n description: sanitize(description),\n ...(newState && { state_event: newState }),\n };\n if (targetBranch) {\n body.target_branch = targetBranch;\n }\n\n if (addLabels) {\n body.add_labels = addLabels;\n }\n\n if (removeLabels) {\n body.remove_labels = removeLabels;\n }\n\n const updatedPrInfo = (\n await gitlabApi.putJson<GitLabMergeRequest>(\n `projects/${config.repository}/merge_requests/${iid}`,\n { body },\n )\n ).body;\n\n const updatedPr = prInfo(updatedPrInfo);\n await GitlabPrCache.setPr(\n gitlabApi,\n config.repository,\n botUserName,\n updatedPr,\n !!config.ignorePrAuthor,\n );\n\n if (platformPrOptions?.autoApprove) {\n await approveMr(iid);\n }\n}\n\nexport async function reattemptPlatformAutomerge({\n number: iid,\n platformPrOptions,\n}: ReattemptPlatformAutomergeConfig): Promise<void> {\n await tryPrAutomerge(iid, platformPrOptions);\n\n logger.debug(`PR platform automerge re-attempted...prNo: ${iid}`);\n}\n\nasync function tryAddPrToMergeTrain(id: number): Promise<boolean> {\n try {\n // Without `auto_merge` the MR is added to the train immediately. The\n // train merges it and removes the source branch on its own.\n // https://docs.gitlab.com/api/merge_trains/#add-a-merge-request-to-a-merge-train\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_trains/merge_requests/${id}`,\n );\n logger.debug(`MR !${id} added to the merge train`);\n return true;\n } catch (err) {\n logger.debug({ err }, 'Failed to add MR to the merge train');\n return false;\n }\n}\n\nexport async function mergePr({ id }: MergePRConfig): Promise<boolean> {\n if (config.mergeTrainsEnabled) {\n return tryAddPrToMergeTrain(id);\n }\n\n try {\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${id}/merge`,\n {\n body: {\n should_remove_source_branch: true,\n },\n },\n );\n return true;\n } catch (err) /* v8 ignore next -- merge rejection statuses (401/406) are mapped to false, not mocked in specs */ {\n if (err.statusCode === 401) {\n logger.debug('No permissions to merge PR');\n return false;\n }\n if (err.statusCode === 406) {\n logger.debug({ err }, 'PR not acceptable for merging');\n return false;\n }\n logger.debug({ err }, 'merge PR error');\n logger.debug('PR merge failed');\n return false;\n }\n}\n\nexport function massageMarkdown(input: string): string {\n const desc = input\n .replace(regEx(/Pull Request/g), 'Merge Request')\n .replace(regEx(/\\bPR: #/g), 'MR: !')\n .replace(regEx(/\\bPR\\b/g), 'MR')\n .replace(regEx(/\\bPRs\\b/g), 'MRs')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](!')\n .replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](#')\n // Strip unicode null characters as GitLab markdown does not permit them\n // oxlint-disable-next-line no-control-regex\n .replace(regEx(/\\u0000/g), '');\n return smartTruncate(desc, maxBodyLength());\n}\n\nexport function maxBodyLength(): number {\n if (semver.lt(defaults.version, '13.4.0')) {\n logger.debug(\n { version: defaults.version },\n 'GitLab versions earlier than 13.4 have issues with long descriptions, truncating to 25K characters',\n );\n return 25000;\n }\n return 1000000;\n}\n\n/* v8 ignore next: no need to test */\nexport function labelCharLimit(): number {\n return 255;\n}\n\n// Branch\n\nfunction matchesState(state: string, desiredState: string): boolean {\n if (desiredState === 'all') {\n return true;\n }\n if (desiredState.startsWith('!')) {\n return state !== desiredState.substring(1);\n }\n return state === desiredState;\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n includeOtherAuthors,\n}: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, ${prTitle!}, ${state})`);\n\n if (includeOtherAuthors) {\n // PR might have been created by anyone, so don't use the cached Renovate MR list\n const response = await gitlabApi.getJsonUnchecked<GitLabMergeRequest[]>(\n `projects/${config.repository}/merge_requests?source_branch=${branchName}&state=opened`,\n );\n\n const { body: mrList } = response;\n if (!mrList.length) {\n logger.debug(`No MR found for branch ${branchName}`);\n return null;\n }\n\n return prInfo(mrList[0]);\n }\n\n const prList = await getPrList();\n return (\n prList.find(\n (p: { sourceBranch: string; title: string; state: string }) =>\n p.sourceBranch === branchName &&\n (!prTitle || p.title.toUpperCase() === prTitle.toUpperCase()) &&\n matchesState(p.state, state),\n ) ?? null\n );\n}\n\n// Returns the Pull Request for a branch. Null if not exists.\nexport async function getBranchPr(\n branchName: string,\n): Promise<GitlabPr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n // cache-bust in case we have rebased\n const res = await getStatus(branchName, false);\n logger.debug(`Got res with ${res.length} results`);\n for (const check of res) {\n if (check.name === context) {\n return gitlabToRenovateStatusMapping[check.status] || 'yellow';\n }\n }\n return null;\n}\n\nexport async function setBranchStatus({\n branchName,\n context,\n description,\n state: renovateState,\n url: targetUrl,\n}: BranchStatusConfig): Promise<void> {\n // First, get the branch commit SHA\n const branchSha = git.getBranchCommit(branchName);\n if (!branchSha) {\n logger.warn('Failed to get the branch commit SHA');\n return;\n }\n // Now, check the statuses for that commit\n const url = `projects/${config.repository}/statuses/${branchSha}`;\n let state = 'success';\n if (renovateState === 'yellow') {\n state = 'pending';\n } else if (renovateState === 'red') {\n state = 'failed';\n }\n const options: any = {\n state,\n description,\n context,\n };\n\n // v8 ignore else -- TODO: add test #40625\n if (targetUrl) {\n options.target_url = targetUrl;\n }\n\n const env = getEnv();\n const retryTimes = parseInteger(\n env.RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS,\n 2,\n );\n\n try {\n for (let attempt = 1; attempt <= retryTimes + 1; attempt += 1) {\n const commitUrl = `projects/${config.repository}/repository/commits/${branchSha}`;\n await gitlabApi\n .getJsonSafe(commitUrl, { memCache: false }, LastPipelineId)\n .onValue((pipelineId) => {\n options.pipeline_id = pipelineId;\n });\n if (options.pipeline_id !== undefined) {\n break;\n }\n if (attempt >= retryTimes + 1) {\n logger.debug(`Pipeline not yet created after ${attempt} attempts`);\n } else {\n logger.debug(`Pipeline not yet created. Retrying ${attempt}`);\n }\n // give gitlab some time to create pipelines for the sha\n await setTimeout(\n parseInteger(env.RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY, 1000),\n );\n }\n } catch (err) {\n logger.debug({ err });\n logger.warn('Failed to retrieve commit pipeline');\n }\n\n if (\n options.pipeline_id === undefined &&\n env.RENOVATE_X_GITLAB_SKIP_STATUS_WITHOUT_PIPELINE === 'true'\n ) {\n logger.debug('Skipping branch status update because no pipeline was found');\n return;\n }\n\n try {\n await gitlabApi.postJson(url, { body: options });\n\n // update status cache\n await getStatus(branchName, false);\n } catch (err) {\n const message = err.body?.message;\n if (\n isString(message) &&\n message.startsWith('Cannot transition status via :enqueue from :pending')\n ) {\n // https://gitlab.com/gitlab-org/gitlab-foss/issues/25807\n logger.debug('Ignoring status transition error');\n } else {\n logger.debug({ err });\n logger.warn('Failed to set branch status');\n }\n }\n}\n\n// Issue\n\nexport async function getIssueList(): Promise<GitlabIssue[]> {\n // v8 ignore else -- TODO: add test #40625\n if (!config.issueList) {\n const searchParams: Record<string, string> = {\n per_page: '100',\n state: 'opened',\n };\n // v8 ignore else -- TODO: add test #40625\n if (!config.ignorePrAuthor) {\n searchParams.scope = 'created_by_me';\n }\n const query = getQueryString(searchParams);\n const res = await gitlabApi.getJsonUnchecked<\n { iid: number; title: string; labels: string[] }[]\n >(`projects/${config.repository}/issues?${query}`, {\n memCache: false,\n paginate: true,\n });\n /* v8 ignore next -- defensive: paginated issues endpoint always yields an array in specs */\n if (!isArray(res.body)) {\n logger.warn({ responseBody: res.body }, 'Could not retrieve issue list');\n return [];\n }\n config.issueList = res.body.map((i) => ({\n iid: i.iid,\n title: i.title,\n labels: i.labels,\n }));\n }\n return config.issueList;\n}\n\nexport async function getIssue(\n number: number,\n useCache = true,\n): Promise<Issue | null> {\n try {\n const opts: GitlabHttpOptions = {};\n /* v8 ignore next: temporary code */\n if (useCache) {\n opts.cacheProvider = memCacheProvider;\n } else {\n opts.memCache = false;\n }\n const issueBody = (\n await gitlabApi.getJsonUnchecked<{ description: string }>(\n `projects/${config.repository}/issues/${number}`,\n opts,\n )\n ).body.description;\n return {\n number,\n body: issueBody,\n };\n } catch (err) /* v8 ignore next -- defensive: issue fetch failures are logged and swallowed, not simulated in specs */ {\n logger.debug({ err, number }, 'Error getting issue');\n return null;\n }\n}\n\nexport async function findIssue(title: string): Promise<Issue | null> {\n logger.debug(`findIssue(${title})`);\n try {\n const issueList = await getIssueList();\n const issue = issueList.find((i) => i.title === title);\n if (!issue) {\n return null;\n }\n return await getIssue(issue.iid);\n } catch /* v8 ignore next -- defensive: getIssueList/getIssue failures are swallowed, not simulated in specs */ {\n logger.warn('Error finding issue');\n return null;\n }\n}\n\nexport async function ensureIssue({\n title,\n reuseTitle,\n body,\n labels,\n confidential,\n}: EnsureIssueConfig): Promise<'updated' | 'created' | null> {\n logger.debug(`ensureIssue()`);\n const description = massageMarkdown(sanitize(body));\n try {\n const issueList = await getIssueList();\n let issue = issueList.find((i) => i.title === title);\n issue ??= issueList.find((i) => i.title === reuseTitle);\n if (issue) {\n const existingDescription = (\n await gitlabApi.getJsonUnchecked<{ description: string }>(\n `projects/${config.repository}/issues/${issue.iid}`,\n )\n ).body.description;\n if (issue.title !== title || existingDescription !== description) {\n logger.debug('Updating issue');\n await gitlabApi.putJson(\n `projects/${config.repository}/issues/${issue.iid}`,\n {\n body: {\n title,\n description,\n labels: coerceArray(labels ?? issue.labels).join(','),\n confidential: confidential ?? false,\n },\n },\n );\n return 'updated';\n }\n } else {\n await gitlabApi.postJson(`projects/${config.repository}/issues`, {\n body: {\n title,\n description,\n labels: coerceArray(labels).join(','),\n confidential: confidential ?? false,\n },\n });\n logger.info('Issue created');\n // delete issueList so that it will be refetched as necessary\n delete config.issueList;\n return 'created';\n }\n } catch (err) /* v8 ignore next -- issue API failures (e.g. issues disabled) are swallowed, not simulated in specs */ {\n if (err.message.startsWith('Issues are disabled for this repo')) {\n logger.debug(`Could not create issue: ${(err as Error).message}`);\n } else {\n logger.warn({ err }, 'Could not ensure issue');\n }\n }\n return null;\n}\n\nexport async function ensureIssueClosing(title: string): Promise<void> {\n logger.debug(`ensureIssueClosing()`);\n const issueList = await getIssueList();\n for (const issue of issueList) {\n if (issue.title === title) {\n logger.debug({ issue }, 'Closing issue');\n await gitlabApi.putJson(\n `projects/${config.repository}/issues/${issue.iid}`,\n {\n body: { state_event: 'close' },\n },\n );\n }\n }\n}\n\nexport async function addAssignees(\n iid: number,\n assignees: string[],\n): Promise<void> {\n try {\n logger.debug(`Adding assignees '${assignees.join(', ')}' to #${iid}`);\n const assigneeIds: number[] = [];\n for (const assignee of assignees) {\n try {\n const userId = await getUserID(assignee);\n assigneeIds.push(userId);\n } catch (err) {\n logger.debug({ assignee, err }, 'getUserID() error');\n logger.warn({ assignee }, 'Failed to add assignee - could not get ID');\n }\n }\n const url = `projects/${\n config.repository\n }/merge_requests/${iid}?${getQueryString({\n 'assignee_ids[]': assigneeIds,\n })}`;\n await gitlabApi.putJson(url);\n } catch (err) {\n logger.debug({ err }, 'addAssignees error');\n logger.warn({ iid, assignees }, 'Failed to add assignees');\n }\n}\n\nexport async function addReviewers(\n iid: number,\n reviewers: string[],\n): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers.join(', ')}' to #${iid}`);\n\n if (semver.lt(defaults.version, '13.9.0')) {\n logger.warn(\n { version: defaults.version },\n 'Adding reviewers is only available in GitLab 13.9 and onwards',\n );\n return;\n }\n\n let mr: GitLabMergeRequest;\n try {\n mr = await getMR(config.repository, iid);\n } catch (err) {\n logger.warn({ err }, 'Failed to get existing reviewers');\n return;\n }\n\n mr.reviewers = coerceArray(mr.reviewers);\n const existingReviewers = mr.reviewers.map((r) => r.username);\n const existingReviewerIDs = mr.reviewers.map((r) => r.id);\n\n // Figure out which reviewers (of the ones we want to add) are not already on the MR as a reviewer\n const newReviewers = reviewers.filter((r) => !existingReviewers.includes(r));\n\n // Gather the IDs for all the reviewers we want to add\n let newReviewerIDs: number[];\n newReviewerIDs = (\n await p.all(\n newReviewers.map((r) => async () => {\n try {\n return [await getUserID(r)];\n } catch {\n // Unable to fetch userId, try resolve as a group\n return getMemberUserIDs(r);\n }\n }),\n )\n ).flat();\n\n if (isNonEmptyArray(newReviewers) && isEmptyArray(newReviewerIDs)) {\n logger.warn('Failed to get IDs of the new reviewers');\n return;\n }\n\n // Multiple groups may have the same members, so\n // filter out non-distinct values\n newReviewerIDs = [...new Set(newReviewerIDs)];\n\n try {\n await updateMR(config.repository, iid, {\n reviewer_ids: [...existingReviewerIDs, ...newReviewerIDs],\n });\n } catch (err) {\n logger.warn({ err }, 'Failed to add reviewers');\n }\n}\n\nexport async function deleteLabel(\n issueNo: number,\n label: string,\n): Promise<void> {\n logger.debug(`Deleting label ${label} from #${issueNo}`);\n try {\n const pr = await getPr(issueNo);\n const labels = coerceArray(pr.labels)\n .filter((l: string) => l !== label)\n .join(',');\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${issueNo}`,\n {\n body: { labels },\n },\n );\n } catch (err) /* v8 ignore next -- defensive: label deletion failures are logged and swallowed, not simulated in specs */ {\n logger.warn({ err, issueNo, label }, 'Failed to delete label');\n }\n}\n\nasync function getComments(issueNo: number): Promise<GitlabComment[]> {\n // GET projects/:owner/:repo/merge_requests/:number/notes\n logger.debug(`Getting comments for #${issueNo}`);\n const url = `projects/${config.repository}/merge_requests/${issueNo}/notes`;\n const comments = (\n await gitlabApi.getJsonUnchecked<GitlabComment[]>(url, { paginate: true })\n ).body;\n logger.debug(`Found ${comments.length} comments`);\n return comments;\n}\n\nasync function addComment(issueNo: number, body: string): Promise<void> {\n // POST projects/:owner/:repo/merge_requests/:number/notes\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_requests/${issueNo}/notes`,\n {\n body: { body },\n },\n );\n}\n\nasync function editComment(\n issueNo: number,\n commentId: number,\n body: string,\n): Promise<void> {\n // PUT projects/:owner/:repo/merge_requests/:number/notes/:id\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${issueNo}/notes/${commentId}`,\n {\n body: { body },\n },\n );\n}\n\nasync function deleteComment(\n issueNo: number,\n commentId: number,\n): Promise<void> {\n // DELETE projects/:owner/:repo/merge_requests/:number/notes/:id\n await gitlabApi.deleteJson(\n `projects/${config.repository}/merge_requests/${issueNo}/notes/${commentId}`,\n );\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n const sanitizedContent = sanitize(content);\n const massagedTopic = topic\n ? topic\n .replace(regEx(/Pull Request/g), 'Merge Request')\n .replace(regEx(/PR/g), 'MR')\n : topic;\n const comments = await getComments(number);\n let body: string;\n let commentId: number | undefined;\n let commentNeedsUpdating: boolean | undefined;\n // TODO: types (#22198)\n if (topic) {\n logger.debug(`Ensuring comment \"${massagedTopic!}\" in #${number}`);\n body = `### ${topic}\\n\\n${sanitizedContent}`;\n body = smartTruncate(\n body\n .replace(regEx(/Pull Request/g), 'Merge Request')\n .replace(regEx(/PR/g), 'MR'),\n maxBodyLength(),\n );\n comments.forEach((comment: { body: string; id: number }) => {\n // v8 ignore else -- TODO: add test #40625\n if (comment.body.startsWith(`### ${massagedTopic!}\\n\\n`)) {\n commentId = comment.id;\n commentNeedsUpdating = comment.body !== body;\n }\n });\n } else {\n logger.debug(`Ensuring content-only comment in #${number}`);\n body = smartTruncate(`${sanitizedContent}`, maxBodyLength());\n comments.forEach((comment: { body: string; id: number }) => {\n // v8 ignore else -- TODO: add test #40625\n if (comment.body === body) {\n commentId = comment.id;\n commentNeedsUpdating = false;\n }\n });\n }\n if (!commentId) {\n await addComment(number, body);\n logger.debug(\n { repository: config.repository, issueNo: number },\n 'Added comment',\n );\n } else if (commentNeedsUpdating) {\n await editComment(number, commentId, body);\n logger.debug(\n { repository: config.repository, issueNo: number },\n 'Updated comment',\n );\n } else {\n logger.debug('Comment is already up-to-date');\n }\n return true;\n}\n\nfunction byTopic(comment: GitlabComment, topic: string): boolean {\n return comment.body.startsWith(`### ${topic}\\n\\n`);\n}\n\nfunction byContent(comment: GitlabComment, content: string): boolean {\n return comment.body.trim() === content;\n}\n\nexport async function ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n const { number: issueNo } = deleteConfig;\n const key =\n deleteConfig.type === 'by-topic'\n ? deleteConfig.topic\n : deleteConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${issueNo} is removed`);\n\n const comments = await getComments(issueNo);\n let commentId: number | null | undefined = null;\n\n // v8 ignore else -- TODO: add test #40625\n if (deleteConfig.type === 'by-topic') {\n const topic = deleteConfig.topic;\n commentId = comments.find((comment) => byTopic(comment, topic))?.id;\n } else if (deleteConfig.type === 'by-content') {\n const content = deleteConfig.content;\n commentId = comments.find((comment) => byContent(comment, content))?.id;\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (commentId) {\n await deleteComment(issueNo, commentId);\n }\n}\n\nexport async function filterUnavailableUsers(\n users: string[],\n): Promise<string[]> {\n const filteredUsers: string[] = [];\n for (const user of users) {\n if (!(await isUserBusy(user))) {\n filteredUsers.push(user);\n }\n }\n return filteredUsers;\n}\n\nexport async function expandGroupMembers(\n reviewersOrAssignees: string[],\n): Promise<string[]> {\n const expandedReviewersOrAssignees: string[] = [];\n const normalizedReviewersOrAssigneesWithoutEmails: string[] = [];\n\n // Skip passing user emails to Gitlab API, but include them in the final result\n for (const reviewerOrAssignee of reviewersOrAssignees) {\n // Resolve GitLab CODEOWNERS role handles (@@developer, @@maintainer,\n // @@owner) to project members instead of treating them as groups\n const roleAccessLevel = getRoleAccessLevel(reviewerOrAssignee);\n if (roleAccessLevel !== null) {\n try {\n const members = await getProjectMembersByRole(\n config.repository,\n roleAccessLevel,\n );\n expandedReviewersOrAssignees.push(...members.map((u) => u.username));\n } catch (err) {\n logger.debug(\n { err, reviewerOrAssignee },\n 'Unable to fetch role members',\n );\n }\n continue;\n }\n\n if (reviewerOrAssignee.indexOf('@') > 0) {\n expandedReviewersOrAssignees.push(reviewerOrAssignee);\n continue;\n }\n\n // Normalize the potential group names before passing to Gitlab API\n normalizedReviewersOrAssigneesWithoutEmails.push(\n noLeadingAtSymbol(reviewerOrAssignee),\n );\n }\n\n for (const reviewerOrAssignee of normalizedReviewersOrAssigneesWithoutEmails) {\n try {\n const members = await getMemberUsernames(reviewerOrAssignee);\n expandedReviewersOrAssignees.push(...members);\n } catch (err) {\n if (err.statusCode !== 404) {\n logger.debug({ err, reviewerOrAssignee }, 'Unable to fetch group');\n }\n expandedReviewersOrAssignees.push(reviewerOrAssignee);\n }\n }\n return expandedReviewersOrAssignees;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["git.initRepo","git.getBranchCommit","git.branchExists","p.all"],"sources":["../../../../lib/modules/platform/gitlab/index.ts"],"sourcesContent":["import { setTimeout } from 'node:timers/promises';\nimport {\n isArray,\n isEmptyArray,\n isNonEmptyArray,\n isString,\n} from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport semver from 'semver';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport {\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_CHANGED,\n REPOSITORY_DISABLED,\n REPOSITORY_EMPTY,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n REPOSITORY_PENDING_DELETION,\n TEMPORARY_ERROR,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { noLeadingAtSymbol, parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { GitlabHttpOptions } from '../../../util/http/gitlab.ts';\nimport { setBaseUrl } from '../../../util/http/gitlab.ts';\nimport type { HttpResponse } from '../../../util/http/types.ts';\nimport { parseInteger } from '../../../util/number.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport type { EmailAddress } from '../../../util/schema-utils/index.ts';\nimport {\n ensureTrailingSlash,\n getQueryString,\n parseUrl,\n} from '../../../util/url.ts';\nimport type {\n AutodiscoverConfig,\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformPrOptions,\n PlatformResult,\n Pr,\n ReattemptPlatformAutomergeConfig,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport {\n getMemberUserIDs,\n getMemberUsernames,\n getProjectMembersByRole,\n getUserID,\n gitlabApi,\n isUserBusy,\n} from './http.ts';\nimport { getMR, updateMR } from './merge-request.ts';\nimport { GitlabPrCache } from './pr-cache.ts';\nimport { getRoleAccessLevel } from './roles.ts';\nimport type { GitLabMergeRequest } from './schema.ts';\nimport { LastPipelineId, MergeTrainCarStatus } from './schema.ts';\nimport type {\n GitlabComment,\n GitlabIssue,\n GitlabPr,\n MergeMethod,\n RepoResponse,\n} from './types.ts';\nimport {\n DRAFT_PREFIX,\n DRAFT_PREFIX_DEPRECATED,\n defaults,\n getRepoUrl,\n prInfo,\n} from './utils.ts';\n\nexport { extractRulesFromCodeOwnersLines } from './code-owners.ts';\n\nlet config: {\n repository: string;\n email: EmailAddress;\n issueList: GitlabIssue[] | undefined;\n mergeMethod: MergeMethod;\n mergeTrainsEnabled: boolean;\n defaultBranch: string;\n cloneSubmodules: boolean | undefined;\n cloneSubmodulesFilter: string[] | undefined;\n ignorePrAuthor: boolean | undefined;\n squash: boolean;\n} = {} as any;\n\nexport function resetPlatform(): void {\n config = {} as any;\n draftPrefix = DRAFT_PREFIX;\n defaults.hostType = 'gitlab';\n defaults.endpoint = 'https://gitlab.com/api/v4/';\n defaults.version = '0.0.0';\n setBaseUrl(defaults.endpoint);\n}\n\nexport const id = 'gitlab';\n\nlet draftPrefix = DRAFT_PREFIX;\nlet botUserName: string;\n\nexport async function initPlatform({\n endpoint,\n username,\n token,\n gitAuthor,\n}: PlatformParams): Promise<PlatformResult> {\n if (!token) {\n throw new Error('Init: You must configure a GitLab personal access token');\n }\n if (!endpoint) {\n logger.debug(`Using default GitLab endpoint: ${defaults.endpoint}`);\n } else if (parseUrl(endpoint) === null) {\n throw new Error(`Invalid GitLab endpoint URL: ${endpoint}`);\n } else {\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n }\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n let gitlabVersion: string;\n try {\n if (!gitAuthor) {\n const user = (\n await gitlabApi.getJsonUnchecked<{\n email: EmailAddress;\n name: string;\n id: number;\n commit_email?: EmailAddress;\n }>(`user`, { token })\n ).body;\n platformConfig.gitAuthor = `${user.name} <${\n user.commit_email ?? user.email\n }>`;\n botUserName = user.name;\n }\n const env = getEnv();\n /* v8 ignore next: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n gitlabVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } else {\n const version = (\n await gitlabApi.getJsonUnchecked<{ version: string }>('version', {\n token,\n })\n ).body;\n gitlabVersion = version.version;\n }\n logger.debug(`GitLab version is: ${gitlabVersion}`);\n // version is 'x.y.z-edition', so not strictly semver; need to strip edition\n [gitlabVersion] = gitlabVersion.split('-');\n defaults.version = gitlabVersion;\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with GitLab. Check that your token includes \"api\" permissions',\n );\n throw new Error('Init: Authentication failure');\n }\n draftPrefix = semver.lt(defaults.version, '13.2.0')\n ? DRAFT_PREFIX_DEPRECATED\n : DRAFT_PREFIX;\n\n botUserName ??= username!;\n\n return platformConfig;\n}\n\n// Get all repositories that the user has access to\nexport async function getRepos(config?: AutodiscoverConfig): Promise<string[]> {\n logger.debug('Autodiscovering GitLab repositories');\n\n const queryParams: Record<string, any> = {\n membership: true,\n per_page: 100,\n with_merge_requests_enabled: true,\n min_access_level: 30,\n archived: false,\n ...(config?.sort && { order_by: config.sort }),\n ...(config?.order && { sort: config.order }),\n };\n if (config?.topics?.length) {\n queryParams.topic = config.topics.join(',');\n }\n\n const urls = [];\n if (config?.namespaces?.length) {\n queryParams.with_shared = false;\n queryParams.include_subgroups = true;\n urls.push(\n ...config.namespaces.map(\n (namespace) =>\n `groups/${urlEscape(namespace)}/projects?${getQueryString(\n queryParams,\n )}`,\n ),\n );\n } else {\n urls.push(`projects?${getQueryString(queryParams)}`);\n }\n\n try {\n const repos = (\n await pMap(\n urls,\n (url) =>\n gitlabApi.getJsonUnchecked<RepoResponse[]>(url, {\n paginate: true,\n }),\n {\n concurrency: 2,\n },\n )\n ).flatMap((response) => response.body);\n\n logger.debug(`Discovered ${repos.length} project(s)`);\n return repos\n .filter((repo) => !repo.mirror || config?.includeMirrors)\n .filter((repo) => !repo.marked_for_deletion_at)\n .map((repo) => repo.path_with_namespace);\n } catch (err) {\n logger.error({ err }, `GitLab getRepos error`);\n throw err;\n }\n}\n\nfunction urlEscape(str: string): string;\nfunction urlEscape(str: string | undefined): string | undefined;\nfunction urlEscape(str: string | undefined): string | undefined {\n return str?.replace(regEx(/\\//g), '%2F');\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const escapedFileName = urlEscape(fileName);\n const repo = urlEscape(repoName) ?? config.repository;\n const url = `projects/${repo}/repository/files/${escapedFileName}?ref=${branchOrTag ?? `HEAD`}`;\n const res = await gitlabApi.getJsonUnchecked<{ content: string }>(url, {\n cacheProvider: memCacheProvider,\n });\n const buf = res.body.content;\n const str = Buffer.from(buf, 'base64').toString();\n return str;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\n// Initialize GitLab by getting base branch\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n config = {} as any;\n config.repository = urlEscape(repository);\n config.cloneSubmodules = cloneSubmodules;\n config.cloneSubmodulesFilter = cloneSubmodulesFilter;\n config.ignorePrAuthor = GlobalConfig.get('ignorePrAuthor');\n\n let res: HttpResponse<RepoResponse>;\n try {\n res = await gitlabApi.getJsonUnchecked<RepoResponse>(\n `projects/${config.repository}`,\n );\n if (res.body.archived) {\n logger.debug(\n 'Repository is archived - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_ARCHIVED);\n }\n\n if (res.body.marked_for_deletion_at) {\n logger.debug(\n 'Repository is marked for deletion - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_PENDING_DELETION);\n }\n\n if (res.body.mirror && GlobalConfig.get('includeMirrors') !== true) {\n logger.debug(\n 'Repository is a mirror - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_MIRRORED);\n }\n if (res.body.repository_access_level === 'disabled') {\n logger.debug(\n 'Repository portion of project is disabled - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_DISABLED);\n }\n if (res.body.merge_requests_access_level === 'disabled') {\n logger.debug(\n 'MRs are disabled for the project - throwing error to abort renovation',\n );\n throw new Error(REPOSITORY_DISABLED);\n }\n if (res.body.default_branch === null || res.body.empty_repo) {\n throw new Error(REPOSITORY_EMPTY);\n }\n config.defaultBranch = res.body.default_branch;\n /* v8 ignore next -- unreachable: null/empty default_branch already threw REPOSITORY_EMPTY above */\n if (!config.defaultBranch) {\n logger.warn({ resBody: res.body }, 'Error fetching GitLab project');\n throw new Error(TEMPORARY_ERROR);\n }\n config.mergeMethod = res.body.merge_method || 'merge';\n config.mergeTrainsEnabled = res.body.merge_trains_enabled ?? false;\n if (res.body.squash_option) {\n config.squash =\n res.body.squash_option === 'always' ||\n res.body.squash_option === 'default_on';\n }\n logger.debug(`${repository} default branch = ${config.defaultBranch}`);\n logger.debug('Enabling Git FS');\n const url = getRepoUrl(repository, gitUrl, res);\n await git.initRepo({\n ...config,\n url,\n });\n } catch (err) /* v8 ignore next -- initRepo error mapping needs git-level failures not mocked in specs */ {\n logger.debug({ err }, 'Caught initRepo error');\n if (err.message.includes('HEAD is not a symbolic ref')) {\n throw new Error(REPOSITORY_EMPTY);\n }\n if (\n [\n REPOSITORY_ARCHIVED,\n REPOSITORY_EMPTY,\n REPOSITORY_PENDING_DELETION,\n ].includes(err.message)\n ) {\n throw err;\n }\n if (err.statusCode === 403) {\n throw new Error(REPOSITORY_ACCESS_FORBIDDEN);\n }\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n if (err.message === REPOSITORY_DISABLED) {\n throw err;\n }\n logger.debug({ err }, 'Unknown GitLab initRepo error');\n throw err;\n }\n const repoConfig: RepoResult = {\n defaultBranch: config.defaultBranch,\n isFork: !!res.body.forked_from_project,\n repoFingerprint: repoFingerprint(res.body.id, defaults.endpoint),\n };\n return repoConfig;\n}\n\nexport function getBranchForceRebase(): Promise<boolean> {\n const forceRebase = config?.mergeMethod !== 'merge';\n if (forceRebase) {\n logger.once.debug(\n `mergeMethod is ${config.mergeMethod} so PRs will be kept up-to-date with base branch`,\n );\n }\n return Promise.resolve(forceRebase);\n}\n\n/**\n * Merge trains are GitLab's equivalent of a merge queue. They are enabled per\n * project, so the branch name is not needed.\n * https://docs.gitlab.com/ci/pipelines/merge_trains/\n */\nexport function isBranchMergeQueueEnabled(\n _branchName: string,\n): Promise<boolean> {\n return Promise.resolve(config.mergeTrainsEnabled);\n}\n\n/**\n * GitLab answers with 404 if the MR is not on a merge train. A car that has\n * already been merged is not waiting any more.\n * https://docs.gitlab.com/api/merge_trains/#get-the-status-of-a-merge-request-on-a-merge-train\n */\nexport async function isPrInMergeQueue(id: number): Promise<boolean> {\n if (!config.mergeTrainsEnabled) {\n return false;\n }\n try {\n const { body: status } = await gitlabApi.getJson(\n `projects/${config.repository}/merge_trains/merge_requests/${id}`,\n { memCache: false },\n MergeTrainCarStatus,\n );\n return status !== 'merged';\n } catch (err) {\n if (err.statusCode !== 404) {\n logger.debug({ err }, 'Failed to fetch merge train status');\n }\n return false;\n }\n}\n\ntype BranchState =\n | 'pending'\n | 'created'\n | 'running'\n | 'waiting_for_resource'\n | 'manual'\n | 'success'\n | 'failed'\n | 'canceled'\n | 'skipped'\n | 'scheduled';\n\ninterface GitlabBranchStatus {\n status: BranchState;\n name: string;\n allow_failure?: boolean;\n}\n\nasync function getStatus(\n branchName: string,\n useCache = true,\n): Promise<GitlabBranchStatus[]> {\n const branchSha = git.getBranchCommit(branchName);\n try {\n // TODO: types (#22198)\n const url = `projects/${\n config.repository\n }/repository/commits/${branchSha!}/statuses`;\n\n const opts: GitlabHttpOptions = { paginate: true };\n if (useCache) {\n opts.cacheProvider = memCacheProvider;\n } else {\n opts.memCache = false;\n }\n\n return (await gitlabApi.getJsonUnchecked<GitlabBranchStatus[]>(url, opts))\n .body;\n } catch (err) /* v8 ignore next -- commit status fetch failures map 404 to REPOSITORY_CHANGED, not mocked in specs */ {\n logger.debug({ err }, 'Error getting commit status');\n if (err.response?.statusCode === 404) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n}\n\nconst gitlabToRenovateStatusMapping: Record<BranchState, BranchStatus> = {\n pending: 'yellow',\n created: 'yellow',\n manual: 'yellow',\n running: 'yellow',\n waiting_for_resource: 'yellow',\n success: 'green',\n failed: 'red',\n canceled: 'red',\n skipped: 'red',\n scheduled: 'yellow',\n};\n\n// Returns the combined status for a branch.\nexport async function getBranchStatus(\n branchName: string,\n internalChecksAsSuccess: boolean,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n\n if (!git.branchExists(branchName)) {\n throw new Error(REPOSITORY_CHANGED);\n }\n\n const branchStatuses = await getStatus(branchName);\n /* v8 ignore next -- defensive: getStatus always resolves to an array in specs */\n if (!isArray(branchStatuses)) {\n logger.warn(\n { branchName, branchStatuses },\n 'Empty or unexpected branch statuses',\n );\n return 'yellow';\n }\n logger.debug(`Got res with ${branchStatuses.length} results`);\n\n const mr = await getBranchPr(branchName);\n if (mr && mr.sha !== mr.headPipelineSha && mr.headPipelineStatus) {\n logger.debug(\n 'Merge request head pipeline has different sha to commit, assuming merged results pipeline',\n );\n branchStatuses.push({\n status: mr.headPipelineStatus as BranchState,\n name: 'head_pipeline',\n });\n }\n // ignore all skipped jobs\n const res = branchStatuses.filter((check) => check.status !== 'skipped');\n if (res.length === 0) {\n // Return 'pending' if we have no status checks\n return 'yellow';\n }\n if (\n !internalChecksAsSuccess &&\n branchStatuses.every(\n (check) =>\n check.name?.startsWith('renovate/') &&\n gitlabToRenovateStatusMapping[check.status] === 'green',\n )\n ) {\n logger.debug(\n 'Successful checks are all internal renovate/ checks, so returning \"pending\" branch status',\n );\n return 'yellow';\n }\n let status: BranchStatus = 'green'; // default to green\n res\n .filter((check) => !check.allow_failure)\n .forEach((check) => {\n // v8 ignore else -- TODO: add test #40625\n if (status !== 'red') {\n // if red, stay red\n let mappedStatus: BranchStatus =\n gitlabToRenovateStatusMapping[check.status];\n if (!mappedStatus) {\n logger.warn(\n { check },\n 'Could not map GitLab check.status to Renovate status',\n );\n mappedStatus = 'yellow';\n }\n if (mappedStatus !== 'green') {\n logger.trace({ check }, 'Found non-green check');\n status = mappedStatus;\n }\n }\n });\n return status;\n}\n\n// Pull Request\nexport async function getPrList(): Promise<Pr[]> {\n return await GitlabPrCache.getPrs(\n gitlabApi,\n config.repository,\n botUserName,\n !!config.ignorePrAuthor,\n );\n}\n\nasync function ignoreApprovals(pr: number): Promise<void> {\n try {\n const url = `projects/${config.repository}/merge_requests/${pr}/approval_rules`;\n const { body: rules } = await gitlabApi.getJsonUnchecked<\n {\n name: string;\n rule_type: string;\n id: number;\n }[]\n >(url);\n\n const ruleName = 'renovateIgnoreApprovals';\n\n const existingAnyApproverRule = rules?.find(\n ({ rule_type }) => rule_type === 'any_approver',\n );\n const existingRegularApproverRules = rules?.filter(\n ({ rule_type, name }) =>\n rule_type !== 'any_approver' &&\n name !== ruleName &&\n rule_type !== 'report_approver' &&\n rule_type !== 'code_owner',\n );\n\n if (existingRegularApproverRules?.length) {\n await p.all(\n existingRegularApproverRules.map((rule) => async (): Promise<void> => {\n await gitlabApi.deleteJson(`${url}/${rule.id}`);\n }),\n );\n }\n\n if (existingAnyApproverRule) {\n await gitlabApi.putJson(`${url}/${existingAnyApproverRule.id}`, {\n body: { ...existingAnyApproverRule, approvals_required: 0 },\n });\n return;\n }\n\n const zeroApproversRule = rules?.find(({ name }) => name === ruleName);\n if (!zeroApproversRule) {\n await gitlabApi.postJson(url, {\n body: {\n name: ruleName,\n approvals_required: 0,\n },\n });\n }\n } catch (err) {\n logger.warn({ err }, 'GitLab: Error adding approval rule');\n }\n}\n\nasync function tryPrAutomerge(\n pr: number,\n platformPrOptions: PlatformPrOptions | undefined,\n): Promise<void> {\n try {\n if (platformPrOptions?.gitLabIgnoreApprovals) {\n await ignoreApprovals(pr);\n }\n\n if (platformPrOptions?.usePlatformAutomerge) {\n // https://docs.gitlab.com/ee/api/merge_requests.html#merge-status\n const desiredDetailedMergeStatus = [\n 'mergeable',\n 'ci_still_running',\n 'not_approved',\n ];\n const desiredPipelineStatus = [\n 'failed', // don't lose time if pipeline failed\n 'running', // pipeline is running, no need to wait for it\n ];\n const desiredStatus = 'can_be_merged';\n const env = getEnv();\n // The default value of 5 attempts results in max. 13.75 seconds timeout if no pipeline created.\n const retryTimes = parseInteger(\n env.RENOVATE_X_GITLAB_AUTO_MERGEABLE_CHECK_ATTEMPS,\n 5,\n );\n\n const mergeDelay = parseInteger(\n env.RENOVATE_X_GITLAB_MERGE_REQUEST_DELAY,\n 250,\n );\n\n // Check for correct merge request status before setting `merge_when_pipeline_succeeds` to `true`.\n for (let attempt = 1; attempt <= retryTimes; attempt += 1) {\n const { body } = await gitlabApi.getJsonUnchecked<{\n merge_status?: string;\n detailed_merge_status?: string;\n merge_when_pipeline_succeeds?: boolean;\n pipeline: {\n status: string;\n };\n }>(`projects/${config.repository}/merge_requests/${pr}`, {\n memCache: false,\n });\n\n // Exit early if merge_when_pipeline_succeeds is already set\n if (body.merge_when_pipeline_succeeds === true) {\n logger.debug(\n 'Skipping automerge retry - merge_when_pipeline_succeeds already enabled',\n );\n return;\n }\n // detailed_merge_status is available with Gitlab >=15.6.0\n const use_detailed_merge_status = !!body.detailed_merge_status;\n const detailed_merge_status_check =\n use_detailed_merge_status &&\n desiredDetailedMergeStatus.includes(body.detailed_merge_status!);\n // merge_status is deprecated with Gitlab >= 15.6\n const deprecated_merge_status_check =\n !use_detailed_merge_status && body.merge_status === desiredStatus;\n\n // Only continue if the merge request can be merged and has a pipeline.\n if (\n (detailed_merge_status_check || deprecated_merge_status_check) &&\n body.pipeline !== null &&\n desiredPipelineStatus.includes(body.pipeline.status)\n ) {\n break;\n }\n logger.debug(`PR not yet in mergeable state. Retrying ${attempt}`);\n await setTimeout(mergeDelay * attempt ** 2); // exponential backoff\n }\n\n // The merge_trains endpoint's auto_merge parameter requires GitLab\n // 17.11+. On older versions we fall back to the /merge endpoint so the\n // MR still automerges, just not on the train.\n // https://docs.gitlab.com/api/merge_trains/#add-a-merge-request-to-a-merge-train\n const useMergeTrain =\n config.mergeTrainsEnabled && !semver.lt(defaults.version, '17.11.0');\n if (config.mergeTrainsEnabled && !useMergeTrain) {\n logger.once.warn(\n { version: defaults.version },\n 'Merge trains require GitLab 17.11.0 or later, falling back to /merge endpoint',\n );\n }\n\n // Even if Gitlab returns a \"merge-able\" merge request status, enabling auto-merge sometimes\n // returns a 405 Method Not Allowed. It seems to be a timing issue within Gitlab.\n for (let attempt = 1; attempt <= retryTimes; attempt += 1) {\n try {\n if (useMergeTrain) {\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_trains/merge_requests/${pr}`,\n {\n body: {\n auto_merge: true,\n },\n },\n );\n } else {\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${pr}/merge`,\n {\n body: {\n should_remove_source_branch: true,\n merge_when_pipeline_succeeds: true,\n },\n },\n );\n }\n break;\n } catch (err) {\n logger.debug(\n { err },\n `Automerge on PR creation failed. Retrying ${attempt}`,\n );\n }\n await setTimeout(mergeDelay * attempt ** 2); // exponential backoff\n }\n }\n } catch (err) /* v8 ignore next -- defensive: retry loop already swallows errors, outer catch is a last resort */ {\n logger.debug({ err }, 'Automerge on PR creation failed');\n }\n}\n\nasync function approveMr(mrNumber: number): Promise<void> {\n const env = getEnv();\n const opts: GitlabHttpOptions = {};\n if (env.RENOVATE_X_GITLAB_AUTO_APPROVE_TOKEN) {\n opts.token = env.RENOVATE_X_GITLAB_AUTO_APPROVE_TOKEN;\n }\n logger.debug(`approveMr(${mrNumber})`);\n try {\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_requests/${mrNumber}/approve`,\n opts,\n );\n } catch (err) {\n logger.warn({ err }, 'GitLab: Error approving merge request');\n }\n}\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle,\n prBody: rawDescription,\n draftPR,\n labels,\n platformPrOptions,\n}: CreatePRConfig): Promise<Pr> {\n let title = prTitle;\n if (draftPR) {\n title = draftPrefix + title;\n }\n const description = sanitize(rawDescription);\n logger.debug(`Creating Merge Request: ${title}`);\n const res = await gitlabApi.postJson<GitLabMergeRequest>(\n `projects/${config.repository}/merge_requests`,\n {\n body: {\n source_branch: sourceBranch,\n target_branch: targetBranch,\n remove_source_branch: true,\n title,\n description,\n labels: coerceArray(labels).join(','),\n squash: config.squash,\n },\n },\n );\n\n const pr = prInfo(res.body);\n await GitlabPrCache.setPr(\n gitlabApi,\n config.repository,\n botUserName,\n pr,\n !!config.ignorePrAuthor,\n );\n\n if (platformPrOptions?.autoApprove) {\n await approveMr(pr.number);\n }\n\n await tryPrAutomerge(pr.number, platformPrOptions);\n\n return pr;\n}\n\nexport async function getPr(iid: number): Promise<GitlabPr> {\n logger.debug(`getPr(${iid})`);\n const mr = await getMR(config.repository, iid);\n\n // Harmonize fields with GitHub\n return prInfo(mr);\n}\n\nexport async function updatePr({\n number: iid,\n prTitle,\n prBody: description,\n addLabels,\n removeLabels,\n state,\n platformPrOptions,\n targetBranch,\n}: UpdatePrConfig): Promise<void> {\n let title = prTitle;\n if ((await getPrList()).find((pr) => pr.number === iid)?.isDraft) {\n title = draftPrefix + title;\n }\n const newState = {\n ['closed']: 'close',\n ['open']: 'reopen',\n // TODO: null check (#22198)\n }[state!];\n\n const body: any = {\n title,\n description: sanitize(description),\n ...(newState && { state_event: newState }),\n };\n if (targetBranch) {\n body.target_branch = targetBranch;\n }\n\n if (addLabels) {\n body.add_labels = addLabels;\n }\n\n if (removeLabels) {\n body.remove_labels = removeLabels;\n }\n\n const updatedPrInfo = (\n await gitlabApi.putJson<GitLabMergeRequest>(\n `projects/${config.repository}/merge_requests/${iid}`,\n { body },\n )\n ).body;\n\n const updatedPr = prInfo(updatedPrInfo);\n await GitlabPrCache.setPr(\n gitlabApi,\n config.repository,\n botUserName,\n updatedPr,\n !!config.ignorePrAuthor,\n );\n\n if (platformPrOptions?.autoApprove) {\n await approveMr(iid);\n }\n}\n\nexport async function reattemptPlatformAutomerge({\n number: iid,\n platformPrOptions,\n}: ReattemptPlatformAutomergeConfig): Promise<void> {\n await tryPrAutomerge(iid, platformPrOptions);\n\n logger.debug(`PR platform automerge re-attempted...prNo: ${iid}`);\n}\n\nasync function tryAddPrToMergeTrain(id: number): Promise<boolean> {\n try {\n // Without `auto_merge` the MR is added to the train immediately. The\n // train merges it and removes the source branch on its own.\n // https://docs.gitlab.com/api/merge_trains/#add-a-merge-request-to-a-merge-train\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_trains/merge_requests/${id}`,\n );\n logger.debug(`MR !${id} added to the merge train`);\n return true;\n } catch (err) {\n logger.debug({ err }, 'Failed to add MR to the merge train');\n return false;\n }\n}\n\nexport async function mergePr({ id }: MergePRConfig): Promise<boolean> {\n if (config.mergeTrainsEnabled) {\n return tryAddPrToMergeTrain(id);\n }\n\n try {\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${id}/merge`,\n {\n body: {\n should_remove_source_branch: true,\n },\n },\n );\n return true;\n } catch (err) /* v8 ignore next -- merge rejection statuses (401/406) are mapped to false, not mocked in specs */ {\n if (err.statusCode === 401) {\n logger.debug('No permissions to merge PR');\n return false;\n }\n if (err.statusCode === 406) {\n logger.debug({ err }, 'PR not acceptable for merging');\n return false;\n }\n logger.debug({ err }, 'merge PR error');\n logger.debug('PR merge failed');\n return false;\n }\n}\n\nexport function massageMarkdown(input: string): string {\n const desc = input\n .replace(regEx(/Pull Request/g), 'Merge Request')\n .replace(regEx(/\\bPR: #/g), 'MR: !')\n .replace(regEx(/\\bPR\\b/g), 'MR')\n .replace(regEx(/\\bPRs\\b/g), 'MRs')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](!')\n .replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](#')\n // Strip unicode null characters as GitLab markdown does not permit them\n // oxlint-disable-next-line no-control-regex\n .replace(regEx(/\\u0000/g), '');\n return smartTruncate(desc, maxBodyLength());\n}\n\nexport function maxBodyLength(): number {\n if (semver.lt(defaults.version, '13.4.0')) {\n logger.debug(\n { version: defaults.version },\n 'GitLab versions earlier than 13.4 have issues with long descriptions, truncating to 25K characters',\n );\n return 25000;\n }\n return 1000000;\n}\n\n/* v8 ignore next: no need to test */\nexport function labelCharLimit(): number {\n return 255;\n}\n\n// Branch\n\nfunction matchesState(state: string, desiredState: string): boolean {\n if (desiredState === 'all') {\n return true;\n }\n if (desiredState.startsWith('!')) {\n return state !== desiredState.substring(1);\n }\n return state === desiredState;\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n includeOtherAuthors,\n}: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, ${prTitle!}, ${state})`);\n\n if (includeOtherAuthors) {\n // PR might have been created by anyone, so don't use the cached Renovate MR list\n const response = await gitlabApi.getJsonUnchecked<GitLabMergeRequest[]>(\n `projects/${config.repository}/merge_requests?source_branch=${branchName}&state=opened`,\n );\n\n const { body: mrList } = response;\n if (!mrList.length) {\n logger.debug(`No MR found for branch ${branchName}`);\n return null;\n }\n\n return prInfo(mrList[0]);\n }\n\n const prList = await getPrList();\n return (\n prList.find(\n (p: { sourceBranch: string; title: string; state: string }) =>\n p.sourceBranch === branchName &&\n (!prTitle || p.title.toUpperCase() === prTitle.toUpperCase()) &&\n matchesState(p.state, state),\n ) ?? null\n );\n}\n\n// Returns the Pull Request for a branch. Null if not exists.\nexport async function getBranchPr(\n branchName: string,\n): Promise<GitlabPr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n // cache-bust in case we have rebased\n const res = await getStatus(branchName, false);\n logger.debug(`Got res with ${res.length} results`);\n for (const check of res) {\n if (check.name === context) {\n return gitlabToRenovateStatusMapping[check.status] || 'yellow';\n }\n }\n return null;\n}\n\nexport async function setBranchStatus({\n branchName,\n context,\n description,\n state: renovateState,\n url: targetUrl,\n}: BranchStatusConfig): Promise<void> {\n // First, get the branch commit SHA\n const branchSha = git.getBranchCommit(branchName);\n if (!branchSha) {\n logger.warn('Failed to get the branch commit SHA');\n return;\n }\n // Now, check the statuses for that commit\n const url = `projects/${config.repository}/statuses/${branchSha}`;\n let state = 'success';\n if (renovateState === 'yellow') {\n state = 'pending';\n } else if (renovateState === 'red') {\n state = 'failed';\n }\n const options: any = {\n state,\n description,\n context,\n };\n\n // v8 ignore else -- TODO: add test #40625\n if (targetUrl) {\n options.target_url = targetUrl;\n }\n\n const env = getEnv();\n const retryTimes = parseInteger(\n env.RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS,\n 2,\n );\n\n try {\n for (let attempt = 1; attempt <= retryTimes + 1; attempt += 1) {\n const commitUrl = `projects/${config.repository}/repository/commits/${branchSha}`;\n await gitlabApi\n .getJsonSafe(commitUrl, { memCache: false }, LastPipelineId)\n .onValue((pipelineId) => {\n options.pipeline_id = pipelineId;\n });\n if (options.pipeline_id !== undefined) {\n break;\n }\n if (attempt >= retryTimes + 1) {\n logger.debug(`Pipeline not yet created after ${attempt} attempts`);\n } else {\n logger.debug(`Pipeline not yet created. Retrying ${attempt}`);\n }\n // give gitlab some time to create pipelines for the sha\n await setTimeout(\n parseInteger(env.RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY, 1000),\n );\n }\n } catch (err) {\n logger.debug({ err });\n logger.warn('Failed to retrieve commit pipeline');\n }\n\n if (\n options.pipeline_id === undefined &&\n env.RENOVATE_X_GITLAB_SKIP_STATUS_WITHOUT_PIPELINE === 'true'\n ) {\n logger.debug('Skipping branch status update because no pipeline was found');\n return;\n }\n\n try {\n await gitlabApi.postJson(url, { body: options });\n\n // update status cache\n await getStatus(branchName, false);\n } catch (err) {\n const message = err.body?.message;\n if (\n isString(message) &&\n message.startsWith('Cannot transition status via :enqueue from :pending')\n ) {\n // https://gitlab.com/gitlab-org/gitlab-foss/issues/25807\n logger.debug('Ignoring status transition error');\n } else {\n logger.debug({ err });\n logger.warn('Failed to set branch status');\n }\n }\n}\n\n// Issue\n\nexport async function getIssueList(): Promise<GitlabIssue[]> {\n // v8 ignore else -- TODO: add test #40625\n if (!config.issueList) {\n const searchParams: Record<string, string> = {\n per_page: '100',\n state: 'opened',\n };\n // v8 ignore else -- TODO: add test #40625\n if (!config.ignorePrAuthor) {\n searchParams.scope = 'created_by_me';\n }\n const query = getQueryString(searchParams);\n const res = await gitlabApi.getJsonUnchecked<\n { iid: number; title: string; labels: string[] }[]\n >(`projects/${config.repository}/issues?${query}`, {\n memCache: false,\n paginate: true,\n });\n /* v8 ignore next -- defensive: paginated issues endpoint always yields an array in specs */\n if (!isArray(res.body)) {\n logger.warn({ responseBody: res.body }, 'Could not retrieve issue list');\n return [];\n }\n config.issueList = res.body.map((i) => ({\n iid: i.iid,\n title: i.title,\n labels: i.labels,\n }));\n }\n return config.issueList;\n}\n\nexport async function getIssue(\n number: number,\n useCache = true,\n): Promise<Issue | null> {\n try {\n const opts: GitlabHttpOptions = {};\n /* v8 ignore next: temporary code */\n if (useCache) {\n opts.cacheProvider = memCacheProvider;\n } else {\n opts.memCache = false;\n }\n const issueBody = (\n await gitlabApi.getJsonUnchecked<{ description: string }>(\n `projects/${config.repository}/issues/${number}`,\n opts,\n )\n ).body.description;\n return {\n number,\n body: issueBody,\n };\n } catch (err) /* v8 ignore next -- defensive: issue fetch failures are logged and swallowed, not simulated in specs */ {\n logger.debug({ err, number }, 'Error getting issue');\n return null;\n }\n}\n\nexport async function findIssue(title: string): Promise<Issue | null> {\n logger.debug(`findIssue(${title})`);\n try {\n const issueList = await getIssueList();\n const issue = issueList.find((i) => i.title === title);\n if (!issue) {\n return null;\n }\n return await getIssue(issue.iid);\n } catch /* v8 ignore next -- defensive: getIssueList/getIssue failures are swallowed, not simulated in specs */ {\n logger.warn('Error finding issue');\n return null;\n }\n}\n\nexport async function ensureIssue({\n title,\n reuseTitle,\n body,\n labels,\n confidential,\n}: EnsureIssueConfig): Promise<'updated' | 'created' | null> {\n logger.debug(`ensureIssue()`);\n const description = massageMarkdown(sanitize(body));\n try {\n const issueList = await getIssueList();\n let issue = issueList.find((i) => i.title === title);\n issue ??= issueList.find((i) => i.title === reuseTitle);\n if (issue) {\n const existingDescription = (\n await gitlabApi.getJsonUnchecked<{ description: string }>(\n `projects/${config.repository}/issues/${issue.iid}`,\n )\n ).body.description;\n if (issue.title !== title || existingDescription !== description) {\n logger.debug('Updating issue');\n await gitlabApi.putJson(\n `projects/${config.repository}/issues/${issue.iid}`,\n {\n body: {\n title,\n description,\n labels: coerceArray(labels ?? issue.labels).join(','),\n confidential: confidential ?? false,\n },\n },\n );\n return 'updated';\n }\n } else {\n await gitlabApi.postJson(`projects/${config.repository}/issues`, {\n body: {\n title,\n description,\n labels: coerceArray(labels).join(','),\n confidential: confidential ?? false,\n },\n });\n logger.info('Issue created');\n // delete issueList so that it will be refetched as necessary\n delete config.issueList;\n return 'created';\n }\n } catch (err) /* v8 ignore next -- issue API failures (e.g. issues disabled) are swallowed, not simulated in specs */ {\n if (err.message.startsWith('Issues are disabled for this repo')) {\n logger.debug(`Could not create issue: ${(err as Error).message}`);\n } else {\n logger.warn({ err }, 'Could not ensure issue');\n }\n }\n return null;\n}\n\nexport async function ensureIssueClosing(title: string): Promise<void> {\n logger.debug(`ensureIssueClosing()`);\n const issueList = await getIssueList();\n for (const issue of issueList) {\n if (issue.title === title) {\n logger.debug({ issue }, 'Closing issue');\n await gitlabApi.putJson(\n `projects/${config.repository}/issues/${issue.iid}`,\n {\n body: { state_event: 'close' },\n },\n );\n }\n }\n}\n\nexport async function addAssignees(\n iid: number,\n assignees: string[],\n): Promise<void> {\n try {\n logger.debug(`Adding assignees '${assignees.join(', ')}' to #${iid}`);\n const assigneeIds: number[] = [];\n for (const assignee of assignees) {\n try {\n const userId = await getUserID(assignee);\n assigneeIds.push(userId);\n } catch (err) {\n logger.debug({ assignee, err }, 'getUserID() error');\n logger.warn({ assignee }, 'Failed to add assignee - could not get ID');\n }\n }\n const url = `projects/${\n config.repository\n }/merge_requests/${iid}?${getQueryString({\n 'assignee_ids[]': assigneeIds,\n })}`;\n await gitlabApi.putJson(url);\n } catch (err) {\n logger.debug({ err }, 'addAssignees error');\n logger.warn({ iid, assignees }, 'Failed to add assignees');\n }\n}\n\nexport async function addReviewers(\n iid: number,\n reviewers: string[],\n): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers.join(', ')}' to #${iid}`);\n\n if (semver.lt(defaults.version, '13.9.0')) {\n logger.warn(\n { version: defaults.version },\n 'Adding reviewers is only available in GitLab 13.9 and onwards',\n );\n return;\n }\n\n let mr: GitLabMergeRequest;\n try {\n mr = await getMR(config.repository, iid);\n } catch (err) {\n logger.warn({ err }, 'Failed to get existing reviewers');\n return;\n }\n\n mr.reviewers = coerceArray(mr.reviewers);\n const existingReviewers = mr.reviewers.map((r) => r.username);\n const existingReviewerIDs = mr.reviewers.map((r) => r.id);\n\n // Figure out which reviewers (of the ones we want to add) are not already on the MR as a reviewer\n const newReviewers = reviewers.filter((r) => !existingReviewers.includes(r));\n\n // Gather the IDs for all the reviewers we want to add\n let newReviewerIDs: number[];\n newReviewerIDs = (\n await p.all(\n newReviewers.map((r) => async () => {\n try {\n return [await getUserID(r)];\n } catch {\n // Unable to fetch userId, try resolve as a group\n return getMemberUserIDs(r);\n }\n }),\n )\n ).flat();\n\n if (isNonEmptyArray(newReviewers) && isEmptyArray(newReviewerIDs)) {\n logger.warn('Failed to get IDs of the new reviewers');\n return;\n }\n\n // Multiple groups may have the same members, so\n // filter out non-distinct values\n newReviewerIDs = [...new Set(newReviewerIDs)];\n\n try {\n await updateMR(config.repository, iid, {\n reviewer_ids: [...existingReviewerIDs, ...newReviewerIDs],\n });\n } catch (err) {\n logger.warn({ err }, 'Failed to add reviewers');\n }\n}\n\nexport async function deleteLabel(\n issueNo: number,\n label: string,\n): Promise<void> {\n logger.debug(`Deleting label ${label} from #${issueNo}`);\n try {\n const pr = await getPr(issueNo);\n const labels = coerceArray(pr.labels)\n .filter((l: string) => l !== label)\n .join(',');\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${issueNo}`,\n {\n body: { labels },\n },\n );\n } catch (err) /* v8 ignore next -- defensive: label deletion failures are logged and swallowed, not simulated in specs */ {\n logger.warn({ err, issueNo, label }, 'Failed to delete label');\n }\n}\n\nasync function getComments(issueNo: number): Promise<GitlabComment[]> {\n // GET projects/:owner/:repo/merge_requests/:number/notes\n logger.debug(`Getting comments for #${issueNo}`);\n const url = `projects/${config.repository}/merge_requests/${issueNo}/notes`;\n const comments = (\n await gitlabApi.getJsonUnchecked<GitlabComment[]>(url, { paginate: true })\n ).body;\n logger.debug(`Found ${comments.length} comments`);\n return comments;\n}\n\nasync function addComment(issueNo: number, body: string): Promise<void> {\n // POST projects/:owner/:repo/merge_requests/:number/notes\n await gitlabApi.postJson(\n `projects/${config.repository}/merge_requests/${issueNo}/notes`,\n {\n body: { body },\n },\n );\n}\n\nasync function editComment(\n issueNo: number,\n commentId: number,\n body: string,\n): Promise<void> {\n // PUT projects/:owner/:repo/merge_requests/:number/notes/:id\n await gitlabApi.putJson(\n `projects/${config.repository}/merge_requests/${issueNo}/notes/${commentId}`,\n {\n body: { body },\n },\n );\n}\n\nasync function deleteComment(\n issueNo: number,\n commentId: number,\n): Promise<void> {\n // DELETE projects/:owner/:repo/merge_requests/:number/notes/:id\n await gitlabApi.deleteJson(\n `projects/${config.repository}/merge_requests/${issueNo}/notes/${commentId}`,\n );\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n const sanitizedContent = sanitize(content);\n const massagedTopic = topic\n ? topic\n .replace(regEx(/Pull Request/g), 'Merge Request')\n .replace(regEx(/PR/g), 'MR')\n : topic;\n const comments = await getComments(number);\n let body: string;\n let commentId: number | undefined;\n let commentNeedsUpdating: boolean | undefined;\n // TODO: types (#22198)\n if (topic) {\n logger.debug(`Ensuring comment \"${massagedTopic!}\" in #${number}`);\n body = `### ${topic}\\n\\n${sanitizedContent}`;\n body = smartTruncate(\n body\n .replace(regEx(/Pull Request/g), 'Merge Request')\n .replace(regEx(/PR/g), 'MR'),\n maxBodyLength(),\n );\n comments.forEach((comment: { body: string; id: number }) => {\n // v8 ignore else -- TODO: add test #40625\n if (comment.body.startsWith(`### ${massagedTopic!}\\n\\n`)) {\n commentId = comment.id;\n commentNeedsUpdating = comment.body !== body;\n }\n });\n } else {\n logger.debug(`Ensuring content-only comment in #${number}`);\n body = smartTruncate(`${sanitizedContent}`, maxBodyLength());\n comments.forEach((comment: { body: string; id: number }) => {\n // v8 ignore else -- TODO: add test #40625\n if (comment.body === body) {\n commentId = comment.id;\n commentNeedsUpdating = false;\n }\n });\n }\n if (!commentId) {\n await addComment(number, body);\n logger.debug(\n { repository: config.repository, issueNo: number },\n 'Added comment',\n );\n } else if (commentNeedsUpdating) {\n await editComment(number, commentId, body);\n logger.debug(\n { repository: config.repository, issueNo: number },\n 'Updated comment',\n );\n } else {\n logger.debug('Comment is already up-to-date');\n }\n return true;\n}\n\nfunction byTopic(comment: GitlabComment, topic: string): boolean {\n return comment.body.startsWith(`### ${topic}\\n\\n`);\n}\n\nfunction byContent(comment: GitlabComment, content: string): boolean {\n return comment.body.trim() === content;\n}\n\nexport async function ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n const { number: issueNo } = deleteConfig;\n const key =\n deleteConfig.type === 'by-topic'\n ? deleteConfig.topic\n : deleteConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${issueNo} is removed`);\n\n const comments = await getComments(issueNo);\n let commentId: number | null | undefined = null;\n\n // v8 ignore else -- TODO: add test #40625\n if (deleteConfig.type === 'by-topic') {\n const topic = deleteConfig.topic;\n commentId = comments.find((comment) => byTopic(comment, topic))?.id;\n } else if (deleteConfig.type === 'by-content') {\n const content = deleteConfig.content;\n commentId = comments.find((comment) => byContent(comment, content))?.id;\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (commentId) {\n await deleteComment(issueNo, commentId);\n }\n}\n\nexport async function filterUnavailableUsers(\n users: string[],\n): Promise<string[]> {\n const filteredUsers: string[] = [];\n for (const user of users) {\n if (!(await isUserBusy(user))) {\n filteredUsers.push(user);\n }\n }\n return filteredUsers;\n}\n\nexport async function expandGroupMembers(\n reviewersOrAssignees: string[],\n): Promise<string[]> {\n const expandedReviewersOrAssignees: string[] = [];\n const normalizedReviewersOrAssigneesWithoutEmails: string[] = [];\n\n // Skip passing user emails to Gitlab API, but include them in the final result\n for (const reviewerOrAssignee of reviewersOrAssignees) {\n // Resolve GitLab CODEOWNERS role handles (@@developer, @@maintainer,\n // @@owner) to project members instead of treating them as groups\n const roleAccessLevel = getRoleAccessLevel(reviewerOrAssignee);\n if (roleAccessLevel !== null) {\n try {\n const members = await getProjectMembersByRole(\n config.repository,\n roleAccessLevel,\n );\n expandedReviewersOrAssignees.push(...members.map((u) => u.username));\n } catch (err) {\n logger.debug(\n { err, reviewerOrAssignee },\n 'Unable to fetch role members',\n );\n }\n continue;\n }\n\n if (reviewerOrAssignee.indexOf('@') > 0) {\n expandedReviewersOrAssignees.push(reviewerOrAssignee);\n continue;\n }\n\n // Normalize the potential group names before passing to Gitlab API\n normalizedReviewersOrAssigneesWithoutEmails.push(\n noLeadingAtSymbol(reviewerOrAssignee),\n );\n }\n\n for (const reviewerOrAssignee of normalizedReviewersOrAssigneesWithoutEmails) {\n try {\n const members = await getMemberUsernames(reviewerOrAssignee);\n expandedReviewersOrAssignees.push(...members);\n } catch (err) {\n if (err.statusCode !== 404) {\n logger.debug({ err, reviewerOrAssignee }, 'Unable to fetch group');\n }\n expandedReviewersOrAssignees.push(reviewerOrAssignee);\n }\n }\n return expandedReviewersOrAssignees;\n}\n"],"mappings":"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"}
@@ -34,6 +34,11 @@ async function handleError(config, err) {
34
34
  delete config.branchList;
35
35
  return err.message;
36
36
  }
37
+ if (err.message === "pending-deletion") {
38
+ logger.info("Repository is pending deletion - skipping");
39
+ delete config.branchList;
40
+ return err.message;
41
+ }
37
42
  if (err.message === "renamed") {
38
43
  logger.info("Repository has been renamed - skipping");
39
44
  delete config.branchList;
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","names":[],"sources":["../../../lib/workers/repository/error.ts"],"sourcesContent":["import type { RenovateConfig } from '../../config/types.ts';\n\nimport {\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n EXTERNAL_HOST_ERROR,\n MANAGER_LOCKFILE_ERROR,\n MISSING_API_CREDENTIALS,\n NO_VULNERABILITY_ALERTS,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CANNOT_FORK,\n REPOSITORY_CHANGED,\n REPOSITORY_CLOSED_ONBOARDING,\n REPOSITORY_DISABLED,\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_EMPTY,\n REPOSITORY_FORKED,\n REPOSITORY_FORK_MISSING,\n REPOSITORY_FORK_MODE_FORKED,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n REPOSITORY_NO_CONFIG,\n REPOSITORY_NO_PACKAGE_FILES,\n REPOSITORY_RENAMED,\n REPOSITORY_UNINITIATED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n SYSTEM_INSUFFICIENT_MEMORY,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport {\n raiseConfigWarningIssue,\n raiseCredentialsWarningIssue,\n} from './error-config.ts';\nimport type { RepositoryResult } from './result.ts';\n\nexport default async function handleError(\n config: RenovateConfig,\n err: Error,\n): Promise<RepositoryResult> {\n return instrument('handleError', async () => {\n if (err.message === REPOSITORY_UNINITIATED) {\n logger.info('Repository is uninitiated - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_EMPTY) {\n logger.info('Repository is empty - skipping');\n delete config.branchList;\n return err.message;\n }\n switch (err.message) {\n case REPOSITORY_CLOSED_ONBOARDING:\n case REPOSITORY_DISABLED:\n case REPOSITORY_DISABLED_BY_CONFIG:\n case REPOSITORY_NO_CONFIG:\n logger.info('Repository is disabled - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ARCHIVED) {\n logger.info('Repository is archived - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_MIRRORED) {\n logger.info('Repository is a mirror - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_RENAMED) {\n logger.info('Repository has been renamed - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_BLOCKED) {\n delete config.branchList;\n logger.info('Repository is blocked - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ACCESS_FORBIDDEN) {\n delete config.branchList;\n logger.info('Repository is forbidden');\n return err.message;\n }\n if (err.message === REPOSITORY_NOT_FOUND) {\n delete config.branchList;\n logger.error('Repository is not found');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MODE_FORKED) {\n logger.info(\n 'Repository is a fork and cannot be processed when Renovate is running in fork mode itself',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_FORKED) {\n logger.info(\n 'Repository is a fork and not manually configured - skipping - did you want to run with --fork-processing=enabled?',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_CANNOT_FORK) {\n logger.info('Cannot fork repository - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MISSING) {\n logger.info('Cannot find fork required for fork mode - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_NO_PACKAGE_FILES) {\n logger.info('Repository has no package files - skipping');\n return err.message;\n }\n if (err.message === NO_VULNERABILITY_ALERTS) {\n logger.info('Repository has no vulnerability alerts - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.info('Repository has changed during renovation - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === CONFIG_VALIDATION) {\n delete config.branchList;\n if (config.configValidationError) {\n logger.error({ err }, 'Repository has invalid config');\n } else {\n logger.warn({ err }, 'Repository has invalid config');\n }\n await raiseConfigWarningIssue(config, err);\n return err.message;\n }\n if (err.message === MISSING_API_CREDENTIALS) {\n delete config.branchList;\n logger.info({ err }, MISSING_API_CREDENTIALS);\n await raiseCredentialsWarningIssue(config, err);\n return err.message;\n }\n if (err.message === CONFIG_SECRETS_EXPOSED) {\n delete config.branchList;\n logger.warn(\n { err },\n 'Repository aborted due to potential secrets exposure',\n );\n return err.message;\n }\n if (err instanceof ExternalHostError) {\n logger.warn(\n { hostType: err.hostType, packageName: err.packageName, err: err.err },\n 'Host error',\n );\n logger.info('External host error causing abort - skipping');\n delete config.branchList;\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('No space left on device') ||\n err.message === SYSTEM_INSUFFICIENT_DISK_SPACE\n ) {\n logger.error('Disk space error - skipping');\n delete config.branchList;\n return SYSTEM_INSUFFICIENT_DISK_SPACE;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.warn('Rate limit exceeded - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === SYSTEM_INSUFFICIENT_MEMORY) {\n logger.warn('Insufficient memory - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.warn('Bad credentials - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.warn('Integration unauthorized - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_AUTHENTICATION_ERROR) {\n logger.warn('Authentication error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === TEMPORARY_ERROR) {\n logger.info('Temporary error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n delete config.branchList;\n logger.info('Lock file error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message.includes('The requested URL returned error: 5')) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('remote end hung up unexpectedly') ||\n err.message.includes('access denied or repository not exported')\n ) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (err.message.includes('fatal: not a git repository')) {\n delete config.branchList;\n return TEMPORARY_ERROR;\n }\n // Swallow this error so that other repositories can be processed\n logger.error({ err }, `Repository has unknown error`);\n // delete branchList to avoid cleaning up branches\n delete config.branchList;\n\n return UNKNOWN_ERROR;\n });\n}\n"],"mappings":";;;;;;AA6CA,eAA8B,YAC5B,QACA,KAC2B;CAC3B,OAAO,WAAW,eAAe,YAAY;EAC3C,IAAI,IAAI,YAAA,eAAoC;GAC1C,OAAO,KAAK,sCAAsC;GAClD,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,SAA8B;GACpC,OAAO,KAAK,gCAAgC;GAC5C,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,QAAQ,IAAI,SAAZ;GACE,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,OAAO,KAAK,mCAAmC;IAC/C,OAAO,IAAI;EACf;EACA,IAAI,IAAI,YAAA,YAAiC;GACvC,OAAO,KAAK,mCAAmC;GAC/C,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,UAAiC;GACvC,OAAO,KAAK,mCAAmC;GAC/C,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,WAAgC;GACtC,OAAO,KAAK,wCAAwC;GACpD,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,WAAgC;GACtC,OAAO,OAAO;GACd,OAAO,KAAK,kCAAkC;GAC9C,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,aAAyC;GAC/C,OAAO,OAAO;GACd,OAAO,KAAK,yBAAyB;GACrC,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,aAAkC;GACxC,OAAO,OAAO;GACd,OAAO,MAAM,yBAAyB;GACtC,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,oBAAyC;GAC/C,OAAO,KACL,2FACF;GACA,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,QAA+B;GACrC,OAAO,KACL,mHACF;GACA,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,eAAoC;GAC1C,OAAO,KAAK,mCAAmC;GAC/C,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,gBAAqC;GAC3C,OAAO,KAAK,oDAAoD;GAChE,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,oBAAyC;GAC/C,OAAO,KAAK,4CAA4C;GACxD,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,2BAAqC;GAC3C,OAAO,KAAK,mDAAmD;GAC/D,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,sBAAgC;GACtC,OAAO,KAAK,qDAAqD;GACjE,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,qBAA+B;GACrC,OAAO,OAAO;GACd,IAAI,OAAO,uBACT,OAAO,MAAM,EAAE,IAAI,GAAG,+BAA+B;QAErD,OAAO,KAAK,EAAE,IAAI,GAAG,+BAA+B;GAEtD,MAAM,wBAAwB,QAAQ,GAAG;GACzC,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,2BAAqC;GAC3C,OAAO,OAAO;GACd,OAAO,KAAK,EAAE,IAAI,GAAG,uBAAuB;GAC5C,MAAM,6BAA6B,QAAQ,GAAG;GAC9C,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,0BAAoC;GAC1C,OAAO,OAAO;GACd,OAAO,KACL,EAAE,IAAI,GACN,sDACF;GACA,OAAO,IAAI;EACb;EACA,IAAI,eAAe,mBAAmB;GACpC,OAAO,KACL;IAAE,UAAU,IAAI;IAAU,aAAa,IAAI;IAAa,KAAK,IAAI;GAAI,GACrE,YACF;GACA,OAAO,KAAK,8CAA8C;GAC1D,OAAO,OAAO;GACd,OAAO;EACT;EACA,IACE,IAAI,QAAQ,SAAS,yBAAyB,KAC9C,IAAI,YAAA,cACJ;GACA,OAAO,MAAM,6BAA6B;GAC1C,OAAO,OAAO;GACd,OAAO;EACT;EACA,IAAI,IAAI,YAAA,uBAA0C;GAChD,OAAO,KAAK,gCAAgC;GAC5C,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,iBAAwC;GAC9C,OAAO,KAAK,gCAAgC;GAC5C,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,mBAAsC;GAC5C,OAAO,KAAK,4BAA4B;GACxC,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,4BAA+C;GACrD,OAAO,KAAK,qCAAqC;GACjD,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,wBAA2C;GACjD,OAAO,KAAK,iCAAiC;GAC7C,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,mBAA6B;GACnC,OAAO,KAAK,4BAA4B;GACxC,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,YAAA,kBAAoC;GAC1C,OAAO,OAAO;GACd,OAAO,KAAK,4BAA4B;GACxC,OAAO,OAAO;GACd,OAAO,IAAI;EACb;EACA,IAAI,IAAI,QAAQ,SAAS,qCAAqC,GAAG;GAC/D,OAAO,KAAK,EAAE,IAAI,GAAG,sBAAsB;GAC3C,OAAO,OAAO;GAEd,OAAO;EACT;EACA,IACE,IAAI,QAAQ,SAAS,iCAAiC,KACtD,IAAI,QAAQ,SAAS,0CAA0C,GAC/D;GACA,OAAO,KAAK,EAAE,IAAI,GAAG,sBAAsB;GAC3C,OAAO,OAAO;GAEd,OAAO;EACT;EACA,IAAI,IAAI,QAAQ,SAAS,6BAA6B,GAAG;GACvD,OAAO,OAAO;GACd,OAAO;EACT;EAEA,OAAO,MAAM,EAAE,IAAI,GAAG,8BAA8B;EAEpD,OAAO,OAAO;EAEd,OAAO;CACT,CAAC;AACH"}
1
+ {"version":3,"file":"error.js","names":[],"sources":["../../../lib/workers/repository/error.ts"],"sourcesContent":["import type { RenovateConfig } from '../../config/types.ts';\n\nimport {\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n EXTERNAL_HOST_ERROR,\n MANAGER_LOCKFILE_ERROR,\n MISSING_API_CREDENTIALS,\n NO_VULNERABILITY_ALERTS,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CANNOT_FORK,\n REPOSITORY_CHANGED,\n REPOSITORY_CLOSED_ONBOARDING,\n REPOSITORY_DISABLED,\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_EMPTY,\n REPOSITORY_FORKED,\n REPOSITORY_FORK_MISSING,\n REPOSITORY_FORK_MODE_FORKED,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n REPOSITORY_NO_CONFIG,\n REPOSITORY_NO_PACKAGE_FILES,\n REPOSITORY_PENDING_DELETION,\n REPOSITORY_RENAMED,\n REPOSITORY_UNINITIATED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n SYSTEM_INSUFFICIENT_MEMORY,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport {\n raiseConfigWarningIssue,\n raiseCredentialsWarningIssue,\n} from './error-config.ts';\nimport type { RepositoryResult } from './result.ts';\n\nexport default async function handleError(\n config: RenovateConfig,\n err: Error,\n): Promise<RepositoryResult> {\n return instrument('handleError', async () => {\n if (err.message === REPOSITORY_UNINITIATED) {\n logger.info('Repository is uninitiated - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_EMPTY) {\n logger.info('Repository is empty - skipping');\n delete config.branchList;\n return err.message;\n }\n switch (err.message) {\n case REPOSITORY_CLOSED_ONBOARDING:\n case REPOSITORY_DISABLED:\n case REPOSITORY_DISABLED_BY_CONFIG:\n case REPOSITORY_NO_CONFIG:\n logger.info('Repository is disabled - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ARCHIVED) {\n logger.info('Repository is archived - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_MIRRORED) {\n logger.info('Repository is a mirror - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_PENDING_DELETION) {\n logger.info('Repository is pending deletion - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_RENAMED) {\n logger.info('Repository has been renamed - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_BLOCKED) {\n delete config.branchList;\n logger.info('Repository is blocked - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ACCESS_FORBIDDEN) {\n delete config.branchList;\n logger.info('Repository is forbidden');\n return err.message;\n }\n if (err.message === REPOSITORY_NOT_FOUND) {\n delete config.branchList;\n logger.error('Repository is not found');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MODE_FORKED) {\n logger.info(\n 'Repository is a fork and cannot be processed when Renovate is running in fork mode itself',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_FORKED) {\n logger.info(\n 'Repository is a fork and not manually configured - skipping - did you want to run with --fork-processing=enabled?',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_CANNOT_FORK) {\n logger.info('Cannot fork repository - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MISSING) {\n logger.info('Cannot find fork required for fork mode - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_NO_PACKAGE_FILES) {\n logger.info('Repository has no package files - skipping');\n return err.message;\n }\n if (err.message === NO_VULNERABILITY_ALERTS) {\n logger.info('Repository has no vulnerability alerts - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.info('Repository has changed during renovation - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === CONFIG_VALIDATION) {\n delete config.branchList;\n if (config.configValidationError) {\n logger.error({ err }, 'Repository has invalid config');\n } else {\n logger.warn({ err }, 'Repository has invalid config');\n }\n await raiseConfigWarningIssue(config, err);\n return err.message;\n }\n if (err.message === MISSING_API_CREDENTIALS) {\n delete config.branchList;\n logger.info({ err }, MISSING_API_CREDENTIALS);\n await raiseCredentialsWarningIssue(config, err);\n return err.message;\n }\n if (err.message === CONFIG_SECRETS_EXPOSED) {\n delete config.branchList;\n logger.warn(\n { err },\n 'Repository aborted due to potential secrets exposure',\n );\n return err.message;\n }\n if (err instanceof ExternalHostError) {\n logger.warn(\n { hostType: err.hostType, packageName: err.packageName, err: err.err },\n 'Host error',\n );\n logger.info('External host error causing abort - skipping');\n delete config.branchList;\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('No space left on device') ||\n err.message === SYSTEM_INSUFFICIENT_DISK_SPACE\n ) {\n logger.error('Disk space error - skipping');\n delete config.branchList;\n return SYSTEM_INSUFFICIENT_DISK_SPACE;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.warn('Rate limit exceeded - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === SYSTEM_INSUFFICIENT_MEMORY) {\n logger.warn('Insufficient memory - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.warn('Bad credentials - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.warn('Integration unauthorized - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_AUTHENTICATION_ERROR) {\n logger.warn('Authentication error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === TEMPORARY_ERROR) {\n logger.info('Temporary error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n delete config.branchList;\n logger.info('Lock file error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message.includes('The requested URL returned error: 5')) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('remote end hung up unexpectedly') ||\n err.message.includes('access denied or repository not exported')\n ) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (err.message.includes('fatal: not a git repository')) {\n delete config.branchList;\n return TEMPORARY_ERROR;\n }\n // Swallow this error so that other repositories can be processed\n logger.error({ err }, `Repository has unknown error`);\n // delete branchList to avoid cleaning up branches\n delete config.branchList;\n\n return UNKNOWN_ERROR;\n });\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import "../../../../constants/error-messages.js";
2
2
  import { regEx } from "../../../../util/regex.js";
3
+ import { safeStringify } from "../../../../util/stringify.js";
3
4
  import { logger } from "../../../../logger/index.js";
4
5
  import { mergeChildConfig } from "../../../../config/utils.js";
5
6
  import { ExternalHostError } from "../../../../types/errors/external-host-error.js";
@@ -99,8 +100,7 @@ async function lookupUpdates(inconfig) {
99
100
  currentValue: config.currentValue
100
101
  }, "lookupUpdates");
101
102
  if (config.currentValue && !isString(config.currentValue)) {
102
- // v8 ignore else -- TODO: add test #40625
103
- if (config.currentValue) logger.debug(`Invalid currentValue for ${config.packageName}: ${JSON.stringify(config.currentValue)} (${typeof config.currentValue})`);
103
+ logger.debug(`Invalid currentValue for ${config.packageName}: ${safeStringify(config.currentValue)} (${typeof config.currentValue})`);
104
104
  res.skipReason = "invalid-value";
105
105
  return Result.ok(res);
106
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../../lib/workers/repository/process/lookup/index.ts"],"sourcesContent":["import { isNonEmptyString, isString, isUndefined } from '@sindresorhus/is';\nimport { mergeChildConfig } from '../../../../config/index.ts';\nimport type { ValidationMessage } from '../../../../config/types.ts';\nimport { CONFIG_VALIDATION } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n getDatasourceFor,\n getDefaultVersioning,\n} from '../../../../modules/datasource/common.ts';\nimport type {\n GetDigestInputConfig,\n Release,\n ReleaseResult,\n} from '../../../../modules/datasource/index.ts';\nimport {\n applyDatasourceFilters,\n getDigest,\n getRawPkgReleases,\n isGetPkgReleasesConfig,\n supportsDigests,\n} from '../../../../modules/datasource/index.ts';\nimport { postprocessRelease } from '../../../../modules/datasource/postprocess-release.ts';\nimport { getRangeStrategy } from '../../../../modules/manager/index.ts';\nimport type { LookupUpdate } from '../../../../modules/manager/types.ts';\nimport { id as dockerVersioningId } from '../../../../modules/versioning/docker/index.ts';\nimport * as allVersioning from '../../../../modules/versioning/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { assignKeys } from '../../../../util/assign-keys.ts';\nimport { getElapsedDays } from '../../../../util/date.ts';\nimport { checkMinimumReleaseAge } from '../../../../util/minimum-release-age.ts';\nimport { applyPackageRules } from '../../../../util/package-rules/index.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport type { Timestamp } from '../../../../util/timestamp.ts';\nimport { calculateAbandonment } from './abandonment.ts';\nimport { getBucket } from './bucket.ts';\nimport { getCurrentVersion } from './current.ts';\nimport { filterVersions } from './filter.ts';\nimport { filterInternalChecks } from './filter-checks.ts';\nimport { generateUpdate } from './generate.ts';\nimport { getRollbackUpdate } from './rollback.ts';\nimport { calculateMostRecentTimestamp } from './timestamps.ts';\nimport type { LookupUpdateConfig, UpdateResult } from './types.ts';\nimport {\n addReplacementUpdateIfValid,\n isReplacementRulesConfigured,\n} from './utils.ts';\n\nasync function getTimestamp(\n config: LookupUpdateConfig,\n versions: Release[],\n version: string,\n versioningApi: allVersioning.VersioningApi,\n): Promise<Timestamp | null | undefined> {\n const currentRelease = versions.find(\n (v) =>\n versioningApi.isValid(v.version) &&\n versioningApi.equals(v.version, version),\n );\n\n if (!currentRelease) {\n return null;\n }\n\n if (currentRelease.releaseTimestamp) {\n return currentRelease.releaseTimestamp;\n }\n\n const remoteRelease = await postprocessRelease(config, currentRelease);\n return remoteRelease?.releaseTimestamp;\n}\n\n/** The only two `updateType`s that `applyMinimumReleaseAgeToDigestUpdate()` can be called with */\ntype DigestLikeUpdate = LookupUpdate & { updateType: 'digest' | 'pinDigest' };\n\n/**\n * A helper function to allow a short-circuit for `minimumReleaseAge` functionality if a package may have config that applies it.\n *\n * Allows avoiding unnecessary calls to more expensive checks like merge + `applyPackageRules()` and `getTimestamp()`.\n */\nfunction couldApplyMinimumReleaseAgeToDigest(\n config: LookupUpdateConfig,\n updateType: DigestLikeUpdate['updateType'],\n): boolean {\n // Match filterInternalChecks(): under `none` the user opted out of internal\n // checks entirely, so do no merging, no package rules, no age check and no\n // logging claiming an age check ran.\n if (config.internalChecksFilter === 'none') {\n return false;\n }\n\n return (\n isNonEmptyString(config.minimumReleaseAge) ||\n isNonEmptyString(config[updateType]?.minimumReleaseAge) ||\n !!config.packageRules?.some((rule) =>\n isNonEmptyString(rule.minimumReleaseAge),\n )\n );\n}\n\n/**\n * Ensure `minimumReleaseAge`/`internalChecksFilter` applies to digest/pinDigest updates, as they don't currently get run through `filterInternalChecks()`.\n *\n * NOTE that this should be kept in sync with `filterInternalChecks`()\n */\nasync function applyMinimumReleaseAgeToDigestUpdate(\n update: DigestLikeUpdate,\n config: LookupUpdateConfig,\n res: UpdateResult,\n currentVersionWasResolved: boolean,\n newestMatchingVersionTimestamp: Timestamp | null | undefined,\n): Promise<void> {\n if (!couldApplyMinimumReleaseAgeToDigest(config, update.updateType)) {\n return;\n }\n\n if (update.updateType === 'pinDigest' && !currentVersionWasResolved) {\n // Not `!res.currentVersion` - that's force-set to lockedVersion further down regardless of timestamp resolution.\n // `pinDigest` doesn't repoint anywhere, unlike `digest` - it just freezes whatever the ref already resolves to.\n // An unversioned tag (e.g. `latest`) has no versioned release to age against, and holding the pin would only\n // prolong the less-pinned (less safe) state, so skip the check entirely rather than treating the missing\n // timestamp as pending.\n logger.once.debug(\n { depName: config.depName, updateType: update.updateType },\n `Skipping minimumReleaseAge check for ${update.updateType} update of ${config.depName}, as its current value does not resolve to a versioned release`,\n );\n return;\n }\n\n let releaseConfig: LookupUpdateConfig = {\n ...mergeChildConfig(config, res),\n updateType: update.updateType,\n };\n releaseConfig = mergeChildConfig(\n releaseConfig,\n releaseConfig[update.updateType]!,\n );\n releaseConfig = await applyPackageRules(releaseConfig, 'update-type');\n\n // Not update.releaseTimestamp - that field means \"age of the new release\" elsewhere (generate.ts, libyear.ts).\n // Not res.currentVersionTimestamp either - that tracks whatever rangeStrategy resolves currentVersion to (e.g.\n // the oldest matching release under `bump`), whereas both `digest` and `pinDigest` reflect whatever the current\n // value's ref actually resolves to *right now*, which is always the newest matching version.\n const ageCheck = checkMinimumReleaseAge(\n releaseConfig,\n newestMatchingVersionTimestamp,\n );\n\n // Mirror filterInternalChecks()'s logging so a held/passed digest update is diagnosable.\n if (ageCheck.minimumReleaseAgeMs && !ageCheck.hasTimestamp) {\n if (releaseConfig.minimumReleaseAgeBehaviour === 'timestamp-optional') {\n logger.once.warn(\n \"Some release(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n }\n\n logger.once.debug(\n {\n depName: config.depName,\n updateType: update.updateType,\n minimumReleaseAgeBehaviour: releaseConfig.minimumReleaseAgeBehaviour,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update of ${config.depName} has no releaseTimestamp to age against`,\n );\n }\n if (ageCheck.isPending) {\n logger.trace(\n {\n depName: config.depName,\n updateType: update.updateType,\n releaseTimestamp: newestMatchingVersionTimestamp,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update is pending minimumReleaseAge status checks`,\n );\n\n // internalChecksFilter is read from the unmerged top-level config, like filterInternalChecks().\n if (config.internalChecksFilter === 'strict') {\n update.pendingChecks = true;\n }\n }\n}\n\nexport async function lookupUpdates(\n inconfig: LookupUpdateConfig,\n): Promise<Result<UpdateResult>> {\n let config: LookupUpdateConfig = { ...inconfig };\n config.versioning ??= getDefaultVersioning(config.datasource);\n\n const versioningApi = allVersioning.get(config.versioning);\n\n let dependency: ReleaseResult | null = null;\n const res: UpdateResult = {\n versioning: config.versioning,\n updates: [],\n warnings: [],\n };\n // Timestamp of the release a `digest`/`pinDigest` update's current value currently resolves to (the newest version matching it, regardless of `rangeStrategy`), as opposed to `res.currentVersionTimestamp` which tracks whatever the configured rangeStrategy resolves `currentVersion` to (e.g. the oldest for `bump`)\n let newestMatchingVersionTimestamp: Timestamp | null | undefined;\n // The `digest` update for `config.currentDigest` (if one is added), so its age check can run after `newDigest` is fetched and no-op updates are stripped.\n let digestUpdate: DigestLikeUpdate | undefined;\n\n try {\n logger.trace(\n {\n dependency: config.packageName,\n currentValue: config.currentValue,\n },\n 'lookupUpdates',\n );\n if (config.currentValue && !isString(config.currentValue)) {\n // If currentValue is not a string, then it's invalid\n // v8 ignore else -- TODO: add test #40625\n if (config.currentValue) {\n logger.debug(\n `Invalid currentValue for ${config.packageName}: ${JSON.stringify(config.currentValue)} (${typeof config.currentValue})`,\n );\n }\n res.skipReason = 'invalid-value';\n return Result.ok(res);\n }\n if (\n !isGetPkgReleasesConfig(config) ||\n !getDatasourceFor(config.datasource)\n ) {\n res.skipReason = 'invalid-config';\n return Result.ok(res);\n }\n let compareValue = config.currentValue;\n if (\n isString(config.currentValue) &&\n isString(config.versionCompatibility)\n ) {\n const versionCompatbilityRegEx = regEx(config.versionCompatibility);\n const regexMatch = versionCompatbilityRegEx.exec(config.currentValue);\n if (regexMatch?.groups) {\n logger.debug(\n {\n versionCompatibility: config.versionCompatibility,\n currentValue: config.currentValue,\n packageName: config.packageName,\n groups: regexMatch.groups,\n },\n 'version compatibility regex match',\n );\n config.currentCompatibility = regexMatch.groups.compatibility;\n res.currentCompatibility = regexMatch.groups.compatibility;\n compareValue = regexMatch.groups.version;\n } else {\n logger.debug(\n {\n versionCompatibility: config.versionCompatibility,\n currentValue: config.currentValue,\n packageName: config.packageName,\n },\n 'version compatibility regex mismatch',\n );\n }\n }\n\n const isValid =\n isString(compareValue) && versioningApi.isValid(compareValue);\n\n const unconstrainedValue =\n !!config.lockedVersion && isUndefined(config.currentValue);\n\n if (isValid || unconstrainedValue) {\n if (\n !config.updatePinnedDependencies &&\n // TODO #22198\n versioningApi.isSingleVersion(compareValue!)\n ) {\n res.skipReason = 'is-pinned';\n return Result.ok(res);\n }\n\n const { val: releaseResult, err: lookupError } = await getRawPkgReleases(\n config,\n )\n .transform((res) => calculateMostRecentTimestamp(versioningApi, res))\n .transform((res) => calculateAbandonment(res, config))\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (lookupError instanceof Error) {\n throw lookupError;\n }\n\n if (lookupError) {\n // If dependency lookup fails then warn and return\n const warning: ValidationMessage = {\n topic: config.packageName,\n message: `Failed to look up ${config.datasource} package ${config.packageName}: ${lookupError}`,\n };\n logger.debug(\n {\n dependency: config.packageName,\n packageFile: config.packageFile,\n },\n warning.message,\n );\n // TODO: return warnings in own field\n res.warnings.push(warning);\n return Result.ok(res);\n }\n\n dependency = releaseResult;\n\n if (dependency.deprecationMessage) {\n logger.debug(\n `Found deprecationMessage for ${config.datasource} package ${config.packageName}`,\n );\n }\n\n assignKeys(res, dependency, [\n 'deprecationMessage',\n 'sourceUrl',\n 'registryUrl',\n 'sourceDirectory',\n 'homepage',\n 'changelogUrl',\n 'dependencyUrl',\n 'lookupName',\n 'packageScope',\n 'mostRecentTimestamp',\n 'isAbandoned',\n 'respectLatest',\n ]);\n\n const latestVersion = dependency.tags?.latest;\n // Filter out any results from datasource that don't comply with our versioning\n let allVersions = dependency.releases.filter((release) =>\n versioningApi.isVersion(release.version),\n );\n const allReleaseVersions = new Set(allVersions.map((r) => r.version));\n // istanbul ignore if\n if (allVersions.length === 0) {\n const message = `Found no results from datasource that look like a version`;\n logger.info(\n {\n dependency: config.packageName,\n result: dependency,\n },\n message,\n );\n if (!config.currentDigest) {\n return Result.ok(res);\n }\n }\n // Reapply package rules in case we missed something from sourceUrl\n config = await applyPackageRules(\n { ...config, sourceUrl: res.sourceUrl },\n 'source-url',\n );\n if (config.followTag) {\n const taggedVersion = dependency.tags?.[config.followTag];\n if (!taggedVersion) {\n res.warnings.push({\n topic: config.packageName,\n message: `Can't find version with tag ${config.followTag} for ${config.datasource} package ${config.packageName}`,\n });\n return Result.ok(res);\n }\n allVersions = allVersions.filter(\n (v) =>\n v.version === taggedVersion ||\n (v.version === compareValue &&\n versioningApi.isGreaterThan(taggedVersion, compareValue)),\n );\n }\n\n const inRangeOnlyStrategy = config.rangeStrategy === 'in-range-only';\n // Check that existing constraint can be satisfied\n const allSatisfyingVersions =\n (inRangeOnlyStrategy || config.rollbackPrs) && !unconstrainedValue\n ? allVersions.filter((v) =>\n // TODO #22198\n versioningApi.matches(v.version, compareValue!),\n )\n : allVersions;\n if (!allSatisfyingVersions.length) {\n logger.debug(\n `Found no satisfying versions with '${config.versioning}' versioning`,\n );\n }\n\n if (config.rollbackPrs && !allSatisfyingVersions.length) {\n const rollback = getRollbackUpdate(config, allVersions, versioningApi);\n // istanbul ignore if\n if (!rollback) {\n res.warnings.push({\n topic: config.packageName,\n // TODO: types (#22198)\n message: `Can't find version matching ${compareValue!} for ${\n config.datasource\n } package ${config.packageName}`,\n });\n return Result.ok(res);\n }\n res.updates.push(rollback);\n }\n let rangeStrategy = getRangeStrategy(config);\n\n // istanbul ignore next\n if (\n config.isVulnerabilityAlert &&\n rangeStrategy === 'update-lockfile' &&\n !config.lockedVersion\n ) {\n rangeStrategy = 'bump';\n }\n // unconstrained deps with lockedVersion\n if (\n config.isVulnerabilityAlert &&\n !config.currentValue &&\n config.lockedVersion\n ) {\n rangeStrategy = 'update-lockfile';\n }\n const nonDeprecatedVersions = dependency.releases\n .filter((release) => !release.isDeprecated)\n .map((release) => release.version);\n let currentVersion: string;\n if (rangeStrategy === 'update-lockfile') {\n currentVersion = config.lockedVersion!;\n } else if (\n compareValue &&\n versioningApi.isSingleVersion(compareValue) &&\n allVersions.find((v) => v.version === compareValue)\n ) {\n currentVersion = compareValue;\n }\n // TODO #22198\n currentVersion ??=\n getCurrentVersion(\n compareValue!,\n config.lockedVersion!,\n versioningApi,\n rangeStrategy!,\n latestVersion!,\n nonDeprecatedVersions,\n ) ??\n getCurrentVersion(\n compareValue!,\n config.lockedVersion!,\n versioningApi,\n rangeStrategy!,\n latestVersion!,\n allVersions.map((v) => v.version),\n )!;\n\n if (!currentVersion) {\n // v8 ignore else -- TODO: add test #40625\n if (!config.lockedVersion) {\n logger.debug(\n `No currentVersion or lockedVersion found for ${config.packageName}`,\n );\n res.skipReason = 'invalid-value';\n }\n return Result.ok(res);\n }\n\n res.currentVersion = currentVersion;\n\n // Use lockedVersion for the timestamp lookup when available, because\n // res.currentVersion is later overwritten to lockedVersion (see below).\n // Without this, strategies like \"replace\" would compute the timestamp\n // for the highest satisfying version (e.g. 1.4.1) while the reported\n // currentVersion ends up being the locked one (e.g. 1.0.0).\n const versionForTimestamp = config.lockedVersion ?? currentVersion;\n const currentVersionTimestamp = await getTimestamp(\n config,\n allVersions,\n versionForTimestamp,\n versioningApi,\n );\n\n if (isNonEmptyString(currentVersionTimestamp)) {\n res.currentVersionTimestamp = currentVersionTimestamp;\n res.currentVersionAgeInDays = getElapsedDays(currentVersionTimestamp);\n\n if (\n config.packageRules?.some((rule) =>\n isNonEmptyString(rule.matchCurrentAge),\n )\n ) {\n // Reapply package rules to check matches for matchCurrentAge\n config = await applyPackageRules(\n { ...config, currentVersionTimestamp },\n 'current-timestamp',\n );\n }\n }\n\n if (\n config.currentDigest\n ? couldApplyMinimumReleaseAgeToDigest(config, 'digest')\n : config.pinDigests &&\n couldApplyMinimumReleaseAgeToDigest(config, 'pinDigest')\n ) {\n // Resolve from `allVersions` (not `dependency.releases`) so that filters like followTag apply, preferring non-deprecated versions with a fallback - both like the `currentVersion` resolution above.\n const newestMatchingVersion =\n getCurrentVersion(\n compareValue!,\n '',\n versioningApi,\n 'replace',\n latestVersion!,\n allVersions.filter((v) => !v.isDeprecated).map((v) => v.version),\n ) ??\n getCurrentVersion(\n compareValue!,\n '',\n versioningApi,\n 'replace',\n latestVersion!,\n allVersions.map((v) => v.version),\n );\n if (newestMatchingVersion) {\n newestMatchingVersionTimestamp = await getTimestamp(\n config,\n allVersions,\n newestMatchingVersion,\n versioningApi,\n );\n }\n }\n\n if (\n compareValue &&\n currentVersion &&\n rangeStrategy === 'pin' &&\n !versioningApi.isSingleVersion(compareValue)\n ) {\n const newValue =\n versioningApi.getPinnedValue?.(currentVersion) ?? currentVersion;\n res.updates.push({\n updateType: 'pin',\n isPin: true,\n newValue,\n newVersion: currentVersion,\n newMajor: versioningApi.getMajor(currentVersion)!,\n });\n }\n if (rangeStrategy === 'pin') {\n // Fall back to replace once pinning logic is done\n rangeStrategy = 'replace';\n }\n // istanbul ignore if\n if (!versioningApi.isVersion(currentVersion!)) {\n res.skipReason = 'invalid-version';\n return Result.ok(res);\n }\n // Filter latest, unstable, etc\n // TODO #22198\n let filteredReleases = filterVersions(\n config,\n currentVersion!,\n latestVersion!,\n inRangeOnlyStrategy ? allSatisfyingVersions : allVersions,\n versioningApi,\n ).filter(\n (v) =>\n // Leave only compatible versions\n unconstrainedValue ||\n versioningApi.isCompatible(v.version, compareValue),\n );\n let shrinkedViaVulnerability = false;\n if (config.isVulnerabilityAlert) {\n if (config.vulnerabilityFixVersion) {\n res.vulnerabilityFixVersion = config.vulnerabilityFixVersion;\n res.vulnerabilityFixStrategy = config.vulnerabilityFixStrategy;\n if (versioningApi.isValid(config.vulnerabilityFixVersion)) {\n let fixedFilteredReleases;\n if (versioningApi.isVersion(config.vulnerabilityFixVersion)) {\n // Retain only releases greater than or equal to the fix version\n fixedFilteredReleases = filteredReleases.filter(\n (release) =>\n !versioningApi.isGreaterThan(\n config.vulnerabilityFixVersion!,\n release.version,\n ),\n );\n } else {\n // Retain only releases which max the fix constraint\n fixedFilteredReleases = filteredReleases.filter((release) =>\n versioningApi.matches(\n release.version,\n config.vulnerabilityFixVersion!,\n ),\n );\n }\n // Warn if this filtering results caused zero releases\n if (fixedFilteredReleases.length === 0 && filteredReleases.length) {\n logger.warn(\n {\n releases: filteredReleases,\n vulnerabilityFixVersion: config.vulnerabilityFixVersion,\n packageName: config.packageName,\n },\n 'No releases satisfy vulnerabilityFixVersion',\n );\n }\n // Use the additionally filtered releases\n filteredReleases = fixedFilteredReleases;\n } else {\n logger.warn(\n {\n vulnerabilityFixVersion: config.vulnerabilityFixVersion,\n packageName: config.packageName,\n },\n 'vulnerabilityFixVersion is not valid',\n );\n }\n }\n if (config.vulnerabilityFixStrategy === 'highest') {\n // Don't shrink the list of releases - let Renovate use its normal logic\n logger.once.debug(\n `Using vulnerabilityFixStrategy=highest for ${config.packageName}`,\n );\n } else {\n // Shrink the list of releases to the lowest fixed version\n logger.once.debug(\n `Using vulnerabilityFixStrategy=lowest for ${config.packageName}`,\n );\n filteredReleases = filteredReleases.slice(0, 1);\n shrinkedViaVulnerability = true;\n }\n }\n const buckets: Record<string, [Release]> = {};\n for (const release of filteredReleases) {\n const bucket = getBucket(\n config,\n // TODO #22198\n currentVersion!,\n release.version,\n versioningApi,\n );\n // v8 ignore else -- TODO: add test #40625\n if (isString(bucket)) {\n if (buckets[bucket]) {\n buckets[bucket].push(release);\n } else {\n buckets[bucket] = [release];\n }\n }\n }\n const depResultConfig = mergeChildConfig(config, res);\n for (const [bucket, releases] of Object.entries(buckets)) {\n const sortedReleases = releases.sort((r1, r2) =>\n versioningApi.sortVersions(r1.version, r2.version),\n );\n const { release, pendingChecks, pendingReleases } =\n await filterInternalChecks(\n depResultConfig,\n versioningApi,\n bucket,\n sortedReleases,\n );\n // istanbul ignore next\n if (!release) {\n return Result.ok(res);\n }\n const newVersion = release.version;\n const update = await generateUpdate(\n config,\n compareValue,\n versioningApi,\n // TODO #22198\n\n rangeStrategy!,\n config.lockedVersion ?? currentVersion!,\n bucket,\n release,\n allReleaseVersions,\n );\n\n // #29034\n if (\n config.manager === 'gomod' &&\n compareValue?.startsWith('v0.0.0-') &&\n update.newValue?.startsWith('v0.0.0-') &&\n config.currentDigest !== update.newDigest\n ) {\n update.updateType = 'digest';\n\n // As this has already been processed by `filterInternalChecks()`, but we're changing the `updateType`, we need to apply the digest-scoped minimumReleaseAge rules.\n // `currentVersionWasResolved` only matters for `pinDigest`, which `update.updateType` never is here - true is a safe constant.\n await applyMinimumReleaseAgeToDigestUpdate(\n update as DigestLikeUpdate,\n config,\n res,\n true,\n release.releaseTimestamp,\n );\n }\n\n if (pendingChecks) {\n update.pendingChecks = pendingChecks;\n }\n\n if (pendingReleases.length) {\n update.pendingVersions = pendingReleases.map((r) => r.version);\n }\n if (!update.newValue || update.newValue === compareValue) {\n if (!config.lockedVersion) {\n continue;\n }\n // istanbul ignore if\n if (rangeStrategy === 'bump') {\n logger.trace(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n lockedVersion: config.lockedVersion,\n newVersion,\n },\n 'Skipping bump because newValue is the same',\n );\n continue;\n }\n res.isSingleVersion = true;\n }\n res.isSingleVersion ??=\n isString(update.newValue) &&\n versioningApi.isSingleVersion(update.newValue);\n // istanbul ignore if\n if (\n config.versioning === dockerVersioningId &&\n update.updateType !== 'rollback' &&\n update.newValue &&\n versioningApi.isVersion(update.newValue) &&\n compareValue &&\n versioningApi.isVersion(compareValue) &&\n versioningApi.isGreaterThan(compareValue, update.newValue)\n ) {\n logger.warn(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n compareValue,\n currentVersion: config.currentVersion,\n update,\n allVersionsLength: allVersions.length,\n filteredReleaseVersions: filteredReleases.map((r) => r.version),\n shrinkedViaVulnerability,\n },\n 'Unexpected downgrade detected: skipping',\n );\n } else {\n res.updates.push(update);\n }\n }\n } else if (compareValue) {\n logger.debug(\n `Dependency ${config.packageName} has unsupported/unversioned value ${compareValue} (versioning=${config.versioning})`,\n );\n\n if (!config.pinDigests && !config.currentDigest) {\n logger.debug(\n `Skipping ${config.packageName} because no currentDigest or pinDigests`,\n );\n res.skipReason = 'invalid-value';\n } else {\n delete res.skipReason;\n }\n } else {\n res.skipReason = 'invalid-value';\n }\n\n if (isReplacementRulesConfigured(config)) {\n addReplacementUpdateIfValid(res.updates, config);\n } else if (dependency?.replacementName && dependency.replacementVersion) {\n res.updates.push({\n updateType: 'replacement',\n newName: dependency.replacementName,\n newValue: dependency.replacementVersion,\n });\n }\n\n // Record if the dep is fixed to a version\n if (config.lockedVersion) {\n res.currentVersion = config.lockedVersion;\n res.fixedVersion = config.lockedVersion;\n } else if (compareValue && versioningApi.isSingleVersion(compareValue)) {\n res.fixedVersion = compareValue.replace(regEx(/^=+/), '');\n }\n\n // massage versionCompatibility\n if (\n isString(config.currentValue) &&\n isString(compareValue) &&\n isString(config.versionCompatibility)\n ) {\n for (const update of res.updates) {\n logger.debug({ update });\n // v8 ignore else -- TODO: add test #40625\n if (isString(config.currentValue) && isString(update.newValue)) {\n update.newValue = config.currentValue.replace(\n compareValue,\n update.newValue,\n );\n }\n }\n }\n\n // Add digests if necessary\n if (supportsDigests(config.datasource)) {\n if (config.currentDigest) {\n if (!config.digestOneAndOnly || !res.updates.length) {\n // digest update - age-checked after the strip below, once newDigest is known\n digestUpdate = {\n updateType: 'digest',\n newValue: config.currentValue,\n };\n res.updates.push(digestUpdate);\n }\n } else if (\n config.pinDigests &&\n // only update the digest in the package file if it's managed by us\n !config.digestManagedExternally &&\n // Create a pin only if one doesn't already exists\n // v8 ignore else -- TODO: add test #40625\n !res.updates.some((update) => update.updateType === 'pin')\n ) {\n // pin digest\n const pinDigestUpdate: DigestLikeUpdate = {\n isPinDigest: true,\n updateType: 'pinDigest',\n newValue: config.currentValue,\n };\n await applyMinimumReleaseAgeToDigestUpdate(\n pinDigestUpdate,\n config,\n res,\n isValid || unconstrainedValue,\n newestMatchingVersionTimestamp,\n );\n res.updates.push(pinDigestUpdate);\n }\n if (versioningApi.valueToVersion) {\n // TODO #22198\n res.currentVersion = versioningApi.valueToVersion(res.currentVersion!);\n for (const update of res.updates) {\n // TODO #22198\n update.newVersion = versioningApi.valueToVersion(update.newVersion!);\n }\n }\n if (res.registryUrl) {\n config.registryUrls = [res.registryUrl];\n }\n\n // update digest for all\n for (const update of res.updates) {\n // only update the digest in the package file if it's managed by us\n if (\n (config.pinDigests === true && !config.digestManagedExternally) ||\n config.currentDigest\n ) {\n const getDigestConfig: GetDigestInputConfig = {\n ...config,\n registryUrl: update.registryUrl ?? res.registryUrl,\n lookupName: res.lookupName,\n };\n\n // #20304 only pass it for replacement updates, otherwise we get wrong or invalid digest\n if (update.updateType !== 'replacement') {\n delete getDigestConfig.replacementName;\n }\n\n // #20304 don't use lookupName and currentDigest when we replace image name\n if (\n update.updateType === 'replacement' &&\n update.newName !== config.packageName\n ) {\n delete getDigestConfig.lookupName;\n delete getDigestConfig.currentDigest;\n getDigestConfig.replacementName = update.newName;\n }\n\n // Don't use current releases if replacement changes name, otherwise we use the wrong new digest.\n // This happens on datasources which return the digest in release info like `github-tags`.\n // We can still use it when only version is changing.\n if (\n update.updateType !== 'replacement' ||\n update.newName === config.packageName\n ) {\n update.newDigest ??= dependency?.releases.find(\n (r) => r.version === update.newValue,\n )?.newDigest;\n }\n\n update.newDigest ??= await getDigest(\n getDigestConfig,\n update.newValue,\n );\n\n // If the digest could not be determined, report this as otherwise the\n // update will be omitted later on without notice.\n if (update.newDigest === null) {\n logger.debug(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n datasource: config.datasource,\n newValue: update.newValue,\n bucket: update.bucket,\n },\n 'Could not determine new digest for update.',\n );\n\n // Only report a warning if there is a current digest.\n // Context: https://github.com/renovatebot/renovate/pull/20175#discussion_r1102615059.\n if (config.currentDigest) {\n res.warnings.push({\n message: `Could not determine new digest for update (${config.datasource} package ${config.packageName})`,\n topic: config.packageName,\n });\n }\n }\n } else {\n delete update.newDigest;\n }\n if (update.newVersion) {\n const registryUrl = dependency?.releases?.find(\n (release) => release.version === update.newVersion,\n )?.registryUrl;\n if (registryUrl && registryUrl !== res.registryUrl) {\n update.registryUrl = registryUrl;\n }\n }\n }\n }\n\n if (res.updates.length) {\n delete res.skipReason;\n }\n // Strip out any non-changed ones\n res.updates = res.updates\n .filter(\n (update) => update.newValue !== null || config.currentValue === null,\n )\n .filter((update) => update.newDigest !== null)\n .filter(\n (update) =>\n (isString(update.newName) && update.newName !== config.packageName) ||\n update.isReplacement === true ||\n update.newValue !== config.currentValue ||\n update.isLockfileUpdate === true ||\n // TODO #22198\n (update.newDigest &&\n !update.newDigest.startsWith(config.currentDigest!)),\n );\n // If range strategy specified in config is 'in-range-only', also strip out updates where currentValue !== newValue\n if (config.rangeStrategy === 'in-range-only') {\n res.updates = res.updates.filter(\n (update) => update.newValue === config.currentValue,\n );\n }\n // Handle a weird edge case involving followTag and fallbacks\n if (config.rollbackPrs && config.followTag) {\n res.updates = res.updates.filter(\n (update) =>\n update.updateType !== 'rollback' || res.updates.length === 1,\n );\n }\n\n // If there is a digest update proposed which is in the pending updates for this dependency, ensure that `minimumReleaseAge` is applied.\n // `currentVersionWasResolved` only matters for `pinDigest`, which `digestUpdate` never is - true is a safe constant.\n if (digestUpdate && res.updates.includes(digestUpdate)) {\n await applyMinimumReleaseAgeToDigestUpdate(\n digestUpdate,\n config,\n res,\n true,\n newestMatchingVersionTimestamp,\n );\n }\n\n const release =\n res.updates.length > 0\n ? (dependency?.releases.find(\n (r) => r.version === res.updates[0].newValue,\n ) ??\n dependency?.releases.find(\n (r) => r.version === res.updates[0].newVersion,\n ))\n : null;\n\n if (release?.changelogContent) {\n res.changelogContent = release.changelogContent;\n res.changelogUrl = release.changelogUrl;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err instanceof ExternalHostError) {\n return Result.err(err);\n }\n\n if (err instanceof Error && err.message === CONFIG_VALIDATION) {\n return Result.err(err);\n }\n\n logger.error(\n {\n currentDigest: config.currentDigest,\n currentValue: config.currentValue,\n datasource: config.datasource,\n packageName: config.packageName,\n digestOneAndOnly: config.digestOneAndOnly,\n followTag: config.followTag,\n lockedVersion: config.lockedVersion,\n packageFile: config.packageFile,\n pinDigests: config.pinDigests,\n rollbackPrs: config.rollbackPrs,\n isVulnerabilityAlert: config.isVulnerabilityAlert,\n updatePinnedDependencies: config.updatePinnedDependencies,\n err,\n },\n 'lookupUpdates error',\n );\n res.skipReason = 'internal-error';\n }\n return Result.ok(res);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../../lib/workers/repository/process/lookup/index.ts"],"sourcesContent":["import { isNonEmptyString, isString, isUndefined } from '@sindresorhus/is';\nimport { mergeChildConfig } from '../../../../config/index.ts';\nimport type { ValidationMessage } from '../../../../config/types.ts';\nimport { CONFIG_VALIDATION } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n getDatasourceFor,\n getDefaultVersioning,\n} from '../../../../modules/datasource/common.ts';\nimport type {\n GetDigestInputConfig,\n Release,\n ReleaseResult,\n} from '../../../../modules/datasource/index.ts';\nimport {\n applyDatasourceFilters,\n getDigest,\n getRawPkgReleases,\n isGetPkgReleasesConfig,\n supportsDigests,\n} from '../../../../modules/datasource/index.ts';\nimport { postprocessRelease } from '../../../../modules/datasource/postprocess-release.ts';\nimport { getRangeStrategy } from '../../../../modules/manager/index.ts';\nimport type { LookupUpdate } from '../../../../modules/manager/types.ts';\nimport { id as dockerVersioningId } from '../../../../modules/versioning/docker/index.ts';\nimport * as allVersioning from '../../../../modules/versioning/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { assignKeys } from '../../../../util/assign-keys.ts';\nimport { getElapsedDays } from '../../../../util/date.ts';\nimport { checkMinimumReleaseAge } from '../../../../util/minimum-release-age.ts';\nimport { applyPackageRules } from '../../../../util/package-rules/index.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport { safeStringify } from '../../../../util/stringify.ts';\nimport type { Timestamp } from '../../../../util/timestamp.ts';\nimport { calculateAbandonment } from './abandonment.ts';\nimport { getBucket } from './bucket.ts';\nimport { getCurrentVersion } from './current.ts';\nimport { filterVersions } from './filter.ts';\nimport { filterInternalChecks } from './filter-checks.ts';\nimport { generateUpdate } from './generate.ts';\nimport { getRollbackUpdate } from './rollback.ts';\nimport { calculateMostRecentTimestamp } from './timestamps.ts';\nimport type { LookupUpdateConfig, UpdateResult } from './types.ts';\nimport {\n addReplacementUpdateIfValid,\n isReplacementRulesConfigured,\n} from './utils.ts';\n\nasync function getTimestamp(\n config: LookupUpdateConfig,\n versions: Release[],\n version: string,\n versioningApi: allVersioning.VersioningApi,\n): Promise<Timestamp | null | undefined> {\n const currentRelease = versions.find(\n (v) =>\n versioningApi.isValid(v.version) &&\n versioningApi.equals(v.version, version),\n );\n\n if (!currentRelease) {\n return null;\n }\n\n if (currentRelease.releaseTimestamp) {\n return currentRelease.releaseTimestamp;\n }\n\n const remoteRelease = await postprocessRelease(config, currentRelease);\n return remoteRelease?.releaseTimestamp;\n}\n\n/** The only two `updateType`s that `applyMinimumReleaseAgeToDigestUpdate()` can be called with */\ntype DigestLikeUpdate = LookupUpdate & { updateType: 'digest' | 'pinDigest' };\n\n/**\n * A helper function to allow a short-circuit for `minimumReleaseAge` functionality if a package may have config that applies it.\n *\n * Allows avoiding unnecessary calls to more expensive checks like merge + `applyPackageRules()` and `getTimestamp()`.\n */\nfunction couldApplyMinimumReleaseAgeToDigest(\n config: LookupUpdateConfig,\n updateType: DigestLikeUpdate['updateType'],\n): boolean {\n // Match filterInternalChecks(): under `none` the user opted out of internal\n // checks entirely, so do no merging, no package rules, no age check and no\n // logging claiming an age check ran.\n if (config.internalChecksFilter === 'none') {\n return false;\n }\n\n return (\n isNonEmptyString(config.minimumReleaseAge) ||\n isNonEmptyString(config[updateType]?.minimumReleaseAge) ||\n !!config.packageRules?.some((rule) =>\n isNonEmptyString(rule.minimumReleaseAge),\n )\n );\n}\n\n/**\n * Ensure `minimumReleaseAge`/`internalChecksFilter` applies to digest/pinDigest updates, as they don't currently get run through `filterInternalChecks()`.\n *\n * NOTE that this should be kept in sync with `filterInternalChecks`()\n */\nasync function applyMinimumReleaseAgeToDigestUpdate(\n update: DigestLikeUpdate,\n config: LookupUpdateConfig,\n res: UpdateResult,\n currentVersionWasResolved: boolean,\n newestMatchingVersionTimestamp: Timestamp | null | undefined,\n): Promise<void> {\n if (!couldApplyMinimumReleaseAgeToDigest(config, update.updateType)) {\n return;\n }\n\n if (update.updateType === 'pinDigest' && !currentVersionWasResolved) {\n // Not `!res.currentVersion` - that's force-set to lockedVersion further down regardless of timestamp resolution.\n // `pinDigest` doesn't repoint anywhere, unlike `digest` - it just freezes whatever the ref already resolves to.\n // An unversioned tag (e.g. `latest`) has no versioned release to age against, and holding the pin would only\n // prolong the less-pinned (less safe) state, so skip the check entirely rather than treating the missing\n // timestamp as pending.\n logger.once.debug(\n { depName: config.depName, updateType: update.updateType },\n `Skipping minimumReleaseAge check for ${update.updateType} update of ${config.depName}, as its current value does not resolve to a versioned release`,\n );\n return;\n }\n\n let releaseConfig: LookupUpdateConfig = {\n ...mergeChildConfig(config, res),\n updateType: update.updateType,\n };\n releaseConfig = mergeChildConfig(\n releaseConfig,\n releaseConfig[update.updateType]!,\n );\n releaseConfig = await applyPackageRules(releaseConfig, 'update-type');\n\n // Not update.releaseTimestamp - that field means \"age of the new release\" elsewhere (generate.ts, libyear.ts).\n // Not res.currentVersionTimestamp either - that tracks whatever rangeStrategy resolves currentVersion to (e.g.\n // the oldest matching release under `bump`), whereas both `digest` and `pinDigest` reflect whatever the current\n // value's ref actually resolves to *right now*, which is always the newest matching version.\n const ageCheck = checkMinimumReleaseAge(\n releaseConfig,\n newestMatchingVersionTimestamp,\n );\n\n // Mirror filterInternalChecks()'s logging so a held/passed digest update is diagnosable.\n if (ageCheck.minimumReleaseAgeMs && !ageCheck.hasTimestamp) {\n if (releaseConfig.minimumReleaseAgeBehaviour === 'timestamp-optional') {\n logger.once.warn(\n \"Some release(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n }\n\n logger.once.debug(\n {\n depName: config.depName,\n updateType: update.updateType,\n minimumReleaseAgeBehaviour: releaseConfig.minimumReleaseAgeBehaviour,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update of ${config.depName} has no releaseTimestamp to age against`,\n );\n }\n if (ageCheck.isPending) {\n logger.trace(\n {\n depName: config.depName,\n updateType: update.updateType,\n releaseTimestamp: newestMatchingVersionTimestamp,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update is pending minimumReleaseAge status checks`,\n );\n\n // internalChecksFilter is read from the unmerged top-level config, like filterInternalChecks().\n if (config.internalChecksFilter === 'strict') {\n update.pendingChecks = true;\n }\n }\n}\n\nexport async function lookupUpdates(\n inconfig: LookupUpdateConfig,\n): Promise<Result<UpdateResult>> {\n let config: LookupUpdateConfig = { ...inconfig };\n config.versioning ??= getDefaultVersioning(config.datasource);\n\n const versioningApi = allVersioning.get(config.versioning);\n\n let dependency: ReleaseResult | null = null;\n const res: UpdateResult = {\n versioning: config.versioning,\n updates: [],\n warnings: [],\n };\n // Timestamp of the release a `digest`/`pinDigest` update's current value currently resolves to (the newest version matching it, regardless of `rangeStrategy`), as opposed to `res.currentVersionTimestamp` which tracks whatever the configured rangeStrategy resolves `currentVersion` to (e.g. the oldest for `bump`)\n let newestMatchingVersionTimestamp: Timestamp | null | undefined;\n // The `digest` update for `config.currentDigest` (if one is added), so its age check can run after `newDigest` is fetched and no-op updates are stripped.\n let digestUpdate: DigestLikeUpdate | undefined;\n\n try {\n logger.trace(\n {\n dependency: config.packageName,\n currentValue: config.currentValue,\n },\n 'lookupUpdates',\n );\n if (config.currentValue && !isString(config.currentValue)) {\n // If currentValue is not a string, then it's invalid\n logger.debug(\n `Invalid currentValue for ${config.packageName}: ${safeStringify(config.currentValue)} (${typeof config.currentValue})`,\n );\n res.skipReason = 'invalid-value';\n return Result.ok(res);\n }\n if (\n !isGetPkgReleasesConfig(config) ||\n !getDatasourceFor(config.datasource)\n ) {\n res.skipReason = 'invalid-config';\n return Result.ok(res);\n }\n let compareValue = config.currentValue;\n if (\n isString(config.currentValue) &&\n isString(config.versionCompatibility)\n ) {\n const versionCompatbilityRegEx = regEx(config.versionCompatibility);\n const regexMatch = versionCompatbilityRegEx.exec(config.currentValue);\n if (regexMatch?.groups) {\n logger.debug(\n {\n versionCompatibility: config.versionCompatibility,\n currentValue: config.currentValue,\n packageName: config.packageName,\n groups: regexMatch.groups,\n },\n 'version compatibility regex match',\n );\n config.currentCompatibility = regexMatch.groups.compatibility;\n res.currentCompatibility = regexMatch.groups.compatibility;\n compareValue = regexMatch.groups.version;\n } else {\n logger.debug(\n {\n versionCompatibility: config.versionCompatibility,\n currentValue: config.currentValue,\n packageName: config.packageName,\n },\n 'version compatibility regex mismatch',\n );\n }\n }\n\n const isValid =\n isString(compareValue) && versioningApi.isValid(compareValue);\n\n const unconstrainedValue =\n !!config.lockedVersion && isUndefined(config.currentValue);\n\n if (isValid || unconstrainedValue) {\n if (\n !config.updatePinnedDependencies &&\n // TODO #22198\n versioningApi.isSingleVersion(compareValue!)\n ) {\n res.skipReason = 'is-pinned';\n return Result.ok(res);\n }\n\n const { val: releaseResult, err: lookupError } = await getRawPkgReleases(\n config,\n )\n .transform((res) => calculateMostRecentTimestamp(versioningApi, res))\n .transform((res) => calculateAbandonment(res, config))\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (lookupError instanceof Error) {\n throw lookupError;\n }\n\n if (lookupError) {\n // If dependency lookup fails then warn and return\n const warning: ValidationMessage = {\n topic: config.packageName,\n message: `Failed to look up ${config.datasource} package ${config.packageName}: ${lookupError}`,\n };\n logger.debug(\n {\n dependency: config.packageName,\n packageFile: config.packageFile,\n },\n warning.message,\n );\n // TODO: return warnings in own field\n res.warnings.push(warning);\n return Result.ok(res);\n }\n\n dependency = releaseResult;\n\n if (dependency.deprecationMessage) {\n logger.debug(\n `Found deprecationMessage for ${config.datasource} package ${config.packageName}`,\n );\n }\n\n assignKeys(res, dependency, [\n 'deprecationMessage',\n 'sourceUrl',\n 'registryUrl',\n 'sourceDirectory',\n 'homepage',\n 'changelogUrl',\n 'dependencyUrl',\n 'lookupName',\n 'packageScope',\n 'mostRecentTimestamp',\n 'isAbandoned',\n 'respectLatest',\n ]);\n\n const latestVersion = dependency.tags?.latest;\n // Filter out any results from datasource that don't comply with our versioning\n let allVersions = dependency.releases.filter((release) =>\n versioningApi.isVersion(release.version),\n );\n const allReleaseVersions = new Set(allVersions.map((r) => r.version));\n // istanbul ignore if\n if (allVersions.length === 0) {\n const message = `Found no results from datasource that look like a version`;\n logger.info(\n {\n dependency: config.packageName,\n result: dependency,\n },\n message,\n );\n if (!config.currentDigest) {\n return Result.ok(res);\n }\n }\n // Reapply package rules in case we missed something from sourceUrl\n config = await applyPackageRules(\n { ...config, sourceUrl: res.sourceUrl },\n 'source-url',\n );\n if (config.followTag) {\n const taggedVersion = dependency.tags?.[config.followTag];\n if (!taggedVersion) {\n res.warnings.push({\n topic: config.packageName,\n message: `Can't find version with tag ${config.followTag} for ${config.datasource} package ${config.packageName}`,\n });\n return Result.ok(res);\n }\n allVersions = allVersions.filter(\n (v) =>\n v.version === taggedVersion ||\n (v.version === compareValue &&\n versioningApi.isGreaterThan(taggedVersion, compareValue)),\n );\n }\n\n const inRangeOnlyStrategy = config.rangeStrategy === 'in-range-only';\n // Check that existing constraint can be satisfied\n const allSatisfyingVersions =\n (inRangeOnlyStrategy || config.rollbackPrs) && !unconstrainedValue\n ? allVersions.filter((v) =>\n // TODO #22198\n versioningApi.matches(v.version, compareValue!),\n )\n : allVersions;\n if (!allSatisfyingVersions.length) {\n logger.debug(\n `Found no satisfying versions with '${config.versioning}' versioning`,\n );\n }\n\n if (config.rollbackPrs && !allSatisfyingVersions.length) {\n const rollback = getRollbackUpdate(config, allVersions, versioningApi);\n // istanbul ignore if\n if (!rollback) {\n res.warnings.push({\n topic: config.packageName,\n // TODO: types (#22198)\n message: `Can't find version matching ${compareValue!} for ${\n config.datasource\n } package ${config.packageName}`,\n });\n return Result.ok(res);\n }\n res.updates.push(rollback);\n }\n let rangeStrategy = getRangeStrategy(config);\n\n // istanbul ignore next\n if (\n config.isVulnerabilityAlert &&\n rangeStrategy === 'update-lockfile' &&\n !config.lockedVersion\n ) {\n rangeStrategy = 'bump';\n }\n // unconstrained deps with lockedVersion\n if (\n config.isVulnerabilityAlert &&\n !config.currentValue &&\n config.lockedVersion\n ) {\n rangeStrategy = 'update-lockfile';\n }\n const nonDeprecatedVersions = dependency.releases\n .filter((release) => !release.isDeprecated)\n .map((release) => release.version);\n let currentVersion: string;\n if (rangeStrategy === 'update-lockfile') {\n currentVersion = config.lockedVersion!;\n } else if (\n compareValue &&\n versioningApi.isSingleVersion(compareValue) &&\n allVersions.find((v) => v.version === compareValue)\n ) {\n currentVersion = compareValue;\n }\n // TODO #22198\n currentVersion ??=\n getCurrentVersion(\n compareValue!,\n config.lockedVersion!,\n versioningApi,\n rangeStrategy!,\n latestVersion!,\n nonDeprecatedVersions,\n ) ??\n getCurrentVersion(\n compareValue!,\n config.lockedVersion!,\n versioningApi,\n rangeStrategy!,\n latestVersion!,\n allVersions.map((v) => v.version),\n )!;\n\n if (!currentVersion) {\n // v8 ignore else -- TODO: add test #40625\n if (!config.lockedVersion) {\n logger.debug(\n `No currentVersion or lockedVersion found for ${config.packageName}`,\n );\n res.skipReason = 'invalid-value';\n }\n return Result.ok(res);\n }\n\n res.currentVersion = currentVersion;\n\n // Use lockedVersion for the timestamp lookup when available, because\n // res.currentVersion is later overwritten to lockedVersion (see below).\n // Without this, strategies like \"replace\" would compute the timestamp\n // for the highest satisfying version (e.g. 1.4.1) while the reported\n // currentVersion ends up being the locked one (e.g. 1.0.0).\n const versionForTimestamp = config.lockedVersion ?? currentVersion;\n const currentVersionTimestamp = await getTimestamp(\n config,\n allVersions,\n versionForTimestamp,\n versioningApi,\n );\n\n if (isNonEmptyString(currentVersionTimestamp)) {\n res.currentVersionTimestamp = currentVersionTimestamp;\n res.currentVersionAgeInDays = getElapsedDays(currentVersionTimestamp);\n\n if (\n config.packageRules?.some((rule) =>\n isNonEmptyString(rule.matchCurrentAge),\n )\n ) {\n // Reapply package rules to check matches for matchCurrentAge\n config = await applyPackageRules(\n { ...config, currentVersionTimestamp },\n 'current-timestamp',\n );\n }\n }\n\n if (\n config.currentDigest\n ? couldApplyMinimumReleaseAgeToDigest(config, 'digest')\n : config.pinDigests &&\n couldApplyMinimumReleaseAgeToDigest(config, 'pinDigest')\n ) {\n // Resolve from `allVersions` (not `dependency.releases`) so that filters like followTag apply, preferring non-deprecated versions with a fallback - both like the `currentVersion` resolution above.\n const newestMatchingVersion =\n getCurrentVersion(\n compareValue!,\n '',\n versioningApi,\n 'replace',\n latestVersion!,\n allVersions.filter((v) => !v.isDeprecated).map((v) => v.version),\n ) ??\n getCurrentVersion(\n compareValue!,\n '',\n versioningApi,\n 'replace',\n latestVersion!,\n allVersions.map((v) => v.version),\n );\n if (newestMatchingVersion) {\n newestMatchingVersionTimestamp = await getTimestamp(\n config,\n allVersions,\n newestMatchingVersion,\n versioningApi,\n );\n }\n }\n\n if (\n compareValue &&\n currentVersion &&\n rangeStrategy === 'pin' &&\n !versioningApi.isSingleVersion(compareValue)\n ) {\n const newValue =\n versioningApi.getPinnedValue?.(currentVersion) ?? currentVersion;\n res.updates.push({\n updateType: 'pin',\n isPin: true,\n newValue,\n newVersion: currentVersion,\n newMajor: versioningApi.getMajor(currentVersion)!,\n });\n }\n if (rangeStrategy === 'pin') {\n // Fall back to replace once pinning logic is done\n rangeStrategy = 'replace';\n }\n // istanbul ignore if\n if (!versioningApi.isVersion(currentVersion!)) {\n res.skipReason = 'invalid-version';\n return Result.ok(res);\n }\n // Filter latest, unstable, etc\n // TODO #22198\n let filteredReleases = filterVersions(\n config,\n currentVersion!,\n latestVersion!,\n inRangeOnlyStrategy ? allSatisfyingVersions : allVersions,\n versioningApi,\n ).filter(\n (v) =>\n // Leave only compatible versions\n unconstrainedValue ||\n versioningApi.isCompatible(v.version, compareValue),\n );\n let shrinkedViaVulnerability = false;\n if (config.isVulnerabilityAlert) {\n if (config.vulnerabilityFixVersion) {\n res.vulnerabilityFixVersion = config.vulnerabilityFixVersion;\n res.vulnerabilityFixStrategy = config.vulnerabilityFixStrategy;\n if (versioningApi.isValid(config.vulnerabilityFixVersion)) {\n let fixedFilteredReleases;\n if (versioningApi.isVersion(config.vulnerabilityFixVersion)) {\n // Retain only releases greater than or equal to the fix version\n fixedFilteredReleases = filteredReleases.filter(\n (release) =>\n !versioningApi.isGreaterThan(\n config.vulnerabilityFixVersion!,\n release.version,\n ),\n );\n } else {\n // Retain only releases which max the fix constraint\n fixedFilteredReleases = filteredReleases.filter((release) =>\n versioningApi.matches(\n release.version,\n config.vulnerabilityFixVersion!,\n ),\n );\n }\n // Warn if this filtering results caused zero releases\n if (fixedFilteredReleases.length === 0 && filteredReleases.length) {\n logger.warn(\n {\n releases: filteredReleases,\n vulnerabilityFixVersion: config.vulnerabilityFixVersion,\n packageName: config.packageName,\n },\n 'No releases satisfy vulnerabilityFixVersion',\n );\n }\n // Use the additionally filtered releases\n filteredReleases = fixedFilteredReleases;\n } else {\n logger.warn(\n {\n vulnerabilityFixVersion: config.vulnerabilityFixVersion,\n packageName: config.packageName,\n },\n 'vulnerabilityFixVersion is not valid',\n );\n }\n }\n if (config.vulnerabilityFixStrategy === 'highest') {\n // Don't shrink the list of releases - let Renovate use its normal logic\n logger.once.debug(\n `Using vulnerabilityFixStrategy=highest for ${config.packageName}`,\n );\n } else {\n // Shrink the list of releases to the lowest fixed version\n logger.once.debug(\n `Using vulnerabilityFixStrategy=lowest for ${config.packageName}`,\n );\n filteredReleases = filteredReleases.slice(0, 1);\n shrinkedViaVulnerability = true;\n }\n }\n const buckets: Record<string, [Release]> = {};\n for (const release of filteredReleases) {\n const bucket = getBucket(\n config,\n // TODO #22198\n currentVersion!,\n release.version,\n versioningApi,\n );\n // v8 ignore else -- TODO: add test #40625\n if (isString(bucket)) {\n if (buckets[bucket]) {\n buckets[bucket].push(release);\n } else {\n buckets[bucket] = [release];\n }\n }\n }\n const depResultConfig = mergeChildConfig(config, res);\n for (const [bucket, releases] of Object.entries(buckets)) {\n const sortedReleases = releases.sort((r1, r2) =>\n versioningApi.sortVersions(r1.version, r2.version),\n );\n const { release, pendingChecks, pendingReleases } =\n await filterInternalChecks(\n depResultConfig,\n versioningApi,\n bucket,\n sortedReleases,\n );\n // istanbul ignore next\n if (!release) {\n return Result.ok(res);\n }\n const newVersion = release.version;\n const update = await generateUpdate(\n config,\n compareValue,\n versioningApi,\n // TODO #22198\n\n rangeStrategy!,\n config.lockedVersion ?? currentVersion!,\n bucket,\n release,\n allReleaseVersions,\n );\n\n // #29034\n if (\n config.manager === 'gomod' &&\n compareValue?.startsWith('v0.0.0-') &&\n update.newValue?.startsWith('v0.0.0-') &&\n config.currentDigest !== update.newDigest\n ) {\n update.updateType = 'digest';\n\n // As this has already been processed by `filterInternalChecks()`, but we're changing the `updateType`, we need to apply the digest-scoped minimumReleaseAge rules.\n // `currentVersionWasResolved` only matters for `pinDigest`, which `update.updateType` never is here - true is a safe constant.\n await applyMinimumReleaseAgeToDigestUpdate(\n update as DigestLikeUpdate,\n config,\n res,\n true,\n release.releaseTimestamp,\n );\n }\n\n if (pendingChecks) {\n update.pendingChecks = pendingChecks;\n }\n\n if (pendingReleases.length) {\n update.pendingVersions = pendingReleases.map((r) => r.version);\n }\n if (!update.newValue || update.newValue === compareValue) {\n if (!config.lockedVersion) {\n continue;\n }\n // istanbul ignore if\n if (rangeStrategy === 'bump') {\n logger.trace(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n lockedVersion: config.lockedVersion,\n newVersion,\n },\n 'Skipping bump because newValue is the same',\n );\n continue;\n }\n res.isSingleVersion = true;\n }\n res.isSingleVersion ??=\n isString(update.newValue) &&\n versioningApi.isSingleVersion(update.newValue);\n // istanbul ignore if\n if (\n config.versioning === dockerVersioningId &&\n update.updateType !== 'rollback' &&\n update.newValue &&\n versioningApi.isVersion(update.newValue) &&\n compareValue &&\n versioningApi.isVersion(compareValue) &&\n versioningApi.isGreaterThan(compareValue, update.newValue)\n ) {\n logger.warn(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n compareValue,\n currentVersion: config.currentVersion,\n update,\n allVersionsLength: allVersions.length,\n filteredReleaseVersions: filteredReleases.map((r) => r.version),\n shrinkedViaVulnerability,\n },\n 'Unexpected downgrade detected: skipping',\n );\n } else {\n res.updates.push(update);\n }\n }\n } else if (compareValue) {\n logger.debug(\n `Dependency ${config.packageName} has unsupported/unversioned value ${compareValue} (versioning=${config.versioning})`,\n );\n\n if (!config.pinDigests && !config.currentDigest) {\n logger.debug(\n `Skipping ${config.packageName} because no currentDigest or pinDigests`,\n );\n res.skipReason = 'invalid-value';\n } else {\n delete res.skipReason;\n }\n } else {\n res.skipReason = 'invalid-value';\n }\n\n if (isReplacementRulesConfigured(config)) {\n addReplacementUpdateIfValid(res.updates, config);\n } else if (dependency?.replacementName && dependency.replacementVersion) {\n res.updates.push({\n updateType: 'replacement',\n newName: dependency.replacementName,\n newValue: dependency.replacementVersion,\n });\n }\n\n // Record if the dep is fixed to a version\n if (config.lockedVersion) {\n res.currentVersion = config.lockedVersion;\n res.fixedVersion = config.lockedVersion;\n } else if (compareValue && versioningApi.isSingleVersion(compareValue)) {\n res.fixedVersion = compareValue.replace(regEx(/^=+/), '');\n }\n\n // massage versionCompatibility\n if (\n isString(config.currentValue) &&\n isString(compareValue) &&\n isString(config.versionCompatibility)\n ) {\n for (const update of res.updates) {\n logger.debug({ update });\n // v8 ignore else -- TODO: add test #40625\n if (isString(config.currentValue) && isString(update.newValue)) {\n update.newValue = config.currentValue.replace(\n compareValue,\n update.newValue,\n );\n }\n }\n }\n\n // Add digests if necessary\n if (supportsDigests(config.datasource)) {\n if (config.currentDigest) {\n if (!config.digestOneAndOnly || !res.updates.length) {\n // digest update - age-checked after the strip below, once newDigest is known\n digestUpdate = {\n updateType: 'digest',\n newValue: config.currentValue,\n };\n res.updates.push(digestUpdate);\n }\n } else if (\n config.pinDigests &&\n // only update the digest in the package file if it's managed by us\n !config.digestManagedExternally &&\n // Create a pin only if one doesn't already exists\n // v8 ignore else -- TODO: add test #40625\n !res.updates.some((update) => update.updateType === 'pin')\n ) {\n // pin digest\n const pinDigestUpdate: DigestLikeUpdate = {\n isPinDigest: true,\n updateType: 'pinDigest',\n newValue: config.currentValue,\n };\n await applyMinimumReleaseAgeToDigestUpdate(\n pinDigestUpdate,\n config,\n res,\n isValid || unconstrainedValue,\n newestMatchingVersionTimestamp,\n );\n res.updates.push(pinDigestUpdate);\n }\n if (versioningApi.valueToVersion) {\n // TODO #22198\n res.currentVersion = versioningApi.valueToVersion(res.currentVersion!);\n for (const update of res.updates) {\n // TODO #22198\n update.newVersion = versioningApi.valueToVersion(update.newVersion!);\n }\n }\n if (res.registryUrl) {\n config.registryUrls = [res.registryUrl];\n }\n\n // update digest for all\n for (const update of res.updates) {\n // only update the digest in the package file if it's managed by us\n if (\n (config.pinDigests === true && !config.digestManagedExternally) ||\n config.currentDigest\n ) {\n const getDigestConfig: GetDigestInputConfig = {\n ...config,\n registryUrl: update.registryUrl ?? res.registryUrl,\n lookupName: res.lookupName,\n };\n\n // #20304 only pass it for replacement updates, otherwise we get wrong or invalid digest\n if (update.updateType !== 'replacement') {\n delete getDigestConfig.replacementName;\n }\n\n // #20304 don't use lookupName and currentDigest when we replace image name\n if (\n update.updateType === 'replacement' &&\n update.newName !== config.packageName\n ) {\n delete getDigestConfig.lookupName;\n delete getDigestConfig.currentDigest;\n getDigestConfig.replacementName = update.newName;\n }\n\n // Don't use current releases if replacement changes name, otherwise we use the wrong new digest.\n // This happens on datasources which return the digest in release info like `github-tags`.\n // We can still use it when only version is changing.\n if (\n update.updateType !== 'replacement' ||\n update.newName === config.packageName\n ) {\n update.newDigest ??= dependency?.releases.find(\n (r) => r.version === update.newValue,\n )?.newDigest;\n }\n\n update.newDigest ??= await getDigest(\n getDigestConfig,\n update.newValue,\n );\n\n // If the digest could not be determined, report this as otherwise the\n // update will be omitted later on without notice.\n if (update.newDigest === null) {\n logger.debug(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n datasource: config.datasource,\n newValue: update.newValue,\n bucket: update.bucket,\n },\n 'Could not determine new digest for update.',\n );\n\n // Only report a warning if there is a current digest.\n // Context: https://github.com/renovatebot/renovate/pull/20175#discussion_r1102615059.\n if (config.currentDigest) {\n res.warnings.push({\n message: `Could not determine new digest for update (${config.datasource} package ${config.packageName})`,\n topic: config.packageName,\n });\n }\n }\n } else {\n delete update.newDigest;\n }\n if (update.newVersion) {\n const registryUrl = dependency?.releases?.find(\n (release) => release.version === update.newVersion,\n )?.registryUrl;\n if (registryUrl && registryUrl !== res.registryUrl) {\n update.registryUrl = registryUrl;\n }\n }\n }\n }\n\n if (res.updates.length) {\n delete res.skipReason;\n }\n // Strip out any non-changed ones\n res.updates = res.updates\n .filter(\n (update) => update.newValue !== null || config.currentValue === null,\n )\n .filter((update) => update.newDigest !== null)\n .filter(\n (update) =>\n (isString(update.newName) && update.newName !== config.packageName) ||\n update.isReplacement === true ||\n update.newValue !== config.currentValue ||\n update.isLockfileUpdate === true ||\n // TODO #22198\n (update.newDigest &&\n !update.newDigest.startsWith(config.currentDigest!)),\n );\n // If range strategy specified in config is 'in-range-only', also strip out updates where currentValue !== newValue\n if (config.rangeStrategy === 'in-range-only') {\n res.updates = res.updates.filter(\n (update) => update.newValue === config.currentValue,\n );\n }\n // Handle a weird edge case involving followTag and fallbacks\n if (config.rollbackPrs && config.followTag) {\n res.updates = res.updates.filter(\n (update) =>\n update.updateType !== 'rollback' || res.updates.length === 1,\n );\n }\n\n // If there is a digest update proposed which is in the pending updates for this dependency, ensure that `minimumReleaseAge` is applied.\n // `currentVersionWasResolved` only matters for `pinDigest`, which `digestUpdate` never is - true is a safe constant.\n if (digestUpdate && res.updates.includes(digestUpdate)) {\n await applyMinimumReleaseAgeToDigestUpdate(\n digestUpdate,\n config,\n res,\n true,\n newestMatchingVersionTimestamp,\n );\n }\n\n const release =\n res.updates.length > 0\n ? (dependency?.releases.find(\n (r) => r.version === res.updates[0].newValue,\n ) ??\n dependency?.releases.find(\n (r) => r.version === res.updates[0].newVersion,\n ))\n : null;\n\n if (release?.changelogContent) {\n res.changelogContent = release.changelogContent;\n res.changelogUrl = release.changelogUrl;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err instanceof ExternalHostError) {\n return Result.err(err);\n }\n\n if (err instanceof Error && err.message === CONFIG_VALIDATION) {\n return Result.err(err);\n }\n\n logger.error(\n {\n currentDigest: config.currentDigest,\n currentValue: config.currentValue,\n datasource: config.datasource,\n packageName: config.packageName,\n digestOneAndOnly: config.digestOneAndOnly,\n followTag: config.followTag,\n lockedVersion: config.lockedVersion,\n packageFile: config.packageFile,\n pinDigests: config.pinDigests,\n rollbackPrs: config.rollbackPrs,\n isVulnerabilityAlert: config.isVulnerabilityAlert,\n updatePinnedDependencies: config.updatePinnedDependencies,\n err,\n },\n 'lookupUpdates error',\n );\n res.skipReason = 'internal-error';\n }\n return Result.ok(res);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.85.0",
4
+ "version": "44.85.1",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.85.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.85.1 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.85.0",
5
+ "x-renovate-version": "44.85.1",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {