{"record":{"id":"7cc9f4ab9199a4b1","repo":"theonedev/onedev","slug":"package-name-not-found-in-metadata","errorCode":null,"errorMessage":"Package name not found in metadata","messagePattern":"Package name not found in metadata","errorType":"http","errorClass":"ClientException","httpStatus":400,"severity":"error","filePath":"server-plugin/server-plugin-pack-gem/src/main/java/io/onedev/server/plugin/pack/gem/GemPackHandler.java","lineNumber":185,"sourceCode":"\t\t\t\tfor (var tuple : metadata.getValue()) {\n\t\t\t\t\tvar keyNode = (ScalarNode) tuple.getKeyNode();\n\t\t\t\t\tif (keyNode.getValue().equals(\"name\")) {\n\t\t\t\t\t\tname = ((ScalarNode) tuple.getValueNode()).getValue();\n\t\t\t\t\t} else if (keyNode.getValue().equals(\"version\")) {\n\t\t\t\t\t\tvar versionNode = (MappingNode) tuple.getValueNode();\n\t\t\t\t\t\tfor (var versionTuple : versionNode.getValue()) {\n\t\t\t\t\t\t\tvar versionKeyNode = (ScalarNode) versionTuple.getKeyNode();\n\t\t\t\t\t\t\tif (versionKeyNode.getValue().equals(\"version\")) {\n\t\t\t\t\t\t\t\tversion = ((ScalarNode) versionTuple.getValueNode()).getValue();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (keyNode.getValue().equals(\"platform\")) {\n\t\t\t\t\t\tplatform = ((ScalarNode) tuple.getValueNode()).getValue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (name == null)\n\t\t\t\t\tthrow new ClientException(SC_BAD_REQUEST, \"Package name not found in metadata\");\n\t\t\t\tif (version == null)\n\t\t\t\t\tthrow new ClientException(SC_BAD_REQUEST, \"Package version not found in metadata\");\n\n\t\t\t\tString finalName = name;\n\t\t\t\tString finalVersion = version;\n\t\t\t\tString finalPlatform = platform;\n\t\t\t\tbyte[] finalMetadataBytes = metadataBytes;\n\t\t\t\tLockUtils.run(getLockName(projectId, name), () -> transactionService.run(() -> {\n\t\t\t\t\tvar project = projectService.load(projectId);\n\n\t\t\t\t\tPackBlob packBlob;\n\t\t\t\t\ttry (var is = new FileInputStream(tempFile)) {\n\t\t\t\t\t\tpackBlob = packBlobService.load(packBlobService.uploadBlob(projectId, is, null));\n\t\t\t\t\t} catch (IOException e) {\n\t\t\t\t\t\tthrow new RuntimeException(e);\n\t\t\t\t\t}\n\t\t\t\t\tGemData data;\n\t\t\t\t\tvar pack = packService.findByNameAndVersion(project, TYPE, finalName, finalVersion);","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-plugin/server-plugin-pack-gem/src/main/java/io/onedev/server/plugin/pack/gem/GemPackHandler.java#L167-L203","documentation":"The gem metadata.gz YAML must contain a 'name' entry identifying the package. After parsing metadata, if the name variable was never set, the handler throws 400 'Package name not found in metadata'. A gem without a name cannot be registered in the package store.","triggerScenarios":"Uploading a gem whose metadata YAML lacks the 'name' key — hand-crafted metadata, malformed gemspec, or metadata that failed to parse into expected MappingNode tuples.","commonSituations":"Custom gem packaging tools producing non-standard metadata; corrupted metadata.gz produced by an unusual gem builder; reproducibility/patching pipelines rewriting the gemspec incorrectly.","solutions":["Rebuild the gem from a correct .gemspec that defines a name (`gem.name = 'mygem'`) and verify with `gem specification`.","Inspect metadata via `tar -xOf mygem.gem metadata.gz | gunzip` to confirm the name key exists.","Use standard `gem build` instead of custom packaging scripts."],"exampleFix":"# before (gemspec)\n# gem.name missing\n# after\nGem::Specification.new do |s|\n  s.name = 'mygem'\nend","handlingStrategy":"validation","validationCode":"# confirm metadata has a name before upload\nmeta=$(tar -xOf mygem.gem metadata.gz | gunzip)\necho \"$meta\" | grep -q '^name:' || { echo 'missing name in metadata'; exit 1; }","typeGuard":null,"tryCatchPattern":"try { upload(gemFile) } catch (e) { if (e.httpStatus === 400 && /name not found/.test(e.message)) { rebuildFromValidGemspec(); } else { throw e; } }","preventionTips":["Always build gems with `gem build` from a complete gemspec.","Set s.name explicitly in every gemspec.","Inspect metadata in CI before publishing custom-built gems."],"tags":["gem","package-upload","metadata"],"backgroundTag":"missing-required-argument","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}