Skip to content

Instantly share code, notes, and snippets.

@spaetz
Created October 12, 2010 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spaetz/622221 to your computer and use it in GitHub Desktop.
Save spaetz/622221 to your computer and use it in GitHub Desktop.
add-modelines
#!/bin/bash
# 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
{
echo "$FirstLine" > "$FileToEdit".new
cat "$FileToEdit" >> "$FileToEdit".new
if [ "x${currentLastLine}" != "x" ] ; then
echo "" >> "$FileToEdit".new
fi
echo "$LastLine" >> "$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:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment