from merge3 import Weave

def write_merged(weave, headA, headB):
    conflicts = False

    for chunk in weave.merge_revisions(headA, headB):
        # Tuple indicates a conflict
        if type(chunk) is tuple:
            conflicts = True
            print "<<<<<<<"
            for line in chunk[0]:
                print line
            print "======="
            for line in chunk[1]:
                print line
            print ">>>>>>>"
        else:
            # Assume this is just a line
            print chunk

    return conflicts

def print_annoted(weave, version):
    for line_info in weave.retrieve_annotated(version):
        if line_info[2] > 0:
            status = "live"
        else:
            status = "dead"
        v = line_info[0][0]
        n = line_info[0][1]
        text = line_info[1]
        print "[%s:%d,%s]%s" % (v,n,status,text)

def test1():
    base_text = """  printVersion = false;
  printResult = false;
  printCacheStats = false;

  maxThreads = -1;"""
    left1_text = """  printVersion = false;
  printResult = false;
  printSidNum = false;
  printCacheStats = false;

  maxThreads = -1;"""
    left2_text = """  printVersion = false;
  printResult = false;
  printSidNum = false;
  printCacheStats = false;
  dotLogFiles = true;

  maxThreads = -1;"""

    right1_text = """  printVersion = false;
  printResult = false;
  printCacheStats = false;
  autoRepl = false;

  maxThreads = -1;"""
    right2_text = """  printVersion = false;
  printResult = false;
  printCacheStats = false;
  autoRepl = true;

  maxThreads = -1;"""
    right3_text = """  printVersion = false;
  printResult = false;
  printSidNum = false;
  printCacheStats = false;
  autoRepl = true;
  dotLogFiles = true;

  maxThreads = -1;"""

    w = Weave()

    w.add_revision('base', base_text.split("\n"), [])
    w.add_revision('left1', left1_text.split("\n"), ['base'])
    w.add_revision('left2', left2_text.split("\n"), ['left1'])
    w.add_revision('right1', right1_text.split("\n"), ['base'])
    w.add_revision('right2', right2_text.split("\n"), ['right1'])
    w.add_revision('right3', right3_text.split("\n"), ['right2'])

    write_merged(w, 'left2', 'right3')

    print "-"*70

    print_annoted(w, 'right3')

    print "-"*70

    w2 = Weave()

    w2.add_revision('base', base_text.split("\n"), [])
    w2.add_revision('left1', left1_text.split("\n"), ['base'])
    w2.add_revision('left2', left2_text.split("\n"), ['left1'])
    w2.add_revision('right1', right1_text.split("\n"), ['base'])
    w2.add_revision('right2', right2_text.split("\n"), ['right1'])
    w2.add_revision('right3', right3_text.split("\n"), ['right2', 'left2'])

    write_merged(w2, 'left2', 'right3')

    print "-"*70

    print_annoted(w2, 'right3')

def test2():
    base_text = """      else if (strcmp(evalArgs[i], "-hushship") == 0) {
          hushedShipping = true;
        i++;
      }
      else if (strcmp(evalArgs[i], "-no-hushship") == 0) {
          hushedShipping = false;
        i++;
      }
      else {
	cerr << "\\n++++ unrecognized flag: " << evalArgs[i] << ".\\n\\n";
	return true;
      }"""

    left_text = """      else if (strcmp(evalArgs[i], "-hushship") == 0) {
          hushedShipping = true;
        i++;
      }
      else if (strcmp(evalArgs[i], "-no-hushship") == 0) {
          hushedShipping = false;
        i++;
      }
      else if (strcmp(evalArgs[i], "-no-log") == 0) {
	  dotLogFiles = false;
	i++;
      }
      else if (strcmp(evalArgs[i], "-log") == 0) {
	  dotLogFiles = true;
	i++;
      }
      else {
	cerr << "\\n++++ unrecognized flag: " << evalArgs[i] << ".\\n\\n";
	return true;
      }"""

    right1_text = """      else if (strcmp(evalArgs[i], "-hushship") == 0) {
          hushedShipping = true;
        i++;
      }
      else if (strcmp(evalArgs[i], "-no-hushship") == 0) {
          hushedShipping = false;
        i++;
      }
      else if (strcmp(evalArgs[i], "-autorepl") == 0) {
	autoRepl = true;
	i++;
      }
      else if (strcmp(evalArgs[i], "-no-autorepl") == 0) {
	autoRepl = false;
	i++;
      }
      else {
	cerr << "\\n++++ unrecognized flag: " << evalArgs[i] << ".\\n\\n";
	return true;
      }"""

    right2_text = """      else if (strcmp(evalArgs[i], "-hushship") == 0) {
          hushedShipping = true;
        i++;
      }
      else if (strcmp(evalArgs[i], "-no-hushship") == 0) {
          hushedShipping = false;
        i++;
      }
      else if (strcmp(evalArgs[i], "-autorepl") == 0) {
	autoRepl = true;
	i++;
      }
      else if (strcmp(evalArgs[i], "-no-autorepl") == 0) {
	autoRepl = false;
	i++;
      }
      else if (strcmp(evalArgs[i], "-no-log") == 0) {
	  dotLogFiles = false;
	i++;
      }
      else if (strcmp(evalArgs[i], "-log") == 0) {
	  dotLogFiles = true;
	i++;
      }
      else {
	cerr << "\\n++++ unrecognized flag: " << evalArgs[i] << ".\\n\\n";
	return true;
      }"""

    w = Weave()

    w.add_revision('base', base_text.split("\n"), [])
    w.add_revision('left', left_text.split("\n"), ['base'])
    w.add_revision('right1', right1_text.split("\n"), ['base'])
    w.add_revision('right2', right2_text.split("\n"), ['right1'])

    write_merged(w, 'left', 'right2')

    print "-"*70

    print_annoted(w, 'right2')

    print "-"*70

    w2 = Weave()

    w2.add_revision('base', base_text.split("\n"), [])
    w2.add_revision('left', left_text.split("\n"), ['base'])
    w2.add_revision('right1', right1_text.split("\n"), ['base'])
    w2.add_revision('right2', right2_text.split("\n"), ['right1', 'left'])

    write_merged(w2, 'left', 'right2')

    print "-"*70

    print_annoted(w2, 'right2')

test1()

print "="*70

test2()

