class_docstr: Push a dataset to a known :term:`sibling`.
  
  This makes a saved state of a dataset available to a sibling or special
  remote data store of a dataset. Any target sibling must already exist and
  be known to the dataset.
  
  || REFLOW >>
  By default, all files tracked in the last saved state (of the current
  branch) will be copied to the target location. Optionally, it is possible
  to limit a push to changes relative to a particular point in the version
  history of a dataset (e.g. a release tag) using the
  [CMD: --since CMD][PY: since PY] option in conjunction with the
  specification of a reference dataset. In recursive mode subdatasets will also be
  evaluated, and only those subdatasets are pushed where a change was
  recorded that is reflected in the current state of the top-level reference
  dataset.
  << REFLOW ||
  
  .. note::
    Power-user info: This command uses :command:`git push`, and :command:`git
    annex copy` to push a dataset. Publication targets are either configured
    remote Git repositories, or git-annex special remotes (if they support
    data upload).
class_docstr_tok: ["Push","a","dataset","to","a","known",":","term",":","`","sibling","`",".","This","makes","a","saved","state","of","a","dataset","available","to","a","sibling","or","special","remote","data","store","of","a","dataset",".","Any","target","sibling","must","already","exist","and","be","known","to","the","dataset",".","||","REFLOW",">",">","By","default",",","all","files","tracked","in","the","last","saved","state","(","of","the","current","branch",")","will","be","copied","to","the","target","location",".","Optionally",",","it","is","possible","to","limit","a","push","to","changes","relative","to","a","particular","point","in","the","version","history","of","a","dataset","(","e.g",".","a","release","tag",")","using","the","[","CMD",":","--","since","CMD","]","[","PY",":","since","PY","]","option","in","conjunction","with","the","specification","of","a","reference","dataset",".","In","recursive","mode","subdatasets","will","also","be","evaluated",",","and","only","those","subdatasets","are","pushed","where","a","change","was","recorded","that","is","reflected","in","the","current","state","of","the","top-level","reference","dataset",".","<","<","REFLOW","||","..","note",":",":","Power-user","info",":","This","command","uses",":","command",":","`","git","push","`",",","and",":","command",":","`","git","annex","copy","`","to","push","a","dataset",".","Publication","targets","are","either","configured","remote","Git","repositories",",","or","git-annex","special","remotes","(","if","they","support","data","upload",")","."]
code: def custom_result_summary_renderer(
      results, action_summary
  ):  # pragma: more cover
      render_action_summary(action_summary)
      # report on any hints at the end
      # get all unique hints
      hints = set([r.get("hints", None) for r in results])
      hints = [hint for hint in hints if hint is not None]
      if hints:
          from datalad.ui import ui
          from datalad.support import ansi_colors
  
          intro = ansi_colors.color_word("Hints: ", ansi_colors.YELLOW)
          ui.message(intro)
          [
              ui.message(
                  "{}: {}".format(
                      ansi_colors.color_word(
                          id + 1, ansi_colors.YELLOW
                      ),
                      hint,
                  )
              )
              for id, hint in enumerate(hints)
          ]
  
imports: from itertools import chain
  import logging
  import re
  from datalad.interface.base import Interface, build_doc, eval_results
  from datalad.interface.common_opts import jobs_opt, recursion_limit, recursion_flag
  from datalad.interface.utils import render_action_summary
  from datalad.interface.results import annexjson2result
  from datalad.log import log_progress
  from datalad.support.annexrepo import AnnexRepo
  from datalad.support.gitrepo import GitRepo
  from datalad.support.param import Parameter
  from datalad.support.constraints import EnsureStr, EnsureNone, EnsureChoice
  from datalad.support.exceptions import CommandError
  from datalad.utils import Path, ensure_list, todo_interface_for_extensions
  from datalad.distribution.dataset import Dataset, EnsureDataset, datasetmethod, require_dataset, resolve_path
  from datalad.core.local.diff import diff_dataset
label_desc: Use image node_id 2 for calling the Push obj's underlying member method code with example usage: obj.custom_result_summary_renderer(results, action_summary) without return types