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

  1. Rebuild the gem from a correct .gemspec that defines a name (`gem.name = 'mygem'`) and verify with `gem specification`.
  2. Inspect metadata via `tar -xOf mygem.gem metadata.gz | gunzip` to confirm the name key exists.
  3. 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

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


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/7cc9f4ab9199a4b1. Report an issue: GitHub.