File: xxdiff-subversion

package info (click to toggle)
xxdiff 1%3A3.1-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 3,936 kB
  • ctags: 2,393
  • sloc: cpp: 19,971; python: 3,334; ansic: 1,505; sh: 1,466; perl: 308; yacc: 273; lex: 219; lisp: 115; makefile: 101
file content (119 lines) | stat: -rwxr-xr-x 4,403 bytes parent folder | download
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()