@@ -310,6 +310,124 @@ Bucket.prototype.delete = function(callback) {
310310 this . makeReq_ ( 'DELETE' , '' , null , true , callback ) ;
311311} ;
312312
313+ /**
314+ * Iterate over the bucket's files, calling `file.delete()` on each.
315+ *
316+ * <strong>This is not an atomic request.</strong> A delete attempt will be made
317+ * for each file individually. Any one can fail, in which case only a portion of
318+ * the files you intended to be deleted would have.
319+ *
320+ * Operations are performed in parallel, up to 10 at once. The first error
321+ * breaks the loop and will execute the provided callback with it. Specify
322+ * `{ force: true }` to suppress the errors until all files have had a chance to
323+ * be processed.
324+ *
325+ * The `query` object passed as the first argument will also be passed to
326+ * {module:storage/bucket#getFiles}.
327+ *
328+ * @param {object= } query - Query object. See {module:storage/bucket#getFiles}
329+ * for all of the supported properties.
330+ * @param {boolean } query.force - Supress errors until all files have been
331+ * processed.
332+ * @param {function } callback - The callback function.
333+ * @param {?error|?error[] } callback.err - An API error or array of errors from
334+ * files that were not able to be deleted.
335+ *
336+ * @example
337+ * //-
338+ * // Delete all of the files in the bucket.
339+ * //-
340+ * bucket.deleteFiles(function(err) {});
341+ *
342+ * //-
343+ * // By default, if a file cannot be deleted, this method will stop deleting
344+ * // files from your bucket. You can override this setting with `force: true`.
345+ * //-
346+ * bucket.deleteFiles({
347+ * force: true
348+ * }, function(errors) {
349+ * // `errors`:
350+ * // Array of errors if any occurred, otherwise null.
351+ * });
352+ *
353+ * //-
354+ * // The first argument to this method acts as a query to
355+ * // {module:storage/bucket#getFiles}. As an example, you can delete files
356+ * // which match a prefix.
357+ * //-
358+ * bucket.deleteFiles({
359+ * prefix: 'images/'
360+ * }, function(err) {
361+ * if (!err) {
362+ * // All files in the `images` directory have been deleted.
363+ * }
364+ * });
365+ */
366+ Bucket . prototype . deleteFiles = function ( query , callback ) {
367+ if ( util . is ( query , 'function' ) ) {
368+ callback = query ;
369+ query = { } ;
370+ }
371+
372+ query = query || { } ;
373+
374+ var self = this ;
375+
376+ var MAX_PARALLEL_LIMIT = 10 ;
377+ var errors = [ ] ;
378+
379+ // Start deleting files, iteratively fetching more as necessary.
380+ deleteFiles ( query , function ( err ) {
381+ if ( err || errors . length > 0 ) {
382+ callback ( err || errors ) ;
383+ return ;
384+ }
385+
386+ callback ( null ) ;
387+ } ) ;
388+
389+ function deleteFiles ( query , callback ) {
390+ self . getFiles ( query , function ( err , files , nextQuery ) {
391+ if ( err ) {
392+ callback ( err ) ;
393+ return ;
394+ }
395+
396+ // Iterate through each file and attempt to delete it.
397+ async . eachLimit ( files , MAX_PARALLEL_LIMIT , deleteFile , function ( err ) {
398+ if ( err ) {
399+ callback ( err ) ;
400+ return ;
401+ }
402+
403+ if ( nextQuery ) {
404+ deleteFiles ( nextQuery , callback ) ;
405+ return ;
406+ }
407+
408+ callback ( ) ;
409+ } ) ;
410+ } ) ;
411+ }
412+
413+ function deleteFile ( file , callback ) {
414+ file . delete ( function ( err ) {
415+ if ( err ) {
416+ if ( query . force ) {
417+ errors . push ( err ) ;
418+ callback ( ) ;
419+ return ;
420+ }
421+
422+ callback ( err ) ;
423+ return ;
424+ }
425+
426+ callback ( ) ;
427+ } ) ;
428+ }
429+ } ;
430+
313431/**
314432 * Create a File object. See {module:storage/file} to see how to handle
315433 * the different use cases you may have.
@@ -849,7 +967,7 @@ Bucket.prototype.makeAllFilesPublicPrivate_ = function(options, callback) {
849967 var updatedFiles = [ ] ;
850968
851969 // Start processing files, iteratively fetching more as necessary.
852- processFiles ( { } , function ( err ) {
970+ processFiles ( { } , function ( err ) {
853971 if ( err || errors . length > 0 ) {
854972 callback ( err || errors , updatedFiles ) ;
855973 return ;
0 commit comments