1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
#!/usr/bin/env python
#******************************************************************************\
#* $Source: /u/blais/cvsroot/xxdiff/bin/xxdiff-subversion,v $
#* $Id: xxdiff-subversion,v 1.4 2004/02/26 01:24:00 blais Exp $
#* $Date: 2004/02/26 01:24:00 $
#*
#* Copyright (C) 2004 Martin Blais <blais@furius.ca>
#*
#* This program is free software; you can redistribute it and/or modify
#* it under the terms of the GNU General Public License as published by
#* the Free Software Foundation; either version 2 of the License, or
#* (at your option) any later version.
#*
#* This program is distributed in the hope that it will be useful,
#* but WITHOUT ANY WARRANTY; without even the implied warranty of
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#* GNU General Public License for more details.
#*
#* You should have received a copy of the GNU General Public License
#* along with this program; if not, write to the Free Software
#* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#*
#*****************************************************************************/
"""xxdiff-subversion [<options>] <file> <file> [<file>]
Simple wrapper script for integration with Subversion in user's configuration
file. This is meant to be used in a user's configuration file to set diff-cmd
and diff3-cmd.
Add the following lines ``~/.subversion/config``::
diff-cmd = xxdiff-subversion
diff3-cmd = xxdiff-subversion
"""
__version__ = "$Revision: 1.4 $"
__author__ = "Martin Blais <blais@furius.ca>"
__depends__ = ['xxdiff', 'Python-2.3']
__copyright__ = """Copyright (C) 2003-2004 Martin Blais <blais@furius.ca>.
This code is distributed under the terms of the GNU General Public License."""
#===============================================================================
# EXTERNAL DECLARATIONS
#===============================================================================
import sys, os
import commands, shutil
from tempfile import NamedTemporaryFile
#===============================================================================
# LOCAL DECLARATIONS
#===============================================================================
tmppfx = '%s.' % os.path.basename(sys.argv[0])
#===============================================================================
# MAIN
#===============================================================================
def main():
import optparse
parser = optparse.OptionParser(__doc__.strip(), version=__version__)
# For diff-cmd invocation.
parser.add_option('-u', action='store_true',
help="See diff(1). Ignored for xxdiff.")
parser.add_option('-L', '--label', action='append', default=[],
help="See diff(1). Label gets set as file title string "
"for xxdiff.")
# For diff3-cmd invocation.
parser.add_option('-E', '--show-overlap', action='store_true',
help="See diff3(1). Ignored for xxdiff.")
parser.add_option('-m', '--merge', action='store_true',
help="See diff3(1). Passed to xxdiff for automatic "
"selection of non-conflictual regions..")
## parser.add_option('--reverse', action='store_true',
## help="Reverse the display order of the files.")
opts, args = parser.parse_args()
if len(args) > 3:
raise parser.error("Cannot invoke wrapper with more than 3 files.")
# create temporary file to hold merged results.
tmpf = NamedTemporaryFile('rw', prefix=tmppfx)
# run command
xxdiff_path = 'xxdiff'
cmd = [xxdiff_path, '--decision']
if opts.merge:
cmd.append('--merge')
cmd.append('--merged-filename="%s"' % tmpf.name)
for x in zip(['--title1', '--title2', '--title3'],
['"%s"' % x for x in opts.label]):
cmd.extend(x)
cmd.extend(args)
##print ' '.join(cmd)
s, o = commands.getstatusoutput(' '.join(cmd))
# if the user merged, copy the merged file over the original.
if o in ['MERGED', 'ACCEPT', 'REJECT']:
tmpf.flush()
tmpf.seek(0)
text = tmpf.read()
tmpf.close()
sys.stdout.write(text)
elif o == 'NODECISION':
pass # do nothing
else:
raise SystemExit(
"Error: unexpected answer from xxdiff: %s" % o)
if __name__ == '__main__':
main()
|