def main():
    if len(sys.argv) == 2:
        dbhome = os.path.join(sys.argv[1], 'db')
        for i in ('', 'uuids', 'revisions', 'transactions', 'representations',
                  'strings', 'changes', 'copies', 'nodes'):
            if not os.path.exists(os.path.join(dbhome, i)):
                sys.stderr.write(
                    "%s: '%s' is not a valid bdb svn repository\n" %
                    (sys.argv[0], sys.argv[1]))
                sys.exit(1)
    else:
        sys.stderr.write("Usage: %s <bdb-svn-repository>\n" % sys.argv[0])
        sys.exit(1)

    print "WARNING!: This program will destroy all text data in the subversion"
    print "repository '%s'" % sys.argv[1]
    print "Do not proceed unless this is a *COPY* of your real repository"
    print "If this is really what you want to do, " \
        "type 'YESERASE' and press Return"
    confirmation = raw_input("Confirmation string> ")
    if confirmation != "YESERASE":
        print "Cancelled - confirmation string not matched"
        sys.exit(0)
    print "Opening database environment..."
    cur = None
    ctx = svnfs.Ctx(dbhome)
    try:
        cur = ctx.nodes_db.cursor()
        nodecount = 0
        newrep = skel.Rep()
        newrep.str = "empty"
        empty_fulltext_rep_skel = newrep.unparse()
        del newrep
        ctx.strings_db['empty'] = ""
        rec = cur.first()
        while rec:
            if rec[0] != "next-key":
                if (nodecount % 10000 == 0) and nodecount != 0:
                    print "Processed %d nodes..." % nodecount
                nodecount += 1
                node = skel.Node(rec[1])
                if node.kind == "file":
                    rep = skel.Rep(ctx.reps_db[node.datarep])
                    if rep.kind == "fulltext":
                        if ctx.strings_db.has_key(rep.str):
                            del ctx.strings_db[rep.str]
                        ctx.reps_db[node.datarep] = empty_fulltext_rep_skel
                    else:
                        for w in rep.windows:
                            if ctx.strings_db.has_key(w.str):
                                del ctx.strings_db[w.str]
                        ctx.reps_db[node.datarep] = empty_fulltext_rep_skel
            rec = cur.next()
        print "Processed %d nodes" % nodecount
    finally:
        if cur:
            cur.close()
        ctx.close()
    print "Done"
Example #2
0
def am_nodes(ctx):
  "nodes"
  cur = ctx.nodes_db.cursor()
  try:
    print "next-key: %s" % ctx.txns_db['next-key']
    rec = cur.first()
    data = {}
    while rec:
      if rec[0] == 'next-key':
        rec = cur.next()
        continue
      nd = skel.Node(rec[1])
      nid,cid,tid = rec[0].split(".")
      data[tid.rjust(20)+nd.createpath] = (rec[0], nd)
      rec = cur.next()
    k = data.keys()
    k.sort()
    reptype = {"fulltext":"F", "delta":"D"}
    for i in k:
      nd = data[i][1]
      prkind = drkind = " "
      if nd.proprep:
        try:
          rep = skel.Rep(ctx.reps_db[nd.proprep])
          prkind = reptype[rep.kind]
          if ctx.bad_reps.has_key(nd.proprep):
            prkind += " *** BAD ***"
        except KeyError:
          prkind = "*** MISSING ***"
      if nd.datarep:
        try:
          rep = skel.Rep(ctx.reps_db[nd.datarep])
          drkind = reptype[rep.kind]
          if ctx.bad_reps.has_key(nd.datarep):
            drkind += " *** BAD ***"
        except KeyError:
          drkind = "*** MISSING ***"
      stringdata = "%s: %s %s pred %s count %s prop %s %s data %s %s edit %s" \
          % ( data[i][0], {"file":"F", "dir":"D"}[nd.kind], nd.createpath,
          nd.prednode or "-", nd.predcount, prkind, nd.proprep or "-",
          drkind, nd.datarep or "-", nd.editrep or "-")
      if nd.createpath == "/":
        print
      print stringdata
  finally:
    cur.close()
Example #3
0
def am_reps(ctx):
    "representations"
    ctx.bad_reps = {}
    cur = ctx.reps_db.cursor()
    try:
        print("next-key: %s" % ctx.txns_db['next-key'])
        rec = cur.first()
        while rec:
            if rec[0] != 'next-key':
                rep = skel.Rep(rec[1])
                lead = "rep %s: txn %s: %s %s " % (
                    rec[0], rep.txn, rep.cksumtype,
                    codecs.getencoder('hex_codec')(rep.cksum)[0])
                if rep.kind == "fulltext":
                    note = ""
                    if rep.str not in ctx.strings_db:
                        note = " *MISS*"
                        ctx.bad_reps[rec[0]] = None
                    print(lead + ("fulltext str %s%s" % (rep.str, note)))
                    if ctx.verbose:
                        print(
                            textwrap.fill(get_string(ctx, rep.str),
                                          initial_indent="  ",
                                          subsequent_indent="  ",
                                          width=78))
                elif rep.kind == "delta":
                    print(lead + ("delta of %s window%s" %
                                  (len(rep.windows),
                                   len(rep.windows) != 1 and "s" or "")))
                    for window in rep.windows:
                        noterep = notestr = ""
                        if window.vs_rep not in ctx.reps_db:
                            noterep = " *MISS*"
                            ctx.bad_reps[rec[0]] = None
                        if window.str not in ctx.strings_db:
                            notestr = " *MISS*"
                            ctx.bad_reps[rec[0]] = None
                        print("\toff %s len %s vs-rep %s%s str %s%s" %
                              (window.offset, window.size, window.vs_rep,
                               noterep, window.str, notestr))
                else:
                    print(lead + "*** UNKNOWN REPRESENTATION TYPE ***")
            rec = cur.next()
    finally:
        cur.close()