On Wed, Aug 14, 2013 at 5:15 AM, Vadim Zhukov <persg...@gmail.com> wrote:

> Index: bin/portimport
> ===================================================================
> RCS file: /cvs/ports/infrastructure/bin/portimport,v
> retrieving revision 1.2
> diff -u -p -r1.2 portimport
> --- bin/portimport      11 Apr 2013 15:18:00 -0000      1.2
> +++ bin/portimport      14 Aug 2013 09:30:11 -0000
> @@ -2,6 +2,7 @@
>  #
>  # $OpenBSD: portimport,v 1.2 2013/04/11 15:18:00 zhuk Exp $
>  # Copyright (c) 2013 Robert Peichaer
> +# Copyright (c) 2013 Vadim Zhukov
>  #
>  # Permission to use, copy, modify, and distribute this software for any
>  # purpose with or without fee is hereby granted, provided that the above
> @@ -18,52 +19,447 @@
>  # Based on Marc Espie's portimport.
>  # sthen: Modified to handle imports from mystuff/ and do a dry run first.
>  # rpe:   rewrite based on sthen@'s version
> +# zhuk:  rewrite based on rpe@'s version
>
>  set -e
>
>  usage() {
> -       echo "usage: $(basename $0) [-u username]" >&2
> +       echo "usage: ${0##*/} [-f] [-p portsdir] [-u username]" >&2
>         exit 1
>  }
>
> +
> +############################################################
> +# Parsing command line options
> +#
> +
>  user=$(id -un)
> +force=false
> +portsdir=
>
> -while getopts "u:" OPT; do
> +while getopts "fp:u:" OPT; do
>         case $OPT in
> -       u)      user="$OPTARG";;
> -       *)      usage;;
> +       f)
> +               force=true
> +               ;;
> +

> +       p)
> +               set -f
> +               if [ "${PWD##$OPTARG}" == "${PWD}" ]; then
> +                       cat >&2 <<EOE
> +${0##*/}: current directory does not seem to be under the
> +specified root directory: $OPTARG
> +EOE
> +                       exit 3
> +               fi
> +               set +f

there's no need to toggle ``noglob''

use ${PWD##"$OPTARG"} to suppress the globbing in the RHS of ``##''

> +               portsdir="$OPTARG"
> +               ;;
> +
> +       u)
> +               user="$OPTARG"
> +               ;;
> +
> +       *)
> +               usage
> +               ;;
>         esac
>  done
>
> -cvsroot=$u...@cvs.openbsd.org:/cvs
> +
> +############################################################
> +# Detect path to root of directory tree of current port(-s) and put it
> +# in $portsdir, unless it was set by user above. As a last resort, we
> +# use some heuristics based on the commonly used names.
> +#
> +# We also have a $pkgpath variable, that represents subdirectory under
> +# root ports directory where the port(-s) will be imported. In case we
> +# use heuristics for determining $portsdir, we'll set up $pkgpath, too,
> +# since we would get this info anyway.
> +#
> +# In make_args we write PORTSDIR_PATH override, that allows us to run
> +# even in ports directory that is not on the PORTSDIR_PATH. This is
> +# useful, for example, when you polish your port on cvs.openbsd.org,
> +# where you cannot just override mk.conf.
> +#
> +
> +pkgpath=
> +make_args=MASTER_SITE_OPENBSD=
> +

> +if [[ -z $portsdir ]]; then
> +       set +e
> +       portsdir=$(make -V PORTSDIR 2>/dev/null)
> +       (($? == 0)) && portsdir=
> +       set -e
> +fi

there's no need to toggle ``errexit''

use portsdir=$(make -V PORTSDIR 2>/dev/null) && portsdir=

if the LHS of ``&&'' fails, the shell won't exit even if ``errexit''
is under effect

> +
> +if [[ -z $portsdir ]]; then
> +       # heuristics mode ON
> +       pkgpath="${PWD##*/ports/*(mystuff/|openbsd-wip/|p5-ports-wip/)}"

> +       set -f
> +       portsdir="${PWD%/$pkgpath}"
> +       set +f

same as previous unnecessary ``noglob'' toggling

> +
> +       # This way we can run all checks even on cvs.openbsd.org
> +       make_args="PORTSDIR_PATH=$portsdir:$(cd /usr/ports && make -V 
> PORTSDIR_PATH || true)"
> +fi
> +
> +if [[ -z $portsdir ]]; then
> +       cat >&2 <<EOE
> +${0##*/}: could not detect root ports directory. Please provide
> +one with -p option.
> +EOE
> +       exit 2
> +fi
> +
> +############################################################
> +# Check and fail routines
> +#
> +
>  error=false
> -fulldir=$(pwd)
> -importname="ports/${fulldir##*/ports/*(mystuff/|openbsd-wip/|p5-ports-wip/)}"
> -timestamp=$(date '+%Y%m%d')
>
> -err() { echo "$*"; error=true; }
> +err() {
> +       echo "$@" >&2
> +       error=true
> +}
> +
> +err_duplicated() {
> +       err "$2 has \"$1\", as well as one of the parent directories"
> +}
> +
> +err_core_found() {
> +       err "file or directory name \"core\" found in $1, CVS will ignore it"
> +}
> +
> +err_coredump_found() {
> +       err "core dump file found in $1"
> +}
> +
> +is_vcs_item() {
> +       [[ $1 == @(.git|.hg|.svn|CVS|.fossil) ]]
> +}
> +
> +handle_extra_file() {
> +       # avoid warning, e.g., about ".*"
> +       test -e "$1" || return 0
> +
> +       if is_vcs_item "${1##*/}"; then
> +               err "VCS item detected: $1"
> +       elif [[ ${1##*/} == core ]]; then
> +               err_core_found "${1%/*}"
> +       elif [[ $1 == *.core ]]; then
> +               err_coredump_found "${1%/*}"
> +       else
> +               err "extra file: $1"
> +       fi
> +}
> +
> +check_port_hier() {
> +       local pkg_lives_upper=$1; shift
> +       local distinfo_lives_upper=$1; shift
> +
> +       local pkg_exists=false
> +       [[ -d $1/pkg ]] && pkg_exists=true
> +       $pkg_exists && $pkg_lives_upper &&
> +               err_duplicated pkg/ "$1"
> +       $pkg_lives_upper && pkg_exists=true
> +
> +       local distinfo_exists=false
> +       [[ -f $1/distinfo ]] && distinfo_exists=true
> +       $distinfo_exists && $distinfo_lives_upper &&
> +               err_duplicated distinfo "$1"
> +       $distinfo_lives_upper && distinfo_exists=true
> +
> +       local F
> +       local npkgpath
> +
> +       for F in "$1"/* "$1"/.*; do
> +               F="${F#./}"
> +               if is_vcs_item "${F##*/}"; then
> +                       err "VCS item detected: $F"
> +               elif [[ -d $F ]]; then
> +                       case "${F##*/}" in
> +                       files)
> +                               check_files_dir "$F"
> +                               ;;
> +
> +                       patches)
> +                               check_patches_dir "$F"
> +                               ;;
> +
> +                       pkg)
> +                               check_pkg_dir "$F"
> +                               ;;
> +
> +                       *)
> +                               [[ ${F##*/} == core ]] && err_core_found "$F"
> +                               npkgpath=${npkgpath:-$(cd -- "$F" && make 
> $make_args show=PKGPATH 2>/dev/null || true)}
> +                               check_port_dir $pkg_exists $distinfo_exists 
> "$F"
> +                               ;;
> +                       esac
> +               else
> +                       case "${F##*/}" in
> +                       Makefile?(.inc)|*.port.mk)
> +                               check_makefile "$F"
> +                               ;;
> +
> +                       distinfo)
> +                               ;;
> +
> +                       *)
> +                               handle_extra_file "$F"
> +                               ;;
> +                       esac
> +               fi
> +       done
> +       pkgpath=${pkgpath:-${npkgpath%/*}}
> +       egrep -q '^[[:space:]]*SUBDIR[[:space:]]*=' Makefile ||
> +               err missing subdir Makefile
> +}
> +
> +check_port_dir() {
> +       local pkg_lives_upper=$1; shift
> +       local distinfo_lives_upper=$1; shift
> +
> +       if [[ -f $1/Makefile.inc ]]; then
> +               check_port_hier $pkg_lives_upper $distinfo_lives_upper 
> "${1#./}"
> +               return
> +       fi
> +
> +       local F
> +       local distinfo_exists=false
> +       local mk_exists=false
> +       local pkg_exists=false
> +
> +       for F in "$1"/* "$1"/.*; do F="${F#./}"; case "${F##*/}" in
> +       Makefile)
> +               test -f "$F" || err "$F is not a file"
> +               check_makefile "$F"
> +               mk_exists=true
> +               ;;
> +
> +       distinfo)
> +               $distinfo_lives_upper && err_duplicated distinfo "$1"
> +               distinfo_exists=true
> +               test -f "$F" || err "$F is not a file"
> +               ;;
> +
> +       *.port.mk)
> +               test -f "$F" || err "$F is not a file"
> +               check_makefile "$F"
> +               ;;
>
> -[[ -f Makefile && -f distinfo && -f pkg/DESCR  && -f pkg/PLIST ]] || err "No 
> ports files?"
> -find . -name .git          -print|read i && err "You git!"
> -find . -name .\*.swp       -print|read i && err "Found vim swap file"
> -find . -name \*.orig       -print|read i && err "Found .orig file, ouch"
> -find . -name typescript    -print|read i && err "Found typescript file, ouch"
> -find . -path ./w-\*        -print|read i && err "Please wipe out work 
> directory before importing"
> -find . -type d -name core  -print|read i && err "directory named core found, 
> cvs will ignore it"
> -find . -type f -name .todo -print|read i && err "devtodo file found"
> -find . -type d -name CVS   -print|read i && err "Some CVS stuff already in 
> there, very funky"
> -$error && exit 1
> +       systrace.filter)
> +               test -f "$F" || err "$F is not a file"
> +               ;;
> +
> +       files)
> +               if [[ -d $F ]]; then
> +                       check_files_dir "$F"
> +               else
> +                       err "$F" is not a directory
> +               fi
> +               ;;
> +
> +       patches)
> +               if [[ -d $F ]]; then
> +                       check_patches_dir "$F"
> +               else
> +                       err "$F" is not a directory
> +               fi
> +               ;;
> +
> +       pkg)
> +               $pkg_lives_upper && err_duplicated pkg/ "$1"
> +               pkg_exists=true
> +               if [[ -d $F ]]; then
> +                       check_pkg_dir "$F"
> +               else
> +                       err "$F" is not a directory
> +               fi
> +               ;;
> +
> +       *)
> +               handle_extra_file "$F"
> +               ;;
> +       esac; done
> +
> +       $mk_exists || err no Makefile in "$1"
> +
> +       $pkg_lives_upper && pkg_exists=true
> +       $pkg_exists || err "no pkg/ in $1"
> +
> +       $distinfo_lives_upper && distinfo_exists=true
> +       $distinfo_exists || err "no distinfo in $1"
> +
> +       local show_items="SHARED_LIBS DISTFILES DIST_SUBDIR"
> +       local shlibs distfiles dist_subdir master_sites
> +
> +        # Do not try to use co-processes, there is some bug related
> +        # to redirection of error stream seen on big number of
> +        # nested ports (100 or so). and we need to redirect &2 to
> +        # avoid noising about accessing dead co-processes.
> +
> +       (cd "$1"; make $make_args show="$show_items" || true) | {
> +               read shlibs
> +               read distfiles
> +               read dist_subdir
> +
> +               check_shlibs "$1" $shlibs
> +               check_distfiles "$1" "$dist_subdir" $distfiles
> +       }
> +}
> +
> +check_shlibs() {
> +       local dir="$1"; shift
> +       local lib
> +       local libver
> +
> +       local portref=
> +       [[ $dir != . ]] && portref="in \"${dir#./}\" port "
> +       while (($# > 1)); do
> +               lib=$1
> +               libver=$2
> +               if [[ $libver != 0.0 ]]; then
> +                       err "${portref}library $lib has version $libver" \
> +                           "instead of 0.0"
> +               fi
> +               shift 2
> +       done
> +}
> +
> +check_distfiles() {
> +       local dir="$1"; shift
> +       local dist_subdir="$1"; shift
> +
> +       # do not care about absent distfiles, this is fine for meta ports
> +       while (($# > 1)); do
> +               if [[ $1 == [0-9]* && -z $dist_subdir && $1 != *\{*\} ]]; then
> +                       err "badly named distfile $1 without DIST_SUBDIR" \
> +                           "or {url} postfix"
> +               fi
> +               shift
> +       done
> +}
> +
> +check_files_dir() {
> +       if (($(ls -A "$1" | wc -l) == 0)); then
> +               err "there are no files, please remove the $1 directory 
> instead"
> +               return
> +       fi
> +
> +       find "$1" -type f -name *.core -print | read i &&
> +               err_coredump_found "$1"
> +}
> +
> +check_patches_dir() {
> +       local empty=true
> +       local F
> +
> +       for F in "$1"/* "$1"/.*; do case "${F##*/}" in
> +       patch-*.orig)
> +               handle_extra_file "$F"
> +               ;;
> +
> +       patch-*)
> +               empty=false
> +               test -f "$F" || err "$F is not a file"
> +               ;;
> +
> +       *)
> +               handle_extra_file "$F"
> +               ;;
> +       esac; done
> +
> +       $empty && err "there are no patches, please remove the $1 directory 
> instead"
> +}
> +
> +check_pkg_dir() {
> +       local empty=true
> +       local F
> +
> +       for F in "$1"/* "$1"/.*; do case "${F##*/}" in
> +       DESCR?(-*)|PLIST?(-*))
> +               empty=false
> +               test -f "$F" || err "$F" is not a file
> +               ;;
> +
> +       MESSAGE?(-*)|PFRAG.*|README?(-*)|SECURITY?(-*)|UNMESSAGE?(-*)|*.rc)
> +               empty=false
> +               test -f "$F" || err "$F" is not a file
> +               ;;
> +
> +       *)
> +               handle_extra_file "$F"
> +               ;;
> +       esac; done
> +
> +       $empty && err "$1 directory does not contain any DESCR or PLIST files"
> +}
> +
> +check_makefile() {
> +       grep -q ^REVISION "$1" 2>/dev/null &&
> +               err "REVISION(-s) found in $1"
> +}
> +
> +
> +############################################################
> +# Run checks and calculate pkgpath variable, that represents
> +# subdirectory under root ports directory where the port(-s)
> +# will be imported.
> +#
> +
> +pkgpath=${pkgpath:-$(make $make_args show=PKGPATH 2>/dev/null || true)}
> +check_port_dir false false .
> +
> +if [[ -z $pkgpath ]]; then
> +       if [[ -n $portsdir ]]; then

> +               set -f
> +               pkgpath="${PWD##$portsdir/}"
> +               set +f

same as previous unnecessary ``noglob'' toggling

Reply via email to