newtype
::: newtype의 지식창고 :::
newtype
전체 방문자
오늘
어제
  • 분류 전체보기 (392)
    • Dev (214)
      • C, C++ (43)
      • Go (5)
      • Web (49)
      • DBMS (21)
      • DevOps (8)
      • Java (2)
      • Windows, Win32 (4)
      • Visual Basic (5)
      • C# (2)
      • Mobile (25)
      • SQL CE (7)
      • Google Map (6)
      • Python (2)
      • cygwin (2)
      • 기타 (32)
      • Ruby (1)
    • 명언 (10)
    • 모임 (18)
      • 붕주회 (3)
      • 신흥컴정 (14)
      • 웹20기 (1)
    • 사진 (8)
    • 불펌 (29)
    • 막글 (98)
    • 게임 (6)
    • 여행 (8)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

  • whoami
05-20 03:16
hELLO · Designed By 정상우.
newtype

::: newtype의 지식창고 :::

Dev/기타

CVS Commit 로그를 남겨보자

2011. 5. 4. 13:17
-. 요구사항 파악 및 설계

적용 패키지 작성을 위해 수정된 파일 목록을 추출 할 방법을 찾아 보기로 했다.
업무 때문에 소스 관리를 CVS 로 하고 있다. CVS의 단점은 개별 파일이력은 확인 할 수 있는데, 
수정된 파일 목록을 뽑기가 쉽지 않다는 것이다.

구글링을 해보니 CVS에서 Commit 시점에 뭔가 처리할 수 있다는 것을 알았다.

먼저, CVS 서버에 접속해서 저장소의 CVSROOT 디렉토리를 보자

-rwxrwxr-- 1 cvs cvs       544  4월 22 09:23 checkoutlist

-rwxrwxr-- 1 cvs cvs       694  3월 21  2009 checkoutlist,v

-rwxrwxr-- 1 cvs cvs       882  4월 26 16:03 commitinfo

-rwxrwxr-- 1 cvs cvs       959  3월 21  2009 commitinfo,v

-rwxrwxr-- 1 cvs cvs       993  3월 21  2009 config

-rwxrwxr-- 1 cvs cvs      1192  3월 21  2009 config,v

-rwxrwxr-- 1 cvs cvs       602  2월  8 16:32 cvswrappers

-rwxrwxr-- 1 cvs cvs       801  3월 21  2009 cvswrappers,v

-rwxrwxr-- 1 cvs cvs      1025  3월 21  2009 editinfo

-rwxrwxr-- 1 cvs cvs      1224  3월 21  2009 editinfo,v

-rwxrwxr-- 1 cvs cvs 292081967  4월 29 18:14 history

-rwxrwxr-- 1 cvs cvs      1245  4월 21 11:32 loginfo

-rwxrwxr-- 1 cvs cvs      1367  3월 21  2009 loginfo,v

-rwxrwxr-- 1 cvs cvs      1151  3월 21  2009 modules

-rwxrwxr-- 1 cvs cvs      1350  3월 21  2009 modules,v

-rwxrwxr-- 1 cvs cvs       564  3월 21  2009 notify

-rwxrwxr-- 1 cvs cvs       763  3월 21  2009 notify,v

-rwxrwxr-- 1 cvs cvs       640  4월 25 12:43 passwd

-rwxrwxr-- 1 cvs cvs       649  3월 21  2009 rcsinfo

-rwxrwxr-- 1 cvs cvs       848  3월 21  2009 rcsinfo,v

-rwxrwxr-- 1 cvs cvs       879  3월 21  2009 taginfo

-rwxrwxr-- 1 cvs cvs      1078  3월 21  2009 taginfo,v

-rwxrwxrw- 1 cvs cvs       187 11월 10 17:15 val-tags

-rwxrwxr-- 1 cvs cvs      1026  3월 21  2009 verifymsg

-rwxrwxr-- 1 cvs cvs      1225  3월 21  2009 verifymsg,v


위와 같은 파일들을 볼 수 있는데.. 
여기서 commitinfo 란 파일이 CVS에서 Commit 하기 바로전에 실행되는 파일이다.

방향은 정해졌다. 
작업 구성은 아래와 같은 순서로 하기로 했다.

     1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다.
         -> CVSROOT/commitinfo에 등록할 쉘 스크립트를 작성.
     2.  저장된 DB를 조회할 간단한 WEB Page 제작
         -> 평소 관심을 갖고 있던, jQuery를 이용.

[ 1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다 ]

commitinfo 파일에 아래와 같이 내용을 추가 한다.

$ vi CVSROOT/commitinfo 

ALL /home/cvs/myproject/CVSROOT/cvscommitlog.sh 


DB에 테이블을 생성 한다.

CREATE TABLE CVS_COMMIT
(
   SEQ              NUMBER(10) NOT NULL,
   USERID           VARCHAR2(20) NOT NULL,
   REG_DATE         DATE DEFAULT SYSDATE,
   PROJECT          VARCHAR2(50) NOT NULL,
   FILENAME         VARCHAR2(500) NOT NULL
);

* index는 REG_DATE, TO_CHAR(reg_date, 'YYYY/MM/DDHH24:MI'), USERID, PROJECT 를 걸었다.

commitinfo 파일이 실행할 쉘스크립트를 작성한다.

#!/bin/sh
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=ORACLE_SID
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_OWNER=oracle
export LANG=c
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib;

DATE=`date "+%Y-%m-%d %H:%M:%S"`
DT=`date "+%Y%m%d"`
LOG_FILE="/home/cvs/cvs_log/commit.$DT.log"
DIR=$1
USER=$USER
PROJECT=`echo $DIR | cut -d/ -f4`
#(echo ""; id;) >> $LOG_FILE
shift
for file in $*
do
    echo "$PROJECT, $USER, $DATE, $DIR/$file" >> $LOG_FILE
        result=`$ORACLE_HOME/bin/sqlplus oracle_user/oracle_pwd@oracledb <<EOF 
        INSERT INTO CVS_COMMIT 
        VALUES ( (SELECT NVL(MAX(SEQ), 0) +1 FROM CVS_COMMIT), 
                       '$USER', TO_DATE('$DATE', 'YYYY-MM-DD hh24:mi:ss'), 
                       '$PROJECT', '$DIR/$file');
        COMMIT;
        EOF
        `
done



[ 2.  저장된 DB를 조회할 간단한 WEB Page 제작 ]
jsp 파일 하나와 html파일 하나로 이루어졌고, jQuery와 JSON을 이용 했다.
DATE Picker는 jQuery Plugin 중에 하나를 이용했다.



 




 

     필링 CVS Commit 목록
 시작일  종료일
 User ID
 프로젝트
 기타 옵션 중복 문서 제거


<%@page import="WDMS.Common.ConvUtil"%>
<%@ page language="java" contentType="text/html;charset=euc-kr"  import="java.sql.*" %>
<%
	// 연결 정보
	String ORA_IP = "ORACLE_ID";
	String ORA_SID= "ORACLE_SID";
	String ORA_USER= "ORACLE_USER";
	String ORA_PWD= "ORACLE_PWD";

	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	ResultSetMetaData rsmd = null;
    
	int i;
    
	String strData ="";
	int nCol=0;
	int nRow=0;
	int numIndex =1;
	StringBuffer szQuery = new StringBuffer();
    
	String method=ConvUtil.nullToSpace(request.getParameter("method"));
	String start_date=ConvUtil.nullToSpace(request.getParameter("start_date"));
	String end_date=ConvUtil.nullToSpace(request.getParameter("end_date"));
	String user_id=ConvUtil.nullToSpace(request.getParameter("user_id"));
	String project=ConvUtil.nullToSpace(request.getParameter("project"));
	String distinct=ConvUtil.nullToSpace(request.getParameter("distinct"));

	if ( method.equals("GetUserID") )  {
		szQuery.append("SELECT DISTINCT USERID FROM CVS_COMMIT");
	} else if (method.equals("GetProject")) {
		szQuery.append("SELECT DISTINCT PROJECT FROM CVS_COMMIT");
	} else if (method.equals("GetCvs")) {
		if(distinct.equals("0")){
			szQuery.append("SELECT USERID, ");
			szQuery.append("TO_CHAR(REG_DATE, 'YYYY-MM-DD hh24:mi:ss') REG_DATE,)";
			szQuery.append("PROJECT,FILENAME FROM CVS_COMMIT");
		}else{
			szQuery.append("SELECT DISTINCT FILENAME FROM CVS_COMMIT");
		}
		
		if(start_date.equals("")&&end_date.equals("")){
			if(!user_id.equals("All")&&!project.equals("All") ){
				szQuery.append(" where USERID=? AND PROJECT=?");
			}else if(!user_id.equals("All")&&project.equals("All") ){
				szQuery.append(" where USERID=?");
			}else if(user_id.equals("All")&&!project.equals("All") ){
				szQuery.append(" where PROJECT=?");
			}
		
			if(distinct.equals("0")){
				szQuery.append(" order by REG_DATE");
			}
		}else{
			if(!user_id.equals("All")&&!project.equals("All") ){
				szQuery.append(" where USERID=? AND PROJECT=?");
			}else if(!user_id.equals("All")&&project.equals("All") ){
				szQuery.append(" where USERID=?");
			}else if(user_id.equals("All")&&!project.equals("All") ){
				szQuery.append(" where PROJECT=?");
			}else{
					szQuery.append(" where 1=1");
			}
			
			if(!start_date.equals("")&&end_date.equals("")){
				szQuery.append(" and REG_DATE BETWEEN ? AND SYSDATE");	
			}else if(!start_date.equals("")&&!end_date.equals("")){
				szQuery.append(" and TO_CHAR(reg_date, 'YYYY/MM/DDHH24:MI') ");
				szQuery.append("BETWEEN ? AND ?");
			}
			
			if(distinct.equals("0")){
				szQuery.append(" order by REG_DATE");	
			}
		}
	}else if (method.equals("")) {
			out.println("Unkwon method!!");
		return;
	}

	try {
     
        //1.드라이버선택
        Class.forName("oracle.jdbc.driver.OracleDriver");
        
        //2.db연결
        conn = DriverManager.getConnection("jdbc:oracle:thin:@"
                     +ORA_IP+":1521:"+ORA_SID, ORA_USER, ORA_PWD);
        
        //3.Statement객체및 쿼리생성
        pstmt = conn.prepareStatement(szQuery.toString());
        if(method.equals("GetCvs")){
        	if(start_date.equals("")&&end_date.equals("")){
	        	if( !user_id.equals("All") && !project.equals("All") ) {
		        	pstmt.setString(numIndex++,user_id);
		        	pstmt.setString(numIndex,project);
	        	} else if(!user_id.equals("All")&&project.equals("All") ){
	        		pstmt.setString(numIndex,user_id);
	        	} else if(user_id.equals("All")&&!project.equals("All") ){
	        		pstmt.setString(numIndex,project);
	        	} else{
	        		if(!start_date.equals("")&&end_date.equals("")) {
	        			pstmt.setString(numIndex,start_date);
	        			} else if(!start_date.equals("")&&!end_date.equals("")){
	        				pstmt.setString(numIndex++,start_date+"00:00");
	        				pstmt.setString(numIndex,end_date+"23:59");
	        			}
				}
        	}else{
        		if(!user_id.equals("All")&&!project.equals("All") ){
                	pstmt.setString(numIndex++,user_id);
                	pstmt.setString(numIndex++,project);
                	}else if(!user_id.equals("All")&&project.equals("All") ){
                		pstmt.setString(numIndex++,user_id);
                	}else if(user_id.equals("All")&&!project.equals("All") ){
                		pstmt.setString(numIndex++,project);
                	}
        		//
        		if(!start_date.equals("")&&end_date.equals("")){
        			pstmt.setString(numIndex,start_date);
       			}else if(!start_date.equals("")&&!end_date.equals("")){
       				pstmt.setString(numIndex++,start_date+"00:00");
       				pstmt.setString(numIndex,end_date+"23:59");
       			}
	        }
        }
        
        //4.실행
        rs = pstmt.executeQuery();
        
        //5.처리
            // 헤더 
        rsmd = rs.getMetaData();
        nCol = rsmd.getColumnCount();
        strData = "{\n\t\"title\": \"Feelring CVS Commit Log\",\n\t\"item\": [\n\t\t";
            
            // 데이타
        while(rs.next())
        {
            strData += "\t{\n\t\t";
        
            for(i=1; i<=nCol; i++)
            {
                strData += "\"" + rsmd.getColumnName(i) 
                            + "\" : \"" + rs.getString(i) + "\",";
            }
            strData = strData.substring(0, strData.length() -1 );
            
            strData += "\n\t},\n";
            nRow++;
        }
        rs.close();
        
        strData = strData.substring(0, strData.length() -2 );
        strData += "\t]\n}";
        
        out.println(strData);
        
        //6.연결해제
        pstmt.close();
        conn.close();
        
    } catch (Exception e) {
    
        if(rs!=null){ try{rs.close();}catch(SQLException se){} }
        if(pstmt!=null){ try{pstmt.close();}catch(SQLException se){} }
        if(conn != null){ try{conn.close();} catch(SQLException se){}} 
        out.println(e);
        
    }

%>



반응형

'Dev > 기타' 카테고리의 다른 글

shell script로 구현하는 multi tail  (0) 2013.08.06
솔라리스 메일 전체 삭제  (0) 2013.03.07
iTunes 없이 iPhone에 음악 전송  (2) 2010.09.28
: no such repository  (0) 2009.10.09
ssh socks 터널링을 이용한 방화벽 탈출  (2) 2008.08.26
    'Dev/기타' 카테고리의 다른 글
    • shell script로 구현하는 multi tail
    • 솔라리스 메일 전체 삭제
    • iTunes 없이 iPhone에 음악 전송
    • : no such repository
    newtype
    newtype
    지극히 개인적인 지식의 창고

    티스토리툴바