# Nick's web site: Generate a project page from a submodule README.md # # Copyright © 2021 Nick Bowler # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . def project_readme(item = @item) tag = item.fetch(:release, "HEAD") shortname = item.fetch(:shortname, item[:module]) data, status = Open3.capture2("git", "submodule", "foreach", "--quiet", "case $sm_path in */" + item[:module] + ")" + "git fetch --quiet --tags;" + "git log --max-count=1 --format=%cI #{tag}; printf '\\35';" + "git show #{tag}:NEWS 2>/dev/null; printf '\\35';" + "git remote get-url origin; printf '\\35';" + "git show #{tag}:README.md ;;" + "esac") raise "git submodule foreach failed" if status != 0 date, news, gituri, contents = data.split("\35", 4) intro, contents = contents.split("#", 2) contents = if contents.nil? then "" else "\n#" + contents end gituri.strip! gitweb = gituri.sub(%r{^[^/]*(.*)(/.*)}, '\1/gitweb\2') date = Date.iso8601(date).to_time obtaining = <<~EOF # Obtaining #{item[:title]} EOF if item[:release].nil? obtaining += "\n" + <<~EOF There are presently no released versions of #{shortname}. EOF else newsver, news = news.split("\n", 2) newsver.sub!(/^.*?([[:digit:]][^:]*).*$/, '\1') targz = "#{shortname}-#{newsver}.tar.gz" distbase = "/archive/#{shortname}" obtaining += <<~EOF [archive]: #{distbase} All released files are available from the [#{shortname} archive directory][archive]. EOF end obtaining += <<~EOF The latest development sources [may be browsed online](#{gitweb}) or cloned directly using git, e.g., git clone #{gituri} EOF unless item[:release].nil? obtaining += "\n" + <<~EOF [targz]: #{distbase}/#{targz} [targzsig]: #{distbase}/#{targz}.sig The most recent release is version #{newsver}, released on #{date.getutc.strftime("%Y-%m-%d")}. Source code for this version is available in [#{targz}][targz] ([signature][targzsig]). Noteworthy changes in this release: EOF obtaining += "\n" news.each_line do |line| break if line =~ /^[^[:space:]]/ obtaining += line.lstrip end obtaining += "\n\n" + <<~EOF [gpg]: https://gnupg.org/ Use the signature file to verify that the corresponding source bundle is intact. After downloading both files, if [GnuPG][gpg] is installed, the signature can be verified with a command like: gpg --verify #{targz}.sig If the verification fails because you don't have the required public key, that key can be imported with a command such as: gpg --keyserver keys.gnupg.net --recv-keys 5B45D3D185B8E1F6 Then run the verify command again. EOF end return "#{intro}\n\n#{obtaining}\n\n#{contents}" end