2015-01-30 6 views
15

Was macht git beim Starten des Kassenvorgangs? Schreibt es eine Sperrdatei oder etwas?Pausieren von Dateiwatchern, bis die Überprüfung abgeschlossen ist

Ich benutze Schluck, und ich möchte es die Beobachter "pausieren", wenn Git aktiv einen Checkout-Vorgang ausführt.

Ich bin in Ordnung mit möglicherweise "neu zu speichern" etwas, um den Dateiwächter zurück in Gang zu treten.

Antwort

6

Die Funktion gulp.watch() gibt ein Objekt zurück, das unter anderem eine end() Methode hat, die Sie aufrufen können - siehe Definition im Modul .

Sie könnten etwas in dieser Richtung tun:

var gulp = require('gulp'); 

function doGitCheckout(callback) { 
    console.log('doing checkout...'); 
    setTimeout(function() { 
    console.log('done checkout...'); 
    callback(); 
    }, 1000); 
} 

var watcher; 

gulp.task('watch:start', function() { 
    if (!watcher) { 
    watcher = gulp.watch('dist/**/*', ['build']); 
    console.log('started watcher'); 
    } 
}); 

gulp.task('watch:stop', function() { 
    if (watcher) { 
    watcher.end(); 
    watcher = null; 
    console.log('stopped watcher'); 
    } 
}); 


gulp.task('git:checkout', ['watch:stop'], function(cb) { 
    console.log('isWatching = ' + !!watcher); 

    // Start the Git checkout... 
    doGitCheckout(function() { 
    // The Git checkout is finished! 
    gulp.start('watch:start', function() { 
     cb(); 
    }); 
    }); 
}); 

gulp.task('default', ['watch:start', 'git:checkout']); 

Gist with this code here

So halten wir einen Verweis auf das Beobachter-Objekt, wenn wir anfangen zu beobachten, und haben eine Aufgabe, die Beobachter zu stoppen, wenn ausgeführt wird. Unsere Git-Aufgabe hängt von watch:stop ab, um zu beginnen, und startet dann das Git-Checkout mit einem Rückruf, wenn es fertig ist. Der Callback startet die Aufgabe watch:start, und wenn das erledigt ist, lösen wir schließlich die Funktion cb aus, um anzuzeigen, dass git:checkout beendet ist!

Eine Alternative könnte sein, die add(pattern) und remove(pattern) auf dem Watch-Objekt zu verwenden, um sie aus- und wieder einzuschalten, anstatt das Objekt zu zerstören und neu zu erstellen.

+0

Das ist großartig! Abgesehen davon, dass ich Git nicht aus dem Schluck-Skript herausstoße. ... Und die Schluckbeobachter starten Schluckaufgaben, weil Git Checkout Arbeitskopie-Dateien umschreibt. Ich suche nach einer Möglichkeit, zuerst zu überprüfen, ob ein Git-Checkout aktiv ist (weil vielleicht eine .git/checkout.lock-Datei existiert oder etwas Ähnliches?) Und verhindert, dass der Watcher Aufgaben vorübergehend ausführt, bis das git-Checkout fertig ist Die Arbeitskopie – enorl76

+0

Nun gibt es einen Sperrdateimechanismus - siehe [dieses Dokument] (https://github.com/git/git/blob/master/Documentation/technical/api-lockfile.txt) für technische Details. Aber Git verwendet keine Sperrdatei für grundlegende Operationen, es sieht so aus, als ob es nur für längere Aufgaben wie 'git rebase' verwendet wird. Es stoppt auch nicht Leseaktionen, da es Dinge konsistent halten soll. – spiralx

+0

Wenn Sie die Kontrolle über den Git-Prozess haben, ist es möglich, dass der Gulp Watcher auf einen Socket hört und "suspend" und "resume" Nachrichten akzeptiert. Sie können Suspend vor dem Git-Prozess senden und dann fortsetzen, nachdem es fertig ist. – spiralx