1029
1032
p = combined.setdefault(name, set())
1030
1033
p.update(map(weave._idx_to_name, weave._parents[idx]))
1031
1034
return combined
1038
"""Show the weave's table-of-contents"""
1039
print '%6s %50s %10s %10s' % ('ver', 'name', 'sha1', 'parents')
1040
for i in (6, 50, 10, 10):
1043
for i in range(w.num_versions()):
1046
parent_str = ' '.join(map(str, w._parents[i]))
1047
print '%6d %-50.50s %10.10s %s' % (i, name, sha1, parent_str)
1051
def weave_stats(weave_file, pb):
1052
from bzrlib.weavefile import read_weave
1054
wf = file(weave_file, 'rb')
1056
# FIXME: doesn't work on pipes
1057
weave_size = wf.tell()
1061
for i in range(vers):
1062
pb.update('checking sizes', i, vers)
1063
for origin, lineno, line in w._extract([i]):
1068
print 'versions %9d' % vers
1069
print 'weave file %9d bytes' % weave_size
1070
print 'total contents %9d bytes' % total
1071
print 'compression ratio %9.2fx' % (float(total) / float(weave_size))
1074
print 'average size %9d bytes' % avg
1075
print 'relative size %9.2fx' % (float(weave_size) / float(avg))
1079
print """bzr weave tool
1081
Experimental tool for weave algorithm.
1084
weave init WEAVEFILE
1085
Create an empty weave file
1086
weave get WEAVEFILE VERSION
1087
Write out specified version.
1088
weave check WEAVEFILE
1089
Check consistency of all versions.
1091
Display table of contents.
1092
weave add WEAVEFILE NAME [BASE...] < NEWTEXT
1093
Add NEWTEXT, with specified parent versions.
1094
weave annotate WEAVEFILE VERSION
1095
Display origin of each line.
1096
weave merge WEAVEFILE VERSION1 VERSION2 > OUT
1097
Auto-merge two versions and display conflicts.
1098
weave diff WEAVEFILE VERSION1 VERSION2
1099
Show differences between two versions.
1103
% weave init foo.weave
1105
% weave add foo.weave ver0 < foo.txt
1108
(create updated version)
1110
% weave get foo.weave 0 | diff -u - foo.txt
1111
% weave add foo.weave ver1 0 < foo.txt
1114
% weave get foo.weave 0 > foo.txt (create forked version)
1116
% weave add foo.weave ver2 0 < foo.txt
1119
% weave merge foo.weave 1 2 > foo.txt (merge them)
1120
% vi foo.txt (resolve conflicts)
1121
% weave add foo.weave merged 1 2 < foo.txt (commit merged version)
1133
# in case we're run directly from the subdirectory
1134
sys.path.append('..')
1136
from bzrlib.weavefile import write_weave, read_weave
1137
from bzrlib.progress import ProgressBar
1152
return read_weave(file(argv[2], 'rb'))
1158
# at the moment, based on everything in the file
1160
parents = map(int, argv[4:])
1161
lines = sys.stdin.readlines()
1162
ver = w.add(name, parents, lines)
1163
write_weave(w, file(argv[2], 'wb'))
1164
print 'added version %r %d' % (name, ver)
1167
if os.path.exists(fn):
1168
raise IOError("file exists")
1170
write_weave(w, file(fn, 'wb'))
1171
elif cmd == 'get': # get one version
1173
sys.stdout.writelines(w.get_iter(int(argv[3])))
1178
v1, v2 = map(int, argv[3:5])
1181
diff_gen = bzrlib.patiencediff.unified_diff(lines1, lines2,
1182
'%s version %d' % (fn, v1),
1183
'%s version %d' % (fn, v2))
1184
sys.stdout.writelines(diff_gen)
1186
elif cmd == 'annotate':
1188
# newline is added to all lines regardless; too hard to get
1189
# reasonable formatting otherwise
1191
for origin, text in w.annotate(int(argv[3])):
1192
text = text.rstrip('\r\n')
1194
print ' | %s' % (text)
1196
print '%5d | %s' % (origin, text)
1202
elif cmd == 'stats':
1203
weave_stats(argv[2], ProgressBar())
1205
elif cmd == 'check':
1210
print '%d versions ok' % w.num_versions()
1212
elif cmd == 'inclusions':
1214
print ' '.join(map(str, w.inclusions([int(argv[3])])))
1216
elif cmd == 'parents':
1218
print ' '.join(map(str, w._parents[int(argv[3])]))
1220
elif cmd == 'plan-merge':
1221
# replaced by 'bzr weave-plan-merge'
1223
for state, line in w.plan_merge(int(argv[3]), int(argv[4])):
1225
print '%14s | %s' % (state, line),
1226
elif cmd == 'merge':
1227
# replaced by 'bzr weave-merge-text'
1229
p = w.plan_merge(int(argv[3]), int(argv[4]))
1230
sys.stdout.writelines(w.weave_merge(p))
1232
raise ValueError('unknown command %r' % cmd)
1235
if __name__ == '__main__':
1237
sys.exit(main(sys.argv))