theonedev/onedev · error · ExplicitException

Unable to find requirements node

Error message

Unable to find requirements node

What it means

getGemRequirement(MappingNode) parses a YAML node tagged !ruby/object:Gem::Requirement expecting a 'requirements' key holding the version constraints list. When that key is absent it throws ExplicitException("Unable to find requirements node"). Raised during gem publish while parsing dependency entries in the gem's metadata.

Source

Thrown at server-plugin/server-plugin-pack-gem/src/main/java/io/onedev/server/plugin/pack/gem/GemPackHandler.java:538

		}
		throw new ExplicitException("Unable to find version node");
	}
	
	private UserMarshal getGemRequirement(MappingNode node) {
		checkArgument(node.getTag().getValue().equals("!ruby/object:Gem::Requirement"));
		for (var tuple: node.getValue()) {
			if (((ScalarNode)tuple.getKeyNode()).getValue().equals("requirements")) {
				var requiredVersions = new LinkedHashMap<String, UserMarshal>();
				for (var requirementNode: ((SequenceNode)tuple.getValueNode()).getValue()) {
					var operatorAndVersion = ((SequenceNode)requirementNode).getValue();
					var operator = ((ScalarNode)operatorAndVersion.get(0)).getValue();
					var gemVersion = getGemVersion((MappingNode) operatorAndVersion.get(1));
					requiredVersions.put(operator, gemVersion);
				}
				return getGemRequirement(requiredVersions);
			}
		}
		throw new ExplicitException("Unable to find requirements node");
	}
	
	private RubyObject getGemDependency(MappingNode node) {
		checkArgument(node.getTag().getValue().equals("!ruby/object:Gem::Dependency"));

		var members = new HashMap<String, Object>();
		
		for (var tuple: node.getValue()) {
			var keyValue = ((ScalarNode)tuple.getKeyNode()).getValue();
			switch (keyValue) {
				case "name":
				case "type":
					members.put("@" + keyValue, ((ScalarNode)tuple.getValueNode()).getValue());	
					break;
				case "requirement":
				case "version_requirements":
					members.put("@" + keyValue, getGemRequirement((MappingNode) tuple.getValueNode()));
					break;

View on GitHub (pinned to d44925c47c)

Solutions

  1. Rebuild the gem with standard `gem build` and re-push.
  2. Inspect metadata (tar -xOf mygem-1.0.0.gem metadata.gz | gzip -d) to confirm each Gem::Requirement has a 'requirements' key.
  3. Update RubyGems before building if the producing toolchain is old.
  4. Simplify or regenerate the gemspec's add_dependency declarations so standard tooling serializes them.

Example fix

// before (malformed YAML)
--- !ruby/object:Gem::Requirement
  constraints:
    - [">=", !ruby/object:Gem::Version {version: 2.0.0}]
// after
--- !ruby/object:Gem::Requirement
  requirements:
    - - ">="
      - !ruby/object:Gem::Version
        version: 2.0.0
Defensive patterns

Strategy: validation

Validate before calling

# validate dependency metadata before pushing
tar -xOf mygem-1.0.0.gem metadata.gz | gzip -d | grep -B2 -A6 'Gem::Requirement'
# ensure every Gem::Requirement mapping contains a 'requirements' key

Try / catch

begin
  gem_push('onedev-host', 'mygem-1.0.0.gem')
rescue => e
  raise unless e.message.include?('Unable to find requirements node')
  warn 'Malformed dependency metadata: rebuild with `gem build`'
end

Prevention

When it happens

Trigger: Publishing a gem whose metadata Gem::Requirement mapping lacks 'requirements' — malformed dependency YAML, truncated metadata.gz, or gems generated by nonstandard packaging tools.

Common situations: Custom gem builders writing dependency data by hand; corrupted/partial uploads; very old or patched RubyGems producing a different serialization layout.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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