星期一, 12月 07, 2009

work around with vimdiff + cvs diff

We'd like to make cvs's diff output colorful.

If you're vim people, you could do it in 2 ways.



  • Redirect cvs diff to vim by "| vim -".

    Then change highlight settings in .vimrc as follows:




    • hi diffAdded ctermfg=Yellow ctermbg=DarkGray guifg=Yellow


    • hi diffRemoved ctermfg=Red ctermbg=DarkGray guifg=Red




  • Or, you could use vimdiff by running the script(cvsvimdiff.sh) in the end.

    This script let you enjoy vimdiff's block diff with cvs.

    Usage: "cvsvimdiff -r version1 -r version2 filename"

    Besides, you should change color scheme to make a comfortable displays of vimdiff.




    • hi DiffAdd term=reverse cterm=bold ctermbg=green ctermfg=white


    • hi DiffChange term=reverse cterm=bold ctermbg=cyan ctermfg=black


    • hi DiffText term=reverse cterm=bold ctermbg=gray ctermfg=black


    • hi DiffDelete term=reverse cterm=bold ctermbg=red ctermfg=black





The following is cvsvimdiff.sh. You can create it and put it in your PATH.



#!/bin/bash

#

# Copyright (C) 2005-2006,

# Stefano Zacchiroli

# Enrico Tassi

#

# This is free software, you can redistribute it and/or modify it under the

# terms of the GNU General Public License version 2 as published by the Free

# Software Foundation.

#



vimdiff="vimdiff"

suffix="vimcvsdiff"

rev1="HEAD"



if [ "$1" == "-g" ] ; then

vimdiff="gvimdiff -f"

shift 1

fi

if [ "$1" == "-r" ]; then

rev1="$2"

shift 2

fi

if [ "$1" == "-r" ]; then

rev2="$2"

shift 2

fi



files="$1"

if [ -z "$files" ]; then

files=$(cvs -n update -r HEAD 2> /dev/null | grep -e "^[MU]" | cut -c 3-)

fi

for f in $files; do

if ! [ -f $f ]; then break; fi

patch=`mktemp $prefix.XXXXXX`

orig=`mktemp $prefix.XXXXXX`

trap "rm -f $patch $orig" EXIT



if ! [ -z "$rev2" ]; then

tmp1=$f.$rev1

tmp2=$f.$rev2

cvs up -p -r $rev1 $f > $tmp1

cvs up -p -r $rev2 $f > $tmp2

$vimdiff $tmp1 $tmp2

rm -f $tmp1 $tmp2

else

cp "$f" $orig

cut -d '/' -f 2 < CVS/Entries | grep "^$f\$" > /dev/null || break

cvs diff -r $rev1 -u "$f" > $patch

if ! [ $? -eq 1 ]; then break; fi

cp "$f" $orig

patch -R -p0 $orig $patch

$vimdiff $orig $f

fi

done