#!/usr/bin/python

import sys, os, shutil
from cStringIO import StringIO

from svn.core import *
from svn.client import *
from svn.wc import *

svn_wc_status_kind_descrs = {
    svn_wc_status_none: '-',
    svn_wc_status_unversioned: '?',
    svn_wc_status_normal: ' ',
    svn_wc_status_added: 'A',
    svn_wc_status_missing: '!',
    svn_wc_status_deleted: 'D',
    svn_wc_status_replaced: 'R',
    svn_wc_status_modified: 'M',
    svn_wc_status_merged: 'G',
    svn_wc_status_conflicted: 'C',
    svn_wc_status_ignored: 'I',
    svn_wc_status_obstructed: '~',
    svn_wc_status_external: 'X',
    svn_wc_status_incomplete: '!',
}

def status_to_string(status):
  s = svn_wc_status_kind_descrs[status.text_status] \
    + svn_wc_status_kind_descrs[status.prop_status] \
    + (status.locked and "L" or " ") \
    + (status.copied and "+" or " ") \
    + (status.switched and "S" or " ") \
    + svn_wc_status_kind_descrs[status.repos_text_status] \
    + svn_wc_status_kind_descrs[status.repos_prop_status]
  return s

def aprapp_main(pool):

  ctx = svn_client_create_context(pool)

  HEAD = svn_opt_revision_t()
  HEAD.kind = svn_opt_revision_head

  # result_rev = svn_client_checkout(URL, path, revision, recurse, ctx, pool)
  try:
    shutil.rmtree('tmp-wc')
  except OSError:
    pass
  rev = svn_client_checkout('file:///svn/trunk', 'tmp-wc',
      HEAD, True, ctx, pool)
  print "Checked out r%d" % rev

  # result_rev = svn_client_update(path, revision, recurse, ctx, pool)
  r90 = svn_opt_revision_t()
  r90.kind = svn_opt_revision_number
  r90.value.number = 90
  rev = svn_client_update('tmp-wc', r90, True, ctx, pool)
  print "Updated to r%d" % rev

  # result_revs = svn_client_update2(paths, revision, recurse, ctx, pool)
  #upres = svn_client_update2(('tmp-wc',), HEAD, True, ctx, pool)
  #print "Update returned %s" % (upres,)

  # props = svn_client_proplist(target, revision, recurse, ctx, pool)
  props = svn_client_proplist('file:///svn/foo/bar.o', HEAD, False, ctx, pool)
  # props = svn_client_proplist2(target, revision, peg_revision, recurse,
  #   ctx, pool)
  display_props(props)
  props = svn_client_proplist2('file:///svn/foo/bar.o', HEAD, HEAD, False,
      ctx, pool)
  display_props(props)

  # svn_client_diff2(diff_options, path1, revision1, path2, revision2,
  #   recurse, ignore_ancestry, no_diff_deleted, force, outfile, errfile,
  #   ctx, pool)

  out = file('diff-out.txt', 'w')
  err = file('diff-err.txt', 'w')
  svn_client_diff2((), 'file:///svn/trunk', r90, 'file:///svn/trunk', HEAD,
      True, False, False, False, out, err, ctx, pool)

  # svn_client_cat(out stream, path_or_url, revision, ctx, pool)
  text = StringIO()
  svn_client_cat(text, 'file:///svn/trunk/mysql.inc', HEAD, ctx, pool)

  print text.getvalue()

  def stat_cb(path, status):
    print status_to_string(status), path

  # result_rev = svn_client_status(path, revision, status_func,
  #   descend, get_all, update, no_ignore, ctx, pool)
  rr = svn_client_status('tmp-wc', HEAD, stat_cb,
       True, True, True, True, ctx, pool)

  print rr

def display_props(props):
  for item, phash in props:
    for pname, pval in phash.items():
      print "%s: %s => %s" % (item, pname, pval)

run_app(aprapp_main)


