docs: def run(self):
          # dynamic import for this command only to not need these in usual python case...
          import git
          import yaml
  
          """runner"""
          repo_path = tempfile.mkdtemp(prefix='rosdevelop-' + os.path.dirname(__file__))  # TODO get actual package name ?
          print("Getting ROS release repo in {0}...".format(repo_path))
          rosrelease_repo = git.Repo.clone_from('https://github.com/asmodehn/pyzmp-rosrelease.git', repo_path)
  
          # Reset our working tree to master
          origin = rosrelease_repo.remotes.origin
          rosrelease_repo.remotes.origin.fetch()  # assure we actually have data. fetch() returns useful information
          # Setup a local tracking branch of a remote branch
          rosrelease_repo.create_head('master', origin.refs.master).set_tracking_branch(origin.refs.master).checkout()
  
          print("Reading tracks.yaml...")
          with open(os.path.join(rosrelease_repo.working_tree_dir, 'tracks.yaml'), 'r') as tracks:
              try:
                  tracks_dict = yaml.load(tracks)
              except yaml.YAMLError as exc:
                  raise
  
          patch_dir = tracks_dict.get('tracks', {}).get('indigo', {}).get('patches', {})
  
          print("Found patches for indigo in {0}".format(patch_dir))
          src_files = os.listdir(os.path.join(rosrelease_repo.working_tree_dir, patch_dir))
  
          working_repo = git.Repo(os.path.dirname(os.path.abspath(__file__)))
  
          # adding patched files to ignore list if needed (to prevent accidental commit of patch)
          # => BETTER if the patch do not erase previous file. TODO : fix problem with both .travis.yml
          with open(os.path.join(working_repo.working_tree_dir, '.gitignore'), 'a+') as gitignore:
              skipit = []
              for line in gitignore:
                  if line in src_files:
                      skipit += line
                  else:  # not found, we are at the eof
                      for f in src_files:
                          if f not in skipit:
                              gitignore.write(f+'\n')  # append missing data
  
          working_repo.git.add(['.gitignore'])  # adding .gitignore to the index so git applies it (and hide new files)
  
          for file_name in src_files:
              print("Patching {0}".format(file_name))
              full_file_name = os.path.join(rosrelease_repo.working_tree_dir, patch_dir, file_name)
              if os.path.isfile(full_file_name):
                  # Special case for package.xml and version template string
                  if file_name == 'package.xml':
                      with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'package.xml'), "wt") as fout:
                          with open(full_file_name, "rt") as fin:
                              for line in fin:
                                  fout.write(line.replace(':{version}', __version__))  # TODO: proper template engine ?
                  else:
                      shutil.copy(full_file_name, os.path.dirname(os.path.abspath(__file__)))
  
          sys.exit()