import nautilus, os, svn.core, svn.client, svn.wc

EMBLEMS = {
  svn.wc.svn_wc_status_added: 'cvs-added',
  svn.wc.svn_wc_status_deleted: 'cvs-removed',
  svn.wc.svn_wc_status_modified: 'cvs-modified',
  svn.wc.svn_wc_status_conflicted: 'cvs-conflict',
  #svn.wc.svn_wc_status_unversioned: 'cvs-new-file',
  #svn.wc.svn_wc_status_missing: 'cvs-new-file',
  svn.wc.svn_wc_status_normal: 'cvs-controlled',
  #svn.wc.svn_wc_status_none: 'cvs-controlled'
}

class SvnEmblem(nautilus.InfoProvider):
  def __init__(self):
    self.folder = None
    self.issvn = False
    self.files = {}

  def update_file_info (self, f):
    pth = f.get_uri()[7:]
    this_folder = os.path.split(pth)[0]
    if this_folder != self.folder: 
      self.folder = None
    if self.folder and not self.issvn: return
    if f.get_uri_scheme() != 'file': return
    if not self.folder:
      self.folder = this_folder
      self.issvn = os.path.isdir(os.path.join(self.folder,".svn"))
      if not self.issvn: return
      svn.core.run_app(self.do_status, self.folder, 1)
    
    try:  
      f.add_emblem(self.files[os.path.split(pth)[1]])
    except KeyError:
      pass
    
  def do_status(self, pool, wc_path, verbose):
    # Calculate the length of the input working copy path.
    wc_path_len = len(wc_path)

    # Build a client context baton.
    ctx = svn.client.svn_client_ctx_t()

    def _status_callback(path, status, root_path_len=wc_path_len):
      """A callback function for svn_client_status."""
      if status.text_status in EMBLEMS:
        self.files[path[wc_path_len + 1:]] = EMBLEMS[status.text_status]
      elif status.prop_status in EMBLEMS:
        self.files[path[wc_path_len + 1:]] = EMBLEMS[status.prop_status]
        
    # Do the status crawl, using _status_callback() as our callback function.
    recurse_dirs = 0
    svn.client.svn_client_status(wc_path, None, _status_callback,
                                 recurse_dirs, verbose, 0, 0, ctx, pool)
