code: def _from_line(cls, remote, line):
          
          control_character, from_to, summary = line.split('\t', 3)
          flags = 0
  
          # control character handling
          try:
              flags |= cls._flag_map[control_character]
          except KeyError:
              raise ValueError("Control character %r unknown as parsed from line %r" % (control_character, line))
          # END handle control character
  
          # from_to handling
          from_ref_string, to_ref_string = from_to.split(':')
          if flags & cls.DELETED:
              from_ref = None
          else:
              from_ref = Reference.from_path(remote.repo, from_ref_string)
  
          # commit handling, could be message or commit info
          old_commit = None
          if summary.startswith('['):
              if "[rejected]" in summary:
                  flags |= cls.REJECTED
              elif "[remote rejected]" in summary:
                  flags |= cls.REMOTE_REJECTED
              elif "[remote failure]" in summary:
                  flags |= cls.REMOTE_FAILURE
              elif "[no match]" in summary:
                  flags |= cls.ERROR
              elif "[new tag]" in summary:
                  flags |= cls.NEW_TAG
              elif "[new branch]" in summary:
                  flags |= cls.NEW_HEAD
              # uptodate encoded in control character
          else:
              # fast-forward or forced update - was encoded in control character,
              # but we parse the old and new commit
              split_token = "..."
              if control_character == " ":
                  split_token = ".."
              old_sha, new_sha = summary.split(' ')[0].split(split_token)  # @UnusedVariable
              # have to use constructor here as the sha usually is abbreviated
              old_commit = old_sha
          # END message handling
  
          return PushInfo(flags, from_ref, to_ref_string, remote, old_commit, summary)
docs: Create a new PushInfo instance as parsed from line which is expected to be like
              refs/heads/master:refs/heads/master 05d2687..1d0568e as bytes