theonedev/onedev · error · ClientException
Package name not found in metadata
Error message
Package name not found in metadata
What it means
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.
Source
Thrown at server-plugin/server-plugin-pack-gem/src/main/java/io/onedev/server/plugin/pack/gem/GemPackHandler.java:185
for (var tuple : metadata.getValue()) {
var keyNode = (ScalarNode) tuple.getKeyNode();
if (keyNode.getValue().equals("name")) {
name = ((ScalarNode) tuple.getValueNode()).getValue();
} else if (keyNode.getValue().equals("version")) {
var versionNode = (MappingNode) tuple.getValueNode();
for (var versionTuple : versionNode.getValue()) {
var versionKeyNode = (ScalarNode) versionTuple.getKeyNode();
if (versionKeyNode.getValue().equals("version")) {
version = ((ScalarNode) versionTuple.getValueNode()).getValue();
break;
}
}
} else if (keyNode.getValue().equals("platform")) {
platform = ((ScalarNode) tuple.getValueNode()).getValue();
}
}
if (name == null)
throw new ClientException(SC_BAD_REQUEST, "Package name not found in metadata");
if (version == null)
throw new ClientException(SC_BAD_REQUEST, "Package version not found in metadata");
String finalName = name;
String finalVersion = version;
String finalPlatform = platform;
byte[] finalMetadataBytes = metadataBytes;
LockUtils.run(getLockName(projectId, name), () -> transactionService.run(() -> {
var project = projectService.load(projectId);
PackBlob packBlob;
try (var is = new FileInputStream(tempFile)) {
packBlob = packBlobService.load(packBlobService.uploadBlob(projectId, is, null));
} catch (IOException e) {
throw new RuntimeException(e);
}
GemData data;
var pack = packService.findByNameAndVersion(project, TYPE, finalName, finalVersion);View on GitHub (pinned to d44925c47c)
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.
Example fix
# before (gemspec) # gem.name missing # after Gem::Specification.new do |s| s.name = 'mygem' end
Defensive patterns
Strategy: validation
Validate before calling
# confirm metadata has a name before upload
meta=$(tar -xOf mygem.gem metadata.gz | gunzip)
echo "$meta" | grep -q '^name:' || { echo 'missing name in metadata'; exit 1; } Try / catch
try { upload(gemFile) } catch (e) { if (e.httpStatus === 400 && /name not found/.test(e.message)) { rebuildFromValidGemspec(); } else { throw e; } } Prevention
- 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.
When it happens
Trigger: 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.
Common situations: Custom gem packaging tools producing non-standard metadata; corrupted metadata.gz produced by an unusual gem builder; reproducibility/patching pipelines rewriting the gemspec incorrectly.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- Package version not found in metadata
- Metadata exceeds maximum size: ${MAX_METADATA_SIZE}
- Metadata not found
- Package already exists (name: %s, version: %s)
- Chart name or version not specified
AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06).
Data as JSON: /api/errors/7cc9f4ab9199a4b1.
Report an issue: GitHub.