Add a 'clear' command to the Google taskqueue sample.
Fix the handling of per-command flags so that the help displays
correctly.
diff --git a/samples/gtaskqueue_sample/gtaskqueue/gtaskqueue b/samples/gtaskqueue_sample/gtaskqueue/gtaskqueue
old mode 100644
new mode 100755
diff --git a/samples/gtaskqueue_sample/gtaskqueue/task_cmds.py b/samples/gtaskqueue_sample/gtaskqueue/task_cmds.py
index 4adea2b..5bbc2ad 100644
--- a/samples/gtaskqueue_sample/gtaskqueue/task_cmds.py
+++ b/samples/gtaskqueue_sample/gtaskqueue/task_cmds.py
@@ -55,18 +55,21 @@
     """Lease a new task from the queue."""
 
     def __init__(self, name, flag_values):
+        flags.DEFINE_integer('lease_secs',
+                             None,
+                             'The lease for the task in seconds',
+                             flag_values=flag_values)
+        flags.DEFINE_integer('num_tasks',
+                             1,
+                             'The number of tasks to lease',
+                             flag_values=flag_values)
+        flags.DEFINE_integer('payload_size_to_display',
+                             2 * 1024 * 1024,
+                             'Size of the payload for leased tasks to show',
+                             flag_values=flag_values)
         super(LeaseTaskCommand, self).__init__(name,
                                                flag_values,
                                                need_task_flag=False)
-        flags.DEFINE_integer('lease_secs',
-                             None,
-                             'The lease for the task in seconds')
-        flags.DEFINE_integer('num_tasks',
-                             1,
-                             'The number of tasks to lease')
-        flags.DEFINE_integer('payload_size_to_display',
-                             2 * 1024 * 1024,
-                             'Size of the payload for leased tasks to show')
 
     def build_request(self, task_api, flag_values):
         """Build a request to lease a pending task from the TaskQueue.
@@ -143,8 +146,67 @@
                              taskqueue=flag_values.taskqueue_name)
 
 
+class ClearTaskQueueCommand(GoogleTaskCommand):
+    """Deletes all tasks in a queue (default to a max of 100)."""
+
+
+    def __init__(self, name, flag_values):
+        flags.DEFINE_integer('max_delete', 100, 'How many to clear at most',
+                             flag_values=flag_values)
+        super(ClearTaskQueueCommand, self).__init__(name,
+                                                    flag_values,
+                                                    need_task_flag=False)
+
+    def run_with_api_and_flags(self, api, flag_values):
+        """Run the command, returning the result.
+
+        Args:
+            api: The handle to the Google TaskQueue API.
+            flag_values: The parsed command flags.
+        Returns:
+            The result of running the command.
+        """
+        tasks_api = api.tasks()
+        self._flag_values = flag_values
+        self._to_delete = flag_values.max_delete
+        total_deleted = 0
+        while self._to_delete > 0:
+          n_deleted = self._delete_a_batch(tasks_api)
+          if n_deleted <= 0:
+            break
+          total_deleted += n_deleted
+        return {'deleted': total_deleted}
+
+    def _delete_a_batch(self, tasks):
+        """Delete a batch of tasks.
+
+        Since the list method only gives us back 100 at a time, we may have
+        to call it several times to clear the entire queue.
+
+        Args:
+            tasks: The handle to the Google TaskQueue API Tasks resource.
+        Returns:
+            The number of tasks deleted.
+        """
+        list_request = tasks.list(project=self._flag_values.project_name,
+                                  taskqueue=self._flag_values.taskqueue_name)
+        result = list_request.execute()
+        n_deleted = 0
+        if result:
+          for task in result.get('items', []):
+            if self._to_delete > 0:
+              self._to_delete -= 1
+              n_deleted += 1
+              print 'Deleting: %s' % task['id']
+              tasks.delete(project=self._flag_values.project_name,
+                           taskqueue=self._flag_values.taskqueue_name,
+                           task=task['id']).execute()
+        return n_deleted
+
+
 def add_commands():
     appcommands.AddCmd('listtasks', ListTasksCommand)
     appcommands.AddCmd('gettask', GetTaskCommand)
     appcommands.AddCmd('deletetask', DeleteTaskCommand)
     appcommands.AddCmd('leasetask', LeaseTaskCommand)
+    appcommands.AddCmd('clear', ClearTaskQueueCommand)
diff --git a/samples/gtaskqueue_sample/gtaskqueue/taskqueue_cmds.py b/samples/gtaskqueue_sample/gtaskqueue/taskqueue_cmds.py
index 99c3f2a..f21840a 100644
--- a/samples/gtaskqueue_sample/gtaskqueue/taskqueue_cmds.py
+++ b/samples/gtaskqueue_sample/gtaskqueue/taskqueue_cmds.py
@@ -33,10 +33,11 @@
     """Get properties of an existing task queue."""
 
     def __init__(self, name, flag_values):
-        super(GetTaskQueueCommand, self).__init__(name, flag_values)
         flags.DEFINE_boolean('get_stats',
                              False,
-                             'Whether to get Stats')
+                             'Whether to get Stats',
+                             flag_values=flag_values)
+        super(GetTaskQueueCommand, self).__init__(name, flag_values)
 
     def build_request(self, taskqueue_api, flag_values):
         """Build a request to get properties of a TaskQueue.