make-archive
Version:
produce mountable archives with ease (OSX only, sorry)
89 lines (74 loc) • 3.82 kB
text/coffeescript
############################################################################################################
njs_path = require 'path'
njs_fs = require 'fs'
MKDIRP = require 'mkdirp'
#===========================================================================================================
# FILE SYSTEM
#-----------------------------------------------------------------------------------------------------------
### TAINT belongs to ROUTE ###
@resolve_route = ( route ) ->
return njs_path.resolve process.cwd(), route
#-----------------------------------------------------------------------------------------------------------
@mkdirp = ( route, handler = null ) ->
### TAINT should support MKDIRP options ###
return MKDIRP.sync route, handler if handler?
MKDIRP route, handler
#-----------------------------------------------------------------------------------------------------------
@names_in_folder = ( route, handler ) ->
return njs_fs.readdirSync route unless handler?
njs_fs.readdir route, handler
return null
#-----------------------------------------------------------------------------------------------------------
@locators_in_folder = ( route, handler ) ->
return ( njs_path.join route, name for name in @names_in_folder route ) unless handler?
@names_in_folder route, ( error, names ) ->
handler error, null if error?
handler null, ( njs_path.join route, name for name in names )
#-----------------------------------------------------------------------------------------------------------
@all_locators_in_folder = ( route, handler ) ->
### NOTE: this version does NOT follow symlinks!
###
unless handler?
R = []
for locator in @locators_in_folder route
R.push locator
if ( njs_fs.lstatSync locator ).isDirectory()
R.splice R.length, 0, ( @all_locators_in_folder locator )...
return R
throw new Error 'asynchronous FS/all-locators-in-folder not implemented'
#-----------------------------------------------------------------------------------------------------------
@get_date_of_newest_object_in_folder = ( route, handler ) ->
### NOTE: this version does NOT follow symlinks!
###
unless handler?
locators = @all_locators_in_folder route
throw new Error "no entries in folder #{route}" if locators.length == 0
R = 0
for locator in locators
R = Math.max ( njs_fs.lstatSync locator ).mtime * 1, R
return new Date R
throw new Error 'asynchronous FS/get-date-of-newest-object-in-folder not implemented'
#-----------------------------------------------------------------------------------------------------------
@get_timestamp_of_newest_object_in_folder = ( route, handler ) ->
unless handler?
R = ( @get_date_of_newest_object_in_folder route ).toISOString()
R = R.replace 'T', '-'
R = R.replace /:/g, '-'
R = R.replace /\..*$/g, ''
return R
throw new Error 'asynchronous FS/get-iso-timestamp-of-newest-object-in-folder not implemented'
#-----------------------------------------------------------------------------------------------------------
@_safe_get_fs_stat = ( route, follow_links = yes ) ->
try
return if follow_links then njs_fs.statSync route else njs_fs.lstatSync route
catch error
throw error unless ( error[ 'message' ].indexOf 'ENOENT, no such file or directory ' ) == 0
return null
#-----------------------------------------------------------------------------------------------------------
@exists = ( route ) ->
return ( @_safe_get_fs_stat route )?
#-----------------------------------------------------------------------------------------------------------
@is_folder = ( route ) ->
stat = @_safe_get_fs_stat route
return false if stat is null
return stat.isDirectory()