ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오픈소스 개발의 기본 소양 - diff and patch
    2011. 9. 6. 0 comments

    모든 개발에 있어서 코드의 변경사항을 관리하는 것은 큰 이슈의 한 부분이다. 그렇기 때문에 SVN, CVS등의 소스버전 컨트롤 Tool이 존재하는데,
    오픈 소스 처럼  많은 사람에 의해서 관리되는 소스코드에 대해서 소스 버전 컨트롤 모두 제공해 줄 수 없는경우

    소스의 변경사항을 출력해주는 diff 명령어
    그리고
    diff의 결과물을 소스코드의 반영시켜주는 patch 명령어 


    로 사용되고 있다.

    오픈 소스들은 메일을 통하여 diff 명령어로 만들어진 내용의 결과물 파일을 전달하면, 관리자는 patch 명령어로 변경사항을 임시로 반영하고 검토, 테스트하여 안정성이 보장되면 해당 변경사항을 소스버전 컨트롤에 변경사항을 추가시키는 프로세스를 거치게 된다.

    외쿡 오픈소소의 버그를 발견해서 수정된 코드를 통째로 첨부하여 그 내용을 알려주는 메일을 보냈는데, 짧게 diff 파일로 다시 보내달라는 답변 메일을 받았다는 사례도 아는 지인으로부터 들었던 에피소드중에 하나이다. 그 정도로 diff 와 patch는 범용적으로 사용되고 있다.(본인이 diff 할 생각은 없는 global한 외쿡 세계)

    이렇게 범용적으로 사용되는 diff 명령어와 patch 명령어에 대해서 간단히 소개한다.

    diff 명령어란 line by line으로 파일을 비교하여 다른점을 출력해주는 유틸리티 바이너리이다.
    사용예로 소스코드 하나를 복사한 후, 복사한 파일의 코드를 몇 줄 수정하였다.
    아래는 diff 명령어의 결과이다. 명령어에서 -urN은 출력옵션이며 원본파일은 첫번째 인자로 변경된 파일은 두번째 인자로 명령어를 내린다.

    diff -urN main.c main_mo.c

     

      1 --- main.c  2011-09-06 10:14:26.000000000 +0900
      2 +++ main_mo.c   2011-09-06 16:55:36.000000000 +0900
      3 @@ -14,8 +14,8 @@
      4     for( i = st ; i <= en; ++i )
      5     {
      6         var = i;
      7 -       cnt = 1;
      8 -       while( var > 1 )
      9 +       cnt = 0;
     10 +       while( var >= 1 )
     11         {
     12             if(is_odd_number(var))
     13                 var = (3*var)+1;
    

    첫번째 줄의 --- main.c 라고 되어 있는 부분은 파일에서 다른 부분이 표시될때 -로 라인옆에 표시된다는 것을 의미하며 마찬가지로 둘째줄의 +++ main_mo.c 는 아래에서 다른 부분이 표시될 때 +로 라인옆에 표시된다는 것을 의미한다.

    출력된 결과를 보면 7~10에서 변경된 사항들을 확인할 수 있다.
    (7~8은 main.c의 부분, 9~10은 main_mo.c 의 부분)


    이런 출력물을 redirect 하여 파일로 저장해 놓으면 diff의 역할을 끝이다.

    diff -urN main.c main_mo.c > main.c.diff



    patch 명령어는 변경된 사항을 반영시켜주는 명령어이다.
    자, 이번엔 main.c 파일을 diff파일을 통해서 patch를 해보도록 하자.
    해당 파일을 main.c와 같은 디렉토리와 복사하고 그 디렉토리로 이동한다.

    patch -p0 <  main.c.diff


    main.c 파일을 열면 patch되었다는 결과를 확인할 수 있다.


    반응형

    댓글 0

Designed by Tistory.