CVS를 대소문자 구분 없이 여러 플렛폼에서 사용
지난번 파일 이름 대소문자 구분 문제로 cvs watchers 가 제대로 작동하지 않는 현상을 언급했고 나름대로 수정했었습니다.
http://bbs.kldp.org/viewtopic.php?t=37268&highlight=
그 후 몇가지 문제점들이 더 발견됐기에 조금 더 수정을 가했습니다. CVS 관리자에게 보낸 메일에 답장을 받지는 못했습니다.
다음과 같은 상황에서 이용가능합니다.
1. 파일 이름 호환성을 위해 모든 파일 이름은 소문자를 기준으로 한다. (필요에 따라 8.3 형식까지 유지한다.)2. 대소 문자를 구분하는 파일 시스템에서도 작동해야 한다. (파일 이름은 소문자 기준)
3. 멀티 부팅 환경에서도 동일한 소스파일을 가지고 작업할 수 있어야 한다.
4. 모든 텍스트 파일은 유닉스 형식이어야 한다.
데스크탑 환경인 경우, 2번과 같은 문제는 대소문자를 구분하지 않는 vfat 같은 파일 시스템을 마운트해서 쓰면 되지만, 이것은 요피에서는 썩 좋은 방법이 아니더군요. loop 장치로 요피의 램디스크 중 일부를 vfat 으로 마운트 해야 하는데, 이것은 그다지 좋은 대안이 아니라고 생각됐습니다.
아무튼 다음과 같이 수정하면 됩니다. cvs 1.11 버젼을 이용했기 때문에, 소스 라인은 그 버젼 기준이고, 파일 이름은 cvs 소스 파일 위치에 대한 상대경로입니다. 현재 1.13 버젼까지 나온 것 같은데, 패치 파일을 만드는 것이 별로 의미있을 것 같지 않아서 수정 방법을 설명하려고 합니다. 지난번 cvs watchers 문제 수정까지 포함하는 종합판입니다.
config.h 에서 #define FILENAMES_CASE_INSENSITIVE 1
lib/system.h에서 #define fncmp strcmp 에 strcasecmp 사용 ( v1.11 505 라인) 이 파일 마지막 부분에 struct dirent* my_readdir( DIR* dir ); #define readdir my_readdir 도스/윈도우즈 계열인 경우 다음 라인을 더 추가 FILE* my_fopen( const char* name, const char* mode ); #define fopen my_fopen
src/filesubr.c 에 다음 함수를 추가 static void lower_name( char* name ) { char c; do { if( strncmp(name,"CVS",3)==0 ) break; while( (c=*name)!=0 ) { if( c=='\\' || c=='/' ) break; *name = tolower(c); name++; } } while( c ); } struct dirent* my_readdir( DIR* dir ) { #undef readdir struct dirent* ent = readdir( dir ); #define readdir my_readdir if( ent ) lower_name( ent->d_name ); return ent; } 도스 윈도우즈인 경우 다음 함수 추가 FILE* my_fopen( const char* name, const char* mode ) { char newmode[12]; int len = strlen(mode); if( mode[len-1]!='b' ) { strcpy( newmode, mode ); newmode[len] = 'b'; newmode[len+1] = 0; mode = newmode; } #undef fopen return fopen( name, mode ); #define fopen my_fopen }
my_readdir 함수는 디렉토리에서 읽어온 파일 이름을 CVS 하위 경로를 제외하고 모두 소문자로 전환시켜서 읽습니다.
도스/윈도우즈에 필요한 my_fopen 함수는 'b' 모드를 추가시켜서 유닉스 호환 텍스트 파일로 읽고 쓰도록 합니다. cygwin 이 "r" 이나 "w" 모드에서 도스 line end 를 사용하기 때문에 이와 같은 함수가 필요합니다.
src/hash.c 파일에서 34라인 (v1.11) hashp 함수에서 unsigned int c = *key++; 에 tolower 사용, 즉 unsigned int c = tolower(*key++); 320 라인(v1.11) findnode 함수에 strcasecmp 사용
src/root.c 139라인 (v1.11) Create_Root 함수 내용 삭제 (내용만 삭제)
CVS/Root 파일에는 checkout 명령을 사용했을 때 쓰인 CVS Repository 경로가 저장됩니다. 만일 이 파일이 존재하면, 그 파일에 씌여있는 경로가 CVSROOT 환경 변수보다 우선하기 때문에, 멀티 부팅환경에서 Repository 경로가 달라지는 경우 제대로 동작하지 않게 됩니다. 그래서 아예 CVS/Root 파일을 생성하지 않도록 합니다.
libdiff 의 비교 결과에 CR 이 포함될 수 있기 때문에, 이진 모드로 비교하도록 수정합니다.
diff/diffrun.h 에 void set_initial_mode( int binary ); 함수 프로토타입 추가
diff/diff.c 에 (1) 다음 함수 추가 void set_initial_mode( int binary ) { binary_I_O = binary; } (2) initialize_main 함수내의 다음 부분을 제거 #if HAVE_SETMODE binary_I_O = 0; #endif
src/main.c main 함수에서 변수 선언이 끝난 후, 호출 set_initial_mode( 1 );
여기까지가 수정 사항이구요. 혹시 위 내용 중 몇가지는 CVS 명령 옵션에 의해 해결할 수 있는지도 모르겠군요. 아무튼 이것으로 데스크탑의 멀티부팅 환경과, 요피 자체 개발 환경을 위한 cvs 기능을 갖추었습니다.
일부 문제가 발생해서 다음 사항이 추가되었고, 관련 내용을 수정했습니다.
일부 문제가 발생해서 다음 사항이 추가되었고, 관련 내용을 수정했습니다.
입력된 텍스트를 유닉스 형식으로 자동 변환하는 과정도 차후에 필요하리라 생각되구요.
repository 파일 이름들에 ,v 를 사용하지 않도록 하는 수정입니다. 이것은 도스에서 이용할 때 유용할 겁니다. 이것을 반영하면, 각 파일마다 몇번 더 stat 호출이 발생합니다.
src/file_names.c에서
이 파일에서 RCSPAT 이라는 문자열을 찾으면, find_rcs 와 find_dirs 두 함수가 발견되는데,
CVS 사이트에서 도스용 CVS가 있다는 글을 찾았는데 소스 다운로드를
CVS 사이트에서 도스용 CVS가 있다는 글을 찾았는데 소스 다운로드를 할 수는 없었습니다. 굳이 더 찾지는 않았는데, 그 도스용 CVS 소스를 다시 유닉스용으로 전환하려면 또 몇가지 테스트가 더 필요할 거라는 생각이 들었구요.
위 수정 사항 중 몇가지는 도스용 CVS 에도 적용이 되어 있을 것이고, 몇가지는 그것과는 별개로 목적을 충족시키는데 필요할 것이라 생각되네요.
음... 로긴을 했었던 것 같은데, 손님으로 글이 등록됐군요... -_-
음... 로긴을 했었던 것 같은데, 손님으로 글이 등록됐군요... -_-;;;
아무튼 그렇습니다.
Orion Project : http://orionids.org
댓글 달기