summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Adelman <someone@boldandbusted.com>2010-10-13 09:49:20 +0200
committerJan Holesovsky <kendy@suse.cz>2010-10-13 09:55:23 +0200
commit6986d4121be457fcfcac0d01bbbc234057499012 (patch)
tree4384226af69ec18a66cf05dc202e417d5ded12c9
parent736284b1a26411b9db7fb388a0f161eb9148e087 (diff)
Script to add Emacs & Vim modelines to source files.
-rw-r--r--bin/add-modelines169
1 files changed, 169 insertions, 0 deletions
diff --git a/bin/add-modelines b/bin/add-modelines
new file mode 100644
index 000000000..bd8673d56
--- /dev/null
+++ b/bin/add-modelines
@@ -0,0 +1,169 @@
+#!/bin/sh
+
+# add-modelines, a simple script to add comments to
+# the beginning and end of source files for LibreOffice devs
+
+# Blame goes to Jesse Adelman (at least at first)
+# someone AT boldandbusted dotty-dot com
+# http://www.boldandbusted.com/
+# (c) 2010 Bold and Busted LLC
+# Licensed under the MPL/LGPLv3 or later
+# First edit 2010-10-08
+# Updated on 2010-10-09
+# Version 0.7
+
+# NOTE: At present, this script only works for files with C-like comments.
+# NOTE: If you don't specify -p, the script will act on the current working directory.
+# NOTE: If no arguments are specified, the defitions below are in effect.
+
+# TO DO
+# - Deuglifiy?
+# - Make source file type agnostic modelines?
+# - Too many/too few comments?
+# - Handle top level source directories with whitespace names? (Do they exist?)
+
+# Turn off globbing, helps with SourceFiles
+set -f
+
+# POSIX
+set -o posix
+
+# Change these to taste
+FirstLine='/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */'
+LastLine='/* vim:set shiftwidth=4 softtabstop=4 expandtab: */'
+SourceFiles='*.cxx *.cpp'
+
+# Set defaults (don't change these)
+ModelineReplace="false"
+
+# Functions
+
+function SetEnvironment()
+{
+ if [ -n "$(which tail)" -a -n "$(which head)" ]; then
+ {
+ headCMD=`which head`
+ tailCMD=`which tail`
+ }
+ else
+ {
+ echo "Missing head or tail, exiting..."
+ exit 1
+ }
+ fi
+ if [ -n "$(which find)" ]; then
+ findCMD=`which find`
+ else
+ {
+ echo "Missing find, exiting..."
+ exit 1
+ }
+ fi
+ if [ -n "$(which awk)" ]; then
+ awkCMD=`which awk`
+ else
+ {
+ echo "Missing awk, exiting..."
+ exit 1
+ }
+ fi
+}
+
+function EditFile()
+{
+ local FileToEdit
+ local currentFirstLine
+ local currentLastLine
+
+ FileToEdit="$1"
+
+ currentFirstLine=`$headCMD -1 "$FileToEdit"`
+ currentLastLine=`$tailCMD -1 "$FileToEdit"`
+
+ case "$ModelineReplace" in
+ "true" )
+ if [ "${currentFirstLIne:0:6}" = "${FirstLine:0:6}" ]; then
+ {
+ echo "$FirstLine" > "$FileToEdit".new
+ $tailCMD -n +2 "$FileToEdit" >> "$FileToEdit".new
+ }
+ fi
+ if [ -e "$FileToEdit.new" ]; then
+ {
+ echo "$LastLine" >> "$FileToEdit".new
+ }
+ fi
+ if [ "${currentLastLine:0:6}" = "${LastLine:0:6}" ]; then
+ {
+ $headCMD -n -1 "$FileToEdit" > "$FileToEdit".new
+ echo "$LastLine" >> "$FileToEdit".new
+ }
+ fi
+ mv "$FileToEdit".new "$FileToEdit"
+ echo "$FileToEdit updated" ;;
+ "false" )
+ if [ "${currentFirstLine:0:6}" != "${FirstLine:0:6}" ]; then
+ if [ "${currentLastLine:0:6}" != "${LastLine:0:6}" ]; then
+ {
+ $awkCMD 'BEGIN{print "'"$FirstLine"'";print "\n"}{print $0}END{print "\n";print "'"$LastLine"'"}' "$FileToEdit" > "$FileToEdit".new
+ mv "$FileToEdit".new "$FileToEdit"
+ echo "$FileToEdit updated"
+ }
+ fi
+ fi ;;
+ esac
+}
+
+function PrintUsage()
+{
+ echo "Usage: $0 [-z] [-s \"<sourcefile glob>\"] [-p <path to source>]"
+}
+
+# Main
+
+SetEnvironment
+
+# Get command line options
+
+while getopts "zs:p:" opt; do
+ case $opt in
+ z) ModelineReplace="true" ;;
+ s) SourceFiles="$OPTARG" ;;
+ p) findPath="$OPTARG" ;;
+ *) PrintUsage
+ exit 1 ;;
+ esac
+done
+
+if [ $OPTIND -gt 1 ]; then
+ shift $(($OPTIND - 1))
+fi
+
+if [ $# -gt 1 ]; then
+{
+ PrintUsage
+ echo "Remember to quote the source file globs after -s"
+ exit 1
+}
+fi
+
+# Create GNU find expressions that traverse the filesystem once and only once
+if [ -z "$findPath" ]; then
+ findArgs='.'
+ else
+ findArgs="$findPath"
+fi
+
+for FileType in ${SourceFiles}; do
+ findArgs="$findArgs"' ( -iname '"$FileType"' -print ) , '
+done
+
+# This gets rid of the final " , " in the find argument list
+findArgs="${findArgs:0:(${#findArgs}-2)}"
+
+for file in $($findCMD $findArgs); do
+ EditFile "$file"
+ echo "Completed: " "$file"
+done
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab: