2014-08-27 2 views
1

주어진 작업 복사본에서 수행 된 마지막 cvs update 작업의 시간을 확인하려고 시도 중이며 어렵다고 판명되었습니다. cvs history -w은 '히스토리가 실행되는 동일한 작업 디렉토리에서 수행 된 수정 사항에 대한 레코드 만 표시'로 문서화되어 있지만 실제로는 전혀 작동하지 않기 때문에 다른 것을 의미해야합니다.'cvs history -w'는 무엇을합니까?

처음으로 저장소에서 프로젝트를 체크 아웃 한 다음 몇 가지 작은 변경을하면 cvs history -e -w은 변경 사항만을보고하지만 예상되는 변경 사항은보고되지만 저장소의 모든 변경 사항은 변경 사항을 포함하여보고됩니다. 다른 프로젝트에서.

예를 들어, 다음과 같은 상황을 :

  • $의 CVSROOT는 두 개의 프로젝트가 포함되어 - 프로젝트 하나에
을 수정에서 프로젝트 하나 프로젝트 두
  • cvs history 반환 출력의 여러 라인을

    나는 다음과 같은 실행하는 경우 :

    mkdir /home/lmitchell/cvs-repo 
    cd /home/lmitchell/cvs-repo 
    cvs checkout project-two 
    echo "//comment" >> bar.cpp 
    cvs commit bar.cpp 
    

    그런 다음 cvs history -w은 체크 아웃 작업 - 단 한 줄의 출력 만 반환하고, cvs history -e -w은 체크 아웃 작업과 커밋 작업을 두 줄 반환한다고 예상합니다. 그러나 위와 똑같은 방식으로 저장소의 모든 곳에서 기록을 반환합니다. 사실, 상황에 관계없이 -w 플래그를 추가 또는 제거하지 않은 채 (지난 몇 시간 동안) 출력이 변경되지는 않았습니다.

    cvs history -w은 정확히 무엇을 수행합니까?

  • +0

    퀴클 때문에'cvs history -xM -w'를하면 어떻게됩니까? 나는'-e'가'-w'와 상충하는지 궁금해하고있다. – clcto

    +0

    나는 그 생각을 너무 가지고 있었다. 그러나 나는 그것을 시도했고 내가 말할 수있는 한, -w는 무시되었다. -xTOEFWUPCMGAR -w에서 일반 -w까지 그리고 그 사이의 모든 것을 내가 거기에 집어 넣는 다른 옵션이 무엇이든 관계없이 아무 것도하지 않습니다. –

    답변

    0

    나는 그것을 이해했다고 생각합니다. 에 이전 의견에서

    if (!hr     /* The last record */ 
        || !STREQ (hr->user, lr->user) /* User has changed */ 
        || !STREQ (hr->mod, lr->mod) /* Module has changed */ 
        || (working    /* If must match "workdir" */ 
         && (!STREQ (hr->dir, lr->dir) /* and the 1st parts or */ 
         || !STREQ (hr->end, lr->end))))/* the 2nd parts differ */ 
    
        return 1; 
    
    if (working) 
    {     /* If must match "workdir" */ 
        if (!STREQ (hr->dir, lr->dir) /* and the 1st parts or */ 
        || !STREQ (hr->end, lr->end)) /* the 2nd parts differ */ 
        return 1; 
    } 
    

    다음 CVS 소스 코드를 파고

    역사에 -w 옵션은 다음 줄에서 함수 accept_hrec()에 사용되는 '작업'이라는 플래그를 설정하는 것이 밝혀 코드에서 우리는 hrlr이 모두 struct hrec - 이력 파일의 한 줄에서 읽은 레코드라는 것을 알게됩니다. 목록은 먼저 저장소의 루트 디렉토리별로 정렬되고 두 번째는 파일 이름 자체로 정렬됩니다. hr은 목록의 다음 레코드를 가리키고 현재는 lr을 가리 킵니다. 또한 hrec.dirhrec.end은 경로를 나타내며 첫 번째 부분 (dir)은 저장소의 루트 디렉토리를 추적하고 end은 저장소 내의 디렉토리를 추적합니다 (일부 압축 후 등).

    accept_hrec은이 hrec를 인쇄하려면 0이 아닌 값을 반환하도록 설계되었습니다. 그래서 우리는 '작업'조건이 모두 위와 같은에 간단하게 볼 :

    if (working && !STREQ (hr->dir, lr->dir) && !STREQ (hr->end, lr->end)) return 1

    즉. 디렉토리/끝 조합이 일치하지 않으면 NON-ZERO를 반환합니다. 우리의 목록은 경로와 파일별로 정렬되기 때문에 그 파일에 대한 모든 hrec을 읽었을 때만 그 조합이 달라집니다.

    결국 우리는 historyhistory -w의 차이점을 확실히 말할 수있는 시점에 있습니다.

    history은 실행 기록 파일의 항목 목록을 반복하고 작업이 수행 된 저장소로 정렬 된 다음 파일 이름 자체로 반복됩니다. 파일 이름이 변경되면 (즉, 해당 파일에서 마지막으로 기록 된 작업), 다음을 확인합니다.이 레코드가 '체크 아웃'레코드입니까? 그렇다면 인쇄하십시오 -이 파일은 현재 체크 아웃되어 있습니다.

    history -w은 파일 이름의 변경 또는 저장소 디렉토리의 변경 사항을 '마지막 기록 작업'으로 간주한다는 점을 제외하고는 완전히 동일합니다. 따라서 cvs history -w은 항상 cvs history의 수퍼 세트를 인쇄합니다.

    CVS가 모든 원격 클라이언트의 '저장소 디렉토리'를 추적하기 때문에 불행히도이 문제는 도움이되지 않습니다. 즉, '이 저장소의 마지막 업데이트 시간'을 가져올 수 없음을 의미합니다. 내가 원했던 것처럼. 그러나 적어도 나는 지금 무슨 일이 벌어지고 있는지 알고 있습니다.