2015-01-30 25 views
15

Cosa fa git quando si avvia l'operazione di checkout? Scrive un file di blocco o qualcosa del genere?Pausa di osservatori di file fino al check-out git completo

Io uso fiato, e mi piacerebbe che "mettere in pausa" gli osservatori se git è attivamente eseguendo un'operazione di cassa.

sto bene con possibilmente dover "salvare nuovamente" qualcosa a calci il file watcher di nuovo in marcia.

risposta

6

La funzione gulp.watch() restituisce un oggetto che ha, tra le altre cose, un metodo end() si può chiamare - vedi la definizione nel modulo glob-watcher.

Si potrebbe fare qualcosa in queste righe:

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

Così abbiamo mantenere un riferimento all'oggetto osservatore quando si inizia a guardare, e hanno un compito di fermare l'osservatore se in esecuzione. La nostra attività Git dipende da watch:stop per iniziare, quindi avvia il checkout Git, con una richiamata per quando è stata completata. La richiamata avvia l'attività watch:start, e quando ciò è fatto, finalmente attiviamo la funzione cb per indicare che git:checkout è terminato!

Un'alternativa potrebbe utilizzare il add(pattern) e remove(pattern) sull'oggetto orologio per spegnerlo e riaccendere invece di distruggere l'oggetto e ricreando esso.

+0

Questo è fantastico! Tranne che non sto dando il via a git dall'interno del copione. ... E, gli spettatori di Gulp stanno dando il via ai compiti ingoiati perché git checkout sta riscrivendo i file di lavoro in copia. Sto cercando un modo per verificare prima se un checkout git è attivo (come perché forse esiste un file .git/checkout.lock o qualcosa di simile?) E impedisce al watcher di eseguire attività temporaneamente fino a quando il checkout git è finito riscrivendo la copia di lavoro – enorl76

+0

Beh c'è un meccanismo di lock file - vedi [questo documento] (https://github.com/git/git/blob/master/Documentation/technical/api-lockfile.txt) per i dettagli tecnici. Ma Git non sta usando un file di blocco per le operazioni di base, sembra che sia usato solo per compiti più lunghi come 'git rebase'. Inoltre non smette di leggere le azioni, in quanto dovrebbe mantenere le cose coerenti. – spiralx

+0

Se si ha il controllo del processo Git, allora sarebbe possibile avere il ricevitore Gulp in ascolto su un socket e accettare i messaggi "suspend" e "resume". È possibile inviare la sospensione prima del processo Git e quindi riprendere dopo averlo terminato. – spiralx