jordansissel/fpm · error · FPM::InvalidPackageConfiguration

Unknown compression type '#{compression}' for data.tar in de

Error message

Unknown compression type '#{compression}' for data.tar in deb source package #{package}

What it means

Same code path as the control.tar variant, but for the payload member while extracting files from a .deb: the suffix of the first ar member matching data.tar must be one of gz, bzip2, xz, zst or plain tar. Anything else raises FPM::InvalidPackageConfiguration with the unrecognized compression value for data.tar.

Source

Thrown at lib/fpm/package/deb.rb:490

      when "gz"
        datatar = "data.tar.gz"
        compression = "-z"
      when "bzip2","bz2"
        datatar = "data.tar.bz2"
        compression = "-j"
      when "xz"
        datatar = "data.tar.xz"
        compression = "-J"
      when "zst"
        datatar = "data.tar.zst"
        compression = "--use-compress-program 'zstd -d'"
      when 'tar'
        datatar = "data.tar"
        compression = ""
      when nil
        raise FPM::InvalidPackageConfiguration, "Missing data.tar in deb source package #{package}"
      else
        raise FPM::InvalidPackageConfiguration,
          "Unknown compression type '#{compression}' for data.tar in deb source package #{package}"
    end

    # unpack the data.tar.{gz,bz2,xz} from the deb package into staging_path
    safesystem(ar_cmd[0] + " p #{package} #{datatar} | tar #{compression} -xf - -C #{staging_path}")
  end # def extract_files

  def output(output_path)
    self.provides = self.provides.collect { |p| fix_provides(p) }

    self.provides.each do |provide|
      if !valid_provides_field?(provide)
        raise FPM::InvalidPackageConfiguration, "Found invalid Provides field values (#{provide.inspect}). This is not valid in a Debian package."
      end
    end
    output_check(output_path)
    # Abort if the target path already exists.

View on GitHub (pinned to b6d77ba72a)

Solutions

  1. List members with ar t package.deb and check the exact data.tar.* suffix
  2. Repack with a supported compression: dpkg-deb -R package.deb tmp && dpkg-deb -b -Zxz tmp fixed.deb, then convert fixed.deb
  3. Change the producing tool to use gz/xz/zst for both control and data members

Example fix

# before
fpm -s deb -t rpm old.deb          # data.tar.lzma

# after
dpkg-deb -R old.deb /tmp/old
dpkg-deb -b -Zxz /tmp/old /tmp/old-fixed.deb
fpm -s deb -t rpm /tmp/old-fixed.deb
Defensive patterns

Strategy: validation

Validate before calling

SUPPORTED = %w[gz bz2 xz zst tar]
members = `ar t #{Shellwords.escape(path)}`.split("\n")
dat = members.find { |m| m.start_with?('data.tar') }
suffix = dat && dat.split('.').last
abort "unsupported data.tar compression '.#{suffix}' -- repack with dpkg-deb -Zxz" unless SUPPORTED.include?(suffix)

Type guard

def supported_data_member?(ar_member)
  %w[gz bz2 xz zst tar].include?(ar_member.split('.').last)
end

Try / catch

begin
  pkg.input(path)
rescue FPM::InvalidPackageConfiguration => e
  raise unless e.message =~ /Unknown compression type .* data\.tar/
  system("dpkg-deb -R #{path} /tmp/repack && dpkg-deb -b -Zxz /tmp/repack #{path}")
  retry
end

Prevention

When it happens

Trigger: Converting a deb containing data.tar.lzma or another unsupported compression for its payload, or an ar member name whose derived suffix string does not match any known case (mangled names, stray whitespace).

Common situations: Legacy/embedded tooling emitting lzma-compressed payloads; debs repacked by scripts that rename or recompress members; toolchain drift in conversion pipelines.

Related errors


AI-assisted analysis of jordansissel/fpm@b6d77ba72a (2026-08-21). Data as JSON: /api/errors/9b201a10b2278aa1. Report an issue: GitHub.