991 self.ui.warn("merging %s failed!\n" % f) |
991 self.ui.warn("merging %s failed!\n" % f) |
992 |
992 |
993 os.unlink(b) |
993 os.unlink(b) |
994 os.unlink(c) |
994 os.unlink(c) |
995 |
995 |
|
996 def verify(self): |
|
997 filelinkrevs = {} |
|
998 filenodes = {} |
|
999 manifestchangeset = {} |
|
1000 changesets = revisions = files = 0 |
|
1001 errors = 0 |
|
1002 |
|
1003 self.ui.status("checking changesets\n") |
|
1004 for i in range(self.changelog.count()): |
|
1005 changesets += 1 |
|
1006 n = self.changelog.node(i) |
|
1007 for p in self.changelog.parents(n): |
|
1008 if p not in self.changelog.nodemap: |
|
1009 self.ui.warn("changeset %s has unknown parent %s\n" % |
|
1010 (short(n), short(p))) |
|
1011 errors += 1 |
|
1012 try: |
|
1013 changes = self.changelog.read(n) |
|
1014 except Exception, inst: |
|
1015 self.ui.warn("unpacking changeset %s: %s\n" % (short(n), inst)) |
|
1016 errors += 1 |
|
1017 |
|
1018 manifestchangeset[changes[0]] = n |
|
1019 for f in changes[3]: |
|
1020 filelinkrevs.setdefault(f, []).append(i) |
|
1021 |
|
1022 self.ui.status("checking manifests\n") |
|
1023 for i in range(self.manifest.count()): |
|
1024 n = self.manifest.node(i) |
|
1025 for p in self.manifest.parents(n): |
|
1026 if p not in self.manifest.nodemap: |
|
1027 self.ui.warn("manifest %s has unknown parent %s\n" % |
|
1028 (short(n), short(p))) |
|
1029 errors += 1 |
|
1030 ca = self.changelog.node(self.manifest.linkrev(n)) |
|
1031 cc = manifestchangeset[n] |
|
1032 if ca != cc: |
|
1033 self.ui.warn("manifest %s points to %s, not %s\n" % |
|
1034 (hex(n), hex(ca), hex(cc))) |
|
1035 errors += 1 |
|
1036 |
|
1037 try: |
|
1038 delta = mdiff.patchtext(self.manifest.delta(n)) |
|
1039 except KeyboardInterrupt: |
|
1040 print "aborted" |
|
1041 sys.exit(0) |
|
1042 except Exception, inst: |
|
1043 self.ui.warn("unpacking manifest %s: %s\n" |
|
1044 % (short(n), inst)) |
|
1045 errors += 1 |
|
1046 |
|
1047 ff = [ l.split('\0') for l in delta.splitlines() ] |
|
1048 for f, fn in ff: |
|
1049 filenodes.setdefault(f, {})[bin(fn)] = 1 |
|
1050 |
|
1051 self.ui.status("crosschecking files in changesets and manifests\n") |
|
1052 for f in filenodes: |
|
1053 if f not in filelinkrevs: |
|
1054 self.ui.warn("file %s in manifest but not in changesets\n" % f) |
|
1055 errors += 1 |
|
1056 |
|
1057 for f in filelinkrevs: |
|
1058 if f not in filenodes: |
|
1059 self.ui.warn("file %s in changeset but not in manifest\n" % f) |
|
1060 errors += 1 |
|
1061 |
|
1062 self.ui.status("checking files\n") |
|
1063 ff = filenodes.keys() |
|
1064 ff.sort() |
|
1065 for f in ff: |
|
1066 if f == "/dev/null": continue |
|
1067 files += 1 |
|
1068 fl = self.file(f) |
|
1069 nodes = { nullid: 1 } |
|
1070 for i in range(fl.count()): |
|
1071 revisions += 1 |
|
1072 n = fl.node(i) |
|
1073 |
|
1074 if n not in filenodes[f]: |
|
1075 self.ui.warn("%s: %d:%s not in manifests\n" |
|
1076 % (f, i, short(n))) |
|
1077 print len(filenodes[f].keys()), fl.count(), f |
|
1078 errors += 1 |
|
1079 else: |
|
1080 del filenodes[f][n] |
|
1081 |
|
1082 flr = fl.linkrev(n) |
|
1083 if flr not in filelinkrevs[f]: |
|
1084 self.ui.warn("%s:%s points to unexpected changeset %d\n" |
|
1085 % (f, short(n), fl.linkrev(n))) |
|
1086 errors += 1 |
|
1087 else: |
|
1088 filelinkrevs[f].remove(flr) |
|
1089 |
|
1090 # verify contents |
|
1091 try: |
|
1092 t = fl.read(n) |
|
1093 except Exception, inst: |
|
1094 self.ui.warn("unpacking file %s %s: %s\n" |
|
1095 % (f, short(n), inst)) |
|
1096 errors += 1 |
|
1097 |
|
1098 # verify parents |
|
1099 (p1, p2) = fl.parents(n) |
|
1100 if p1 not in nodes: |
|
1101 self.ui.warn("file %s:%s unknown parent 1 %s" % |
|
1102 (f, short(n), short(p1))) |
|
1103 errors += 1 |
|
1104 if p2 not in nodes: |
|
1105 self.ui.warn("file %s:%s unknown parent 2 %s" % |
|
1106 (f, short(n), short(p1))) |
|
1107 errors += 1 |
|
1108 nodes[n] = 1 |
|
1109 |
|
1110 # cross-check |
|
1111 for node in filenodes[f]: |
|
1112 self.ui.warn("node %s in manifests not in %s\n" |
|
1113 % (hex(n), f)) |
|
1114 errors += 1 |
|
1115 |
|
1116 self.ui.status("%d files, %d changesets, %d total revisions\n" % |
|
1117 (files, changesets, revisions)) |
|
1118 |
|
1119 if errors: |
|
1120 self.ui.warn("%d integrity errors encountered!\n" % errors) |
|
1121 return 1 |
|
1122 |
996 class remoterepository: |
1123 class remoterepository: |
997 def __init__(self, ui, path): |
1124 def __init__(self, ui, path): |
998 self.url = path |
1125 self.url = path |
999 self.ui = ui |
1126 self.ui = ui |
1000 |
1127 |