summaryrefslogtreecommitdiffstats
path: root/bin/xmldiff.pl
blob: 6b358e53498727676bb70ea27a1411ca5c21cb3b (plain)
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
120
121
#!/usr/bin/perl
#
#  Copyright (c) 2002, DecisionSoft Limited All rights reserved.
#  Please see:
#  http://software.decisionsoft.com/licence.html
#  for more information.
#
# Modified for the Fedora Docs Project by Tommy.Reynolds@MegaCoder.com
#

#
# xmldiff: xmldiff program - uses xmlpp, which must be on the ${PATH}
#

#Change this if xmlpp is not in your current path
#for example: $XMLPP = "./xmlpp";
$XMLPP = "xmlpp";

use Getopt::Std;

getopts('tscupChHSi');

if ($opt_h || @ARGV != 2) {
	usage();
}

my $diffOpts;

my $outputFmt = $opt_u + $opt_c + $opt_s + $opt_p + $opt_C;
if( $outputFmt == 0 )	{
	$outputFmt = $opt_p = 1;
}
if( $outputFmt > 1 )	{
  print STDERR "Error: Only one mode may be specified\n";
  usage();
}

if( $opt_s )	{
	# Standard diff, no playing around
} elsif( $opt_c )	{
	# Plain context diff
	$diffOpts .= "-c ";
} elsif( $opt_u )	{
	# Plain unified diff
	$diffOpts .= "-u ";
} elsif( $opt_p )	{
	# Colorized unified diff
	# $diffOpts .= "-u ";
	$diffOpts .= "--new-line-format='+ %l\n' ";
	$diffOpts .= "--old-line-format='- %l\n' ";
	$diffOpts .= "--unchanged-line-format='  %l\n' ";
} elsif( $opt_C )	{
  $diffOpts .= "--changed-group-format='\n<<<<<<<<<<<<<<\n%<==============\n%>>>>>>>>>>>>>>>\n\n' ";
  $diffOpts .= "--new-line-format='+ %l\n' ";
  $diffOpts .= "--old-line-format='- %l\n' ";
  $diffOpts .= "--unchanged-line-format='  %l\n' ";
} elsif( $opt_H )	{
  $diffOpts .= "--changed-group-format='%<%>' ";
  $diffOpts .= " --new-group-format='%>' ";
  $diffOpts .= "--old-group-format='%<' ";
  $diffOpts .= "--new-line-format='<font color=\"green\">+ %l</font>\n' ";
  $diffOpts .= "--old-line-format='<font color=\"red\">- %l</font>\n' ";
  $diffOpts .= "--unchanged-line-format='<font color=\"gray\">  %l</font>\n' ";
}

# Set up xmlpp options

my $prettyOpts = $opt_t ? "-t " : "";
$prettyOpts   .= $opt_S ? "-S " : "";
$prettyOpts   .= $opt_H ? "-H " : "";
$prettyOpts   .= "-s -e ";

$file1 = "xmlppTEMP1.$$";
$file2 = "xmlppTEMP2.$$";

my $results = 0;
$results += system("$XMLPP $prettyOpts '$ARGV[0]' > $file1");
$results += system("$XMLPP $prettyOpts '$ARGV[1]' > $file2");

if($opt_H) {
	print "<HTML>\n";
	print "  <HEAD>\n";
	print "    <TITLE>XML Diff</TITLE>\n";
	print "  </HEAD>\n";
	print "  <BODY bgcolor=\"#FEFEFF\">\n";
	print "    <PRE>";
	$results += system("/usr/bin/diff -bB $diffOpts $file1 $file2");
	# Do not add extra whitespace before the </PRE>
	print "</PRE>\n";
	print "  </BODY>\n";
	print "</HTML>\n";

} else {
	$results += system("/usr/bin/diff -bB $diffOpts $file1 $file2");
}


unlink($file1,$file2);

exit( $results );

sub usage {
  print STDERR <<EOF;
usage: $0 [ mode ] [ options ] oldfile.xml newfile.xml

mode must be one of:
  -p  coloured unified diff [default]
  -c  context diff
  -u  unified diff
  -s  standard diff output
  -C  vaguely CVS like unified diff

options:
  -H  HTML output
  -t  split attributes - good for spotting changes in attributes
  -S  schema hack mode - good for diffing schemas
  -i  ignore element and attribute contents

EOF
  exit 1;
}