code: def name_to_object(repo, name, return_ref=False):
      
      hexsha = None
  
      # is it a hexsha ? Try the most common ones, which is 7 to 40
      if repo.re_hexsha_shortened.match(name):
          if len(name) != 40:
              # find long sha for short sha
              hexsha = short_to_long(repo.odb, name)
          else:
              hexsha = name
          # END handle short shas
      # END find sha if it matches
  
      # if we couldn't find an object for what seemed to be a short hexsha
      # try to find it as reference anyway, it could be named 'aaa' for instance
      if hexsha is None:
          for base in ('%s', 'refs/%s', 'refs/tags/%s', 'refs/heads/%s', 'refs/remotes/%s', 'refs/remotes/%s/HEAD'):
              try:
                  hexsha = SymbolicReference.dereference_recursive(repo, base % name)
                  if return_ref:
                      return SymbolicReference(repo, base % name)
                  # END handle symbolic ref
                  break
              except ValueError:
                  pass
          # END for each base
      # END handle hexsha
  
      # didn't find any ref, this is an error
      if return_ref:
          raise BadObject("Couldn't find reference named %r" % name)
      # END handle return ref
  
      # tried everything ? fail
      if hexsha is None:
          raise BadName(name)
      # END assert hexsha was found
  
      return Object.new_from_sha(repo, hex_to_bin(hexsha))
docs: :return: object specified by the given name, hexshas ( short and long )
          as well as references are supported
      :param return_ref: if name specifies a reference, we will return the reference
          instead of the object. Otherwise it will raise BadObject or BadName