2010-11-23 1 views
2

대다수는 플랫 (즉, 키/값 쌍)이지만 XML, bash 스크립트 또는 사용자 지정 형식 인 구성 파일 트리를 간결하게 비교하고 싶습니다. 구성 정보는 거의 항상 주문되지 않으며 공백과 주석을 포함 할 수 있습니다.간략하게 구성 트리를 비교하고 부분적으로 병합합니다.

플랫 파일의 경우 공백없이 diff를 수행하거나 정렬 된 출력에 대한 의견을 보내고 싶습니다. XML의 경우 sometoolsavailable이 있습니다. 그러나 일부 맞춤 형식은 예를 들어 중첩 된 구성 키의 순서는 중요하지 않지만 하위 키의 순서는 중요하지 않지만 트리 구조는 XML과 비슷합니다. 다른 것들은 매우 주문 의존적입니다.

자주해야한다면 어떻게해야할까요? 거기에 일반적인 도구가 있습니까? 내 솔루션을 선보이는 것은 어떨까요? 형식의 수는 엄청나지 않으며 (엄청나게/etc만큼 나쁘지는 않음), 기본값은 flat입니다. 아마도 libmagic과 파일 이름이 일치하고 사용자 정의 파서와 결합되었을 것입니다. 아무도 그렇게하려고하지 않았습니까?

하나의 접근법은 중첩되었지만 순서가 지정되지 않은 구조의 파일에 대해 적절한 작업을 수행하고 기존 도구로 몇 가지 다른 유형을 특수화하여 문제의 95 %를 해결하려고하는 것입니다. 간단한 중첩 된 파일에 대한 대부분 작품 방식을 제안 할 수 있습니까?

몇 가지 예 :

com.example.resource.host=foo 
com.example.resource.port=8080 

com.example.resource.port=8080 
com.example.resource.host=bar 
//com.example.network.timeout=600 
com.example.network.timeout=300 

선택적

< com.example.resource.host=foo 
--- 
> com.example.resource.host=bar 
> //com.example.network.timeout=600 
> com.example.network.timeout=300 

또는 생산해야 :

< com.example.resource.host=foo 
--- 
> com.example.resource.host=bar 
> com.example.network.timeout=300 

예상대로 그러나, 뭔가 같은 :

Conf com.example.resource = 
    Conf host = foo; 
    Conf port = 8080; 
; 

Conf com.example.resource = 
    Conf port = 8080; 
    Conf host = bar; 
; 
Conf com.example.network = 
    Conf timeout = 300; 
; 

대도 작동합니다 :

<  Conf host = foo 
--- 
>  Conf host = bar 
> Conf com.example.network = 
>  Conf timeout = 300; 
> ; 

답변

1

구성 파일의 각 구문 및 묵시적 의미를 가지고있다. 당신이하고 싶은 일은 설정 파일을 텍스트가 아닌 묵시적 의미와 비교하는 것입니다.

이렇게하는 유일한 방법은 각 구성 파일 형식에 대한 사용자 지정 파서가 있어야합니다. 그런 다음 묵시적인 의미에 따라 파일을 비교해야합니다.

일반적으로 실제 프로그래밍 언어에서는 상당히 어렵습니다. 우리는 정확한 언어 구문에 따라 코드를 파싱하는 SmartDifferencers이라고 부르는 타협 솔루션을 제공하고 언어 구조 (예 : 표현식, 명령문, 선언문, 메소드 ...)에 따라 코드를 비교하고 차이점을 추상 편집 작업 (move , 복사, 삭제, 삽입, 이름 변경 - 식별자). 이것은 diff의 전형적인 "어떻게 든 변경된이 줄의 블록"이 아니라 프로그래머에게 이해하기 쉬운 측면에서 succint deltas (사용자가 요구 한 것임)를 제공합니다.

이러한 도구는 언어 구문을 알고 있으며 작은 기호 의미를 알고 있습니다. 특히 의 교환 가능 언어 요소를 처리하기 위해 노력하고 있습니다. Java에서 클래스의 메소드 순서는 중요하지 않습니다. 귀하의 경우, 일부 구성 요소의 순서는 중요하지 않을 수 있습니다. 우리의 기계는 이것을 고려할 수 있습니다.

이렇게하려면 을 원한다면 구성 파일의 각 유형에 대해 별도의 파서가 필요하며 안전하게 명령을 뒤섞을 수있는 각 유형별 지식이 필요합니다. 이 작업을 수행하려면 각 유형의 구성 파일에 대해 별도의 도구가 필요합니다. (XML 기반의 파일 들로서 의미와 구문을 구별하려고하기 때문에 separtes 도구가 필요합니다.) 필자의 이상적인 솔루션은 각 구성 파일 유형에 대한 SmartDifferencers입니다.

관련 문제