Author: jtr
Update of /cvs/docs/docs-common/bin In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv28079/bin
Added Files: copy-figs Log Message: Allow a document 'figs/' directory to contain its own subdirectory structure. Copy the directory tree, but only populate it with files which pass the '-f glob' filter(s). If no filters are given, "*" is used as a default.
--- NEW FILE copy-figs --- #!/bin/bash ######################################################################## # Copy a file system hierarchy to a destination tree, copying only # files that are either: language neutral, or specific to a particular # language. ######################################################################## # We assume the following naming convention, because that is what the # docs currently seem to use. # # <filename>-<locale>.<ext> is a language-specific file, such as # "foo-en.png". # # <filename>.<ext> is a language-neutral file, such as "foo.png". # # What makes this complicated is that some files already have embedded # dashes that have nothing to do with locales, thus we have an ambiguous # filename grammar. ########################################################################
targetLang=en bnFilter= DEBUG=no VERBOSE=no
die() { printf "${ME}: %s\n" "$@" >&2 exit 1 }
glob2sed() { s="" i=1 while true do c=$(echo "${1}" | cut -c$i) if [ -z "${c}" ]; then break fi case "${c}" in '.' ) s="${s}[.]" ;; '*' ) s="${s}.*" ;; '?' ) s="${s}." ;; * ) s="${s}${c}" ;; esac i=$(expr $i + 1) done echo "${s}" }
ME=$(/bin/basename $0) USAGE="usage: ${ME} [-D] [-f glob] [-l lang] [-V] /path/to/source/dir /path/to/dest/dir"
while getopts Df:l:v c do case "${c}" in D) DEBUG='';; f) sedFilter=$(glob2sed "${OPTARG}") bnFilter="${bnFilter} -e /^${sedFilter}$/p" ;; l) targetLang="${OPTARG}";; v) VERBOSE='';; *) echo "${USAGE}" >&2; exit 1;; esac done
shift $(expr ${OPTIND} - 1)
if [ $# -ne 2 ]; then echo "${USAGE}" >&2 exit 1 fi
SRC="$1" DST="$2"
shift 2
case "${SRC}" in /* ) ;; ~/* ) SRC=${HOME}/$(echo "${SRC}" | cut -c2,-) ;; * ) SRC="$(/bin/pwd)/${SRC}" ;; esac
case "${DST}" in /* ) ;; ~/* ) DST=${HOME}/$(echo "${DST}" | cut -c2,-) ;; * ) DST="$(/bin/pwd)/${DST}" ;; esac
if [ -z "${bnFilter}" ]; then bnFilter="-e /^.*$/p" fi [ "${DEBUG}" ] || echo >&2 "bnFilter=|${bnFilter}|"
leadin=$(/usr/bin/dirname "${SRC}") [ "${DEBUG}" ] || echo >&2 "leadin=|${leadin}|"
find "${SRC}" -print | while read fn do # Skip anything that even looks like CVS or SVN case "${fn}" in *CVS* | *svn* ) continue ;; esac # Figure out the relative path for this pathname chunk rp=$( echo $(/usr/bin/dirname "${fn}")/$(/bin/basename "${fn}") | /bin/sed "s;^${leadin}/*;;" ) [ "${DEBUG}" ] || echo >&2 "rp=|${rp}|" # Copy directories, even if they are going to be empty. # Inodes are cheap, as long as you have enough. if [ -d "${fn}" ]; then [ "${VERBOSE}" ] || echo >&2 "Creating ${rp}" /bin/mkdir -p "${DST}"/"${rp}" continue fi # May not want this file under any circumstances bn=$(/bin/basename "${rp}") filteredBn=$(echo "${bn}" | sed -n ${bnFilter}) if [ -z "${filteredBn}" ]; then [ "${DEBUG}" ] || echo >&2 "Filter rejects |${fn}|" continue fi # We want this file if the language matches or if it is # language neutral copyIt=no case "${bn}" in *-${LANG}.* ) # Has matching language copyIt=yes ;; *-* ) # Doesn't match target language ;; * ) # Assume language neutral file copyIt=yes ;; esac [ "${DEBUG}" ] || echo >&2 "copyIt=${copyIt}" # Copy file if we like it if [ "${copyIt}" = "yes" ]; then [ "${VERBOSE}" ] || echo >&2 "Copying file |$fn|" cp "${fn}" "${DST}/${rp}" else [ "${VERBOSE}" ] || echo >&2 "Rejecting file |$fn|" fi done
docs-commits@lists.fedoraproject.org