| #!/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 |