2010-10-31 10 views
10

Come parte di un progetto più ampio, voglio la possibilità di prendere due corpi di testo e passarli a un algoritmo di fusione che restituisce un risultato auto-unito (nei casi in cui le modifiche non sono in conflitto) o genera un errore e (potenzialmente) produce un singolo documento di testo con le modifiche in conflitto evidenziate.Come unire programmaticamente i file di testo con potenziali conflitti (ala git o svn, ecc.)?

Fondamentalmente, voglio solo un modo programmatico per fare quello che internamente ogni sistema di controllo sorgente del pianeta, ma sto avendo difficoltà a trovarlo. Ci sono un sacco di GUI visuali per fare questo genere di cose che dominano i miei risultati di ricerca, ma nessuno di loro sembra rendere facilmente accessibile l'algoritmo di fusione di base. Tutti fanno affidamento su un algoritmo/libreria comune e ben compreso e io non conosco il nome, quindi ho difficoltà a cercarlo? Si tratta di qualche piccola modifica su diff e dovrei cercare librerie diff invece di librerie di unione?

Le librerie Python sarebbero molto utili, ma posso vivere con l'overhead dell'interfaccia con qualche altra libreria (o soluzione a linea di comando) se necessario; questa operazione dovrebbe essere relativamente infrequente.

+0

Le unioni automatiche non sono sicure, perché non hanno alcuna comprensione dell'intenzione dei programmatori (plurale); non c'è garanzia che un file "unito" funziona e tanto meno funziona come previsto da qualcuno. I sistemi di controllo del codice sorgente si allontanano da questo assumendo implicitamente che l'utente in qualche modo riesamini (anche se ciò accada è un'altra domanda). Come useresti i risultati di un'unione automatica? –

+0

In questo caso, non sto unendo il codice, sto sincronizzando i file di testo che potrebbero essere stati modificati mentre non si trovava in contatto con il server. Quando il client offline si riconnette, ho bisogno di confrontare la versione locale con quella del server. I veri conflitti non fusibili saranno rari a causa della progettazione dell'applicazione, ma succederanno occasionalmente e devo solo sapere quando si verificano. Non mi aspetto che l'unione automatica sia perfetta, solo per notificarmi quando non riesce e consentirmi di degradare con garbo senza perdere il contenuto di server o client nel processo. – drewww

+0

Domande come queste sono il motivo per cui adoro StackOverflow. La qualità della community qui è pazzesca! – ehfeng

risposta

9

Probabilmente stai alla ricerca di algoritmi di unione come 3-way fusione, che si può trovare in molti progetti open source, per esempio nel bazar VCS (merge3.py source).

+0

Ah, sì, penso che sia esattamente la frase magica di cui avevo bisogno! Dovrò scavare attraverso queste diverse versioni per vedere cosa è facilmente estraibile/estraibile dal suo contesto, ma un primo passaggio sembra davvero promettente. Grazie! – drewww

1

Hai controllato fuori difflib

+1

Questo sembra potente, ma a me sembra che non possa effettivamente fare la parte di fusione del processo, solo la parte diff. Potrei essere in grado di costruire un sistema di fusione in cima a SequenceMatcher, ma sembra un grande passo avanti. – drewww

+0

Se sei pronto, puoi estrapolare il codice di fusione dalla combinazione. –

Problemi correlati