|  | @@ -270,11 +270,12 @@ from importlib import import_module
 | 
	
		
			
				|  |  |  from kombu.utils import json
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from celery.app import defaults
 | 
	
		
			
				|  |  | -from celery.five import string_t, values
 | 
	
		
			
				|  |  | +from celery.five import keys, string_t, values
 | 
	
		
			
				|  |  |  from celery.platforms import EX_OK, EX_FAILURE, EX_UNAVAILABLE, EX_USAGE
 | 
	
		
			
				|  |  |  from celery.utils import term
 | 
	
		
			
				|  |  |  from celery.utils import text
 | 
	
		
			
				|  |  |  from celery.utils.functional import pass1
 | 
	
		
			
				|  |  | +from celery.utils.text import str_to_list
 | 
	
		
			
				|  |  |  from celery.utils.timeutils import maybe_iso8601
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # Cannot use relative imports here due to a Windows issue (#1111).
 | 
	
	
		
			
				|  | @@ -462,25 +463,42 @@ class purge(Command):
 | 
	
		
			
				|  |  |      option_list = Command.option_list + (
 | 
	
		
			
				|  |  |          Option('--force', '-f', action='store_true',
 | 
	
		
			
				|  |  |                 help='Do not prompt for verification'),
 | 
	
		
			
				|  |  | +        Option('--queues', '-Q', default=[],
 | 
	
		
			
				|  |  | +               help='Comma separated list of queue names to purge.'),
 | 
	
		
			
				|  |  | +        Option('--exclude-queues', '-X', default=[],
 | 
	
		
			
				|  |  | +               help='Comma separated list of queues names not to purge.')
 | 
	
		
			
				|  |  |      )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def run(self, force=False, **kwargs):
 | 
	
		
			
				|  |  | -        names = list(sorted(self.app.amqp.queues.keys()))
 | 
	
		
			
				|  |  | +    def run(self, force=False, queues=None, exclude_queues=None, **kwargs):
 | 
	
		
			
				|  |  | +        queues = set(str_to_list(queues or []))
 | 
	
		
			
				|  |  | +        exclude = set(str_to_list(exclude_queues or []))
 | 
	
		
			
				|  |  | +        names = (queues or set(keys(self.app.amqp.queues))) - exclude
 | 
	
		
			
				|  |  |          qnum = len(names)
 | 
	
		
			
				|  |  | -        if not force:
 | 
	
		
			
				|  |  | -            self.out(self.warn_prelude.format(
 | 
	
		
			
				|  |  | -                warning=self.colored.red('WARNING'),
 | 
	
		
			
				|  |  | -                queues=text.pluralize(qnum, 'queue'), names=', '.join(names),
 | 
	
		
			
				|  |  | -            ))
 | 
	
		
			
				|  |  | -            if self.ask(self.warn_prompt, ('yes', 'no'), 'no') != 'yes':
 | 
	
		
			
				|  |  | -                return
 | 
	
		
			
				|  |  | -        messages = self.app.control.purge()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        messages = None
 | 
	
		
			
				|  |  | +        if names:
 | 
	
		
			
				|  |  | +            if not force:
 | 
	
		
			
				|  |  | +                self.out(self.warn_prelude.format(
 | 
	
		
			
				|  |  | +                    warning=self.colored.red('WARNING'),
 | 
	
		
			
				|  |  | +                    queues=text.pluralize(qnum, 'queue'),
 | 
	
		
			
				|  |  | +                    names=', '.join(sorted(names)),
 | 
	
		
			
				|  |  | +                ))
 | 
	
		
			
				|  |  | +                if self.ask(self.warn_prompt, ('yes', 'no'), 'no') != 'yes':
 | 
	
		
			
				|  |  | +                    return
 | 
	
		
			
				|  |  | +            with self.app.connection_for_write() as conn:
 | 
	
		
			
				|  |  | +                messages = sum(self._purge(conn, queue) for queue in names)
 | 
	
		
			
				|  |  |          fmt = self.fmt_purged if messages else self.fmt_empty
 | 
	
		
			
				|  |  |          self.out(fmt.format(
 | 
	
		
			
				|  |  |              mnum=messages, qnum=qnum,
 | 
	
		
			
				|  |  |              messages=text.pluralize(messages, 'message'),
 | 
	
		
			
				|  |  |              queues=text.pluralize(qnum, 'queue')))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    def _purge(self, conn, queue):
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            return conn.default_channel.queue_purge(queue) or 0
 | 
	
		
			
				|  |  | +        except conn.channel_errors:
 | 
	
		
			
				|  |  | +            return 0
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class result(Command):
 | 
	
		
			
				|  |  |      """Gives the return value for a given task id.
 |