Path: blob/main/website/tools/hardware-notes-processor.rb
18081 views
#!/usr/bin/env ruby1=begin23BSD 2-Clause License4Copyright (c) 2020-2026, The FreeBSD Project5Copyright (c) 2020-2026, Sergio Carlavilla <[email protected]>67This script will generate the hardware notes89=end10require 'open3'1112# Main method13puts "Processing hardware notes..."1415if ARGV.length < 1 || ARGV.length > 116puts "Only expecting the release version"17exit18end1920# Extract FreeBSD version from newvers.sh21freebsd_version = nil22newvers_path = './tmp/sys/conf/newvers.sh'23if File.exist?(newvers_path)24File.foreach(newvers_path) do |line|25if line =~ /REVISION="([^"]+)"/26freebsd_version = $127break28end29end30end3132if freebsd_version.nil?33puts "WARNING: Could not find FreeBSD version in #{newvers_path}"34freebsd_version = 'X.Y'35end3637hardwareNotesPath = ARGV[0]38hardwareNotesContent = ""3940File.foreach(hardwareNotesPath).with_index do |original_line, idx|41line = original_line.dup # allow modification4243# Replace version placeholders in the first 10 lines44if idx < 1045line.gsub!(/X\.0/, freebsd_version)46line.gsub!(/X\.Y/, freebsd_version)47end4849if (line[/&hwlist.\b/])50manualPage = line.gsub("&hwlist.", "").gsub(";", "").gsub("\n", "")5152if(File.exist?("tmp/share/man/man4/" + manualPage + ".4"))53cmd = "mandoc -Tmarkdown tmp/share/man/man4/" + manualPage + ".4 | sed -n '/^# HARDWARE/,/^# /{ /^# /d; p; }'"54mandocOut, err, s = Open3::capture3(cmd)55if s.success?56#replace \_ to _ and \[ to [ in drivers name and description57mandocOut.gsub!(/\\_/, '_')58mandocOut.gsub!(/\\\[/, '[')5960# extract Nm (real driver name)61nm_cmd = "grep -m1 '^\\.Nm' tmp/share/man/man4/#{manualPage}.4"62nmOut, err2, s2 = Open3.capture3(nm_cmd)6364if s2.success?6566nm = nmOut.split[1]6768if nm && !nm.empty?69driverName = File.basename(manualPage)7071if nm != driverName72# f.e man ar40xx has driver name ar40xx_switch73man_link = "link:https://man.freebsd.org/cgi/man.cgi?query=#{driverName}&apropos=&&sektion=4&format=html[#{nm}]"74else75man_link = "man:#{driverName}[4]"76end77# replace only first occurrence, preserving markdown formatting78mandocOut.sub!(/[*_]*#{nm}[*_]*/) do79man_link80end81end82end8384if mandocOut.strip.empty?85puts "WARNING: No HARDWARE section content for manual page #{manualPage}"86next87end8889hardwareNotesContent << mandocOut90else91puts "WARNING: The manual page " + manualPage + " without HARDWARE exists or malformed"92end93else94puts "WARNING: The manual page " + manualPage + " does not exists"95end96else97hardwareNotesContent << line98end99end100101File.open(hardwareNotesPath, 'w') do |out|102out << hardwareNotesContent103end104105106