in generator/src/main/groovy/generator/SiteGenerator.groovy [347:396]
static void main(String... args) {
def sourcesDir = args[0] as File
def outputDir = args[1] as File
def sitemapFilename = args[2]
def generator = new SiteGenerator(sourcesDir: sourcesDir, outputDir: outputDir, sitemapFilename: sitemapFilename)
System.setProperty('sitemapFilename', sitemapFilename)
boolean watchMode = args.length > 3 ? Boolean.valueOf(args[3]) : false
generator.generateSite()
if (watchMode) {
println "Started watch mode"
def watcher = FileSystems.default.newWatchService()
sourcesDir.toPath().register(watcher,
ENTRY_CREATE,
ENTRY_DELETE,
ENTRY_MODIFY)
sourcesDir.eachDirRecurse { File f ->
f.toPath().register(watcher,
ENTRY_CREATE,
ENTRY_DELETE,
ENTRY_MODIFY)
}
def existingDirectories = ['pages', 'layouts', 'includes', 'html', 'assets', 'css', 'fonts', 'img', 'js', 'vendor']
while (true) {
def key = watcher.take()
def pollEvents = (List<WatchEvent<Path>>) key.pollEvents()
def changed = pollEvents.collect { "${it.context()}".toString() }.join(', ')
// only generate when the event refers to the actual file modified / created / added
// as otherwise the watcher service generates two events:
// 1) one for directory containing the modified file, and
// 2) one for the actual file being modified
// this checks avoid getting two events for one change
if (existingDirectories.every { !changed.contains(it) }) {
try {
println "Regenerating site due to changes in: ${changed}"
// todo: selective regeneration
generator.generateSite()
} finally {
key.reset()
}
}
}
}
}