git: 원본 코드 의 버 전 번 호 를 자동 으로 업그레이드 하고, tag, push 스 크 립 트 를 제출 합 니 다.

22257 단어 script
최근 ubuntu 에서 내장 형 시스템 의 프로젝트 를 개발 하고 자바 플랫폼 에서 maven 자동 으로 버 전 번호 업 그 레이 드 를 관리 하 는 것 에 익숙 하지 않 습 니 다. 버 전 을 업그레이드 하려 면 코드 를 바 꾸 고 제출 해 야 합 니 다. 라벨 도 달 아야 합 니 다. 귀 찮 습 니 다.후속 프로젝트 버 전 관리의 중요성 을 고려 하여 저도 제 c 코드 에서 maven 에서 자바 프로그램 을 개발 하 는 것 처럼 프로젝트 의 버 전 번 호 를 자동 으로 업그레이드 할 수 있 기 를 바 랍 니 다.
그래서 스스로 스 크 립 트 를 써 서 프로젝트 버 전 번호 에 대한 자동 업 그 레이 드 를 완성 하고 제출 합 니 다.실현 원리 도 복잡 하지 않다. 주로 정규 표현 식 을 이용 하여 원본 코드 에서 고정 형식 MAJOR.MINOR.PATCH[.DESC][-SNAPSHOT] 의 버 전 정 보 를 읽 은 다음 에 자동 으로 버 전 번 호 를 1 로 추가 하고 sed 으로 원본 코드 를 쓰 고 git 창 고 를 제출 하 며 버 전 태그 (tag) 를 붙인다. 이 스 크 립 트 가 있 으 면 한 번 만 실행 하면 버 전 번 호 는 자동 으로 1 (버 전 번 호 를 수 동 으로 입력 할 수 있다).
다음은 버 전 정 보 를 포함 하 는 소스 코드 version.h 입 니 다. //! 시 작 된 줄 은 일부 매개 변 수 를 정의 합 니 다. 이 매개 변 수 는 스 크 립 트 가 소스 코드 에서 버 전 정 보 를 어떻게 얻 는 지 알려 주 는 정규 표현 식 입 니 다.
#ifndef FLCONFIG_VERSION_H_
#define FLCONFIG_VERSION_H_

//    verrel.sh        //!  
//! @TAG_PREFIX@
//! @VERSION_REG@ (FL_VERSION\s+)(\S*)(.*)
//! @VERSION_MAJOR_REG@ (FL_VERSION_MAJOR\s+)(\S*)?(.*)?
//! @VERSION_MINOR_REG@ (FL_VERSION_MINOR\s+)(\S*)?(.*)?
//! @VERSION_PATCH_REG@ (FL_VERSION_PATCH\s+)(\S*)?(.*)?
//! @VERSION_DESC_REG@ (FL_VERSION_DESC\s+)(\S*)?(\s*,.*)
//! @BEANCH_REG@ (FL_SCM_BRANCH\s+)(\S*)?(\s*,.*)
//! @COMMIT_REG@ (FL_SCM_COMMIT\s+)(\S*)?(\s*,.*)

//    
#define FL_VERSION 0.0.2-SNAPSHOT

#define FL_VERSION_MAJOR 0
#define FL_VERSION_MINOR 0
#define FL_VERSION_PATCH 2
#define FL_VERSION_DESC ,

//    
#define FL_SCM_BRANCH master,
// commit_id
#define FL_SCM_COMMIT 37ca318,

#endif /* FLCONFIG_VERSION_H_ */

스 크 립 트 구현 verrel.sh
#! /bin/bash 
##                 ,   git  ,      ,          
##   maven      ,   -SNAPSHOT            
##        MAJOR.MINOR.PATCH[.DESC][-SNAPSHOT],      RLV_FMT_REG        
##                 

#           
function get_var(){
    echo $(sed -nr "s/^\s*\/\/!\s*$1\s*(\S*).*$/\1/p" $2)    
}

#                             
function get_value_by_reg(){
    echo $(sed -nr "s/^.*$1.*/\2/p" $2)    
}

#            
function check_version_format(){
    if [[ -n "$1" && -z $(echo $1 | grep -E "$RLV_FMT_REG") ]] ;
    then
        echo "ERROR:invalid version string format(       ),example: 1.0.0 OR 1.0.0.beta"
        exit -1
    fi
}

sh_folder=$(dirname $(readlink -f $0))

#            ,           
version_src=$sh_folder/src/flconfig/version.h

# git   
branch=`git branch | grep "*"`
branch=${branch/* /}
#     id
commit_id=`git rev-parse --short HEAD`

echo branch=$branch
echo commit_id=$commit_id

#        
# release     
RLV_FMT_REG="([0-9]+)\.([0-9]+)\.([0-9]+)(\.([[:alnum:]]+))?"
#          (   -SNAPSHOT  )
SS_VFMT_REG=$RLV_FMT_REG"(-(SNAPSHOT))?"

TAG_PREFIX=$(get_var @TAG_PREFIX@  $version_src)
echo TAG_PREFIX=$TAG_PREFIX
VERSION_REG=$(get_var @VERSION_REG@  $version_src)
echo VERSION_REG=$VERSION_REG
VERSION_MAJOR_REG=$(get_var @VERSION_MAJOR_REG@  $version_src)
echo VERSION_MAJOR_REG=$VERSION_MAJOR_REG
VERSION_MINOR_REG=$(get_var @VERSION_MINOR_REG@  $version_src)
echo VERSION_MINOR_REG=$VERSION_MINOR_REG
VERSION_PATCH_REG=$(get_var @VERSION_PATCH_REG@  $version_src)
echo VERSION_PATCH_REG=$VERSION_PATCH_REG
VERSION_DESC_REG=$(get_var @VERSION_DESC_REG@  $version_src)
echo VERSION_DESC_REG=$VERSION_DESC_REG
BEANCH_REG=$(get_var @BEANCH_REG@  $version_src)
echo BEANCH_REG=$BEANCH_REG
COMMIT_REG=$(get_var @COMMIT_REG@  $version_src)
echo COMMIT_REG=$COMMIT_REG

#               
VERSION=$(get_value_by_reg $VERSION_REG $version_src)
echo VERSION=$VERSION

if [ -z "$VERSION" ] ;
then
    echo "ERROR:failt to read version format from $version_src(            )"
    exit -1
fi

#            
#     
MAJOR_VERSION=$(echo $VERSION | sed -nr "s/$SS_VFMT_REG/\1/p")
#     
MINOR_VERSION=$(echo $VERSION | sed -nr "s/$SS_VFMT_REG/\2/p")
#      
PATCH_VERSION=$(echo $VERSION | sed -nr "s/$SS_VFMT_REG/\3/p")
#      
DESC=$(echo $VERSION | sed -nr "s/$SS_VFMT_REG/\5/p")
#     
SNAPSHOT=$(echo $VERSION | sed -nr "s/$SS_VFMT_REG/\7/p")

echo MAJOR_VERSION=$MAJOR_VERSION
echo MINOR_VERSION=$MINOR_VERSION
echo PATCH_VERSION=$PATCH_VERSION
echo DESC=$DESC
echo SNAPSHOT=$SNAPSHOT

[ -z "$SNAPSHOT" ] && echo "WARNING:$VERSION is not a snapshot version(           )"

#          1
new_patch=$(expr $PATCH_VERSION + 1 )

echo new_patch=$new_patch

#      (       )
release_version=$MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION
#         
next_relver=$MAJOR_VERSION.$MINOR_VERSION.$new_patch
[ -n "$DESC" ] && release_version=$release_version.$DESC && next_relver=$next_relver.$DESC
#####################

#            ,            
read -p "input release version(       )[$release_version]:" input_str

check_version_format $input_str

#if [[ -n "$input_str" && -z $(echo $input_str | grep -E "$RLV_FMT_REG") ]] ;
#then
# echo "ERROR:invalid version string format(       ),example: 1.0.0 OR 1.0.0.beta"
# exit -1
#fi

[ -n "$input_str" ] && release_version=$input_str

echo release_version=$release_version


#               ,            
read -p "input next release version(          )[$next_relver]:" input_str

check_version_format $input_str

#if [[ -n "$input_str" && -z $(echo $input_str | grep -E "$RLV_FMT_REG") ]] ;
#then
# echo "ERROR:invalid version string format(       ),example: 1.0.0 OR 1.0.0.beta"
# exit -1
#fi

if [ "$input_str" = $release_version ] ;
then
    echo "ERROR:next version must not be same with $release_version(                 )"
    exit -1
fi

[ -n "$input_str" ] && next_relver=$input_str
echo next_relver=$next_relver


#        
#     
rel_major_version=$(echo $release_version | sed -nr "s/$RLV_FMT_REG/\1/p")
#     
rel_minor_version=$(echo $release_version | sed -nr "s/$RLV_FMT_REG/\2/p")
#      
rel_patch_version=$(echo $release_version | sed -nr "s/$RLV_FMT_REG/\3/p")
#      
rel_desc=$(echo $release_version | sed -nr "s/$RLV_FMT_REG/\5/p")

#           
#     
snap_major_version=$(echo $next_relver | sed -nr "s/$RLV_FMT_REG/\1/p")
#     
snap_minor_version=$(echo $next_relver | sed -nr "s/$RLV_FMT_REG/\2/p")
#      
snap_patch_version=$(echo $next_relver | sed -nr "s/$RLV_FMT_REG/\3/p")
#      
snap_desc=$(echo $next_relver | sed -nr "s/$RLV_FMT_REG/\5/p")
#########################
#                 ,      
if [ -n "$(git status -s)" ] ;
then
    echo "ERROR:working directory not clean,can not release(         ,    release)"
    exit -1
fi

echo "       ($release_version)"
sed -i -r "s!$VERSION_REG!\1$release_version\3!g" $version_src || exit -1
sed -i -r "s!$VERSION_MAJOR_REG!\1$rel_major_version\3!g" $version_src || exit -1
sed -i -r "s!$VERSION_MINOR_REG!\1$rel_minor_version\3!g" $version_src || exit -1
sed -i -r "s!$VERSION_PATCH_REG!\1$rel_patch_version\3!g" $version_src || exit -1 
sed -i -r "s!$VERSION_DESC_REG!\1$rel_desc\3!g" $version_src || exit -1
sed -i -r "s!$BEANCH_REG!\1$branch\3!g" $version_src || exit -1
sed -i -r "s!$COMMIT_REG!\1$commit_id\3!g" $version_src || exit -1

echo "         release_version=$release_version"
git add $version_src || exit -1
git commit -m "release $release_version" || exit -1

release_tag=$TAG_PREFIX$release_version
echo "      (release_tag=$release_tag)"
git tag $release_tag || exit -1

#        
next_snapshot="$next_relver-SNAPSHOT"
#     id
cur_commit_id=`git rev-parse --short HEAD`
echo "    ,       ($next_snapshot),  branch,commit_id"
sed -i -r "s!$VERSION_REG!\1$next_snapshot\3!g" $version_src || exit -1
sed -i -r "s!$VERSION_MAJOR_REG!\1$snap_major_version\3!g" $version_src || exit -1
sed -i -r "s!$VERSION_MINOR_REG!\1$snap_minor_version\3!g" $version_src || exit -1
sed -i -r "s!$VERSION_PATCH_REG!\1$snap_patch_version\3!g" $version_src || exit -1 
sed -i -r "s!$VERSION_DESC_REG!\1$snap_desc\3!g" $version_src || exit -1
sed -i -r "s!$BEANCH_REG!\1$branch\3!g" $version_src || exit -1
sed -i -r "s!$COMMIT_REG!\1$cur_commit_id\3!g" $version_src || exit -1

echo "        "
git add $version_src || exit -1
git commit -m "next snapshot $next_snapshot" || exit -1

#echo "push      "
git push || exit -1
git push origin $release_tag || exit -1

좋은 웹페이지 즐겨찾기