文件夹对比-生成同级差异patch

最近一段时间研究kodi,需要做一些定制修改,由于kodi对g++ 版本的要求,只能在本地编译集成,没整成git去管理,所以打算以kodi官方release版code为基准 ,任何改动的文件作为patch,只把patch git管理起来,方便同步整合到其它版本

打算以文件夹形式保存改动过的文件,也方便之后的Beyondcompare对比,找了一下没有什么好工具可以直接对比抽出patch,只有自己动手了,记录脚本如下:

#author :jscese
# $1 - source code
# $2 - modify code
# $1 and $2 Have the same target directory  -example: ./diff_patch.sh  xxx/xxx/kodi_***/addons  xxx/kodi_***/addons
# the script create patch_directory<$patch_name> in current derectory
#!/bin/bash
basedir="./"
patch_name="kodi_modif_patch"
dir1=$1
dir2=$2
dir3="$(echo $dir1 | sed "s/^[^\/]*/${patch_name}/")"
diff_out="diff_between_patch.log"
echo "$dir1  $patch_name  $dir3"
tempf="$(mktemp -p $basedir)"
find $PWD/$dir1 -type f >$tempf
if [ -f "${diff_out}" ];then
        mv "${diff_out}" "${diff_out}-$(date +%H%M%S)"
fi
if [ -d "${patch_name}" ];then
        echo "already exit patch"
        rm -rf ${patch_name}

fi

if [ -z "$tempf" ];then
        exit 1
fi
echo "begain check"
for myfile in $(cat $tempf)
do
        myfile2="$(echo $myfile | sed "s:$dir1:$dir2:")"
        if [ -f "$myfile2" ];then
             cmp -s $myfile $myfile2
             return_value=$?
             if [ "$return_value" == 1 ];then
              #diff -u $myfile $myfile2 | tee -a "$diff_out"
              myfile3="$(echo $myfile | sed "s:$dir1:$dir3:")"
              targdir=$(dirname $myfile3)
              mkdir -p $targdir
              cp -fp $myfile2 $myfile3
             fi
        else
                echo "$myfile2 not exist!"
        fi
done    
rm -f $tempf

脚本运行需要传入基准源目录 和 修改过的工程目录, 同级目录,对比生成的patch 才有意义

以find 首先遍历基准源目录 ,取出所有文件路径保存起来,如果觉得这个操作费时 ,第一次后可以不rm,以后每次check ,如果存在直接读取用

sed 命令替换我们想要的路径,第一个sed 通过替换制作我们最终patch文件需要的路径,第二个sed 根据源目录去得到修改工程对应的文件,找不到的就不作为patch,有差异的就认定位patch,因变量为路径会有”/” ,不好用转义 \ ,所以用的 : 分割,也可用#

通过 cmp 比对目录下所有文件,返回值 1 为不同, 0 为相同,如果目录下文件太多 ,可依次分层对比

cp 文件作为保存改动的文件, 如果需要同步

cp -rfp kodi_modif_patch/*  source_code/

一样 也需要同级目录。

你可能感兴趣的:(【Embedded】)