| Index: appengine/swarming/handlers_frontend.py | 
| diff --git a/appengine/swarming/handlers_frontend.py b/appengine/swarming/handlers_frontend.py | 
| index 158d74e69cf2a76feb3f490e776fd3193791e53c..22088e7f4fb0642f6ffa0cc46532355bd2d7210e 100644 | 
| --- a/appengine/swarming/handlers_frontend.py | 
| +++ b/appengine/swarming/handlers_frontend.py | 
| @@ -616,6 +616,17 @@ class BaseTaskHandler(auth.AuthenticatingHandler): | 
| class TaskHandler(BaseTaskHandler): | 
| """Show the full text of a task request and its result.""" | 
|  | 
| +  @staticmethod | 
| +  def packages_grouped_by_path(flat_packages): | 
| +    """Returns sorted [(path, [PinInfo, ...])]. | 
| + | 
| +    Used by user_task.html. | 
| +    """ | 
| +    retval = collections.defaultdict(list) | 
| +    for pkg in flat_packages: | 
| +      retval[pkg.path].append(pkg) | 
| +    return sorted(retval.iteritems()) | 
| + | 
| @auth.autologin | 
| @auth.require(acl.is_user) | 
| def get(self, task_id): | 
| @@ -663,9 +674,27 @@ class TaskHandler(BaseTaskHandler): | 
| parent_task = parent_task_future.get_result() | 
| children_tasks = [c.get_result() for c in children_tasks_futures] | 
|  | 
| +    cipd = None | 
| +    if request.properties.cipd_input: | 
| +      cipd = { | 
| +        'server': request.properties.cipd_input.server, | 
| +        'client_package': request.properties.cipd_input.client_package, | 
| +        'packages': self.packages_grouped_by_path( | 
| +            request.properties.cipd_input.packages), | 
| +      } | 
| + | 
| +    cipd_pins = None | 
| +    if result.cipd_pins: | 
| +      cipd_pins = { | 
| +        'client_package': result.cipd_pins.client_package, | 
| +        'packages': self.packages_grouped_by_path(result.cipd_pins.packages), | 
| +      } | 
| + | 
| params = { | 
| 'bot': bot_future.get_result() if bot_future else None, | 
| 'children_tasks': children_tasks, | 
| +      'cipd': cipd, | 
| +      'cipd_pins': cipd_pins, | 
| 'is_admin': acl.is_admin(), | 
| 'is_gae_admin': users.is_current_user_admin(), | 
| 'is_privileged_user': acl.is_privileged_user(), | 
|  |