| #!/bin/sh |
| #****************************************************************************** |
| # Copyright (c) 2006, 2007 Wind River Systems, Inc. |
| # All rights reserved. This program and the accompanying materials |
| # are made available under the terms of the Eclipse Public License v1.0 |
| # which accompanies this distribution, and is available at |
| # http://www.eclipse.org/legal/epl-v10.html |
| # |
| # Contributors: |
| # Martin Oberhuber - initial API and implementation |
| #****************************************************************************** |
| #:# |
| #:# lc - Count lines of code, data and documentation of all files below a |
| #:# list of directories. Do not count empty lines or binary files. |
| #:# |
| #:# Usage: |
| #:# lc [-efh] {directory,...} |
| #:# Options: |
| #:# -e .. include empty lines in count (like wc -l) |
| #:# -f .. show file list on stderr (for debugging) |
| #:# -h .. show help |
| #:# Examples: |
| #:# lc -f com.foobar.plugin |
| #:# lc -e org.eclipse.core.* |
| #:# |
| curdir=`pwd` |
| case x$1 in |
| x-e*) INCLUDE_EMPTY=1; shift ;; |
| x-f*) SHOW_FILES=1; shift ;; |
| x-*) HELP=1 ;; |
| esac |
| if [ "$HELP" = "1" ]; then |
| grep '^#:#' $0 | grep -v grep | sed -e 's,^#:#,,' |
| exit 0 |
| fi |
| |
| if [ ! -d "$1" ]; then |
| echo "Error: Argument is not a directory: $1" |
| echo "Type `basename $0` -help for help" |
| exit 1 |
| fi |
| |
| FILE_LIST=/tmp/.lc.files.$$ |
| LINES_FILE=/tmp/.lc.lines.$$ |
| while [ -f ${FILE_LIST} ]; do |
| FILE_LIST="${FILE_LIST}_" |
| done |
| while [ -f {LINES_FILE} ]; do |
| LINES_FILE="${LINES_FILE}_" |
| done |
| trap "rm -f ${FILE_LIST} ${LINES_FILE}" EXIT |
| #trap "rm -f ${FILE_LIST} ${LINES_FILE}; cd \"${curdir}\"" EXIT |
| |
| TOTAL=0 |
| while [ "$1" != "" ]; do |
| # Cat all non-binary files, suppress empty and lines only containing /*#{} |
| if [ ! -d "$1" ]; then |
| echo "$1: Not a directory" |
| shift |
| continue |
| else |
| echo "$1:" |
| fi |
| cd "$1" |
| find . -type f | egrep -v '/(CVS|.metadata)/' \ |
| | egrep -iv '\.(a|class|dll|exe|bmp|gif|png|jpg|so|o|obj|jar|tar|gz|zip)$' \ |
| > ${FILE_LIST} |
| if [ "$SHOW_FILES" = "1" ]; then |
| #cat ${FILE_LIST} > /dev/stderr |
| cat ${FILE_LIST} 1>&2- |
| fi |
| |
| ################################ |
| # Here's our contribution line counting algorithm: |
| # 1. Cat all files from the contribution, delimited by newlines (xargs -d \\n cat) |
| # 2. Suppress empty lines and lines only containing /*#{} |
| # |
| # Known limitations: |
| # a. Fails for filenames with newlines embedded (a pretty academic limitation) |
| |
| if [ x${INCLUDE_EMPTY} = x1 ]; then |
| cat ${FILE_LIST} | xargs -d \\n cat | wc -l > ${LINES_FILE} |
| else |
| cat ${FILE_LIST} | xargs -d \\n cat \ |
| | egrep -v '^[^a-zA-Z0-9_!?"|@~`$%&()+;,.:<>=+-]*$' | wc -l > ${LINES_FILE} |
| fi |
| |
| LINES=`cat ${LINES_FILE}` |
| rm ${FILE_LIST} ${LINES_FILE} |
| echo ${LINES} |
| TOTAL=`expr ${TOTAL} + ${LINES}` |
| cd "$curdir" |
| shift |
| done |
| echo "Total: ${TOTAL}" |
| exit 0 |