├── .github └── FUNDING.yml ├── INSTALL ├── LICENSE ├── Makefile ├── Makefile.pl ├── README.md ├── doc └── index.html ├── modules ├── FileType.xml └── Internals │ ├── Fonts │ ├── OpenSans.ttf │ └── VeraMono.ttf │ ├── Scripts │ └── Sort.js │ ├── Styles │ ├── Index.css │ └── View.css │ └── Tools │ ├── java-dump.sh │ └── rfcdiff-1.41-CUSTOM.sh └── pkgdiff.pl /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | patreon: LINUXABI 4 | custom: https://abi-laboratory.pro/?view=donate 5 | -------------------------------------------------------------------------------- /INSTALL: -------------------------------------------------------------------------------- 1 | 2 | Copyright (C) 2012-2025 Andrey Ponomarenko's ABI Laboratory 3 | All rights reserved. 4 | 5 | 6 | RELEASE INFORMATION 7 | 8 | Project: Package Changes Analyzer (pkgdiff) 9 | Version: 1.8 10 | Date: 2025-01-11 11 | 12 | 13 | This file explains how to install and setup environment 14 | for the tool in your computer. 15 | 16 | 17 | Content: 18 | 19 | 1. Requirements for Linux and FreeBSD 20 | 2. Requirements for Mac OS X 21 | 3. Configure and Install 22 | 4. Usage 23 | 24 | 25 | 1. REQUIREMENTS FOR LINUX AND FREEBSD 26 | ===================================== 27 | 28 | 1. Perl 5 (5.8 or newer) 29 | 2. GNU Diff 30 | 3. GNU Wdiff 31 | 4. GNU Awk 32 | 5. GNU Binutils (readelf) 33 | 6. Perl-File-LibMagic 34 | 35 | 1.1 Analysis of RPM packages 36 | 37 | RPM (rpm, rpm2cpio) 38 | 39 | 1.2 Analysis of DEB packages 40 | 41 | DPKG (dpkg, dpkg-deb) 42 | 43 | 1.3 Suggestions 44 | 45 | 1. ABI Compliance Checker (1.99.1 or newer) 46 | 2. ABI Dumper (0.97 or newer) 47 | 48 | 49 | 50 | 2. REQUIREMENTS FOR MAC OS X 51 | ============================ 52 | 53 | 1. Perl 5 (5.8 or newer) 54 | 2. GNU Diff 55 | 3. GNU Wdiff 56 | 4. GNU Awk 57 | 5. Xcode (otool) 58 | 59 | 2.1 Suggestions 60 | 61 | 1. ABI Compliance Checker (1.99.1 or newer) 62 | 2. ABI Dumper (0.97 or newer) 63 | 64 | 65 | 66 | 3. CONFIGURE AND INSTALL 67 | ======================== 68 | 69 | This command will install the pkgdiff program into the 70 | PREFIX/bin system directory and private modules into the PREFIX/share: 71 | 72 | sudo make install prefix=PREFIX [/usr, /usr/local, ...] 73 | 74 | 3.1 Remove 75 | 76 | sudo make uninstall prefix=PREFIX 77 | 78 | 79 | 80 | 4. USAGE 81 | ======== 82 | 83 | Compare two packages: 84 | 85 | pkgdiff PKG1 PKG2 86 | 87 | For advanced usage, see output of --help option 88 | 89 | 90 | 91 | Enjoy! 92 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | prefix ?= /usr 2 | 3 | .PHONY: install 4 | install: 5 | perl Makefile.pl -install -prefix "$(prefix)" 6 | 7 | uninstall: 8 | perl Makefile.pl -remove -prefix "$(prefix)" 9 | -------------------------------------------------------------------------------- /Makefile.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | ########################################################################### 3 | # Makefile for PkgDiff 4 | # Install/remove the tool for GNU/Linux, FreeBSD and Mac OS X 5 | # 6 | # Copyright (C) 2012-2015 Andrey Ponomarenko's ABI Laboratory 7 | # 8 | # Written by Andrey Ponomarenko 9 | # 10 | # This program is free software: you can redistribute it and/or modify 11 | # it under the terms of the GNU General Public License as published by 12 | # the Free Software Foundation. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License along 20 | # with this program. If not, see . 21 | ########################################################################### 22 | use Getopt::Long; 23 | Getopt::Long::Configure ("posix_default", "no_ignore_case"); 24 | use File::Path qw(mkpath rmtree); 25 | use File::Copy qw(copy); 26 | use File::Basename qw(dirname); 27 | use Cwd qw(abs_path); 28 | use File::Find; 29 | use strict; 30 | 31 | my $TOOL_SNAME = "pkgdiff"; 32 | my $ARCHIVE_DIR = abs_path(dirname($0)); 33 | 34 | my $HELP_MSG = " 35 | NAME: 36 | Makefile for pkgdiff 37 | 38 | DESCRIPTION: 39 | Install $TOOL_SNAME command and private modules. 40 | 41 | USAGE: 42 | sudo perl $0 -install -prefix /usr 43 | sudo perl $0 -remove -prefix /usr 44 | 45 | OPTIONS: 46 | -h|-help 47 | Print this help. 48 | 49 | --prefix=PREFIX 50 | Install files in PREFIX [/usr]. 51 | 52 | -install 53 | Command to install the tool. 54 | 55 | -remove 56 | Command to remove the tool. 57 | 58 | EXTRA OPTIONS: 59 | --destdir=DESTDIR 60 | This option is for maintainers to build 61 | RPM or DEB packages inside the build root. 62 | The environment variable DESTDIR is also 63 | supported. 64 | \n"; 65 | 66 | if(not @ARGV) { 67 | print $HELP_MSG; 68 | exit(0); 69 | } 70 | 71 | my ($PREFIX, $DESTDIR, $Help, $Install, $Remove); 72 | 73 | GetOptions( 74 | "h|help!" => \$Help, 75 | "prefix=s" => \$PREFIX, 76 | "destdir=s" => \$DESTDIR, 77 | "install!" => \$Install, 78 | "remove!" => \$Remove 79 | ) or exit(1); 80 | 81 | sub scenario() 82 | { 83 | if($Help) 84 | { 85 | print $HELP_MSG; 86 | exit(0); 87 | } 88 | if(not $Install and not $Remove) 89 | { 90 | print STDERR "ERROR: command is not selected (-install or -remove)\n"; 91 | exit(1); 92 | } 93 | 94 | if($Install) 95 | { # remove old version first 96 | $Remove = 1; 97 | } 98 | 99 | if($PREFIX ne "/") { 100 | $PREFIX=~s/[\/]+\Z//g; 101 | } 102 | if(not $PREFIX) 103 | { # default prefix 104 | $PREFIX = "/usr"; 105 | } 106 | if(my $Var = $ENV{"DESTDIR"}) 107 | { 108 | print "Using DESTDIR environment variable\n"; 109 | $DESTDIR = $Var; 110 | } 111 | if($DESTDIR) 112 | { 113 | if($DESTDIR ne "/") { 114 | $DESTDIR=~s/[\/]+\Z//g; 115 | } 116 | if($DESTDIR!~/\A\//) 117 | { 118 | print STDERR "ERROR: destdir is not absolute path\n"; 119 | exit(1); 120 | } 121 | if(not -d $DESTDIR) 122 | { 123 | print STDERR "ERROR: you should create destdir directory first\n"; 124 | exit(1); 125 | } 126 | $PREFIX = $DESTDIR.$PREFIX; 127 | if(not -d $PREFIX) 128 | { 129 | print STDERR "ERROR: you should create installation directory first (destdir + prefix):\n mkdir -p $PREFIX\n"; 130 | exit(1); 131 | } 132 | } 133 | else 134 | { 135 | if($PREFIX!~/\A\//) 136 | { 137 | print STDERR "ERROR: prefix is not absolute path\n"; 138 | exit(1); 139 | } 140 | if(not -d $PREFIX) 141 | { 142 | print STDERR "ERROR: you should create prefix directory first\n"; 143 | exit(1); 144 | } 145 | } 146 | 147 | print "INSTALL PREFIX: $PREFIX\n"; 148 | 149 | # paths 150 | my $EXE_PATH = "$PREFIX/bin"; 151 | my $MODULES_PATH = "$PREFIX/share/$TOOL_SNAME"; 152 | my $REL_PATH = "../share/$TOOL_SNAME"; 153 | 154 | if(not -w $PREFIX) 155 | { 156 | print STDERR "ERROR: you should be root\n"; 157 | exit(1); 158 | } 159 | if($Remove) 160 | { 161 | if(-e $EXE_PATH."/".$TOOL_SNAME) 162 | { # remove executable 163 | print "-- Removing $EXE_PATH/$TOOL_SNAME\n"; 164 | unlink($EXE_PATH."/".$TOOL_SNAME); 165 | } 166 | elsif(not $Install) { 167 | print "The tool is not installed\n"; 168 | } 169 | 170 | if(-d $MODULES_PATH) 171 | { # remove modules 172 | print "-- Removing $MODULES_PATH\n"; 173 | rmtree($MODULES_PATH); 174 | } 175 | elsif(not $Install) { 176 | print "The modules of the tool are not installed\n"; 177 | } 178 | } 179 | if($Install) 180 | { 181 | # configure 182 | my $Content = readFile($ARCHIVE_DIR."/".$TOOL_SNAME.".pl"); 183 | if($DESTDIR) { # relative path 184 | $Content=~s/MODULES_INSTALL_PATH/$REL_PATH/; 185 | } 186 | else { # absolute path 187 | $Content=~s/MODULES_INSTALL_PATH/$MODULES_PATH/; 188 | } 189 | 190 | # copy executable 191 | print "-- Installing $EXE_PATH/$TOOL_SNAME\n"; 192 | mkpath($EXE_PATH); 193 | writeFile($EXE_PATH."/".$TOOL_SNAME, $Content); 194 | chmod(0755, $EXE_PATH."/".$TOOL_SNAME); 195 | 196 | # copy modules 197 | if(-d $ARCHIVE_DIR."/modules") 198 | { 199 | print "-- Installing $MODULES_PATH\n"; 200 | mkpath($MODULES_PATH); 201 | copyDir($ARCHIVE_DIR."/modules", $MODULES_PATH); 202 | 203 | my $TOOLS_PATH = $MODULES_PATH."/modules/Internals/Tools"; 204 | my @Tools = listDir($TOOLS_PATH); 205 | foreach my $Tool (@Tools) { 206 | chmod(0755, $TOOLS_PATH."/".$Tool); 207 | } 208 | } 209 | 210 | # check PATH 211 | if($ENV{"PATH"}!~/(\A|:)\Q$EXE_PATH\E[\/]?(\Z|:)/) { 212 | print "WARNING: your PATH variable doesn't include \'$EXE_PATH\'\n"; 213 | } 214 | } 215 | exit(0); 216 | } 217 | 218 | sub listDir($) 219 | { 220 | my $Path = $_[0]; 221 | return () if(not $Path or not -d $Path); 222 | opendir(my $DH, $Path); 223 | return () if(not $DH); 224 | my @Contents = grep { $_ ne "." && $_ ne ".." } readdir($DH); 225 | return @Contents; 226 | } 227 | 228 | sub copyDir($$) 229 | { 230 | my ($From, $To) = @_; 231 | my %Files; 232 | find(\&wanted, $From); 233 | sub wanted { 234 | $Files{$File::Find::dir."/$_"} = 1 if($_ ne "."); 235 | } 236 | foreach my $Path (sort keys(%Files)) 237 | { 238 | my $Inst = $Path; 239 | $Inst=~s/\A\Q$ARCHIVE_DIR\E/$To/; 240 | if(-d $Path) 241 | { # directories 242 | mkpath($Inst); 243 | } 244 | else 245 | { # files 246 | mkpath(dirname($Inst)); 247 | copy($Path, $Inst); 248 | } 249 | } 250 | } 251 | 252 | sub readFile($) 253 | { 254 | my $Path = $_[0]; 255 | return "" if(not $Path or not -f $Path); 256 | open(FILE, $Path) || die ("can't open file \'$Path\': $!\n"); 257 | local $/ = undef; 258 | my $Content = ; 259 | close(FILE); 260 | return $Content; 261 | } 262 | 263 | sub writeFile($$) 264 | { 265 | my ($Path, $Content) = @_; 266 | return if(not $Path); 267 | open(FILE, ">".$Path) || die ("can't open file \'$Path\': $!\n"); 268 | print FILE $Content; 269 | close(FILE); 270 | } 271 | 272 | scenario(); 273 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | PkgDiff 1.8 2 | =========== 3 | 4 | Package Changes Analyzer (pkgdiff) — a tool for visualizing changes in Linux software packages (RPM, DEB, TAR.GZ, etc). 5 | 6 | Contents 7 | -------- 8 | 9 | 1. [ About ](#about) 10 | 2. [ Install ](#install) 11 | 3. [ Usage ](#usage) 12 | 13 | About 14 | ----- 15 | 16 | The tool is intended for Linux maintainers who are interested in ensuring compatibility of old and new versions of packages. The tool can compare directories as well (with the help of the -d option). 17 | 18 | Sample report: https://abi-laboratory.pro/tracker/package_diff/libssh/0.6.5/0.7.0/report.html 19 | 20 | The tool is developed by Andrey Ponomarenko. 21 | 22 | Install 23 | ------- 24 | 25 | sudo make install prefix=/usr 26 | 27 | ###### Requires 28 | 29 | * Perl 5 30 | * GNU Diff 31 | * GNU Wdiff 32 | * GNU Awk 33 | * GNU Binutils 34 | * Perl-File-LibMagic 35 | 36 | ###### Suggests 37 | 38 | * ABI Compliance Checker 1.99.1 or newer: https://github.com/lvc/abi-compliance-checker/ 39 | * ABI Dumper 0.97 or newer: https://github.com/lvc/abi-dumper 40 | 41 | Usage 42 | ----- 43 | 44 | pkgdiff PKG1 PKG2 [options] 45 | 46 | ###### Example 47 | 48 | pkgdiff libssh-0.6.5.tar.xz libssh-0.7.0.tar.xz 49 | 50 | ###### Compare directories 51 | 52 | pkgdiff -d DIR1/ DIR2/ [options] 53 | 54 | ###### Useful options 55 | 56 | | Option | Meaning | 57 | |---------------------|----------------------------------------------| 58 | | -c/-hide-unchanged | Don't show unchanged files in the report | 59 | | -list-added-removed | Show content of added and removed text files | 60 | | -skip-pattern REGEX | Don't check files matching REGEX | 61 | | -tmp-dir DIR | Use custom temp directory | 62 | | -d/-directories | Compare directories instead of packages | 63 | 64 | ###### Adv. usage 65 | 66 | For advanced usage, see output of -help option. 67 | -------------------------------------------------------------------------------- /doc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | pkgdiff - Package Changes Analyzer 8 | 9 | 32 | 33 | 46 | 47 | 48 | 49 | 50 | Fork me on GitHub 51 | 52 |
53 | 54 |
55 | 56 | 57 | 58 | 59 |
60 | 61 |

pkgdiff

62 | 63 |
64 | A tool for visualizing changes in Linux software packages 65 |
66 | 67 | 68 |

Package Changes Analyzer (pkgdiff) is a tool for visualizing changes in Linux software packages (RPM, DEB, TAR.GZ, etc). The tool is intended for Linux maintainers who are interested in ensuring compatibility of old and new versions of packages.

69 | 70 |

71 | The tool is developed by Andrey Ponomarenko: https://abi-laboratory.pro/ 72 | 73 |
74 |
Table of Contents
75 | 89 |
90 | 91 | 92 |

Downloads

93 |

All releases can be downloaded from this page.

94 | 95 |

Latest release: pkgdiff-1.7.2.tar.gz

96 | 97 |

Read-only access to the latest development version:

98 | 99 |  git clone git://github.com/lvc/pkgdiff  100 | 101 | 102 |

License

103 |

This program is free software. You may use, redistribute and/or modify it under the terms of the GNU GPL

104 | 105 | 106 |

Supported Platforms

107 | GNU/Linux, FreeBSD, Mac OS X 108 | 109 | 110 |

Dependencies

111 | Requires: 112 |
    113 |
  • 114 | Perl 5 (5.8 or newer) 115 |
  • 116 |
  • 117 | GNU Diff 118 |
  • 119 |
  • 120 | GNU Wdiff 121 |
  • 122 |
  • 123 | GNU Awk 124 |
  • 125 |
  • 126 | GNU Binutils (readelf) 127 |
  • 128 |
  • 129 | RPM (rpm2cpio, rpm) for analysis of RPM packages 130 |
  • 131 |
  • 132 | DPKG (dpkg-deb, dpkg) for analysis of DEB packages 133 |
  • 134 |
135 | 136 | Suggests: 137 | 145 | 146 | 147 |

Installation

148 |

The tool is ready-to-use after extracting the archive.

149 | 150 |

You can also use a Makefile to install the tool into the system:

151 |  sudo make install prefix=PREFIX [/usr, /usr/local]  152 |

This command will install a pkgdiff program to the PREFIX/bin system directory and private modules into the PREFIX/share.

153 | 154 | 155 |

Usage

156 |  pkgdiff PKG1 PKG2  157 |

The HTML report will be generated to:

158 | 159 |  pkgdiff_reports/<pkg>/<v1>_to_<v2>/changes_report.html  160 | 161 | 162 |

Examples

163 |

Compare 0.4.1 and 0.8.1 versions of libqb SRPM-packages:

164 |  pkgdiff libqb-0.4.1-2.fc15.src.rpm libqb-0.8.1-2.fc16.src.rpm  165 |

The HTML report will be generated to:

166 |  pkgdiff_reports/libqb/0.4.1_to_0.8.1/changes_report.html  167 | 168 |

169 |

Compare 0.10.23 and 0.10.32 versions of gstreamer TXZ-packages:

170 |  pkgdiff gstreamer-0.10.23-i486-1.txz gstreamer-0.10.32-i486-1.txz  171 |

The HTML report will be generated to:

172 |  pkgdiff_reports/gstreamer/0.10.23-i486-1_to_0.10.32-i486-1/changes_report.html  173 | 174 |

175 |

Compare 0.3.4 and 0.4.0 versions of libssh TAR.GZ-packages:

176 |  pkgdiff libssh-0.3.4.tar.gz libssh-0.4.0.tar.gz  177 |

The HTML report will be generated to:

178 |  pkgdiff_reports/libssh/0.3.4_to_0.4.0/changes_report.html  179 | 180 |

181 |

Compare 1.10.2 and 1.12.2 versions of cairo DEB-packages:

182 |  pkgdiff libcairo2-dev_1.10.2-6.1_i386.deb libcairo2-dev_1.12.2-1_i386.deb  183 |

The HTML report will be generated to:

184 |  pkgdiff_reports/libcairo2-dev/1.10.2-6.1_to_1.12.2-1/changes_report.html  185 | 186 |

187 |

Compare 2.24.1 and 2.28.8 versions of glib RPM-packages:

188 |  pkgdiff libglib2.0-devel-2.24.1.i586.rpm libglib2.0-devel-2.28.8.i586.rpm  189 |

The HTML report will be generated to:

190 |  pkgdiff_reports/libglib2.0-devel/2.24.1_to_2.28.8/changes_report.html  191 | 192 | 193 |

Adv. Usage

194 |

For advanced usage, see output of --help option:

195 |  pkgdiff --help  196 |

If you need to analyze a group of packages then you can create an XML-descriptor of this group (OLD.xml file):

197 | 198 |
199 | <version>
200 |     2.24.1
201 | </version>

202 | 203 | <group>
204 |     libglib
205 | </group>

206 | 207 | <packages>
208 |     libglib2.0-devel-2.24.1-1mdv2010.1.i586.rpm
209 |     libglib2.0_0-2.24.1-1mdv2010.1.i586.rpm
210 | </packages>
211 |
212 | 213 |

And then pass XML-descriptors of old and new versions of a group to the tool:

214 | 215 |  pkgdiff OLD.xml NEW.xml  216 | 217 |

The HTML report will be generated to:

218 | 219 |  pkgdiff_reports/<group>/<v1>_to_<v2>/changes_report.html  220 | 221 | 222 |

Adv. Examples

223 |

Compare 2.3.12 and 2.4.5 versions of libfreetype6 group of RPM-packages:

224 |  pkgdiff 2.3.12.xml 2.4.5.xml  225 | 226 |

File 2.3.12.xml:

227 |
228 | <version>
229 |     2.3.12
230 | </version>

231 | 232 | <group>
233 |     libfreetype6
234 | </group>

235 | 236 | <packages>
237 |     libfreetype6-2.3.12-1mdv2010.1.i586.rpm
238 |     libfreetype6-devel-2.3.12-1mdv2010.1.i586.rpm
239 | </packages>
240 |
241 | 242 |

File 2.4.5.xml:

243 |
244 | <version>
245 |     2.4.5
246 | </version>

247 | 248 | <group>
249 |     libfreetype6
250 | </group>

251 | 252 | <packages>
253 |     libfreetype6-2.4.5-2-mdv2011.0.i586.rpm
254 |     libfreetype6-devel-2.4.5-2-mdv2011.0.i586.rpm
255 | </packages>
256 |
257 | 258 |

The HTML report will be generated to:

259 |  pkgdiff_reports/libfreetype6/2.3.12_to_2.4.5/changes_report.html  260 | 261 | 262 |

Bugs

263 |

Please post your bug reports, feature requests and questions to the issue tracker.

264 | 265 | 266 |

Maintainers

267 | The tool is developed by Andrey Ponomarenko. 268 | 269 | 270 |

Changes

271 | 272 | Version 1.8 (January 28, 2017)
273 | Bug Fixes 274 |
    275 |
  • 276 | Fixed -d option to compare large directories 277 |
  • 278 |
  • 279 | Added more file classes 280 |
  • 281 |
  • 282 | 5% performance improvement 283 |
  • 284 |
  • 285 | Omit *.N suffix when determining the file format 286 |
  • 287 |
  • 288 | Do not print warning about missed wdiff into the report 289 |
  • 290 |
  • 291 | Increased default width of the report to 80 chars 292 |
  • 293 |
294 |
295 | 296 | Version 1.7.2 (March 18, 2016)
297 | New Features 298 |
    299 |
  • 300 | Ability to download plain-text added/removed patches from the report 301 |
  • 302 |
303 | Bug Fixes 304 |
    305 |
  • 306 | Do not show time stamp in the report 307 |
  • 308 |
  • 309 | Fixed removal of tmp directory in the rfcdiff-1.41-CUSTOM.sh 310 |
  • 311 |
312 |
313 | 314 | Version 1.7.1 (December 11, 2015)
315 | New Features 316 |
    317 |
  • 318 | Added -skip-pattern option: skip checking of paths within archives matching a regex 319 |
  • 320 |
321 | Bug Fixes 322 |
    323 |
  • 324 | Fixed incompatibility with the latest versions of the ABICC tool 325 |
  • 326 |
  • 327 | Fixed comparison of the RPM/Deb packages info 328 |
  • 329 |
330 |
331 | 332 | Version 1.7.0 (October 18, 2015)
333 | New Features 334 |
    335 |
  • 336 | Added -d option: compare directories instead of packages 337 |
  • 338 |
  • 339 | Added -list-added-removed option: show content of added/removed text files 340 |
  • 341 |
  • 342 | Added -vnum1 and -vnum2 options: set version numbers of input packages 343 |
  • 344 |
  • 345 | Added -title option: set name of the package in the title of the report 346 |
  • 347 |
  • 348 | Added -skip-subarchives option: skip checking of archives inside packages 349 |
  • 350 |
351 |
352 | 353 | Version 1.6.4 (September 08, 2015)
354 | Bug Fixes 355 |
    356 |
  • 357 | Fixed style of the report 358 |
  • 359 |
  • 360 | Fixed install permissions 361 |
  • 362 |
  • 363 | Fixed errors when comparing man pages 364 |
  • 365 |
  • 366 | Added check for wdiff 367 |
  • 368 |
  • 369 | Simplified Makefile 370 |
  • 371 |
372 | 373 |
374 | 375 | Version 1.6.3 (November 05, 2014)
376 | New Features 377 |
    378 |
  • 379 | Added -hide-unchanged option: don't show unchanged files in the report 380 |
  • 381 |
  • 382 | Show change rate in the extra info files.xml (moved, changed, renamed) 383 |
  • 384 |
  • 385 | Check if we can remove a common prefix from files of both packages 386 |
  • 387 |
  • 388 | Encoding of diff reports has been changed to utf-8 389 |
  • 390 |
391 | Bug Fixes 392 |
    393 |
  • 394 | Fixed a problem with spaces in package name 395 |
  • 396 |
  • 397 | Added -o option to unzip command 398 |
  • 399 |
  • 400 | Fixed -tmp-dir option 401 |
  • 402 |
403 | 404 |
405 | 406 | Version 1.6 (June 07, 2013)
407 | New Features 408 |
    409 |
  • 410 | ABI compatibility check for shared objects and kernel modules containing DWARF debugging information (in -details mode) 411 |
  • 412 |
  • 413 | ABI status section in the report for debuginfo-packages 414 |
  • 415 |
  • 416 | Suggests ABI Compliance Checker 1.99.1 417 |
  • 418 |
  • 419 | Suggests ABI Dumper 0.97 420 |
  • 421 |
422 | 423 |
424 | 425 | Version 1.5 (April 04, 2013)
426 | New Features 427 |
    428 |
  • 429 | Added -extra-info option to dump extra analysis information 430 |
  • 431 |
  • 432 | Improved identification of moved files 433 |
  • 434 |
  • 435 | Classifying files by magic bytes 436 |
  • 437 |
  • 438 | Compare public symbols in shared objects before detailed comparison 439 |
  • 440 |
  • 441 | Added statistics comment line in the report 442 |
  • 443 |
  • 444 | Support for more file types 445 |
  • 446 |
447 | Bug Fixes 448 |
    449 |
  • 450 | Corrected Makefile 451 |
  • 452 |
  • 453 | Corrected parser of package version 454 |
  • 455 |
456 | 457 |
458 | 459 | Version 1.4.1 (December 14, 2012)
460 | Bug Fixes 461 |
    462 |
  • 463 | Corrected parser of package version 464 |
  • 465 |
  • 466 | Opening file diffs in a separate window 467 |
  • 468 |
469 | 470 |
471 | 472 | Version 1.4 (October 25, 2012)
473 | New Features 474 |
    475 |
  • 476 | Sorting by status, delta and file name in the report 477 |
  • 478 |
  • 479 | New -open option to open report in the default browser 480 |
  • 481 |
  • 482 | Printing of estimated change rate to the console 483 |
  • 484 |
  • 485 | Simplified usage: pkgdiff PKG1 PKG2 486 |
  • 487 |
  • 488 | Support for Mac OS X 489 |
  • 490 |
  • 491 | Support for more file formats 492 |
  • 493 |
494 | 495 | 498 |
499 | 500 |
501 | 502 | 503 | -------------------------------------------------------------------------------- /modules/FileType.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HEADER 6 | 7 | 8 | Header file 9 | 10 | 11 | h, hh, H, hp, hxx, hpp, HPP, h++, tcc 12 | 13 | 14 | 100 15 | 16 | 17 | Text 18 | 19 | 20 | 21 | 22 | 23 | SHARED_OBJECT 24 | 25 | 26 | Shared library 27 | 28 | 29 | so 30 | 31 | 32 | 90 33 | 34 | 35 | 36 | 37 | 38 | KERNEL_MODULE 39 | 40 | 41 | Kernel module 42 | 43 | 44 | ko 45 | 46 | 47 | 85 48 | 49 | 50 | 51 | 52 | 53 | DEBUG_INFO 54 | 55 | 56 | Debug info file 57 | 58 | 59 | debug 60 | 61 | 62 | 80 63 | 64 | 65 | 66 | 67 | 68 | DLL 69 | 70 | 71 | DLL library 72 | 73 | 74 | dll 75 | 76 | 77 | 85 78 | 79 | 80 | 81 | 82 | 83 | SHARED_LIBRARY 84 | 85 | 86 | Dynamic library 87 | 88 | 89 | dylib 90 | 91 | 92 | 85 93 | 94 | 95 | 96 | 97 | 98 | SPEC 99 | 100 | 101 | Spec file 102 | 103 | 104 | spec 105 | 106 | 107 | 90 108 | 109 | 110 | Text 111 | 112 | 113 | 114 | 115 | 116 | C_SOURCE 117 | 118 | 119 | C program 120 | 121 | 122 | c, i 123 | 124 | 125 | 90 126 | 127 | 128 | Text 129 | 130 | 131 | 132 | 133 | 134 | PATCH 135 | 136 | 137 | Patch 138 | 139 | 140 | patch, diff, diffs 141 | 142 | 143 | diff output 144 | 145 | 146 | 80 147 | 148 | 149 | Text 150 | 151 | 152 | 153 | 154 | 155 | STATIC_LIBRARY 156 | 157 | 158 | Static library 159 | 160 | 161 | a 162 | 163 | 164 | 80 165 | 166 | 167 | 168 | 169 | 170 | CPP_SOURCE 171 | 172 | 173 | C++ program 174 | 175 | 176 | cc, cp, cxx, cpp, CPP, c++, C, ii 177 | 178 | 179 | 90 180 | 181 | 182 | Text 183 | 184 | 185 | 186 | 187 | 188 | ADA 189 | 190 | 191 | Ada program 192 | 193 | 194 | ads, adb 195 | 196 | 197 | 70 198 | 199 | 200 | Text 201 | 202 | 203 | 204 | 205 | 206 | FORTRAN 207 | 208 | 209 | Fortran program 210 | 211 | 212 | f, for, ftn 213 | F, FOR, fpp, FPP, FTN 214 | f90, f95. f03, f08, 215 | F90, F95, F03, F08 216 | 217 | 218 | 70 219 | 220 | 221 | Text 222 | 223 | 224 | 225 | 226 | 227 | SYMBOL 228 | 229 | 230 | Symbols file 231 | 232 | 233 | sym, syms, fncs 234 | 235 | 236 | 60 237 | 238 | 239 | Text 240 | 241 | 242 | 243 | 244 | 245 | LIBTOOL 246 | 247 | 248 | Libtool file 249 | 250 | 251 | la, lo, plo 252 | 253 | 254 | 50 255 | 256 | 257 | 258 | 259 | 260 | MANPAGE 261 | 262 | 263 | Man page 264 | 265 | 266 | 50 267 | 268 | 269 | 270 | 271 | 272 | DOCBOOK 273 | 274 | 275 | DocBook document 276 | 277 | 278 | docbook 279 | 280 | 281 | 40 282 | 283 | 284 | Text 285 | 286 | 287 | 288 | 289 | 290 | NVDL 291 | 292 | 293 | NVDL script 294 | 295 | 296 | nvdl 297 | 298 | 299 | 40 300 | 301 | 302 | Text 303 | 304 | 305 | 306 | 307 | 308 | RSS 309 | 310 | 311 | RSS file 312 | 313 | 314 | rss 315 | 316 | 317 | 40 318 | 319 | 320 | Text 321 | 322 | 323 | 324 | 325 | 326 | MMP 327 | 328 | 329 | Symbian Project file 330 | 331 | 332 | mmp 333 | 334 | 335 | 40 336 | 337 | 338 | Text 339 | 340 | 341 | 342 | 343 | 344 | BINARY_TERRAIN 345 | 346 | 347 | Binary Terrain file 348 | 349 | 350 | bt 351 | 352 | 353 | 40 354 | 355 | 356 | Text 357 | 358 | 359 | 360 | 361 | 362 | X3D 363 | 364 | 365 | X3D Image 366 | 367 | 368 | x3d, x3dv 369 | 370 | 371 | 40 372 | 373 | 374 | Text 375 | 376 | 377 | 378 | 379 | 380 | S_EXPRESSION_FILE 381 | 382 | 383 | S-Expression file 384 | 385 | 386 | sexpr 387 | 388 | 389 | 40 390 | 391 | 392 | Text 393 | 394 | 395 | 396 | 397 | 398 | LOG_FILE 399 | 400 | 401 | Log file 402 | 403 | 404 | xorg.log.1 405 | 406 | 407 | log, log.1 408 | 409 | 410 | logs, log 411 | 412 | 413 | 40 414 | 415 | 416 | Text 417 | 418 | 419 | 420 | 421 | 422 | ARGUMENT_FILE 423 | 424 | 425 | Argument file 426 | 427 | 428 | arg, args, argv 429 | 430 | 431 | 40 432 | 433 | 434 | Text 435 | 436 | 437 | 438 | 439 | 440 | ML_PROGRAM 441 | 442 | 443 | ML program 444 | 445 | 446 | ml 447 | 448 | 449 | 40 450 | 451 | 452 | Text 453 | 454 | 455 | 456 | 457 | 458 | AUGEAS_FILE 459 | 460 | 461 | Augeas file 462 | 463 | 464 | aug 465 | 466 | 467 | 40 468 | 469 | 470 | Text 471 | 472 | 473 | 474 | 475 | 476 | VMWARE_SCRIPT 477 | 478 | 479 | VMware Configuration file 480 | 481 | 482 | vmx 483 | 484 | 485 | 40 486 | 487 | 488 | Text 489 | 490 | 491 | 492 | 493 | 494 | STAP_SCRIPT 495 | 496 | 497 | SystemTap script 498 | 499 | 500 | stp 501 | 502 | 503 | 40 504 | 505 | 506 | Text 507 | 508 | 509 | 510 | 511 | 512 | PPD_FILE 513 | 514 | 515 | PPD file 516 | 517 | 518 | ppd 519 | 520 | 521 | 40 522 | 523 | 524 | Text 525 | 526 | 527 | 528 | 529 | 530 | LDAP 531 | 532 | 533 | LDAP Data file 534 | 535 | 536 | ldif 537 | 538 | 539 | 40 540 | 541 | 542 | Text 543 | 544 | 545 | 546 | 547 | 548 | ESRI_SHAPEFILE 549 | 550 | 551 | ESRI Shape file 552 | 553 | 554 | shp, shx 555 | 556 | 557 | 40 558 | 559 | 560 | 561 | 562 | 563 | DBASE_DATABASE 564 | 565 | 566 | dBASE Database file 567 | 568 | 569 | dbf 570 | 571 | 572 | DBase 3 data 573 | 574 | 575 | 40 576 | 577 | 578 | 579 | 580 | 581 | DJVU 582 | 583 | 584 | DjVu document 585 | 586 | 587 | djvu, djv 588 | 589 | 590 | 40 591 | 592 | 593 | 594 | 595 | 596 | XPT 597 | 598 | 599 | XPConnect Typelib file 600 | 601 | 602 | xpt 603 | 604 | 605 | 40 606 | 607 | 608 | 609 | 610 | 611 | ELF_BINARY 612 | 613 | 614 | ELF Binary file 615 | 616 | 617 | 40 618 | 619 | 620 | 621 | 622 | 623 | TDF 624 | 625 | 626 | TDF file 627 | 628 | 629 | tdf 630 | 631 | 632 | 40 633 | 634 | 635 | Text 636 | 637 | 638 | 639 | 640 | 641 | MESSAGE_FILE 642 | 643 | 644 | Message file 645 | 646 | 647 | eml, msg 648 | 649 | 650 | 40 651 | 652 | 653 | Text 654 | 655 | 656 | 657 | 658 | 659 | XINDY 660 | 661 | 662 | Xindy file 663 | 664 | 665 | xdy 666 | 667 | 668 | 40 669 | 670 | 671 | Text 672 | 673 | 674 | 675 | 676 | 677 | GNAT_PROJECT 678 | 679 | 680 | GNAT Project file 681 | 682 | 683 | gpr 684 | 685 | 686 | 40 687 | 688 | 689 | Text 690 | 691 | 692 | 693 | 694 | 695 | BIBTEX 696 | 697 | 698 | BibTeX document 699 | 700 | 701 | bst, bbl, bib, csf 702 | 703 | 704 | 40 705 | 706 | 707 | Text 708 | 709 | 710 | 711 | 712 | 713 | INCLUDE 714 | 715 | 716 | Include file 717 | 718 | 719 | inc, inl 720 | 721 | 722 | 40 723 | 724 | 725 | Text 726 | 727 | 728 | 729 | 730 | 731 | LANGUAGE_DATA 732 | 733 | 734 | Language Data file 735 | 736 | 737 | lng 738 | 739 | 740 | 40 741 | 742 | 743 | 744 | 745 | 746 | XIB 747 | 748 | 749 | Interface Builder file 750 | 751 | 752 | xib, nib 753 | 754 | 755 | 40 756 | 757 | 758 | Text 759 | 760 | 761 | 762 | 763 | 764 | MDMP 765 | 766 | 767 | Memory Dump file 768 | 769 | 770 | dmp, mdmp 771 | 772 | 773 | 40 774 | 775 | 776 | 777 | 778 | 779 | REGISTRY 780 | 781 | 782 | Registry file 783 | 784 | 785 | rgs, reg 786 | 787 | 788 | 40 789 | 790 | 791 | Text 792 | 793 | 794 | 795 | 796 | 797 | RPC 798 | 799 | 800 | RPC file 801 | 802 | 803 | srpc, rpc, x 804 | 805 | 806 | 40 807 | 808 | 809 | Text 810 | 811 | 812 | 813 | 814 | 815 | BINHEX 816 | 817 | 818 | BinHex Encoded file 819 | 820 | 821 | hqx 822 | 823 | 824 | 40 825 | 826 | 827 | 828 | 829 | 830 | PROTOBUF 831 | 832 | 833 | Protocol Buffer file 834 | 835 | 836 | proto 837 | 838 | 839 | 40 840 | 841 | 842 | Text 843 | 844 | 845 | 846 | 847 | 848 | OPTIONS 849 | 850 | 851 | Options file 852 | 853 | 854 | opt 855 | 856 | 857 | 40 858 | 859 | 860 | Text 861 | 862 | 863 | 864 | 865 | 866 | SCONS 867 | 868 | 869 | SCons file 870 | 871 | 872 | SConstruct, SConscript 873 | 874 | 875 | scons 876 | 877 | 878 | 40 879 | 880 | 881 | Text 882 | 883 | 884 | 885 | 886 | 887 | MD5 888 | 889 | 890 | MD5 Checksum file 891 | 892 | 893 | md5 894 | 895 | 896 | 40 897 | 898 | 899 | Text 900 | 901 | 902 | 903 | 904 | 905 | SIGNATURE 906 | 907 | 908 | Signature file 909 | 910 | 911 | sig 912 | 913 | 914 | 40 915 | 916 | 917 | Text 918 | 919 | 920 | 921 | 922 | 923 | OPERA_MAILBOX 924 | 925 | 926 | Opera Mailbox file 927 | 928 | 929 | mbs 930 | 931 | 932 | 40 933 | 934 | 935 | 936 | 937 | 938 | OPERA_BOOKMARK 939 | 940 | 941 | Opera Bookmark file 942 | 943 | 944 | adr 945 | 946 | 947 | 40 948 | 949 | 950 | 951 | 952 | 953 | QT_UI 954 | 955 | 956 | Qt UI file 957 | 958 | 959 | ui 960 | 961 | 962 | 40 963 | 964 | 965 | Text 966 | 967 | 968 | 969 | 970 | 971 | QT_SS 972 | 973 | 974 | Qt style sheet 975 | 976 | 977 | qss 978 | 979 | 980 | 40 981 | 982 | 983 | Text 984 | 985 | 986 | 987 | 988 | 989 | QT_MESSAGE 990 | 991 | 992 | Qt Message file 993 | 994 | 995 | qm 996 | 997 | 998 | 40 999 | 1000 | 1001 | 1002 | 1003 | 1004 | QT_HELP 1005 | 1006 | 1007 | Qt Help file 1008 | 1009 | 1010 | qhp, qch, qhc, qhcp 1011 | 1012 | 1013 | 40 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | OBJECTIVE_C 1020 | 1021 | 1022 | Objective-C program 1023 | 1024 | 1025 | m, mi 1026 | 1027 | 1028 | 70 1029 | 1030 | 1031 | Text 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | OBJECTIVE_CPP 1038 | 1039 | 1040 | Objective-C++ program 1041 | 1042 | 1043 | mm, mii, M 1044 | 1045 | 1046 | 70 1047 | 1048 | 1049 | Text 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | SGML 1056 | 1057 | 1058 | SGML document 1059 | 1060 | 1061 | sgml, sgm 1062 | 1063 | 1064 | 50 1065 | 1066 | 1067 | Text 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | QT_PROJECT 1074 | 1075 | 1076 | Qt Project file 1077 | 1078 | 1079 | pro, pri, prf 1080 | 1081 | 1082 | 40 1083 | 1084 | 1085 | Text 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | FSH 1092 | 1093 | 1094 | OpenGL FSH file 1095 | 1096 | 1097 | fsh 1098 | 1099 | 1100 | 40 1101 | 1102 | 1103 | Text 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | GLSL 1110 | 1111 | 1112 | GLSL Shader file 1113 | 1114 | 1115 | glsl, glslf, glslv, vert, frag 1116 | 1117 | 1118 | 40 1119 | 1120 | 1121 | Text 1122 | 1123 | 1124 | 1125 | 1126 | 1127 | XCODE 1128 | 1129 | 1130 | Xcode file 1131 | 1132 | 1133 | xcconfig, pbxproj, xcodeproj, nib, pbxbtree, pbxuser 1134 | xcworkspace, xcsnapshots, xcode 1135 | 1136 | 1137 | 40 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | PROPERTY_LIST 1144 | 1145 | 1146 | Property list 1147 | 1148 | 1149 | plist 1150 | 1151 | 1152 | 40 1153 | 1154 | 1155 | 1156 | 1157 | 1158 | POLICY_FILE 1159 | 1160 | 1161 | Policy file 1162 | 1163 | 1164 | policy, Policy 1165 | 1166 | 1167 | 40 1168 | 1169 | 1170 | Text 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | JAVA_ASSEMBLER 1177 | 1178 | 1179 | Java assembler program 1180 | 1181 | 1182 | jasm, jsasm 1183 | 1184 | 1185 | 50 1186 | 1187 | 1188 | Text 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | PROPERTY_FILE 1195 | 1196 | 1197 | Property file 1198 | 1199 | 1200 | prp, pty, props, properties 1201 | 1202 | 1203 | 40 1204 | 1205 | 1206 | Text 1207 | 1208 | 1209 | 1210 | 1211 | 1212 | SWG_FILE 1213 | 1214 | 1215 | SWG file 1216 | 1217 | 1218 | swg 1219 | 1220 | 1221 | 40 1222 | 1223 | 1224 | Text 1225 | 1226 | 1227 | 1228 | 1229 | 1230 | INITIALIZATION 1231 | 1232 | 1233 | Initialization file 1234 | 1235 | 1236 | ini 1237 | 1238 | 1239 | 50 1240 | 1241 | 1242 | Text 1243 | 1244 | 1245 | 1246 | 1247 | 1248 | MANIFEST 1249 | 1250 | 1251 | Manifest file 1252 | 1253 | 1254 | manifest, MANIFEST 1255 | 1256 | 1257 | manifest, mf, MF, nmf, mn 1258 | 1259 | 1260 | 50 1261 | 1262 | 1263 | Text 1264 | 1265 | 1266 | 1267 | 1268 | 1269 | RESOURCE 1270 | 1271 | 1272 | Resource file 1273 | 1274 | 1275 | res, rc, resource, mc, grd, rsrc, rc2 1276 | 1277 | 1278 | 40 1279 | 1280 | 1281 | Text 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | XTB 1288 | 1289 | 1290 | XTB data file 1291 | 1292 | 1293 | xtb 1294 | 1295 | 1296 | 40 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | MOLECULE_SPEC 1303 | 1304 | 1305 | Molecule spec file 1306 | 1307 | 1308 | xyz 1309 | 1310 | 1311 | 40 1312 | 1313 | 1314 | Text 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | QT_RESOURCE 1321 | 1322 | 1323 | Qt Resource file 1324 | 1325 | 1326 | qrc 1327 | 1328 | 1329 | 40 1330 | 1331 | 1332 | Text 1333 | 1334 | 1335 | 1336 | 1337 | 1338 | QT_DOC 1339 | 1340 | 1341 | Qt Doc file 1342 | 1343 | 1344 | qdoc, qdocconf, qdocinc 1345 | 1346 | 1347 | 40 1348 | 1349 | 1350 | Text 1351 | 1352 | 1353 | 1354 | 1355 | 1356 | XBEL 1357 | 1358 | 1359 | XBEL bookmark 1360 | 1361 | 1362 | xbel 1363 | 1364 | 1365 | 40 1366 | 1367 | 1368 | Text 1369 | 1370 | 1371 | 1372 | 1373 | 1374 | IDL 1375 | 1376 | 1377 | IDL file 1378 | 1379 | 1380 | idl 1381 | 1382 | 1383 | 40 1384 | 1385 | 1386 | Text 1387 | 1388 | 1389 | 1390 | 1391 | 1392 | QML 1393 | 1394 | 1395 | QML file 1396 | 1397 | 1398 | qml, qs 1399 | 1400 | 1401 | 50 1402 | 1403 | 1404 | Text 1405 | 1406 | 1407 | 1408 | 1409 | 1410 | XML 1411 | 1412 | 1413 | XML document 1414 | 1415 | 1416 | xml 1417 | 1418 | 1419 | 50 1420 | 1421 | 1422 | Text 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | WML 1429 | 1430 | 1431 | WML document 1432 | 1433 | 1434 | wml 1435 | 1436 | 1437 | 50 1438 | 1439 | 1440 | 1441 | 1442 | 1443 | MAKEFILE 1444 | 1445 | 1446 | Makefile 1447 | 1448 | 1449 | mk, make, makefile, Makefile, nmake, kmk, mak 1450 | 1451 | 1452 | Makefile, GNUmakefile, Imakefile, Makeconfig, Makerules 1453 | 1454 | 1455 | 50 1456 | 1457 | 1458 | Text 1459 | 1460 | 1461 | 1462 | 1463 | 1464 | JAVA_MAKEFILE 1465 | 1466 | 1467 | Java Makefile 1468 | 1469 | 1470 | jmk, gmk 1471 | 1472 | 1473 | 50 1474 | 1475 | 1476 | Text 1477 | 1478 | 1479 | 1480 | 1481 | 1482 | UCM 1483 | 1484 | 1485 | UCM file 1486 | 1487 | 1488 | Unicode Character Mapping 1489 | 1490 | 1491 | ucm 1492 | 1493 | 1494 | 40 1495 | 1496 | 1497 | Text 1498 | 1499 | 1500 | 1501 | 1502 | 1503 | CHARMAP 1504 | 1505 | 1506 | Charmap file 1507 | 1508 | 1509 | cm 1510 | 1511 | 1512 | charmaps 1513 | 1514 | 1515 | 40 1516 | 1517 | 1518 | Text 1519 | 1520 | 1521 | 1522 | 1523 | 1524 | ABI_LIST 1525 | 1526 | 1527 | ABI list 1528 | 1529 | 1530 | abilist 1531 | 1532 | 1533 | 40 1534 | 1535 | 1536 | Text 1537 | 1538 | 1539 | 1540 | 1541 | 1542 | LOCALE_DATA 1543 | 1544 | 1545 | Localization data 1546 | 1547 | 1548 | iconvdata, localedata, locales 1549 | 1550 | 1551 | 40 1552 | 1553 | 1554 | Text 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | TIMEZONE_DATA 1561 | 1562 | 1563 | Timezone data 1564 | 1565 | 1566 | timezone 1567 | 1568 | 1569 | 40 1570 | 1571 | 1572 | Text 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | CONFIGURE_SCRIPT 1579 | 1580 | 1581 | Configure script 1582 | 1583 | 1584 | configure, preconfigure 1585 | 1586 | 1587 | 40 1588 | 1589 | 1590 | Text 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | VERSIONING 1597 | 1598 | 1599 | Version file 1600 | 1601 | 1602 | Version, Versions 1603 | 1604 | 1605 | 40 1606 | 1607 | 1608 | Text 1609 | 1610 | 1611 | 1612 | 1613 | 1614 | GYP 1615 | 1616 | 1617 | GYP file 1618 | 1619 | 1620 | gyp, gypi 1621 | 1622 | 1623 | 40 1624 | 1625 | 1626 | Text 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | PKGCONFIG 1633 | 1634 | 1635 | Pkg-config file 1636 | 1637 | 1638 | pc 1639 | 1640 | 1641 | 50 1642 | 1643 | 1644 | PkgConfigFiles 1645 | 1646 | 1647 | Text 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | OOO 1654 | 1655 | 1656 | OpenOffice document 1657 | 1658 | 1659 | sxd, sxi, sxm, smf, sds, odf, odp, otp, odg 1660 | odb, otg, odt, ott, sda, sdc, ods, ots 1661 | 1662 | 1663 | 40 1664 | 1665 | 1666 | 1667 | 1668 | 1669 | QT_QPH 1670 | 1671 | 1672 | Qt Translation file 1673 | 1674 | 1675 | qph 1676 | 1677 | 1678 | 40 1679 | 1680 | 1681 | Text 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | QT_MS_TS 1688 | 1689 | 1690 | Qt Translation or MS TypeScript file 1691 | 1692 | 1693 | ts 1694 | 1695 | 1696 | 40 1697 | 1698 | 1699 | Text 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | DOT 1706 | 1707 | 1708 | DOT Graph file 1709 | 1710 | 1711 | dot 1712 | 1713 | 1714 | 40 1715 | 1716 | 1717 | Text 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | DESKTOP 1724 | 1725 | 1726 | Desktop file 1727 | 1728 | 1729 | desktop 1730 | 1731 | 1732 | 40 1733 | 1734 | 1735 | Text 1736 | 1737 | 1738 | 1739 | 1740 | 1741 | MS_VISUAL_STUDIO 1742 | 1743 | 1744 | MS Visual Studio file 1745 | 1746 | 1747 | vcxproj, vcproj, vcprojin, vcxproj.filters, vcxproj.filtersin 1748 | sln, vc9, resx, vc6, vcwin32, dsw, dsp, csproj, vsprops, xsx 1749 | cbproj, vbp, vbproj, vcp, vcw, vbg, vbz, vdp, vdproj, vc4, frm 1750 | 1751 | 1752 | 40 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | WINDOWS 1759 | 1760 | 1761 | MS Windows file 1762 | 1763 | 1764 | clp, clg, hme, msi, msu, chm, hlp, wmf, emf 1765 | 1766 | 1767 | 40 1768 | 1769 | 1770 | 1771 | 1772 | 1773 | CSV_FILE 1774 | 1775 | 1776 | CSV file 1777 | 1778 | 1779 | csv 1780 | 1781 | 1782 | 40 1783 | 1784 | 1785 | Text 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | COMMAND 1792 | 1793 | 1794 | Command file 1795 | 1796 | 1797 | cmd, com, COM 1798 | 1799 | 1800 | 40 1801 | 1802 | 1803 | Text 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | WIX 1810 | 1811 | 1812 | WiX Installer file 1813 | 1814 | 1815 | wxi, wxs 1816 | 1817 | 1818 | 40 1819 | 1820 | 1821 | Text 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | STRINGS 1828 | 1829 | 1830 | Text Strings file 1831 | 1832 | 1833 | strings 1834 | 1835 | 1836 | 40 1837 | 1838 | 1839 | Text 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | OVF 1846 | 1847 | 1848 | OVF file 1849 | 1850 | 1851 | ovf 1852 | 1853 | 1854 | 40 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | DISK_IMAGE 1861 | 1862 | 1863 | Disk Image file 1864 | 1865 | 1866 | vdi, vmdk, vhd, iso, vco 1867 | 1868 | 1869 | 40 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | VIRTUAL_BOX 1876 | 1877 | 1878 | VirtualBox file 1879 | 1880 | 1881 | vbox 1882 | 1883 | 1884 | 40 1885 | 1886 | 1887 | Text 1888 | 1889 | 1890 | 1891 | 1892 | 1893 | MMC 1894 | 1895 | 1896 | Windows MMC file 1897 | 1898 | 1899 | msc 1900 | 1901 | 1902 | 40 1903 | 1904 | 1905 | 1906 | 1907 | 1908 | VISUAL_BASIC 1909 | 1910 | 1911 | Visual Basic program 1912 | 1913 | 1914 | vbs, vb, vbx 1915 | 1916 | 1917 | 50 1918 | 1919 | 1920 | Text 1921 | 1922 | 1923 | 1924 | 1925 | 1926 | LEX 1927 | 1928 | 1929 | Lex program 1930 | 1931 | 1932 | l 1933 | 1934 | 1935 | 50 1936 | 1937 | 1938 | Text 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | YACC 1945 | 1946 | 1947 | Yacc program 1948 | 1949 | 1950 | y 1951 | 1952 | 1953 | 50 1954 | 1955 | 1956 | Text 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | LISP 1963 | 1964 | 1965 | Lisp program 1966 | 1967 | 1968 | lsp, lisp, el 1969 | 1970 | 1971 | 50 1972 | 1973 | 1974 | Text 1975 | 1976 | 1977 | 1978 | 1979 | 1980 | SEED7_INCLUDE 1981 | 1982 | 1983 | Seed7 include/library 1984 | 1985 | 1986 | s7i 1987 | 1988 | 1989 | 50 1990 | 1991 | 1992 | Text 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | SEED7_PROGRAM 1999 | 2000 | 2001 | Seed7 program 2002 | 2003 | 2004 | sd7 2005 | 2006 | 2007 | 50 2008 | 2009 | 2010 | Text 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | HASKELL_SOURCE 2017 | 2018 | 2019 | Haskell program 2020 | 2021 | 2022 | hs 2023 | 2024 | 2025 | 50 2026 | 2027 | 2028 | Text 2029 | 2030 | 2031 | 2032 | 2033 | 2034 | HASKELL_CABAL 2035 | 2036 | 2037 | Haskell metadata 2038 | 2039 | 2040 | cabal 2041 | 2042 | 2043 | 50 2044 | 2045 | 2046 | Text 2047 | 2048 | 2049 | 2050 | 2051 | 2052 | RUST 2053 | 2054 | 2055 | Rust program 2056 | 2057 | 2058 | rs 2059 | 2060 | 2061 | 50 2062 | 2063 | 2064 | Text 2065 | 2066 | 2067 | 2068 | 2069 | 2070 | PASCAL 2071 | 2072 | 2073 | Pascal program 2074 | 2075 | 2076 | pas 2077 | 2078 | 2079 | 50 2080 | 2081 | 2082 | Text 2083 | 2084 | 2085 | 2086 | 2087 | 2088 | DOS_BATCH 2089 | 2090 | 2091 | DOS Batch file 2092 | 2093 | 2094 | bat 2095 | 2096 | 2097 | 40 2098 | 2099 | 2100 | Text 2101 | 2102 | 2103 | 2104 | 2105 | 2106 | POSTSCRIPT 2107 | 2108 | 2109 | PostScript file 2110 | 2111 | 2112 | ps, eps, pfa 2113 | 2114 | 2115 | 40 2116 | 2117 | 2118 | 2119 | 2120 | 2121 | JAVASCRIPT 2122 | 2123 | 2124 | JavaScript file 2125 | 2126 | 2127 | js, sjs, jsm 2128 | 2129 | 2130 | 50 2131 | 2132 | 2133 | 2134 | 2135 | 2136 | COFFEESCRIPT 2137 | 2138 | 2139 | CoffeeScript file 2140 | 2141 | 2142 | coffee 2143 | 2144 | 2145 | 50 2146 | 2147 | 2148 | Text 2149 | 2150 | 2151 | 2152 | 2153 | 2154 | NSIS 2155 | 2156 | 2157 | NSIS script 2158 | 2159 | 2160 | nsi, nsh 2161 | 2162 | 2163 | 40 2164 | 2165 | 2166 | Text 2167 | 2168 | 2169 | 2170 | 2171 | 2172 | PARAM 2173 | 2174 | 2175 | Parameter file 2176 | 2177 | 2178 | prm, par, ff 2179 | 2180 | 2181 | 40 2182 | 2183 | 2184 | Text 2185 | 2186 | 2187 | 2188 | 2189 | 2190 | DOXYGEN 2191 | 2192 | 2193 | Doxygen file 2194 | 2195 | 2196 | dox, doxy, doxyfile, doxygen 2197 | 2198 | 2199 | Doxyfile, Doxyfile.in 2200 | 2201 | 2202 | 40 2203 | 2204 | 2205 | Text 2206 | 2207 | 2208 | 2209 | 2210 | 2211 | QML_PROJECT 2212 | 2213 | 2214 | QML Project file 2215 | 2216 | 2217 | qmlproject 2218 | 2219 | 2220 | 50 2221 | 2222 | 2223 | Text 2224 | 2225 | 2226 | 2227 | 2228 | 2229 | CMAKE 2230 | 2231 | 2232 | CMake file 2233 | 2234 | 2235 | cmake, cmakein 2236 | 2237 | 2238 | CMakeLists.txt 2239 | 2240 | 2241 | 50 2242 | 2243 | 2244 | Text 2245 | 2246 | 2247 | 2248 | 2249 | 2250 | EXE 2251 | 2252 | 2253 | Executable file 2254 | 2255 | 2256 | 50 2257 | 2258 | 2259 | 2260 | 2261 | 2262 | PE_BINARY 2263 | 2264 | 2265 | PE Binary file 2266 | 2267 | 2268 | 45 2269 | 2270 | 2271 | PE32, PE64, MS-DOS executable 2272 | 2273 | 2274 | 2275 | 2276 | 2277 | AUTOMAKE 2278 | 2279 | 2280 | Automake file 2281 | 2282 | 2283 | am, ac 2284 | 2285 | 2286 | Makefile.am, Makefile.ac 2287 | 2288 | 2289 | 50 2290 | 2291 | 2292 | Text 2293 | 2294 | 2295 | 2296 | 2297 | 2298 | IPDL 2299 | 2300 | 2301 | IPDL file 2302 | 2303 | 2304 | ipdl 2305 | 2306 | 2307 | 40 2308 | 2309 | 2310 | Text 2311 | 2312 | 2313 | 2314 | 2315 | 2316 | XPI 2317 | 2318 | 2319 | XPI file 2320 | 2321 | 2322 | xpi 2323 | 2324 | 2325 | 40 2326 | 2327 | 2328 | 2329 | 2330 | 2331 | CERTIFICATE 2332 | 2333 | 2334 | Certificate file 2335 | 2336 | 2337 | ca, crt, cert, crl, cer, pem 2338 | 2339 | 2340 | 40 2341 | 2342 | 2343 | 2344 | 2345 | 2346 | ICC 2347 | 2348 | 2349 | ICC profile 2350 | 2351 | 2352 | icc, icm, pf 2353 | 2354 | 2355 | 40 2356 | 2357 | 2358 | 2359 | 2360 | 2361 | CGI 2362 | 2363 | 2364 | CGI script 2365 | 2366 | 2367 | cgi 2368 | 2369 | 2370 | 40 2371 | 2372 | 2373 | Text 2374 | 2375 | 2376 | 2377 | 2378 | 2379 | XUL 2380 | 2381 | 2382 | XML UI file 2383 | 2384 | 2385 | xul 2386 | 2387 | 2388 | 40 2389 | 2390 | 2391 | Text 2392 | 2393 | 2394 | 2395 | 2396 | 2397 | XBL 2398 | 2399 | 2400 | XBL file 2401 | 2402 | 2403 | xbl 2404 | 2405 | 2406 | 40 2407 | 2408 | 2409 | Text 2410 | 2411 | 2412 | 2413 | 2414 | 2415 | XSL 2416 | 2417 | 2418 | XML style sheet 2419 | 2420 | 2421 | xsl 2422 | 2423 | 2424 | 40 2425 | 2426 | 2427 | Text 2428 | 2429 | 2430 | 2431 | 2432 | 2433 | XSD 2434 | 2435 | 2436 | XML schema definition 2437 | 2438 | 2439 | xsd 2440 | 2441 | 2442 | 40 2443 | 2444 | 2445 | Text 2446 | 2447 | 2448 | 2449 | 2450 | 2451 | XSLT 2452 | 2453 | 2454 | XSL transformation file 2455 | 2456 | 2457 | xslt 2458 | 2459 | 2460 | 40 2461 | 2462 | 2463 | Text 2464 | 2465 | 2466 | 2467 | 2468 | 2469 | DTD 2470 | 2471 | 2472 | DTD file 2473 | 2474 | 2475 | dtd 2476 | 2477 | 2478 | 40 2479 | 2480 | 2481 | Text 2482 | 2483 | 2484 | 2485 | 2486 | 2487 | ENTITY_FILE 2488 | 2489 | 2490 | Entity file 2491 | 2492 | 2493 | ent 2494 | 2495 | 2496 | 40 2497 | 2498 | 2499 | Text 2500 | 2501 | 2502 | 2503 | 2504 | 2505 | XML_RNG 2506 | 2507 | 2508 | RNG file 2509 | 2510 | 2511 | rng 2512 | 2513 | 2514 | 40 2515 | 2516 | 2517 | Text 2518 | 2519 | 2520 | 2521 | 2522 | 2523 | RDF 2524 | 2525 | 2526 | RDF file 2527 | 2528 | 2529 | rdf 2530 | 2531 | 2532 | 40 2533 | 2534 | 2535 | Text 2536 | 2537 | 2538 | 2539 | 2540 | 2541 | SQLITE 2542 | 2543 | 2544 | QSLite database 2545 | 2546 | 2547 | sqlite 2548 | 2549 | 2550 | 40 2551 | 2552 | 2553 | 2554 | 2555 | 2556 | BERKELEY_DB 2557 | 2558 | 2559 | Berkeley database 2560 | 2561 | 2562 | db 2563 | 2564 | 2565 | 40 2566 | 2567 | 2568 | 2569 | 2570 | 2571 | GPERF 2572 | 2573 | 2574 | GNU Gperf file 2575 | 2576 | 2577 | gperf 2578 | 2579 | 2580 | 40 2581 | 2582 | 2583 | Text 2584 | 2585 | 2586 | 2587 | 2588 | 2589 | YAML 2590 | 2591 | 2592 | YAML file 2593 | 2594 | 2595 | yml, yaml, yml2 2596 | 2597 | 2598 | 40 2599 | 2600 | 2601 | Text 2602 | 2603 | 2604 | 2605 | 2606 | 2607 | TCL 2608 | 2609 | 2610 | Tcl program 2611 | 2612 | 2613 | tcl 2614 | 2615 | 2616 | 70 2617 | 2618 | 2619 | Text 2620 | 2621 | 2622 | 2623 | 2624 | 2625 | PYTHON 2626 | 2627 | 2628 | Python program 2629 | 2630 | 2631 | py 2632 | 2633 | 2634 | 70 2635 | 2636 | 2637 | Text 2638 | 2639 | 2640 | 2641 | 2642 | 2643 | PYTHON_COMPILED 2644 | 2645 | 2646 | Python compiled program 2647 | 2648 | 2649 | d1f20d0a 2650 | 2651 | 2652 | pyc, pyo 2653 | 2654 | 2655 | 60 2656 | 2657 | 2658 | 2659 | 2660 | 2661 | SED 2662 | 2663 | 2664 | Sed program 2665 | 2666 | 2667 | sed 2668 | 2669 | 2670 | 70 2671 | 2672 | 2673 | Text 2674 | 2675 | 2676 | 2677 | 2678 | 2679 | FONT 2680 | 2681 | 2682 | Font file 2683 | 2684 | 2685 | bdf, ttf, TTF, ttc, pfb, qpf, qpf2, otf, eot 2686 | woff, fnt, bfc, afm, xafm, tfm, vf, ofm, sfd 2687 | 2688 | 2689 | 40 2690 | 2691 | 2692 | 2693 | 2694 | 2695 | BINARY_DTD 2696 | 2697 | 2698 | Binary DTD file 2699 | 2700 | 2701 | bdtd 2702 | 2703 | 2704 | 40 2705 | 2706 | 2707 | 2708 | 2709 | 2710 | ENCODING 2711 | 2712 | 2713 | Encoding file 2714 | 2715 | 2716 | enc, utf 2717 | 2718 | 2719 | 40 2720 | 2721 | 2722 | 2723 | 2724 | 2725 | GO 2726 | 2727 | 2728 | Go program 2729 | 2730 | 2731 | go 2732 | 2733 | 2734 | 70 2735 | 2736 | 2737 | Text 2738 | 2739 | 2740 | 2741 | 2742 | 2743 | IBY 2744 | 2745 | 2746 | ROM Image file 2747 | 2748 | 2749 | iby 2750 | 2751 | 2752 | 40 2753 | 2754 | 2755 | Text 2756 | 2757 | 2758 | 2759 | 2760 | 2761 | JAVA 2762 | 2763 | 2764 | Java program 2765 | 2766 | 2767 | java, jsp, jj, sjava, java.template 2768 | 2769 | 2770 | 70 2771 | 2772 | 2773 | Text 2774 | 2775 | 2776 | 2777 | 2778 | 2779 | CS 2780 | 2781 | 2782 | C# program 2783 | 2784 | 2785 | cs 2786 | 2787 | 2788 | 60 2789 | 2790 | 2791 | Text 2792 | 2793 | 2794 | 2795 | 2796 | 2797 | SCALA 2798 | 2799 | 2800 | Scala program 2801 | 2802 | 2803 | scl 2804 | 2805 | 2806 | 70 2807 | 2808 | 2809 | Text 2810 | 2811 | 2812 | 2813 | 2814 | 2815 | SHELL 2816 | 2817 | 2818 | Shell program 2819 | 2820 | 2821 | sh, SH, csh, ksh, bash, tcsh, zsh 2822 | 2823 | 2824 | 70 2825 | 2826 | 2827 | Text 2828 | 2829 | 2830 | 2831 | 2832 | 2833 | ASSEMBLER 2834 | 2835 | 2836 | Assembler program 2837 | 2838 | 2839 | asm, s, S, sx, il 2840 | 2841 | 2842 | 70 2843 | 2844 | 2845 | Text 2846 | 2847 | 2848 | 2849 | 2850 | 2851 | PERL_TEST 2852 | 2853 | 2854 | Perl test program 2855 | 2856 | 2857 | t 2858 | 2859 | 2860 | 50 2861 | 2862 | 2863 | Text 2864 | 2865 | 2866 | 2867 | 2868 | 2869 | PERL 2870 | 2871 | 2872 | Perl program 2873 | 2874 | 2875 | pl, PL, plx, e2x, ph 2876 | 2877 | 2878 | 70 2879 | 2880 | 2881 | Text 2882 | 2883 | 2884 | 2885 | 2886 | 2887 | LUA 2888 | 2889 | 2890 | Lua program 2891 | 2892 | 2893 | lua 2894 | 2895 | 2896 | 60 2897 | 2898 | 2899 | Text 2900 | 2901 | 2902 | 2903 | 2904 | 2905 | AWK 2906 | 2907 | 2908 | Awk program 2909 | 2910 | 2911 | awk 2912 | 2913 | 2914 | 60 2915 | 2916 | 2917 | Text 2918 | 2919 | 2920 | 2921 | 2922 | 2923 | PYTHON_EGG 2924 | 2925 | 2926 | Python egg 2927 | 2928 | 2929 | egg 2930 | 2931 | 2932 | Python Eggs 2933 | 2934 | 2935 | 60 2936 | 2937 | 2938 | 2939 | 2940 | 2941 | RUBY 2942 | 2943 | 2944 | Ruby program 2945 | 2946 | 2947 | rb 2948 | 2949 | 2950 | 60 2951 | 2952 | 2953 | Text 2954 | 2955 | 2956 | 2957 | 2958 | 2959 | PHP 2960 | 2961 | 2962 | PHP program 2963 | 2964 | 2965 | php, phpt 2966 | 2967 | 2968 | 60 2969 | 2970 | 2971 | Text 2972 | 2973 | 2974 | 2975 | 2976 | 2977 | VIM 2978 | 2979 | 2980 | Vim Settings file 2981 | 2982 | 2983 | vim 2984 | 2985 | 2986 | 40 2987 | 2988 | 2989 | 2990 | 2991 | 2992 | SQL 2993 | 2994 | 2995 | SQL file 2996 | 2997 | 2998 | sql 2999 | 3000 | 3001 | 40 3002 | 3003 | 3004 | Text 3005 | 3006 | 3007 | 3008 | 3009 | 3010 | SHELL_ARCHIVE 3011 | 3012 | 3013 | Shell archive 3014 | 3015 | 3016 | shar 3017 | 3018 | 3019 | 40 3020 | 3021 | 3022 | Text 3023 | 3024 | 3025 | 3026 | 3027 | 3028 | WEB_SOURCE 3029 | 3030 | 3031 | WEB Source file 3032 | 3033 | 3034 | web, w 3035 | 3036 | 3037 | 40 3038 | 3039 | 3040 | Text 3041 | 3042 | 3043 | 3044 | 3045 | 3046 | GETTEXT 3047 | 3048 | 3049 | Gettext file 3050 | 3051 | 3052 | po, pot 3053 | 3054 | 3055 | 40 3056 | 3057 | 3058 | Text 3059 | 3060 | 3061 | 3062 | 3063 | 3064 | GETTEXT_MO 3065 | 3066 | 3067 | Gettext object 3068 | 3069 | 3070 | gmo, mo 3071 | 3072 | 3073 | 40 3074 | 3075 | 3076 | 3077 | 3078 | 3079 | GPG 3080 | 3081 | 3082 | GNU GPG file 3083 | 3084 | 3085 | gpg 3086 | 3087 | 3088 | 40 3089 | 3090 | 3091 | 3092 | 3093 | 3094 | RTF 3095 | 3096 | 3097 | RTF file 3098 | 3099 | 3100 | rtf 3101 | 3102 | 3103 | Rich Text 3104 | 3105 | 3106 | 40 3107 | 3108 | 3109 | 3110 | 3111 | 3112 | RST 3113 | 3114 | 3115 | RST file 3116 | 3117 | 3118 | rst 3119 | 3120 | 3121 | 40 3122 | 3123 | 3124 | Text 3125 | 3126 | 3127 | 3128 | 3129 | 3130 | VRML 3131 | 3132 | 3133 | VRML file 3134 | 3135 | 3136 | wrl, vrml 3137 | 3138 | 3139 | 40 3140 | 3141 | 3142 | Text 3143 | 3144 | 3145 | 3146 | 3147 | 3148 | IV 3149 | 3150 | 3151 | Scene graph file 3152 | 3153 | 3154 | iv 3155 | 3156 | 3157 | 40 3158 | 3159 | 3160 | 3161 | 3162 | 3163 | MATLAB 3164 | 3165 | 3166 | MATLAB file 3167 | 3168 | 3169 | mat 3170 | 3171 | 3172 | 40 3173 | 3174 | 3175 | 3176 | 3177 | 3178 | TEX_DOCUMENT 3179 | 3180 | 3181 | TeX document 3182 | 3183 | 3184 | latex, tex, sty 3185 | 3186 | 3187 | LaTeX 3188 | 3189 | 3190 | 40 3191 | 3192 | 3193 | 3194 | 3195 | 3196 | DVI 3197 | 3198 | 3199 | DVI file 3200 | 3201 | 3202 | dvi, xdv 3203 | 3204 | 3205 | 40 3206 | 3207 | 3208 | 3209 | 3210 | 3211 | XQ 3212 | 3213 | 3214 | XQuery file 3215 | 3216 | 3217 | xq 3218 | 3219 | 3220 | 40 3221 | 3222 | 3223 | Text 3224 | 3225 | 3226 | 3227 | 3228 | 3229 | JAVA_CLASS 3230 | 3231 | 3232 | Java class 3233 | 3234 | 3235 | class 3236 | 3237 | 3238 | 60 3239 | 3240 | 3241 | 3242 | 3243 | 3244 | PERL_MODULE 3245 | 3246 | 3247 | Perl module 3248 | 3249 | 3250 | pm 3251 | 3252 | 3253 | 70 3254 | 3255 | 3256 | Text 3257 | 3258 | 3259 | 3260 | 3261 | 3262 | PERL_XS 3263 | 3264 | 3265 | Perl XS file 3266 | 3267 | 3268 | xs 3269 | 3270 | 3271 | 40 3272 | 3273 | 3274 | Text 3275 | 3276 | 3277 | 3278 | 3279 | 3280 | JSON 3281 | 3282 | 3283 | JSON file 3284 | 3285 | 3286 | json 3287 | 3288 | 3289 | 50 3290 | 3291 | 3292 | Text 3293 | 3294 | 3295 | 3296 | 3297 | 3298 | POD 3299 | 3300 | 3301 | POD document 3302 | 3303 | 3304 | pod 3305 | 3306 | 3307 | 40 3308 | 3309 | 3310 | Text 3311 | 3312 | 3313 | 3314 | 3315 | 3316 | SKIN 3317 | 3318 | 3319 | Skin file 3320 | 3321 | 3322 | skin 3323 | 3324 | 3325 | 40 3326 | 3327 | 3328 | 3329 | 3330 | 3331 | COMPILED_OBJECT 3332 | 3333 | 3334 | Compiled object 3335 | 3336 | 3337 | o, obj 3338 | 3339 | 3340 | 40 3341 | 3342 | 3343 | 3344 | 3345 | 3346 | MACRO 3347 | 3348 | 3349 | Macro file 3350 | 3351 | 3352 | mac 3353 | 3354 | 3355 | 40 3356 | 3357 | 3358 | 3359 | 3360 | 3361 | INFODOC 3362 | 3363 | 3364 | Info document 3365 | 3366 | 3367 | 40 3368 | 3369 | 3370 | 3371 | 3372 | 3373 | GNU_LD_SCRIPT 3374 | 3375 | 3376 | GNU LD script 3377 | 3378 | 3379 | ld, lds 3380 | 3381 | 3382 | 50 3383 | 3384 | 3385 | Text 3386 | 3387 | 3388 | 3389 | 3390 | 3391 | DEF 3392 | 3393 | 3394 | Module-Definition file 3395 | 3396 | 3397 | def 3398 | 3399 | 3400 | 50 3401 | 3402 | 3403 | Text 3404 | 3405 | 3406 | 3407 | 3408 | 3409 | GIT 3410 | 3411 | 3412 | Git file 3413 | 3414 | 3415 | 40 3416 | 3417 | 3418 | Text 3419 | 3420 | 3421 | 3422 | 3423 | 3424 | CVS 3425 | 3426 | 3427 | CVS file 3428 | 3429 | 3430 | 40 3431 | 3432 | 3433 | 3434 | 3435 | 3436 | SVN 3437 | 3438 | 3439 | Subversion file 3440 | 3441 | 3442 | 40 3443 | 3444 | 3445 | 3446 | 3447 | 3448 | HG 3449 | 3450 | 3451 | Mercurial file 3452 | 3453 | 3454 | 40 3455 | 3456 | 3457 | 3458 | 3459 | 3460 | BZR 3461 | 3462 | 3463 | Bazaar file 3464 | 3465 | 3466 | 40 3467 | 3468 | 3469 | 3470 | 3471 | 3472 | TEXINFO 3473 | 3474 | 3475 | Texinfo file 3476 | 3477 | 3478 | texi, texinfo 3479 | 3480 | 3481 | 40 3482 | 3483 | 3484 | Text 3485 | 3486 | 3487 | 3488 | 3489 | 3490 | MS_OFFICE 3491 | 3492 | 3493 | MS office document 3494 | 3495 | 3496 | doc, docx, xl, xls, xlsb, xlsx, tsv, dex 3497 | 3498 | 3499 | 40 3500 | 3501 | 3502 | 3503 | 3504 | 3505 | CSS 3506 | 3507 | 3508 | CSS style sheet 3509 | 3510 | 3511 | css 3512 | 3513 | 3514 | 40 3515 | 3516 | 3517 | Text 3518 | 3519 | 3520 | CSS 3521 | 3522 | 3523 | 3524 | 3525 | 3526 | SCSS 3527 | 3528 | 3529 | Sass CSS style sheet 3530 | 3531 | 3532 | scss 3533 | 3534 | 3535 | 40 3536 | 3537 | 3538 | Text 3539 | 3540 | 3541 | 3542 | 3543 | 3544 | DATA 3545 | 3546 | 3547 | Data file 3548 | 3549 | 3550 | data, dat, out, stdout, stdin, tbl, input, exp, ex 3551 | 3552 | 3553 | 30 3554 | 3555 | 3556 | Text 3557 | 3558 | 3559 | 3560 | 3561 | 3562 | M4 3563 | 3564 | 3565 | M4 macro file 3566 | 3567 | 3568 | m4 3569 | 3570 | 3571 | 50 3572 | 3573 | 3574 | M4 3575 | 3576 | 3577 | Text 3578 | 3579 | 3580 | 3581 | 3582 | 3583 | SYMLINK 3584 | 3585 | 3586 | Symbolic link 3587 | 3588 | 3589 | 50 3590 | 3591 | 3592 | 3593 | 3594 | 3595 | HTML 3596 | 3597 | 3598 | HTML page 3599 | 3600 | 3601 | html, htm, xhtml, dhtml, shtml, shtm 3602 | 3603 | 3604 | 40 3605 | 3606 | 3607 | HTML 3608 | 3609 | 3610 | 3611 | 3612 | 3613 | PRECOMPILED_HEADER 3614 | 3615 | 3616 | Precompiled header 3617 | 3618 | 3619 | gch, pch 3620 | 3621 | 3622 | 40 3623 | 3624 | 3625 | 3626 | 3627 | 3628 | PACKAGE 3629 | 3630 | 3631 | Package file 3632 | 3633 | 3634 | pkg 3635 | 3636 | 3637 | 40 3638 | 3639 | 3640 | 3641 | 3642 | 3643 | PACKAGE_INFO 3644 | 3645 | 3646 | Package Info file 3647 | 3648 | 3649 | PkgInfo 3650 | 3651 | 3652 | pkginfo 3653 | 3654 | 3655 | 40 3656 | 3657 | 3658 | Text 3659 | 3660 | 3661 | 3662 | 3663 | 3664 | JAM_FILE 3665 | 3666 | 3667 | Jam file 3668 | 3669 | 3670 | Jamfile, Jamrules 3671 | 3672 | 3673 | jam 3674 | 3675 | 3676 | 40 3677 | 3678 | 3679 | Text 3680 | 3681 | 3682 | 3683 | 3684 | 3685 | LIST_FILE 3686 | 3687 | 3688 | Data List 3689 | 3690 | 3691 | list, lst 3692 | 3693 | 3694 | 40 3695 | 3696 | 3697 | Text 3698 | 3699 | 3700 | 3701 | 3702 | 3703 | GLADE 3704 | 3705 | 3706 | Glade interface 3707 | 3708 | 3709 | glade 3710 | 3711 | 3712 | 40 3713 | 3714 | 3715 | Text 3716 | 3717 | 3718 | 3719 | 3720 | 3721 | CACHE 3722 | 3723 | 3724 | Cache file 3725 | 3726 | 3727 | cache 3728 | 3729 | 3730 | 40 3731 | 3732 | 3733 | Text 3734 | 3735 | 3736 | 3737 | 3738 | 3739 | HIDDEN 3740 | 3741 | 3742 | Hidden file 3743 | 3744 | 3745 | 40 3746 | 3747 | 3748 | Text 3749 | 3750 | 3751 | 3752 | 3753 | 3754 | BACKUP 3755 | 3756 | 3757 | Backup file 3758 | 3759 | 3760 | bak 3761 | 3762 | 3763 | 40 3764 | 3765 | 3766 | Text 3767 | 3768 | 3769 | 3770 | 3771 | 3772 | SERVICE 3773 | 3774 | 3775 | Service file 3776 | 3777 | 3778 | service 3779 | 3780 | 3781 | 40 3782 | 3783 | 3784 | Text 3785 | 3786 | 3787 | 3788 | 3789 | 3790 | YUM_DB 3791 | 3792 | 3793 | Yum DB file 3794 | 3795 | 3796 | yumdb 3797 | 3798 | 3799 | 40 3800 | 3801 | 3802 | 3803 | 3804 | 3805 | FIRMWARE 3806 | 3807 | 3808 | Firmware file 3809 | 3810 | 3811 | fw 3812 | 3813 | 3814 | 40 3815 | 3816 | 3817 | Binary 3818 | 3819 | 3820 | 3821 | 3822 | 3823 | CONFIGURATION 3824 | 3825 | 3826 | Configuration file 3827 | 3828 | 3829 | conf, config, cfg, cnf, inf, INF, sysconf, sysconfig, rules 3830 | 3831 | 3832 | Config, config 3833 | 3834 | 3835 | 50 3836 | 3837 | 3838 | Text 3839 | 3840 | 3841 | 3842 | 3843 | 3844 | PDF 3845 | 3846 | 3847 | PDF file 3848 | 3849 | 3850 | pdf 3851 | 3852 | 3853 | 30 3854 | 3855 | 3856 | 3857 | 3858 | 3859 | X_PIXMAP 3860 | 3861 | 3862 | X Pixmap file 3863 | 3864 | 3865 | xpm, xbm 3866 | 3867 | 3868 | 30 3869 | 3870 | 3871 | Text 3872 | 3873 | 3874 | 3875 | 3876 | 3877 | IMAGE 3878 | 3879 | 3880 | Image file 3881 | 3882 | 3883 | png, jpg, jpeg, exif, raw, bmp, pbm, webp, spp, tga 3884 | img, gif, tiff, xcf, cur, svgz, cct, jp2, jpx 3885 | ppm, tif, yuv, jps, mng, pcx, blend 3886 | 3887 | 3888 | 30 3889 | 3890 | 3891 | 3892 | 3893 | 3894 | VECTOR_IMAGE 3895 | 3896 | 3897 | Vector Image file 3898 | 3899 | 3900 | svg, emf, dia, asy, fig, cdr, cvx, fxg, hpl, vsd 3901 | 3902 | 3903 | 30 3904 | 3905 | 3906 | Text 3907 | 3908 | 3909 | 3910 | 3911 | 3912 | AUDIO 3913 | 3914 | 3915 | Audio file 3916 | 3917 | 3918 | wav, aiff, flac, aac, mpc, ogg, wma, sf2, aa, ac3 3919 | m3u, midi, wave, wax, wow, mp1, mp2, mp3, mpa, mpga 3920 | mpu, oga, omg, omx, omf, pcast, pls, acm, afc, mid 3921 | dls, flw, amr 3922 | 3923 | 3924 | 30 3925 | 3926 | 3927 | 3928 | 3929 | 3930 | VIDEO 3931 | 3932 | 3933 | Video file 3934 | 3935 | 3936 | swf, flv, mng, avi, 3gp, divx, ogv, movie, mov, swf, wmv, xvid 3937 | mp4, mpeg, mjpeg, mjp, mpeg4, mpg, mpg2, mpv, mpv2, webm 3938 | 3939 | 3940 | 30 3941 | 3942 | 3943 | 3944 | 3945 | 3946 | ICON 3947 | 3948 | 3949 | Icon 3950 | 3951 | 3952 | ico, icon, ICO, icns 3953 | 3954 | 3955 | 30 3956 | 3957 | 3958 | 3959 | 3960 | 3961 | RPM 3962 | 3963 | 3964 | RPM package 3965 | 3966 | 3967 | rpm 3968 | 3969 | 3970 | 20 3971 | 3972 | 3973 | 3974 | 3975 | 3976 | SRPM 3977 | 3978 | 3979 | SRPM package 3980 | 3981 | 3982 | src.rpm, srpm 3983 | 3984 | 3985 | 20 3986 | 3987 | 3988 | 3989 | 3990 | 3991 | DEB 3992 | 3993 | 3994 | Deb package 3995 | 3996 | 3997 | deb 3998 | 3999 | 4000 | 20 4001 | 4002 | 4003 | 4004 | 4005 | 4006 | DIR 4007 | 4008 | 4009 | Directory 4010 | 4011 | 4012 | 20 4013 | 4014 | 4015 | 4016 | 4017 | 4018 | TEXT 4019 | 4020 | 4021 | Text file 4022 | 4023 | 4024 | txt, TXT 4025 | 4026 | 4027 | 10 4028 | 4029 | 4030 | Text 4031 | 4032 | 4033 | 4034 | 4035 | 4036 | ARCHIVE 4037 | 4038 | 4039 | Archive 4040 | 4041 | 4042 | tar.gz, tgz, tar.Z, taz, tar.xz, txz 4043 | tar.bz2, tbz2, tbz, tb2, tar.lzma, tlzma 4044 | tar.lz, tlz, zip, zae, tar, lzma, gz 4045 | jar, war, ear, xz, 7z, rar, sfx, ace 4046 | bz, bz2, zipx, apk 4047 | 4048 | 4049 | 10 4050 | 4051 | 4052 | 4053 | 4054 | 4055 | INFORM 4056 | 4057 | 4058 | Information file 4059 | 4060 | 4061 | PATCHING, ANNOUNCE, FAQ, HACKING, BUGS, CONFORMANCE 4062 | TRADEMARK, THANKYOU, PACKAGERS, DEBUG, HOWTO, MAINTAINERS 4063 | TODO, NOTES, AUTHORS, THANKS, IDEAS, HOWTO.DEBUG, DESIGN 4064 | PKG-INFO, CREDITS, HISTORY, INSTALL, INDEX, RELEASE 4065 | CONTRIB, NOTE, INSTALLATION, NEW, DEPS, LEGAL.NOTICE 4066 | 4067 | 4068 | CONTRIBUTORS.txt, BUILDING.txt, Install.txt, BLACKLIST.txt 4069 | WISHLIST.TXT, HOWTO.txt 4070 | 4071 | 4072 | install, INSTALL 4073 | 4074 | 4075 | 10 4076 | 4077 | 4078 | 4079 | 4080 | 4081 | CHANGELOG 4082 | 4083 | 4084 | Change log 4085 | 4086 | 4087 | CHANGES, ChangeLog, NEWS, HISTORY 4088 | 4089 | 4090 | Release_notes.txt, RELEASE.txt, CHANGES.txt 4091 | 4092 | 4093 | 10 4094 | 4095 | 4096 | 4097 | 4098 | 4099 | README 4100 | 4101 | 4102 | Readme file 4103 | 4104 | 4105 | README 4106 | 4107 | 4108 | Readme.txt, README.Debian 4109 | 4110 | 4111 | readme.txt, README 4112 | 4113 | 4114 | 10 4115 | 4116 | 4117 | 4118 | 4119 | 4120 | LICENSE 4121 | 4122 | 4123 | License 4124 | 4125 | 4126 | LGPL-2, LGPL-3, LICENSE, COPYING, COPYING3 4127 | COPYING3.LIB, COPYING.LIB, LGPL, COPYING.LESSER 4128 | LICENSE.LESSER, LICENSE-MPL 4129 | 4130 | 4131 | LGPL.txt, COPYING.txt, COPYRIGHT, License.txt, COPYING.GPLv2 4132 | APACHE.license, LGPL.license, COPYING.readme, COPYING.GPLv3 4133 | COPYING.LGPL, LICENSING.txt, COPYING.LGPLv2.1, GPL.txt 4134 | GPL-LICENSE.txt, MIT-LICENSE.txt, COPYING.MPL, MPL-1.1.txt 4135 | 4136 | 4137 | license, licence 4138 | 4139 | 4140 | 10 4141 | 4142 | 4143 | 4144 | 4145 | 4146 | OTHER 4147 | 4148 | 4149 | Other 4150 | 4151 | 4152 | Other Files 4153 | 4154 | 4155 | 0 4156 | 4157 | 4158 | 4159 | 4160 | -------------------------------------------------------------------------------- /modules/Internals/Fonts/OpenSans.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvc/pkgdiff/56af1b018404f6efcf05063c1db5490e77bf6b00/modules/Internals/Fonts/OpenSans.ttf -------------------------------------------------------------------------------- /modules/Internals/Fonts/VeraMono.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvc/pkgdiff/56af1b018404f6efcf05063c1db5490e77bf6b00/modules/Internals/Fonts/VeraMono.ttf -------------------------------------------------------------------------------- /modules/Internals/Scripts/Sort.js: -------------------------------------------------------------------------------- 1 | function sort(el, status) 2 | { 3 | var col_sort = el.innerHTML; 4 | var tr = el.parentNode; 5 | var table = tr.parentNode; 6 | var td, col_sort_num; 7 | for (var i=0; (td = tr.getElementsByTagName('th').item(i)); i++) 8 | { 9 | if(td.innerHTML == col_sort) 10 | { 11 | col_sort_num = i; 12 | if(td.prevsort == 'y') { 13 | el.up = Number(!el.up); 14 | } 15 | else if(td.prevsort == 'n') { 16 | td.prevsort = 'y'; 17 | el.up = 0; 18 | } 19 | else 20 | { 21 | if(col_sort_num==0) 22 | { // already sorted 23 | td.prevsort = 'n'; 24 | el.up = 1; 25 | } 26 | else if(col_sort_num==2) 27 | { // delta 28 | td.prevsort = 'n'; 29 | el.up = 1; 30 | } 31 | else 32 | { 33 | td.prevsort = 'y'; 34 | el.up = 0; 35 | } 36 | } 37 | } 38 | else 39 | { 40 | if(td.prevsort == 'y') { 41 | td.prevsort = 'n'; 42 | } 43 | } 44 | } 45 | 46 | var a = new Array(); 47 | for(var i=1; i < table.rows.length; i++) 48 | { 49 | var cols = table.rows[i].getElementsByTagName('td'); 50 | if(cols.item(status)==null) 51 | { // double status 52 | a[i-2][2] = table.rows[i]; 53 | } 54 | else 55 | { 56 | a[i-1] = new Array(); 57 | var indent = cols.item(col_sort_num).innerHTML; 58 | if(indent=='') indent='0'; 59 | if(indent.substr(indent.length-1, 1)=="%") 60 | { // delta 61 | indent = indent.substr(0, indent.length-1)*100; 62 | } 63 | a[i-1][0] = indent; 64 | a[i-1][1] = table.rows[i]; 65 | a[i-1][2] = null; 66 | } 67 | } 68 | 69 | // sort table 70 | a.sort(sort_array); 71 | if(el.up) a.reverse(); 72 | 73 | // draw table 74 | for(var i in a) 75 | { 76 | table.appendChild(a[i][1]); 77 | if(a[i][2]!=null) { 78 | table.appendChild(a[i][2]); 79 | } 80 | } 81 | } 82 | 83 | function sort_array(a,b) 84 | { 85 | if(a[0] == b[0]) return 0; 86 | if(a[0] > b[0]) return 1; 87 | return -1; 88 | } -------------------------------------------------------------------------------- /modules/Internals/Styles/Index.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family:"Open Sans"; 3 | src:url("../fonts/OpenSans.ttf") format("truetype"); 4 | } 5 | 6 | @font-face { 7 | font-family:"VeraMono"; 8 | src:url("../fonts/VeraMono.ttf") format("truetype"); 9 | } 10 | 11 | body { 12 | font-family:'Open Sans', Arial, sans-serif; 13 | background-color:White; 14 | color:Black; 15 | } 16 | hr { 17 | color:#ececec; 18 | background-color:#ececec; 19 | height:3px; 20 | border:0; 21 | } 22 | h1 { 23 | font-size:1.625em; 24 | text-decoration:underline; 25 | } 26 | h2 { 27 | font-size:1.25em; 28 | white-space:nowrap; 29 | text-decoration:underline; 30 | } 31 | table.summary { 32 | border-collapse:collapse; 33 | border:1px solid Gray; 34 | } 35 | table.summary td, table.summary th { 36 | border:1px solid Gray; 37 | white-space:nowrap; 38 | } 39 | table.summary th { 40 | background-color:#EEEEEE; 41 | font-weight:bold; 42 | text-align:left; 43 | padding: 3px; 44 | } 45 | table.summary td { 46 | text-align:right; 47 | padding: 3px 5px 3px 5px; 48 | font-family:'VeraMono', Consolas, 'DejaVu Sans Mono', 'Droid Sans Mono', Monaco, Monospace; 49 | } 50 | table.summary td.left { 51 | text-align:left; 52 | } 53 | table.summary th.left { 54 | text-align:left; 55 | font-weight:100; 56 | } 57 | table.summary td.f_path { 58 | white-space:normal; 59 | word-wrap:break-word; 60 | max-width:57em; 61 | } 62 | table.summary td.value { 63 | padding-left:10px; 64 | } 65 | table.highlight tr:hover { 66 | background-color:#E0E0E0; 67 | } 68 | td.passed, tr.passed { 69 | background-color:#CCFFCC; 70 | } 71 | td.warning, tr.warning { 72 | background-color:#F4F4AF; 73 | } 74 | td.renamed, tr.renamed { 75 | background-color:#FFDAA3; 76 | } 77 | td.moved, tr.moved { 78 | background-color:#FFDAA3; 79 | } 80 | td.failed, tr.failed { 81 | background-color:#FFC3CE; 82 | } 83 | td.new, tr.new { 84 | background-color:#C6DEFF; 85 | } 86 | a.default { 87 | color:#336699; 88 | } 89 | div.p_list { 90 | padding-left:10px; 91 | color:#333333; 92 | font-size:0.94em; 93 | } 94 | .top_ref { 95 | font-size:0.69em; 96 | } 97 | .footer { 98 | font-size:1.2em; 99 | margin-top:23px; 100 | } 101 | -------------------------------------------------------------------------------- /modules/Internals/Styles/View.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin:0.4em; 3 | } 4 | 5 | .view { 6 | cursor:text; 7 | /*margin-top:7px;*/ 8 | font-family:Consolas, 'DejaVu Sans Mono', 'Droid Sans Mono', Monaco, Monospace; 9 | background-color:White; 10 | word-wrap:break-word; 11 | background-color: #FFF; 12 | max-width:100em; 13 | display: inline-block; 14 | text-align:left; 15 | white-space:pre-wrap; 16 | } 17 | 18 | .header, .plain { 19 | background-color:Orange; 20 | text-align:center; 21 | font-weight:bold; 22 | padding-left:1em; 23 | padding-right:1em; 24 | } 25 | 26 | .plain { 27 | background-color:#BFEFFF; 28 | width:0px; 29 | } 30 | 31 | .add { 32 | background-color:#C6DEFF; 33 | } 34 | 35 | .rm { 36 | background-color:#FFCCCC; 37 | } 38 | -------------------------------------------------------------------------------- /modules/Internals/Tools/java-dump.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | function decompile { 4 | # Decompile class and include private members. In preparation for the 5 | # hashing below, strip references on the form #[0-9]+. 6 | javap -c -p "$1" \ 7 | | sed '/^Compiled from /d' \ 8 | | sed '/^[ ]*}[ ]*$/d' \ 9 | | sed 's/[ ]\(#[1-9][0-9]*\)[ ,]/ /' \ 10 | | sed 's/[ ]\([0-9]*[:]\)//' \ 11 | | sed 's/[ ][ ]*/ /g' \ 12 | | sed '/Code:$/,/^$/s/^[ ]*\([^ ]\)/ \1/g' \ 13 | | sed '/Code:$/d' \ 14 | | sed 's/ *{$//' 15 | } 16 | 17 | function hash_bodies { 18 | # Generate hashes of the instructions making up the method bodies; Yields 19 | # more concise summaries. 20 | awk '/^[ ]{0,3}[^ ]/{if (x)print x"\n";x="";}{x=(!x)?$0"\n--":x" "$0;}END{print x;}' \ 21 | | sed '/^--[ ]*$/d' \ 22 | | awk "{ if(/^--/) system(\"printf ' '; (echo '\"\$0\"' | shasum --algorithm 256)\"); else print }" \ 23 | | sed 's/[ ][ ]*-$//' 24 | } 25 | 26 | if [[ "$1" == "-s" ]]; then 27 | shift 1 28 | decompile "$1" | hash_bodies 29 | else 30 | javap -c -s -p -verbose "$1" 31 | fi 32 | -------------------------------------------------------------------------------- /modules/Internals/Tools/rfcdiff-1.41-CUSTOM.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Synopsis: 4 | # Show changes between 2 internet-drafts using changebars or html 5 | # side-by-side diff. 6 | # 7 | # Usage: 8 | # rfcdiff [options] file1 file2 9 | # 10 | # rfcdiff takes two RFCs or Internet-Drafts in text form as input, and 11 | # produces output which indicates the differences found in one of various 12 | # forms, controlled by the options listed below. In all cases, page 13 | # headers and page footers are stripped before looking for changes. 14 | # 15 | # --html Produce side-by-side .html diff (default) 16 | # 17 | # --chbars Produce changebar marked .txt output 18 | # 19 | # --diff Produce a regular diff output 20 | # 21 | # --wdiff Produce paged wdiff output 22 | # 23 | # --hwdiff Produce html-wrapped coloured wdiff output 24 | # 25 | # --oldcolour COLOURNAME Colour for new file in hwdiff (default is "green") 26 | # --oldcolor COLORNAME Color for old file in hwdiff (default is "red") 27 | # 28 | # --newcolour COLOURNAME Colour for new file in hwdiff (default is "green") 29 | # --newcolor COLORNAME Color for new file in hwdiff (default is "green") 30 | # 31 | # --larger Make difference text in hwdiff slightly larger 32 | # 33 | # --keep Don't delete temporary workfiles 34 | # 35 | # --version Show version 36 | # 37 | # --help Show this help 38 | # 39 | # --info "Synopsis|Usage|Copyright|Description|Log" 40 | # Show various info 41 | # 42 | # --width N Set a maximum width of N characters for the 43 | # display of each half of the old/new html diff 44 | # 45 | # --linenum Show linenumbers for each line, not only at the 46 | # start of each change section 47 | # 48 | # --body Strip document preamble (title, boilerplate and 49 | # table of contents) and postamble (Intellectual 50 | # Property Statement, Disclaimer etc) 51 | # 52 | # --nostrip Don't strip headers and footers (or body) 53 | # 54 | # --ab-diff Before/After diff, suitable for rfc-editor 55 | # --abdiff 56 | # 57 | # --stdout Send output to stdout instead to a file 58 | # 59 | # --tmpdiff Path to intermediate diff file 60 | # 61 | # --prelines N Set value for diff -U option 62 | # 63 | # --minimal Set value for diff -d option 64 | # 65 | # --ignore-space-change 66 | # Ignore changes in the amount of white space. 67 | # 68 | # --ignore-all-space 69 | # Ignore all white space. 70 | # 71 | # --ignore-blank-lines 72 | # Ignore changes whose lines are all blank. 73 | # 74 | # 75 | # Copyright: 76 | # ----------------------------------------------------------------- 77 | # 78 | # Copyright 2002 Henrik Levkowetz 79 | # 80 | # This program is free software; you can redistribute it and/or modify 81 | # it under the terms of the GNU General Public License as published by 82 | # the Free Software Foundation; either version 2 of the License, or 83 | # (at your option) any later version. 84 | # 85 | # This program is distributed in the hope that it will be useful, 86 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 87 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 88 | # GNU General Public License for more details. 89 | # 90 | # You should have received a copy of the GNU General Public License 91 | # along with this program; if not, write to the Free Software 92 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 93 | # 94 | # ----------------------------------------------------------------- 95 | # 96 | # Description: 97 | # 98 | # The purpose of this program is to compare two versions of an 99 | # internet-draft, and as output produce a diff in one of several 100 | # formats: 101 | # 102 | # - side-by-side html diff 103 | # - paged wdiff output in a text terminal 104 | # - a text file with changebars in the left margin 105 | # - a simple unified diff output 106 | # 107 | # In all cases, internet-draft headers and footers are stripped before 108 | # generating the diff, to produce a cleaner diff. 109 | # 110 | # It is called as 111 | # 112 | # rfcdiff first-file second-file 113 | # 114 | # The latest version is available from 115 | # http://tools.ietf.org/tools/rfcdiff/ 116 | # 117 | 118 | export version="1.41" 119 | export prelines="10" 120 | export basename=$(basename $0) 121 | export workdir=`mktemp -d -t rfcdiff.XXXXXXXX` 122 | export pagecache1="$workdir/pagecache1" 123 | export pagecache2="$workdir/pagecache2" 124 | 125 | # ---------------------------------------------------------------------- 126 | # Utility to find an executable 127 | # ---------------------------------------------------------------------- 128 | lookfor() { 129 | for b in "$@"; do 130 | found=$(which "$b" 2>/dev/null) 131 | if [ -n "$found" ]; then 132 | if [ -x "$found" ]; then 133 | echo "$found" 134 | return 135 | fi 136 | fi 137 | done 138 | } 139 | 140 | AWK=awk 141 | 142 | # ---------------------------------------------------------------------- 143 | # Strip headers footers and formfeeds from infile to stdout 144 | # ---------------------------------------------------------------------- 145 | strip() { 146 | $AWK ' 147 | { gsub(/\r/, ""); } 148 | { gsub(/[ \t]+$/, ""); } 149 | { pagelength++; } 150 | /\[?[Pp]age [0-9ivx]+\]?[ \t\f]*$/ { 151 | match($0, /[Pp]age [0-9ivx]+/); 152 | num = substr($0, RSTART+5, RLENGTH-5); 153 | print num, outline > ENVIRON["pagecache" ENVIRON["which"]] 154 | pagelength = 0; 155 | } 156 | /\f/ { newpage=1; 157 | pagelength=1; 158 | } 159 | /\f$/ { 160 | # a form feed followed by a \n does not contribute to the 161 | # line count. (But a \f followed by something else does.) 162 | pagelength--; 163 | } 164 | /\f/ { next; } 165 | /\[?[Pp]age [0-9ivx]+\]?[ \t\f]*$/ { preindent = indent; next; } 166 | 167 | /^ *Internet.Draft.+[12][0-9][0-9][0-9] *$/ && (FNR > 15) { newpage=1; next; } 168 | /^ *INTERNET.DRAFT.+[12][0-9][0-9][0-9] *$/ && (FNR > 15) { newpage=1; next; } 169 | /^ *Draft.+( +)[12][0-9][0-9][0-9] *$/ && (FNR > 15) { newpage=1; next; } 170 | /^RFC[ -]?[0-9]+.*( +).* [12][0-9][0-9][0-9]$/ && (FNR > 15) { newpage=1; next; } 171 | /^draft-[-a-z0-9_.]+.*[0-9][0-9][0-9][0-9]$/ && (FNR > 15) { newpage=1; next; } 172 | /(Jan|Feb|Mar|March|Apr|April|May|Jun|June|Jul|July|Aug|Sep|Oct|Nov|Dec) (19[89][0-9]|20[0-9][0-9]) *$/ && pagelength < 3 { newpage=1; next; } 173 | newpage && $0 ~ /^ *draft-[-a-z0-9_.]+ *$/ { newpage=1; next; } 174 | 175 | /^[ \t]+\[/ { sentence=1; } 176 | /[^ \t]/ { 177 | indent = match($0, /[^ ]/); 178 | if (indent < preindent) { 179 | sentence = 1; 180 | } 181 | if (newpage) { 182 | if (sentence) { 183 | outline++; print ""; 184 | } 185 | } else { 186 | if (haveblank) { 187 | outline++; print ""; 188 | } 189 | } 190 | haveblank=0; 191 | sentence=0; 192 | newpage=0; 193 | 194 | line = $0; 195 | sub(/^ *\t/, " ", line); 196 | thiscolumn = match(line, /[^ ]/); 197 | } 198 | /[.:][ \t]*$/ { sentence=1; } 199 | /\(http:\/\/trustee\.ietf\.org\/license-info\)\./ { sentence=0; } 200 | /^[ \t]*$/ { haveblank=1; next; } 201 | { outline++; print; } 202 | ' "$1" 203 | } 204 | 205 | 206 | # ---------------------------------------------------------------------- 207 | # Strip preamble (title, boilerplate and table of contents) and 208 | # postamble (Intellectual Property Statement, Disclaimer etc) 209 | # ---------------------------------------------------------------------- 210 | bodystrip() { 211 | $AWK ' 212 | /^[ \t]*Acknowledgment/ { inbody = 0; } 213 | /^(Full )*Copyright Statement$/ { inbody = 0; } 214 | /^[ \t]*Disclaimer of Validid/ { inbody = 0; } 215 | /^[ \t]*Intellectual Property/ { inbody = 0; } 216 | /^Abstract$/ { inbody = 0; } 217 | /^Table of Contents$/ { inbody = 0; } 218 | /^1.[ \t]*Introduction$/ { inbody = 1; } 219 | 220 | inbody { print; } 221 | ' "$1" 222 | } 223 | 224 | 225 | # ---------------------------------------------------------------------- 226 | # From two words, find common prefix and differing part, join descriptively 227 | # ---------------------------------------------------------------------- 228 | worddiff() { 229 | $AWK ' 230 | BEGIN { 231 | w1 = ARGV[1] 232 | w2 = ARGV[2] 233 | format = ARGV[3] 234 | 235 | do { 236 | if (substr(w1,1,1) == substr(w2,1,1)) { 237 | w1 = substr(w1,2) 238 | w2 = substr(w2,2) 239 | } else { 240 | break; 241 | } 242 | prefixlen++; 243 | } while (length(w1) && length(w2)) 244 | 245 | prefix = substr(ARGV[1],1,prefixlen); 246 | 247 | do { 248 | l1 = length(w1); 249 | l2 = length(w2); 250 | if (substr(w1,l1,1) == substr(w2,l2,1)) { 251 | w1 = substr(w1,1,l1-1) 252 | w2 = substr(w2,1,l2-1) 253 | } else { 254 | break; 255 | } 256 | } while (l1 && l2) 257 | 258 | suffix = substr(ARGV[1], prefixlen+length(w1)) 259 | 260 | printf format, prefix, w1, w2, suffix; 261 | } 262 | ' "$1" "$2" "$3" 263 | } 264 | 265 | # ---------------------------------------------------------------------- 266 | # Generate a html page with side-by-side diff from a unified diff 267 | # ---------------------------------------------------------------------- 268 | htmldiff() { 269 | $AWK ' 270 | BEGIN { 271 | FS = "[ \t,]"; 272 | 273 | # Read pagecache1 274 | maxpage[1] = 1 275 | pageend[1,0] = 2; 276 | while ( getline < ENVIRON["pagecache1"] > 0) { 277 | pageend[1,$1] = $2; 278 | if ($1+0 > maxpage[1]) maxpage[1] = $1+0; 279 | } 280 | 281 | # Read pagecache2 282 | maxpage[2] = 1 283 | pageend[2,0] = 2; 284 | while ( getline < ENVIRON["pagecache2"] > 0) { 285 | pageend[2,$1] = $2; 286 | if ($1+0 > maxpage[2]) maxpage[2] = $1+0; 287 | } 288 | 289 | wdiff = ENVIRON["wdiffbin"] 290 | base1 = ENVIRON["base1"] 291 | base2 = ENVIRON["base2"] 292 | optwidth = ENVIRON["optwidth"] 293 | optnums = ENVIRON["optnums"] 294 | optlinks = ENVIRON["optlinks"] 295 | header(base1, base2) 296 | 297 | difflines1 = 0 298 | difflines2 = 0 299 | } 300 | 301 | function header(file1, file2) { 302 | url1 = file1; 303 | url2 = file2; 304 | if (optlinks) { 305 | if (file1 ~ /^draft-/) { url1 = sprintf("%s", file1, file1); } 306 | if (file1 ~ /^draft-/) { prev = sprintf("<", file1); } 307 | if (file2 ~ /^draft-/) { url2 = sprintf("%s", file2, file2); } 308 | if (file2 ~ /^draft-/) { nxt = sprintf(">", file2) } 309 | } 310 | printf "" \ 311 | " \n" \ 312 | "\n" \ 313 | " \n" \ 314 | " \n" \ 315 | " \n" \ 316 | " \n" \ 317 | " Diff: %s - %s \n" \ 318 | " \n" \ 345 | " \n" \ 346 | " \n" \ 347 | " \n" \ 348 | " \n" \ 349 | "", file1, file2, prev, url1, url2, nxt; 350 | } 351 | 352 | function worddiff(w1, w2) { 353 | prefixlen = 0; 354 | word1 = w1; 355 | do { 356 | if (substr(w1,1,1) == substr(w2,1,1)) { 357 | w1 = substr(w1,2); 358 | w2 = substr(w2,2); 359 | } else { 360 | break; 361 | } 362 | prefixlen++; 363 | } while (length(w1) && length(w2)); 364 | 365 | prefix = substr(word1,1,prefixlen); 366 | 367 | do { 368 | l1 = length(w1); 369 | l2 = length(w2); 370 | if (substr(w1,l1,1) == substr(w2,l2,1)) { 371 | w1 = substr(w1,1,l1-1); 372 | w2 = substr(w2,1,l2-1); 373 | } else { 374 | break; 375 | } 376 | } while (l1 && l2); 377 | 378 | suffix = substr(word1, prefixlen+length(w1)+1); 379 | 380 | wordpart[0] = prefix; 381 | wordpart[1] = w1; 382 | wordpart[2] = w2; 383 | wordpart[3] = suffix; 384 | } 385 | 386 | function numdisplay(which, line) { 387 | if (optnums && (line != prevline[which])) { 388 | prevline[which] = line; 389 | return line-1; 390 | } 391 | return ""; 392 | } 393 | 394 | function fixesc(line) { 395 | # Making this a no-op for now -- the change in line-breaking 396 | # "
" => "\n" should make this less necessary. 397 | # line = gensub(/&(<[^>]*>)/, "\\1\\&", "g", line); 398 | 399 | # We still have to handle cases where we have a broken up "<" / ">" 400 | gsub(/&l<\/span>t;/, "\\<", line); 401 | gsub(/&g<\/span>t;/, "\\>", line); 402 | 403 | gsub(/&amp;/, "\\&", line) 404 | gsub(/&amp;/, "\\&", line) 405 | 406 | gsub(/&lt;/, "\\<", line); 407 | gsub(/&gt;/, "\\>", line); 408 | gsub(/&lt;/, "\\<", line); 409 | gsub(/&gt;/, "\\>", line); 410 | 411 | gsub(/&l<\/span>t;/, "\\<", line); 412 | gsub(/&g<\/span>t;/, "\\>", line); 413 | gsub(/&l<\/span>t;/, "\\<", line); 414 | gsub(/&g<\/span>t;/, "\\>", line); 415 | 416 | 417 | return line; 418 | } 419 | 420 | function chunkdiff(chunk) { 421 | if (difflines1 == 0 && difflines2 == 0) return; 422 | 423 | chunkfile1= sprintf("1/chunk%04d", chunk); 424 | chunkfile2= sprintf("2/chunk%04d", chunk); 425 | printf "" > chunkfile1; 426 | printf "" > chunkfile2; 427 | for (l = 0; l < difflines1; l++) { print stack1[l] >> chunkfile1; } 428 | for (l = 0; l < difflines2; l++) { print stack2[l] >> chunkfile2; } 429 | close(chunkfile1); 430 | close(chunkfile2); 431 | 432 | cmd1 = sprintf("%s -n -2 -w \"\" -x \"\" %s %s", wdiff, chunkfile1, chunkfile2); 433 | cmd2 = sprintf("%s -n -1 -y \"\" -z \"\" %s %s", wdiff, chunkfile1, chunkfile2); 434 | 435 | l=0; while (cmd1 | getline > 0) { stack1[l] = fixesc($0); l++; } 436 | difflines1 = l; 437 | l=0; while (cmd2 | getline > 0) { stack2[l] = fixesc($0); l++; } 438 | difflines2 = l; 439 | 440 | close(cmd1); 441 | close(cmd2); 442 | } 443 | 444 | function flush() { 445 | if (difflines1 || difflines2) { 446 | difftag++; 447 | multiline = (difflines1 > 1) || (difflines2 > 1); 448 | if (multiline && (wdiff != "")) chunkdiff(difftag); 449 | 450 | printf " \n", difftag; 451 | for (l = 0; l < difflines1 || l < difflines2; l++) { 452 | if (l in stack1) { 453 | line1 = stack1[l]; 454 | delete stack1[l]; 455 | linenum1++ 456 | if (line1 == "") 457 | if (optwidth > 0) { 458 | line1 = substr(" ",0,optwidth); 459 | } else { 460 | line1 = " "; 461 | } 462 | } else { 463 | line1 = ""; 464 | } 465 | if (l in stack2) { 466 | line2 = stack2[l]; 467 | delete stack2[l]; 468 | linenum2++; 469 | if (line2 == "") 470 | if (optwidth > 0) { 471 | line2 = substr(" ",0,optwidth); 472 | } else { 473 | line2 = " "; 474 | } 475 | } else { 476 | line2 = ""; 477 | } 478 | 479 | if (!multiline || (wdiff == "")) { 480 | worddiff(line1, line2); 481 | line1 = fixesc(sprintf("%s%s%s", wordpart[0], wordpart[1], wordpart[3])); 482 | line2 = fixesc(sprintf("%s%s%s", wordpart[0], wordpart[2], wordpart[3])); 483 | # Clean up; remove empty spans 484 | sub(/<\/span>/,"", line1); 485 | sub(/<\/span>/,"", line2); 486 | } 487 | left = sprintf("", numdisplay(1, linenum1), line1); 488 | right = sprintf("", line2, numdisplay(2, linenum2)); 489 | printf " %s%s\n", left, right; 490 | } 491 | } 492 | } 493 | 494 | function getpage(which, line) { 495 | line = line + ENVIRON["prelines"]; 496 | page = "?"; 497 | for (p=1; p <= maxpage[which]; p++) { 498 | if (pageend[which,p] == 0) continue; 499 | if (line <= pageend[which,p]) { 500 | page = p; 501 | break; 502 | } 503 | } 504 | return page; 505 | } 506 | 507 | function getpageline(which, line, page) { 508 | if (page == "?") { 509 | return line + ENVIRON["prelines"]; 510 | } else { 511 | if (pageend[which,page-1]+0 != 0) { 512 | return line + ENVIRON["prelines"] - pageend[which,page-1] + 3; # numbers of header lines stripped 513 | } else { 514 | return "?"; 515 | } 516 | } 517 | } 518 | 519 | function htmlesc(line) { 520 | gsub("&", "\\&", line); 521 | gsub("<", "\\<", line); 522 | gsub(">", "\\>", line); 523 | return line; 524 | } 525 | 526 | function expandtabs(line) { 527 | spaces = " "; 528 | while (pos = index(line, "\t")) { 529 | sub("\t", substr(spaces, 0, (8-pos%8)), line); 530 | } 531 | return line; 532 | } 533 | 534 | function maybebreakline(line, width) { 535 | width = optwidth; 536 | new = ""; 537 | if (width > 0) { 538 | line = expandtabs(line); 539 | while (length(line) > width) { 540 | new = new htmlesc(substr(line, 1, width)) "\n"; 541 | line = substr(line, width+1); 542 | } 543 | } 544 | line = new htmlesc(line) ; 545 | return line; 546 | } 547 | 548 | /^@@/ { 549 | linenum1 = 0 - $2; 550 | linenum2 = 0 + $4; 551 | diffnum ++; 552 | if (linenum1 > 1) { 553 | printf " \n"; 554 | page1 = getpage(1,linenum1); 555 | page2 = getpage(2,linenum2); 556 | if (page1 == "?") { 557 | posinfo1 = sprintf("skipping to change at line %s", diffnum, getpageline(1, linenum1, page1)); 558 | } else { 559 | posinfo1 = sprintf("skipping to change at page %s, line %s", diffnum, page1, getpageline(1, linenum1, page1)); 560 | } 561 | 562 | if (page2 == "?") { 563 | posinfo2 = sprintf("skipping to change at line %s", diffnum, getpageline(2, linenum2, page2)); 564 | } else { 565 | posinfo2 = sprintf("skipping to change at page %s, line %s", diffnum, page2, getpageline(2, linenum2, page2)); 566 | } 567 | 568 | printf " \n", posinfo1, posinfo2; 569 | } 570 | } 571 | 572 | /^---/ { next; } 573 | /^[+][+][+]/ { next; } 574 | /^[ ]/ { 575 | line = substr($0, 2); 576 | line = maybebreakline(line); 577 | 578 | flush(); 579 | linenum1++; 580 | linenum2++; 581 | printf " ", numdisplay(1, linenum1), line; 582 | printf "\n", line, numdisplay(2, linenum2); 583 | diffcount1 += difflines1 584 | difflines1 = 0 585 | diffcount2 += difflines2 586 | difflines2 = 0 587 | } 588 | /^-/ { 589 | line = substr($0, 2); 590 | line = maybebreakline(line); 591 | 592 | stack1[difflines1] = line; 593 | difflines1++; 594 | } 595 | /^[+]/ { 596 | line = substr($0, 2); 597 | line = maybebreakline(line); 598 | 599 | stack2[difflines2] = line; 600 | difflines2++; 601 | } 602 | 603 | END { 604 | flush(); 605 | printf("\n" \ 606 | " \n" \ 607 | " \n" \ 608 | " \n" \ 609 | " \n" \ 610 | "
%s %s   %s %s
%s%s%s%s
%s %s
%s%s %s%s
 %s. %s change block(s). 
%s line(s) changed or deleted %s line(s) changed or added

This html diff was produced by rfcdiff %s
\n" \ 611 | " \n" \ 612 | " \n", diffnum?"End of changes":"No changes", difftag, diffcount1, diffcount2, ENVIRON["version"]); 613 | } 614 | ' "$1" 615 | } 616 | 617 | # ---------------------------------------------------------------------- 618 | # Generate before/after text output from a context diff 619 | # ---------------------------------------------------------------------- 620 | abdiff() { 621 | $AWK ' 622 | BEGIN { 623 | # Read pagecache1 624 | maxpage[1] = 1 625 | pageend[1,0] = 2; 626 | while ( getline < ENVIRON["pagecache1"] > 0) { 627 | pageend[1,$1] = $2; 628 | if ($1+0 > maxpage[1]) maxpage[1] = $1+0; 629 | } 630 | 631 | # Read pagecache2 632 | maxpage[2] = 1 633 | pageend[2,0] = 2; 634 | while ( getline < ENVIRON["pagecache2"] > 0) { 635 | pageend[2,$1] = $2; 636 | if ($1+0 > maxpage[2]) maxpage[2] = $1+0; 637 | } 638 | 639 | base1 = ENVIRON["base1"] 640 | base2 = ENVIRON["base2"] 641 | 642 | section = "INTRODUCTION"; 643 | para = 0; 644 | 645 | } 646 | /^\+\+/ { 647 | next; 648 | } 649 | /^\-\-/ { 650 | next; 651 | } 652 | /^ Appendix ./ { 653 | section = $1 " " $2; 654 | para = 0; 655 | } 656 | /^ ? ? ?[0-9]+(\.[0-9]+)*\.? / { 657 | section = "Section " $1; 658 | para = 0; 659 | } 660 | /^ ?$/ { 661 | if (inpara) { 662 | printf "\n%s, paragraph %s:\n", section, para; 663 | print "OLD:\n" 664 | print oldpara 665 | print "NEW:\n" 666 | print newpara 667 | } 668 | oldpara = ""; 669 | newpara = ""; 670 | para ++; 671 | inpara = 0 672 | } 673 | /^ ./ { 674 | oldpara = oldpara $0 "\n" 675 | newpara = newpara $0 "\n" 676 | } 677 | /^\-/ { 678 | sub(/^./, " "); 679 | oldpara = oldpara $0 "\n" 680 | inpara++; 681 | } 682 | /^\+/ { 683 | sub(/^./, " "); 684 | newpara = newpara $0 "\n" 685 | inpara++; 686 | } 687 | END { 688 | if (inpara) { 689 | printf "\n%s, paragraph %s:\n", section, para; 690 | print "OLD:\n" 691 | print oldpara 692 | print "NEW:\n" 693 | print newpara 694 | } 695 | } 696 | ' 697 | } 698 | 699 | 700 | # ---------------------------------------------------------------------- 701 | # Utility to extract keyword info 702 | # ---------------------------------------------------------------------- 703 | extract() { 704 | $AWK -v keyword="$1" ' 705 | BEGIN { 706 | # print "Keyword", keyword; 707 | } 708 | /^# [A-Z]/ { 709 | # print "New key", $2; 710 | if ($2 == keyword ":" ) { output=1; } else { output=0; } 711 | # print "Output", output; 712 | } 713 | /^#\t/ { 714 | # print "Content", output, $0; 715 | if ( output ) { 716 | sub(/^#/,""); 717 | print; 718 | } 719 | } 720 | { 721 | next; 722 | } 723 | 724 | ' "$2" 725 | } 726 | 727 | 728 | # ---------------------------------------------------------------------- 729 | # Utility for error exit 730 | # ---------------------------------------------------------------------- 731 | die() { 732 | echo $*; 733 | exit 1; 734 | } 735 | 736 | # ---------------------------------------------------------------------- 737 | # Process options 738 | # ---------------------------------------------------------------------- 739 | 740 | # Default values 741 | opthtml=1; optdiff=0; optchbars=0; optwdiff=0; optnowdiff=0; 742 | optkeep=0; optinfo=0; optwidth=0; optnums=0; optbody=0; optabdiff=0; 743 | optstrip=1; opthwdiff=0; optlinks=0; 744 | optoldcolour="red"; optnewcolour="green"; optlarger="" 745 | optstdout=0; 746 | opttmpdiff=0; tmpdiff=$workdir/diff; 747 | 748 | while [ $# -gt 0 ]; do 749 | case "$1" in 750 | --html) opthtml=1; optdiff=0; optchbars=0; optwdiff=0; opthwdiff=0; optabdiff=0;; 751 | --diff) opthtml=0; optdiff=1; optchbars=0; optwdiff=0; opthwdiff=0; optabdiff=0;; 752 | --chbars) opthtml=0; optdiff=0; optchbars=1; optwdiff=0; opthwdiff=0; optabdiff=0;; 753 | --wdiff) opthtml=0; optdiff=0; optchbars=0; optwdiff=1; opthwdiff=0; optabdiff=0;; 754 | --hwdiff) opthtml=0; optdiff=0; optchbars=0; optwdiff=0; opthwdiff=1; optabdiff=0;; 755 | --changes)opthtml=0; optdiff=0; optchbars=0; optwdiff=0; opthwdiff=0; optabdiff=1;; 756 | --abdiff) opthtml=0; optdiff=0; optchbars=0; optwdiff=0; opthwdiff=0; optabdiff=1;; 757 | --ab-diff)opthtml=0; optdiff=0; optchbars=0; optwdiff=0; opthwdiff=0; optabdiff=1;; 758 | --rfc-editor-diff)opthtml=0; optdiff=0; optchbars=0; optwdiff=0; opthwdiff=0; optabdiff=1;; 759 | --version)echo -e "$basename\t$version"; exit 0;; 760 | --nowdiff)optnowdiff=1;; 761 | --keep) optkeep=1;; 762 | --info) optinfo=1; keyword=$2; shift;; 763 | --help) optinfo=1; keyword="Usage";; 764 | --width) optwidth=$2; shift;; 765 | --oldcolor) optoldcolour=$2; shift;; 766 | --oldcolour) optoldcolour=$2; shift;; 767 | --newcolor) optnewcolour=$2; shift;; 768 | --newcolour) optnewcolour=$2; shift;; 769 | --larger) optlarger='size="+1"';; 770 | --linenum)optnums=1;; 771 | --body) optbody=1;; 772 | --nostrip)optstrip=0; optbody=0;; 773 | --stdout) optstdout=1;; 774 | --links) optlinks=1;; 775 | --ignore-space-change) optnospacechange=1;; 776 | --ignore-all-space) optignorewhite=1;; 777 | --ignore-blank-lines) optignoreblank=1;; 778 | --wdiff-args) optwdiffargs=$2; shift;; 779 | --tmpdiff) opttmpdiff=1; tmpdiff=$2; shift;; 780 | --prelines) export prelines=$2; shift;; 781 | --minimal) optminimal=1;; 782 | --) shift; break;; 783 | 784 | -v) echo "$basename $version"; exit 0;; 785 | -*) echo "Unrecognized option: $1"; 786 | exit 1;; 787 | *) break;; 788 | esac 789 | shift 790 | done 791 | 792 | export optwidth 793 | export optnums 794 | export optlinks 795 | 796 | # ---------------------------------------------------------------------- 797 | # Determine output file name. Maybe output usage and exit. 798 | # ---------------------------------------------------------------------- 799 | #set -x 800 | 801 | if [ $optinfo -gt 0 ]; then 802 | extract $keyword $0 803 | exit 804 | fi 805 | if [ $# -ge 2 ]; then 806 | if [ "$1" = "$2" ]; then 807 | echo "The files are the same file" 808 | exit 809 | fi 810 | export base1=$(basename "$1") 811 | export base2=$(basename "$2") 812 | outbase=$(worddiff "$base2" "$base1" "%s%s-from-%s") 813 | else 814 | extract Usage $0 815 | exit 1 816 | fi 817 | 818 | 819 | # ---------------------------------------------------------------------- 820 | # create working directory. 821 | # ---------------------------------------------------------------------- 822 | mkdir $workdir/1 || die "$0: Error: Failed to create temporary directory '$workdir/1'." 823 | mkdir $workdir/2 || die "$0: Error: Failed to create temporary directory '$workdir/2'." 824 | 825 | # ---------------------------------------------------------------------- 826 | # Copy files to a work directory 827 | # ---------------------------------------------------------------------- 828 | cp "$1" $workdir/1/"$base1" 829 | cp "$2" $workdir/2/"$base2" 830 | 831 | 832 | # ---------------------------------------------------------------------- 833 | # Maybe strip headers/footers from both files 834 | # ---------------------------------------------------------------------- 835 | 836 | if [ $optstrip -gt 0 ]; then 837 | export which=1 838 | strip $workdir/1/"$base1" > $workdir/1/"$base1".stripped 839 | mv -f $workdir/1/"$base1".stripped $workdir/1/"$base1" 840 | export which=2 841 | strip $workdir/2/"$base2" > $workdir/2/"$base2".stripped 842 | mv -f $workdir/2/"$base2".stripped $workdir/2/"$base2" 843 | fi 844 | 845 | # ---------------------------------------------------------------------- 846 | # Maybe do html quoting 847 | # ---------------------------------------------------------------------- 848 | 849 | if [ $opthwdiff -gt 0 ]; then 850 | sed -e 's/&/&/g' -e 's//\>/g' $workdir/1/"$base1" > $workdir/1/"$base1".quoted 851 | mv -f $workdir/1/"$base1".quoted $workdir/1/"$base1" 852 | sed -e 's/&/&/g' -e 's//\>/g' $workdir/2/"$base2" > $workdir/2/"$base2".quoted 853 | mv -f $workdir/2/"$base2".quoted $workdir/2/"$base2" 854 | fi 855 | 856 | # ---------------------------------------------------------------------- 857 | # Maybe strip preamble (title, boilerplate and table of contents) and 858 | # postamble (Intellectual Property Statement, Disclaimer etc) 859 | # ---------------------------------------------------------------------- 860 | if [ $optbody -gt 0 ]; then 861 | bodystrip $workdir/1/"$base1" > $workdir/1/"$base1".stripped 862 | mv $workdir/1/"$base1".stripped $workdir/1/"$base1" 863 | bodystrip $workdir/2/"$base2" > $workdir/2/"$base2".stripped 864 | mv $workdir/2/"$base2".stripped $workdir/2/"$base2" 865 | fi 866 | 867 | # ---------------------------------------------------------------------- 868 | # Get output file name 869 | # ---------------------------------------------------------------------- 870 | if [ "$3" ]; then 871 | outfile="$3" 872 | else 873 | if [ $opthtml -gt 0 ]; then 874 | outfile=./"$outbase".diff.html 875 | fi 876 | if [ $optchbars -gt 0 ]; then 877 | outfile=./"$outbase".chbar 878 | fi 879 | if [ $optdiff -gt 0 ]; then 880 | outfile=./"$outbase".diff 881 | fi 882 | if [ $optabdiff -gt 0 ]; then 883 | outfile=./"$outbase".changes 884 | fi 885 | if [ $opthwdiff -gt 0 ]; then 886 | outfile=./"$outbase".wdiff.html 887 | fi 888 | fi 889 | if [ "$outfile" ]; then 890 | tempout=./$(basename "$outfile") 891 | fi 892 | 893 | # ---------------------------------------------------------------------- 894 | # Check if we can use wdiff for block diffs 895 | # ---------------------------------------------------------------------- 896 | if [ $optnowdiff -eq 0 ]; then 897 | wdiffbin=$(lookfor wdiff) 898 | export wdiffbin 899 | fi 900 | 901 | # ---------------------------------------------------------------------- 902 | # Do diff 903 | # ---------------------------------------------------------------------- 904 | 905 | origdir=$PWD 906 | cd $workdir 907 | if cmp 1/"$base1" 2/"$base2" >/dev/null; then 908 | echo "" 909 | echo "The files are identical." 910 | fi 911 | 912 | if [ $opthtml -gt 0 ]; then 913 | diff ${optignoreblank:+-B} ${optminimal:+-d} ${optnospacechange:+-b} ${optignorewhite:+-w} -U $prelines 1/"$base1" 2/"$base2" | tee $tmpdiff | htmldiff > "$tempout" 914 | fi 915 | if [ $optchbars -gt 0 ]; then 916 | diff -Bwd -U 10000 1/"$base1" 2/"$base2" | tee $tmpdiff | grep -v "^-" | tail -n +3 | sed 's/^+/|/' > "$tempout" 917 | fi 918 | if [ $optdiff -gt 0 ]; then 919 | diff -Bwd -U $prelines 1/"$base1" 2/"$base2" | tee $tmpdiff > "$tempout" 920 | fi 921 | if [ $optabdiff -gt 0 ]; then 922 | diff -wd -U 1000 1/"$base1" 2/"$base2" | tee $tmpdiff | abdiff 923 | fi 924 | if [ $optwdiff -gt 0 ]; then 925 | wdiff -a $optwdiffargs 1/"$base1" 2/"$base2" 926 | fi 927 | if [ $opthwdiff -gt 0 ]; then 928 | echo "wdiff "$base1" "$base2"" > "$tempout" 929 | echo "
"								>> "$tempout"
930 |     wdiff -w "" -x ""	\
931 |           -y "" -z ""	\
932 | 	  1/"$base1" 2/"$base2"							>> "$tempout"
933 |     echo "
" >> "$tempout" 934 | echo "" >> "$tempout" 935 | fi 936 | 937 | if [ $optstdout -gt 0 ]; then 938 | cat "$tempout" 939 | rm "$tempout" 940 | else 941 | cd "$origdir"; if [ -f $workdir/"$tempout" ]; then mv $workdir/"$tempout" "$outfile"; fi 942 | fi 943 | 944 | if [ $optkeep -eq 0 ]; then 945 | if [ -f $pagecache1 ]; then rm $pagecache1; fi 946 | if [ -f $pagecache2 ]; then rm $pagecache2; fi 947 | rm -fr $workdir/1 948 | rm -fr $workdir/2 949 | if [ -f $tmpdiff ]; then 950 | if [ $opttmpdiff -eq 0 ]; then 951 | rm $tmpdiff 952 | fi 953 | fi 954 | rm -f $workdir/$tmpdiff 955 | rmdir $workdir 956 | else 957 | cd /tmp 958 | tar czf $basename-$$.tgz $basename-$$ 959 | echo " 960 | Temporary workfiles have been left in $workdir/, and packed up in $workdir.tgz" 961 | fi 962 | 963 | --------------------------------------------------------------------------------