File update-sources.sh of Package dash-core

#!/bin/bash

set -e

update_specfile () {
  local specfile
  for specfile in "$@"; do
    (
      local tmpdir=$(mktemp -d)
      local srcurl=$(spectool -s 0 -lf "$specfile" | sed 's/^Source[0-9]*: *//')
      local srcfile="${srcurl##*/}"
      local srcdir="${srcfile%.tar*}"
      curl -s -L -o "${tmpdir}/${srcfile}" "${srcurl}"
      tar xCf "$tmpdir" "${tmpdir}/${srcfile}"
      git -C "${tmpdir}/${srcdir}" init -q
      git -C "${tmpdir}/${srcdir}" config user.name rpm-build
      git -C "${tmpdir}/${srcdir}" config user.email '<rpm-build>'
      git -C "${tmpdir}/${srcdir}" add .
      git -C "${tmpdir}/${srcdir}" commit -q -a --author 'rpm-build <rpm-build>' -m 'dash-core base'
      spectool -P -lf "$specfile" |
      sed -e '/^Source[0-9]*:/d' -e 's/^Patch[0-9]*: *//' |
      while read patch; do
        cat "$patch" | git -C "${tmpdir}/${srcdir}" am -q
      done
      local packages=$(make -s -C "${tmpdir}/${srcdir}/depends" -f <(cat <<'EOF'
include Makefile
duplicated_packages = protobuf
list_packages:; @echo $(filter-out $(duplicated_packages),$(all_packages))
EOF
      ) list_packages)
      sed -n -e '1,/^# Autogenerated section begin\. Do not edit\.$/p' "$specfile"
      n=200
      for package in $packages; do
        make -s -C "${tmpdir}/${srcdir}/depends" -f <(cat <<EOF
package=${package}
fetch_file=echo "\$(2)/\$(3)\$(shell test '\$(3)' != '\$(4)' && echo '#/\$(4)')"
include packages/${package}.mk
${package}_download_file?=\$(${package}_file_name)
${package}_download_path_fixed=\$(subst :,\:,\$(${package}_download_path))
${package}_fetch_cmds?=\$(call fetch_file,${package},\$(subst \:,:,\$(${package}_download_path_fixed)),\$(${package}_download_file),\$(${package}_file_name),\$(${package}_sha256_hash))
show_url:; @\$(call ${package}_fetch_cmds)
EOF
        ) show_url
      done |
      while read url; do
	echo "Source$n:      $url"
        n=$((n + 1))
      done
      sed -n -e '/^# Autogenerated section end\.$/,$p' "$specfile"
      rm -rf "$tmpdir"
    ) > "$specfile.tmp" && mv "$specfile.tmp" "$specfile"
  done
}

if [ $# -gt 0 ]; then
  update_specfile "$@"
else
  update_specfile *.spec
fi