1035
1034
p = combined.setdefault(name, set())
1036
1035
p.update(map(weave._idx_to_name, weave._parents[idx]))
1037
1036
return combined
1041
"""Show the weave's table-of-contents"""
1042
print '%6s %50s %10s %10s' % ('ver', 'name', 'sha1', 'parents')
1043
for i in (6, 50, 10, 10):
1046
for i in range(w.num_versions()):
1049
parent_str = ' '.join(map(str, w._parents[i]))
1050
print '%6d %-50.50s %10.10s %s' % (i, name, sha1, parent_str)
1054
def weave_stats(weave_file, pb):
1055
from bzrlib.weavefile import read_weave
1057
wf = file(weave_file, 'rb')
1059
# FIXME: doesn't work on pipes
1060
weave_size = wf.tell()
1064
for i in range(vers):
1065
pb.update('checking sizes', i, vers)
1066
for origin, lineno, line in w._extract([i]):
1071
print 'versions %9d' % vers
1072
print 'weave file %9d bytes' % weave_size
1073
print 'total contents %9d bytes' % total
1074
print 'compression ratio %9.2fx' % (float(total) / float(weave_size))
1077
print 'average size %9d bytes' % avg
1078
print 'relative size %9.2fx' % (float(weave_size) / float(avg))
1082
print """bzr weave tool
1084
Experimental tool for weave algorithm.
1087
weave init WEAVEFILE
1088
Create an empty weave file
1089
weave get WEAVEFILE VERSION
1090
Write out specified version.
1091
weave check WEAVEFILE
1092
Check consistency of all versions.
1094
Display table of contents.
1095
weave add WEAVEFILE NAME [BASE...] < NEWTEXT
1096
Add NEWTEXT, with specified parent versions.
1097
weave annotate WEAVEFILE VERSION
1098
Display origin of each line.
1099
weave merge WEAVEFILE VERSION1 VERSION2 > OUT
1100
Auto-merge two versions and display conflicts.
1101
weave diff WEAVEFILE VERSION1 VERSION2
1102
Show differences between two versions.
1106
% weave init foo.weave
1108
% weave add foo.weave ver0 < foo.txt
1111
(create updated version)
1113
% weave get foo.weave 0 | diff -u - foo.txt
1114
% weave add foo.weave ver1 0 < foo.txt
1117
% weave get foo.weave 0 > foo.txt (create forked version)
1119
% weave add foo.weave ver2 0 < foo.txt
1122
% weave merge foo.weave 1 2 > foo.txt (merge them)
1123
% vi foo.txt (resolve conflicts)
1124
% weave add foo.weave merged 1 2 < foo.txt (commit merged version)
1136
# in case we're run directly from the subdirectory
1137
sys.path.append('..')
1139
from bzrlib.weavefile import write_weave, read_weave
1140
from bzrlib.progress import ProgressBar
1155
return read_weave(file(argv[2], 'rb'))
1161
# at the moment, based on everything in the file
1163
parents = map(int, argv[4:])
1164
lines = sys.stdin.readlines()
1165
ver = w.add(name, parents, lines)
1166
write_weave(w, file(argv[2], 'wb'))
1167
print 'added version %r %d' % (name, ver)
1170
if os.path.exists(fn):
1171
raise IOError("file exists")
1173
write_weave(w, file(fn, 'wb'))
1174
elif cmd == 'get': # get one version
1176
sys.stdout.writelines(w.get_iter(int(argv[3])))
1181
v1, v2 = map(int, argv[3:5])
1184
diff_gen = bzrlib.patiencediff.unified_diff(lines1, lines2,
1185
'%s version %d' % (fn, v1),
1186
'%s version %d' % (fn, v2))
1187
sys.stdout.writelines(diff_gen)
1189
elif cmd == 'annotate':
1191
# newline is added to all lines regardless; too hard to get
1192
# reasonable formatting otherwise
1194
for origin, text in w.annotate(int(argv[3])):
1195
text = text.rstrip('\r\n')
1197
print ' | %s' % (text)
1199
print '%5d | %s' % (origin, text)
1205
elif cmd == 'stats':
1206
weave_stats(argv[2], ProgressBar())
1208
elif cmd == 'check':
1213
print '%d versions ok' % w.num_versions()
1215
elif cmd == 'inclusions':
1217
print ' '.join(map(str, w.inclusions([int(argv[3])])))
1219
elif cmd == 'parents':
1221
print ' '.join(map(str, w._parents[int(argv[3])]))
1223
elif cmd == 'plan-merge':
1224
# replaced by 'bzr weave-plan-merge'
1226
for state, line in w.plan_merge(int(argv[3]), int(argv[4])):
1228
print '%14s | %s' % (state, line),
1229
elif cmd == 'merge':
1230
# replaced by 'bzr weave-merge-text'
1232
p = w.plan_merge(int(argv[3]), int(argv[4]))
1233
sys.stdout.writelines(w.weave_merge(p))
1235
raise ValueError('unknown command %r' % cmd)
1238
if __name__ == '__main__':
1240
sys.exit(main(sys.argv))