Come i programmi come subversion rilevano quando un file è stato modificato rispetto a quello creato / cancellato?

4

Questa è la mia prima domanda qui, quindi spero che non sia fuori tema. Sebbene io stia usando la libreria inotify di Linux per ascoltare le modifiche ai file, e confronto l'utilizzo di quello con il programma Subversion , sto specificatamente cercando il algoritmo usato.

Per un umano è molto facile capire se un file è stato creato o modificato. Fare clic sul pulsante New costituisce il primo e facendo clic sul pulsante Save costituisce il secondo. Per Linux, entrambe le azioni hanno una seria sovrapposizione. Negli editor di testo, ad esempio, in genere viene creato un file di scambio, quindi copiato / spostato. Ciò rende difficile distinguere tramite inotify tra una modifica minore in un file e una sovrascrittura deliberata di un file. Quello che sto cercando di capire è come un programma come Subversion riconosce la differenza tra un utente che ha modificato un file con un editor di testo e un utente che ha effettivamente cancellato il file e aperto un nuovo file con lo stesso nome.

Modifica È stato sottolineato che la sovversione non fa ciò che voglio che faccia, quindi è stato un errore da parte mia usarlo come esempio. Piuttosto, permettimi di riformulare la domanda: "Esiste un programma o un approccio di programmazione noto per abbinare azioni di alto livello come la creazione di nuovi file e il loro salvataggio in azioni di basso livello come la modifica, lo spostamento, la copia, ecc. i file nel sistema e li cambia "?

    
posta puk 11.05.2012 - 03:25
fonte

3 risposte

3

Se vuoi sapere come fa la sovversione per capire la directory di lavoro, puoi guardare la fonte abbastanza facilmente. Come utente SVN da molto tempo, posso tranquillamente dire che SVN non fa alcuna distinzione per ciò che accade a un file prima del commit, ma semplicemente controlla ciò che si sta commettendo contro il repository. Niente di più, niente di meno.

    
risposta data 11.05.2012 - 04:24
fonte
2

Non sono sicuro di cosa intendi con un algoritmo, ma certamente puoi farlo. Quanto sarà difficile dipende da quale sistema operativo e file system si sta utilizzando e dal livello di dettaglio necessario.

Se ci pensi, questo è esattamente ciò che il file system sta facendo comunque. Un file è un'astrazione. Alla base è solo una raccolta di punti su un disco. Tutte queste operazioni come la creazione di un file, l'eliminazione di un file o la modifica di un file sono solo il file system che gestisce gli elenchi di spot. Quello che stai chiedendo è che il file system condivida le informazioni con te mentre esegue le sue mansioni di gestione.

A un certo livello ci sono chiamate di libreria come stat e inotify, ma queste sono solo impostazioni del sistema operativo di livello inferiore o delle chiamate del driver di dispositivo. Puoi attingere anche a quelli. Nei "vecchi tempi" avresti dovuto scrivere degli hook di interrupt per monitorare le chiamate del sistema operativo. Ora può essere fornita una sofisticata API per l'aggancio al file system. Vedi, ad esempio, questo articolo sulla API del file system transazionale NTFS . Mi sono anche imbattuto in questo articolo " Interceptor VFS: Tracciare dinamicamente le operazioni del file system in ambienti reali " che discute la progettazione di uno strumento per tracciare le operazioni del file system.

    
risposta data 11.05.2012 - 06:15
fonte
1

Potresti leggere il file in te stesso prima di impostare il tuo inotify, quindi ogni volta che ottieni un evento, diff il file con la tua copia memorizzata e vedi quanto è cambiato. In un semplice esempio di bash con inotify-tools installati sarebbe qualcosa di simile (con il file che stai guardando come primo parametro):

#!/bin/bash
TEMPFILE=/tmp/${0}_${RANDOM}_$$.tmp
cp $1 $TEMPFILE
while true; do
   inotifywait $1
   changesize='diff $1 $TEMPFILE | wc -l'
   if test $changesize -gt 10 ; then
       echo "Big change"
   else
        echo "Minor edit"
fi

NOTA: Questo è un esempio, trattalo come pseudocodice, non l'ho testato per errori di sintassi e così adattare prima dell'uso.

    
risposta data 28.02.2013 - 23:52
fonte

Leggi altre domande sui tag