最近一段时间研究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/
一样 也需要同级目录。