code: def request_version_list(self, req, msg):
          
          versions = [
              ("katcp-protocol", (self.PROTOCOL_INFO, None)),
              ("katcp-library", ("katcp-python-%s" % katcp.__version__, katcp.__version__)),
              ("katcp-device", (self.version(), self.build_state())),
          ]
          extra_versions = sorted(self.extra_versions.items())
  
          for name, (version, build_state) in versions + extra_versions:
              if build_state is None:
                  inform_args = (name, version)
              else:
                  inform_args = (name, version, build_state)
              req.inform(*inform_args)
  
          num_versions = len(versions) + len(extra_versions)
          return req.make_reply("ok", str(num_versions))
docs: Request the list of versions of roles and subcomponents.
  
          Informs
          -------
          name : str
              Name of the role or component.
          version : str
              A string identifying the version of the component. Individual
              components may define the structure of this argument as they
              choose. In the absence of other information clients should
              treat it as an opaque string.
          build_state_or_serial_number : str
              A unique identifier for a particular instance of a component.
              This should change whenever the component is replaced or updated.
  
          Returns
          -------
          success : {'ok', 'fail'}
              Whether sending the version list succeeded.
          informs : int
              Number of #version-list inform messages sent.
  
          Examples
          --------
          ::
  
              ?version-list
              #version-list katcp-protocol 5.0-MI
              #version-list katcp-library katcp-python-0.4 katcp-python-0.4.1-py2
              #version-list katcp-device foodevice-1.0 foodevice-1.0.0rc1
              !version-list ok 3