{"record":{"id":"5fa4cd2f28e7770e","repo":"theonedev/onedev","slug":"package-already-exists-name-s-version-s-5fa4cd","errorCode":null,"errorMessage":"Package already exists (name: %s, version: %s)","messagePattern":"Package already exists \\(name: (.+?), version: (.+?)\\)","errorType":"http","errorClass":"ClientException","httpStatus":409,"severity":"error","filePath":"server-plugin/server-plugin-pack-npm/src/main/java/io/onedev/server/plugin/pack/npm/NpmPackHandler.java","lineNumber":402,"sourceCode":"\t\t\t\t\t\tbyte[] packageMetadataBytes = writeJson(packageMetadata);\n\n\t\t\t\t\t\tif (versionsNode != null) {\n\t\t\t\t\t\t\tfor (var it = versionsNode.fields(); it.hasNext(); ) {\n\t\t\t\t\t\t\t\tvar field = it.next();\n\t\t\t\t\t\t\t\tvar version = field.getKey();\n\t\t\t\t\t\t\t\tvar versionMetadata = (ObjectNode) field.getValue();\n\t\t\t\t\t\t\t\tvar name = versionMetadata.get(\"name\").asText();\n\n\t\t\t\t\t\t\t\tLockUtils.run(getLockName(projectId, name), () -> {\n\t\t\t\t\t\t\t\t\ttransactionService.run(() -> {\n\t\t\t\t\t\t\t\t\t\tvar project = projectService.load(projectId);\n\t\t\t\t\t\t\t\t\t\tvar pack = packService.findByNameAndVersion(project, TYPE, name, version);\n\t\t\t\t\t\t\t\t\t\tif (pack != null) {\n\t\t\t\t\t\t\t\t\t\t\tvar packData = (NpmData) pack.getData();\n\t\t\t\t\t\t\t\t\t\t\tif (packBlobService.checkPackBlob(projectId, packData.getFileSha256BlobHash()) != null) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar errorMessage = String.format(\"Package already exists (name: %s, version: %s)\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tname, version);\n\t\t\t\t\t\t\t\t\t\t\t\tthrow new ClientException(SC_CONFLICT, errorMessage);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tpack = new Pack();\n\t\t\t\t\t\t\t\t\t\t\tpack.setType(TYPE);\n\t\t\t\t\t\t\t\t\t\t\tpack.setName(name);\n\t\t\t\t\t\t\t\t\t\t\tpack.setVersion(version);\n\t\t\t\t\t\t\t\t\t\t\tpack.setProject(project);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tBuild build = null;\n\t\t\t\t\t\t\t\t\t\tif (buildId != null)\n\t\t\t\t\t\t\t\t\t\t\tbuild = buildService.load(buildId);\n\t\t\t\t\t\t\t\t\t\tpack.setBuild(build);\n\t\t\t\t\t\t\t\t\t\tpack.setUser(SecurityUtils.getUser());\n\t\t\t\t\t\t\t\t\t\tpack.setPublishDate(new Date());\n\n\t\t\t\t\t\t\t\t\t\tvar distTagsOfVersion = new LinkedHashSet<String>();\n\t\t\t\t\t\t\t\t\t\tfor (var entry : distTags.entrySet()) {\n\t\t\t\t\t\t\t\t\t\t\tif (entry.getValue().equals(version))","sourceCodeStart":384,"sourceCodeEnd":420,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-plugin/server-plugin-pack-npm/src/main/java/io/onedev/server/plugin/pack/npm/NpmPackHandler.java#L384-L420","documentation":"On npm publish, before creating a new Pack the handler checks findByNameAndVersion. If a pack with the same name and version already exists AND its file blob still exists in storage, the publish is rejected with HTTP 409 Conflict 'Package already exists (name: %s, version: %s)'. npm forbids overwriting published versions.","triggerScenarios":"Running 'npm publish' twice for the same package name+version in the same OneDev project; CI retrying a publish that already succeeded; manually re-deploying an already-uploaded artifact.","commonSituations":"CI pipelines without idempotency re-running publish steps after a later-stage failure; forgetting to bump the version in package.json; shared packages published by multiple branches with fixed versions.","solutions":["Bump the version in package.json and publish again (npm requires unique versions)","If the existing pack is unwanted, delete that package version from the OneDev project UI then republish","Make CI publish steps conditional/idempotent so they skip when the version already exists","Note: if the blob was missing (checkPackBlob returned null) the handler re-creates instead — this error means the data is fully intact"],"exampleFix":"// before\n\"version\": \"1.0.0\"  // already published\n// after\n\"version\": \"1.0.1\"","handlingStrategy":"try-catch","validationCode":"const res = await fetch(`${registry}/${encodeURIComponent(name)}`);\nconst info = await res.json();\nif (info.versions?.[version]) throw new Error(`Version ${version} already published; bump version`);","typeGuard":null,"tryCatchPattern":"try { await publish() } catch (e) { if (e.response?.status === 409 && /Package already exists/i.test(e.message ?? '')) { console.error('Bump version in package.json or delete the existing pack version'); } else throw e }","preventionTips":["Bump versions before every publish","Make CI publish steps idempotent/skippable on retry","Check for existing name+version before scripted deploys"],"tags":["http-409","npm","conflict","publish","duplicate-version"],"backgroundTag":"file-already-exists","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}