##// END OF EJS Templates
Bundle python dll in win32 installer if present...
Bundle python dll in win32 installer if present in case hg.exe is generated with the py2exe '-b 2' option instead of '-b 1', python2?.dll is not included in library.zip file and must also be packaged. The file will be integrated in the installer only if it is present in the dist directory. Generating hg.exe with the '-b 2' option is mandatory to avoid a crash when pyreadline is installed.

File last commit:

r5081:ea7b982b default
r8057:2a4cb1d5 default
Show More
hgdiff
105 lines | 3.0 KiB | text/plain | TextLexer
Matt Mackall
contrib: add Chris Mason's stand-alone diff tool...
r1636 #!/usr/bin/env python
import os, sys, struct, stat
import difflib
import re
from optparse import OptionParser
from mercurial.bdiff import bdiff, blocks
Thomas Arendsen Hein
Fixed contrib/hgdiff script to pass diffopts in the new format.
r3398 from mercurial.mdiff import bunidiff, diffopts
Matt Mackall
contrib: add Chris Mason's stand-alone diff tool...
r1636
Thomas Arendsen Hein
Fixed contrib/hgdiff script to pass diffopts in the new format.
r3398 VERSION="0.3"
Matt Mackall
contrib: add Chris Mason's stand-alone diff tool...
r1636 usage = "usage: %prog [options] file1 file2"
parser = OptionParser(usage=usage)
parser.add_option("-d", "--difflib", action="store_true", default=False)
parser.add_option('-x', '--count', default=1)
parser.add_option('-c', '--context', type="int", default=3)
parser.add_option('-p', '--show-c-function', action="store_true", default=False)
Thomas Arendsen Hein
Remove trailing spaces
r5081 parser.add_option('-w', '--ignore-all-space', action="store_true",
Matt Mackall
contrib: add Chris Mason's stand-alone diff tool...
r1636 default=False)
(options, args) = parser.parse_args()
if not args:
parser.print_help()
sys.exit(1)
# simple utility function to put all the
# files from a directory tree into a dict
def buildlist(names, top):
tlen = len(top)
for root, dirs, files in os.walk(top):
l = root[tlen + 1:]
for x in files:
p = os.path.join(root, x)
st = os.lstat(p)
if stat.S_ISREG(st.st_mode):
names[os.path.join(l, x)] = (st.st_dev, st.st_ino)
def diff_files(file1, file2):
if file1 == None:
b = file(file2).read().splitlines(1)
l1 = "--- %s\n" % (file2)
l2 = "+++ %s\n" % (file2)
l3 = "@@ -0,0 +1,%d @@\n" % len(b)
l = [l1, l2, l3] + ["+" + e for e in b]
elif file2 == None:
a = file(file1).read().splitlines(1)
l1 = "--- %s\n" % (file1)
l2 = "+++ %s\n" % (file1)
l3 = "@@ -1,%d +0,0 @@\n" % len(a)
l = [l1, l2, l3] + ["-" + e for e in a]
else:
t1 = file(file1).read()
t2 = file(file2).read()
l1 = t1.splitlines(1)
l2 = t2.splitlines(1)
if options.difflib:
l = difflib.unified_diff(l1, l2, file1, file2)
else:
Thomas Arendsen Hein
Fixed contrib/hgdiff script to pass diffopts in the new format.
r3398 l = bunidiff(t1, t2, l1, l2, file1, file2,
diffopts(context=options.context,
showfunc=options.show_c_function,
ignorews=options.ignore_all_space))
Matt Mackall
contrib: add Chris Mason's stand-alone diff tool...
r1636 for x in l:
if x[-1] != '\n':
x += "\n\ No newline at end of file\n"
print x,
file1 = args[0]
file2 = args[1]
if os.path.isfile(file1) and os.path.isfile(file2):
diff_files(file1, file2)
elif os.path.isdir(file1):
if not os.path.isdir(file2):
sys.stderr.write("file types don't match\n")
sys.exit(1)
d1 = {}
d2 = {}
buildlist(d1, file1)
buildlist(d2, file2)
keys = d1.keys()
keys.sort()
for x in keys:
if x not in d2:
f2 = None
else:
f2 = os.path.join(file2, x)
st1 = d1[x]
st2 = d2[x]
del d2[x]
if st1[0] == st2[0] and st1[1] == st2[1]:
sys.stderr.write("%s is a hard link\n" % x)
continue
x = os.path.join(file1, x)
diff_files(x, f2)
keys = d2.keys()
keys.sort()
for x in keys:
f1 = None
x = os.path.join(file2, x)
diff_files(f1, x)