mirror of
				https://github.com/fspc/dswim.git
				synced 2025-10-30 16:05:35 -04:00 
			
		
		
		
	*** empty log message ***
This commit is contained in:
		
						commit
						26c15dd62f
					
				
							
								
								
									
										28
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| # CVS default ignores begin | ||||
| tags | ||||
| TAGS | ||||
| .make.state | ||||
| .nse_depinfo | ||||
| *~ | ||||
| #* | ||||
| .#* | ||||
| ,* | ||||
| _$* | ||||
| *$ | ||||
| *.old | ||||
| *.bak | ||||
| *.BAK | ||||
| *.orig | ||||
| *.rej | ||||
| .del-* | ||||
| *.a | ||||
| *.olb | ||||
| *.o | ||||
| *.obj | ||||
| *.so | ||||
| *.exe | ||||
| *.Z | ||||
| *.elc | ||||
| *.ln | ||||
| core | ||||
| # CVS default ignores end | ||||
							
								
								
									
										8
									
								
								BUGS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								BUGS
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| * Permissions of some directories are weird using mkdir(). | ||||
| * ftp()/qftp() doesn't handle timeout problems very well, if alarm() | ||||
|   and SIG{ALRM} are used program quits with stdout "Alarm Bell". | ||||
| * Debian md5sum program has different output than non-Debian md5sum | ||||
|   programs, will probably switch to MD5 module. | ||||
| * --ftp, swimz.list, for non-US using the dists/arch/ notation doesn't  | ||||
|   work on all sites, normal notation works if the site is set-up | ||||
|   this way. | ||||
							
								
								
									
										340
									
								
								COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								COPYING
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,340 @@ | ||||
| 		    GNU GENERAL PUBLIC LICENSE | ||||
| 		       Version 2, June 1991 | ||||
| 
 | ||||
|  Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||||
|      59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
| 
 | ||||
| 			    Preamble | ||||
| 
 | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| License is intended to guarantee your freedom to share and change free | ||||
| software--to make sure the software is free for all its users.  This | ||||
| General Public License applies to most of the Free Software | ||||
| Foundation's software and to any other program whose authors commit to | ||||
| using it.  (Some other Free Software Foundation software is covered by | ||||
| the GNU Library General Public License instead.)  You can apply it to | ||||
| your programs, too. | ||||
| 
 | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| this service if you wish), that you receive source code or can get it | ||||
| if you want it, that you can change the software or use pieces of it | ||||
| in new free programs; and that you know you can do these things. | ||||
| 
 | ||||
|   To protect your rights, we need to make restrictions that forbid | ||||
| anyone to deny you these rights or to ask you to surrender the rights. | ||||
| These restrictions translate to certain responsibilities for you if you | ||||
| distribute copies of the software, or if you modify it. | ||||
| 
 | ||||
|   For example, if you distribute copies of such a program, whether | ||||
| gratis or for a fee, you must give the recipients all the rights that | ||||
| you have.  You must make sure that they, too, receive or can get the | ||||
| source code.  And you must show them these terms so they know their | ||||
| rights. | ||||
| 
 | ||||
|   We protect your rights with two steps: (1) copyright the software, and | ||||
| (2) offer you this license which gives you legal permission to copy, | ||||
| distribute and/or modify the software. | ||||
| 
 | ||||
|   Also, for each author's protection and ours, we want to make certain | ||||
| that everyone understands that there is no warranty for this free | ||||
| software.  If the software is modified by someone else and passed on, we | ||||
| want its recipients to know that what they have is not the original, so | ||||
| that any problems introduced by others will not reflect on the original | ||||
| authors' reputations. | ||||
| 
 | ||||
|   Finally, any free program is threatened constantly by software | ||||
| patents.  We wish to avoid the danger that redistributors of a free | ||||
| program will individually obtain patent licenses, in effect making the | ||||
| program proprietary.  To prevent this, we have made it clear that any | ||||
| patent must be licensed for everyone's free use or not licensed at all. | ||||
| 
 | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
| 		    GNU GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
| 
 | ||||
|   0. This License applies to any program or other work which contains | ||||
| a notice placed by the copyright holder saying it may be distributed | ||||
| under the terms of this General Public License.  The "Program", below, | ||||
| refers to any such program or work, and a "work based on the Program" | ||||
| means either the Program or any derivative work under copyright law: | ||||
| that is to say, a work containing the Program or a portion of it, | ||||
| either verbatim or with modifications and/or translated into another | ||||
| language.  (Hereinafter, translation is included without limitation in | ||||
| the term "modification".)  Each licensee is addressed as "you". | ||||
| 
 | ||||
| Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running the Program is not restricted, and the output from the Program | ||||
| is covered only if its contents constitute a work based on the | ||||
| Program (independent of having been made by running the Program). | ||||
| Whether that is true depends on what the Program does. | ||||
| 
 | ||||
|   1. You may copy and distribute verbatim copies of the Program's | ||||
| source code as you receive it, in any medium, provided that you | ||||
| conspicuously and appropriately publish on each copy an appropriate | ||||
| copyright notice and disclaimer of warranty; keep intact all the | ||||
| notices that refer to this License and to the absence of any warranty; | ||||
| and give any other recipients of the Program a copy of this License | ||||
| along with the Program. | ||||
| 
 | ||||
| You may charge a fee for the physical act of transferring a copy, and | ||||
| you may at your option offer warranty protection in exchange for a fee. | ||||
| 
 | ||||
|   2. You may modify your copy or copies of the Program or any portion | ||||
| of it, thus forming a work based on the Program, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| above, provided that you also meet all of these conditions: | ||||
| 
 | ||||
|     a) You must cause the modified files to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
| 
 | ||||
|     b) You must cause any work that you distribute or publish, that in | ||||
|     whole or in part contains or is derived from the Program or any | ||||
|     part thereof, to be licensed as a whole at no charge to all third | ||||
|     parties under the terms of this License. | ||||
| 
 | ||||
|     c) If the modified program normally reads commands interactively | ||||
|     when run, you must cause it, when started running for such | ||||
|     interactive use in the most ordinary way, to print or display an | ||||
|     announcement including an appropriate copyright notice and a | ||||
|     notice that there is no warranty (or else, saying that you provide | ||||
|     a warranty) and that users may redistribute the program under | ||||
|     these conditions, and telling the user how to view a copy of this | ||||
|     License.  (Exception: if the Program itself is interactive but | ||||
|     does not normally print such an announcement, your work based on | ||||
|     the Program is not required to print an announcement.) | ||||
|  | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Program, | ||||
| and can be reasonably considered independent and separate works in | ||||
| themselves, then this License, and its terms, do not apply to those | ||||
| sections when you distribute them as separate works.  But when you | ||||
| distribute the same sections as part of a whole which is a work based | ||||
| on the Program, the distribution of the whole must be on the terms of | ||||
| this License, whose permissions for other licensees extend to the | ||||
| entire whole, and thus to each and every part regardless of who wrote it. | ||||
| 
 | ||||
| Thus, it is not the intent of this section to claim rights or contest | ||||
| your rights to work written entirely by you; rather, the intent is to | ||||
| exercise the right to control the distribution of derivative or | ||||
| collective works based on the Program. | ||||
| 
 | ||||
| In addition, mere aggregation of another work not based on the Program | ||||
| with the Program (or with a work based on the Program) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
| 
 | ||||
|   3. You may copy and distribute the Program (or a work based on it, | ||||
| under Section 2) in object code or executable form under the terms of | ||||
| Sections 1 and 2 above provided that you also do one of the following: | ||||
| 
 | ||||
|     a) Accompany it with the complete corresponding machine-readable | ||||
|     source code, which must be distributed under the terms of Sections | ||||
|     1 and 2 above on a medium customarily used for software interchange; or, | ||||
| 
 | ||||
|     b) Accompany it with a written offer, valid for at least three | ||||
|     years, to give any third party, for a charge no more than your | ||||
|     cost of physically performing source distribution, a complete | ||||
|     machine-readable copy of the corresponding source code, to be | ||||
|     distributed under the terms of Sections 1 and 2 above on a medium | ||||
|     customarily used for software interchange; or, | ||||
| 
 | ||||
|     c) Accompany it with the information you received as to the offer | ||||
|     to distribute corresponding source code.  (This alternative is | ||||
|     allowed only for noncommercial distribution and only if you | ||||
|     received the program in object code or executable form with such | ||||
|     an offer, in accord with Subsection b above.) | ||||
| 
 | ||||
| The source code for a work means the preferred form of the work for | ||||
| making modifications to it.  For an executable work, complete source | ||||
| code means all the source code for all modules it contains, plus any | ||||
| associated interface definition files, plus the scripts used to | ||||
| control compilation and installation of the executable.  However, as a | ||||
| special exception, the source code distributed need not include | ||||
| anything that is normally distributed (in either source or binary | ||||
| form) with the major components (compiler, kernel, and so on) of the | ||||
| operating system on which the executable runs, unless that component | ||||
| itself accompanies the executable. | ||||
| 
 | ||||
| If distribution of executable or object code is made by offering | ||||
| access to copy from a designated place, then offering equivalent | ||||
| access to copy the source code from the same place counts as | ||||
| distribution of the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
|  | ||||
|   4. You may not copy, modify, sublicense, or distribute the Program | ||||
| except as expressly provided under this License.  Any attempt | ||||
| otherwise to copy, modify, sublicense or distribute the Program is | ||||
| void, and will automatically terminate your rights under this License. | ||||
| However, parties who have received copies, or rights, from you under | ||||
| this License will not have their licenses terminated so long as such | ||||
| parties remain in full compliance. | ||||
| 
 | ||||
|   5. You are not required to accept this License, since you have not | ||||
| signed it.  However, nothing else grants you permission to modify or | ||||
| distribute the Program or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Program (or any work based on the | ||||
| Program), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Program or works based on it. | ||||
| 
 | ||||
|   6. Each time you redistribute the Program (or any work based on the | ||||
| Program), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute or modify the Program subject to | ||||
| these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties to | ||||
| this License. | ||||
| 
 | ||||
|   7. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot | ||||
| distribute so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you | ||||
| may not distribute the Program at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Program by | ||||
| all those who receive copies directly or indirectly through you, then | ||||
| the only way you could satisfy both it and this License would be to | ||||
| refrain entirely from distribution of the Program. | ||||
| 
 | ||||
| If any portion of this section is held invalid or unenforceable under | ||||
| any particular circumstance, the balance of the section is intended to | ||||
| apply and the section as a whole is intended to apply in other | ||||
| circumstances. | ||||
| 
 | ||||
| It is not the purpose of this section to induce you to infringe any | ||||
| patents or other property right claims or to contest validity of any | ||||
| such claims; this section has the sole purpose of protecting the | ||||
| integrity of the free software distribution system, which is | ||||
| implemented by public license practices.  Many people have made | ||||
| generous contributions to the wide range of software distributed | ||||
| through that system in reliance on consistent application of that | ||||
| system; it is up to the author/donor to decide if he or she is willing | ||||
| to distribute software through any other system and a licensee cannot | ||||
| impose that choice. | ||||
| 
 | ||||
| This section is intended to make thoroughly clear what is believed to | ||||
| be a consequence of the rest of this License. | ||||
|  | ||||
|   8. If the distribution and/or use of the Program is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Program under this License | ||||
| may add an explicit geographical distribution limitation excluding | ||||
| those countries, so that distribution is permitted only in or among | ||||
| countries not thus excluded.  In such case, this License incorporates | ||||
| the limitation as if written in the body of this License. | ||||
| 
 | ||||
|   9. The Free Software Foundation may publish revised and/or new versions | ||||
| of the General Public License from time to time.  Such new versions will | ||||
| be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
| 
 | ||||
| Each version is given a distinguishing version number.  If the Program | ||||
| specifies a version number of this License which applies to it and "any | ||||
| later version", you have the option of following the terms and conditions | ||||
| either of that version or of any later version published by the Free | ||||
| Software Foundation.  If the Program does not specify a version number of | ||||
| this License, you may choose any version ever published by the Free Software | ||||
| Foundation. | ||||
| 
 | ||||
|   10. If you wish to incorporate parts of the Program into other free | ||||
| programs whose distribution conditions are different, write to the author | ||||
| to ask for permission.  For software which is copyrighted by the Free | ||||
| Software Foundation, write to the Free Software Foundation; we sometimes | ||||
| make exceptions for this.  Our decision will be guided by the two goals | ||||
| of preserving the free status of all derivatives of our free software and | ||||
| of promoting the sharing and reuse of software generally. | ||||
| 
 | ||||
| 			    NO WARRANTY | ||||
| 
 | ||||
|   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN | ||||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS | ||||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE | ||||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||||
| REPAIR OR CORRECTION. | ||||
| 
 | ||||
|   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||||
| POSSIBILITY OF SUCH DAMAGES. | ||||
| 
 | ||||
| 		     END OF TERMS AND CONDITIONS | ||||
|  | ||||
| 	    How to Apply These Terms to Your New Programs | ||||
| 
 | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
| 
 | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| convey the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
| 
 | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) 19yy  <name of author> | ||||
| 
 | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; either version 2 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| 
 | ||||
| 
 | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
| 
 | ||||
| If the program is interactive, make it output a short notice like this | ||||
| when it starts in an interactive mode: | ||||
| 
 | ||||
|     Gnomovision version 69, Copyright (C) 19yy name of author | ||||
|     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||
|     This is free software, and you are welcome to redistribute it | ||||
|     under certain conditions; type `show c' for details. | ||||
| 
 | ||||
| The hypothetical commands `show w' and `show c' should show the appropriate | ||||
| parts of the General Public License.  Of course, the commands you use may | ||||
| be called something other than `show w' and `show c'; they could even be | ||||
| mouse-clicks or menu items--whatever suits your program. | ||||
| 
 | ||||
| You should also get your employer (if you work as a programmer) or your | ||||
| school, if any, to sign a "copyright disclaimer" for the program, if | ||||
| necessary.  Here is a sample; alter the names: | ||||
| 
 | ||||
|   Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||||
|   `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||||
| 
 | ||||
|   <signature of Ty Coon>, 1 April 1989 | ||||
|   Ty Coon, President of Vice | ||||
| 
 | ||||
| This General Public License does not permit incorporating your program into | ||||
| proprietary programs.  If your program is a subroutine library, you may | ||||
| consider it more useful to permit linking proprietary applications with the | ||||
| library.  If this is what you want to do, use the GNU Library General | ||||
| Public License instead of this License. | ||||
							
								
								
									
										672
									
								
								Conf.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										672
									
								
								Conf.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,672 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Conf; | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| 
 | ||||
| @EXPORT = qw($my_number $tmp $architecture $distribution @user_defined_section | ||||
|              $default_directory  $default_root_directory $permission $dpkg | ||||
|              $dpkg_deb $ar $gcc $apt_get $apt_cache $sources @FTP $spl $cat | ||||
|              $sort $md5sum $zcat $tar $grep $gzip $fastswim $slowswim $longswim | ||||
|              $mount $umount $mke2fs $copy $pager $base $pwd $parent $library | ||||
|              $splt $mv $imswim $swim_conf $debug $port $timeout | ||||
|              $firewall $passive $apt_sources $HISTORY $alt); | ||||
| %EXPORT_TAGS = ( | ||||
|                Path => [ qw($tmp $parent $base $library) ], | ||||
|                Deb => [ qw($pwd $dpkg_deb $ar $tar $grep $tmp $md5sum $cat $mv) ], | ||||
|                Qftp => [ qw($default_root_directory $permission @FTP  | ||||
|                             $default_directory $swim_conf) ], | ||||
|                Info => [ qw($parent $base $zcat) ] | ||||
|                ); | ||||
| 
 | ||||
| 
 | ||||
|           | ||||
| ############################# | ||||
| # DEFAULT PROGRAM VARIABLES # | ||||
| ############################# | ||||
| 
 | ||||
| # You can change this to how many lines you would like "swim -qf <>" to | ||||
| # print out, before asking for -t or --total, it will automatically ask | ||||
| # though, if there is more than one package and you used the option -i. | ||||
| # Remember -t can be used with --scripts family members to view the | ||||
| # title of the script file regardless of this setting, and if -t has to be | ||||
| # used, the titles will be displayed, which makes sense. | ||||
| $my_number = 23; | ||||
| 
 | ||||
| # Just like a shell, you can keep a history of whatever length you want.   | ||||
| $HISTORY = 10; | ||||
| 
 | ||||
| # For not-installed: | ||||
| # This part supplies the default value for --arch. | ||||
| # | ||||
| # You can determine the default architecture used when -n is  | ||||
| # called or a not-installed database is made.  Architectures are always | ||||
| # being added so check with Debian to find a list.  There is alpha, arm, | ||||
| # hurd (alternative kernel to linux), i386, m68k, powerpc, sparc.  Just use | ||||
| # the arch found after the hyphen in the Contents-(arch) file. | ||||
| $architecture = "i386"; | ||||
| 
 | ||||
| # For not-installed: | ||||
| # This part supplies the default value for --dists. | ||||
| # | ||||
| # The default distribution can be either stable, unstable, frozen, or | ||||
| # experimental (rare).  These represent the state of development that the | ||||
| # packages are under.  The unstable distribution can have lot's of changes | ||||
| # within a very short time period, and frozen may or may not be available. | ||||
| $distribution = "unstable"; | ||||
| 
 | ||||
| 
 | ||||
| #For not-installed: | ||||
| #This part supplies the default value for --main, --contrib, --non-free, | ||||
| #and --non-us. | ||||
| 
 | ||||
| # Distributions are divided into the sections.  These sections are called | ||||
| # distributions in the version 2.4.1.0 packaging manual, because they were at | ||||
| # one time separate distributions, but this has since changed.  You can | ||||
| # determine which of these sections (main, non-free, contrib or non-US) to | ||||
| # pull out of the Contents file if you don't want to use --main, --contrib, | ||||
| # --non-free, and --non-us to selectively pick sections.  Basically, whatever | ||||
| # you pull out should match the Package(s) file(s) you are targetting, this | ||||
| # program is friendly if you make a mistake, but it's more effecient to pull | ||||
| # out just what you want.  If the same package happens to exist in two | ||||
| # different sections, main and non-us for example (which is really a | ||||
| # situation that shouldn't exist, yet it does), you will still be able to | ||||
| # find this package in the non-us group, but its section and locations will be | ||||
| # the one which main recognizes assuming that you use the order in the example | ||||
| # below. | ||||
| 
 | ||||
| # Setting it up: | ||||
| # Example: You just want to pull out main and contrib every time you run | ||||
| # --initndb, --rebuildndb, or --ndb.   | ||||
| # @user_defined_section = qw(main contrib non-US);   | ||||
| # remember "non-US" not "non-us".  | ||||
| 
 | ||||
| # untill non-US is fixed the second is better | ||||
| #@user_defined_section = qw(main contrib non-free non-US);  | ||||
| @user_defined_section = qw(main contrib non-free); | ||||
| 
 | ||||
| # Usually, this is  | ||||
| $alt = "debian"; | ||||
| 
 | ||||
| ################ | ||||
| # DF LOCATION  # | ||||
| ################ | ||||
| 
 | ||||
| # A little philosophy: | ||||
| # swim was developed for maximum versatility, so whether you are just | ||||
| # interested in researching, and keeping tabs on the newest packages, | ||||
| # or maintaining a Debian virtual distribution on a non-Debian real | ||||
| # distribution, or you are a using swim for distribution development, swim | ||||
| # provides a way.  The default directory (DF - which can also mean | ||||
| # directory/file) keeps track of Contents and Packages files downloaded | ||||
| # using --ftp, and gives the files names specific to the distribution and | ||||
| # architectures they represent.  But, you also have the freedom not to use | ||||
| # the default directory in this case swim will still do the renaming and | ||||
| # keeping track of the mtime, but you will have to remember where you put | ||||
| # the files. On the other hand, if you use apt, you won't even have to use | ||||
| # the DF directory for Packages files because you can get the ones specific | ||||
| # to your own systems architecture from apt, but if you want to look at | ||||
| # other architectures you will need to use the DF directory or one of your | ||||
| # own choice.  | ||||
| # Naming Convention: Contents = Contents-dist.gz  | ||||
| # Packages = Packages-arch-dist-section.gz  | ||||
| $default_directory = '/root/.swim'; | ||||
| 
 | ||||
| 
 | ||||
| # The default root directory is the key to easy management of packages | ||||
| # downloaded through --ftp and --file, and provides an easy way to put together | ||||
| # a personalized distribution.  Future implementations of swim will provide | ||||
| # a distribution called personal..Packages and Contents files specific to | ||||
| # this distribution will automatically be made.  This directory can be a | ||||
| # real ftp site on your computer, or put where ever else you are allowed | ||||
| # to have directories.  dists/distribution/section/architecture/subject will be | ||||
| # placed above this directory.  No matter what, debian must be the final | ||||
| # directory before dists.  Other distributions are placed alongside debian, | ||||
| # like debian-non-US or personal.  | ||||
| # Feel free to change the permissions.  This directory is above your default_ | ||||
| # directory. | ||||
| $default_root_directory = '/pub/debian'; | ||||
| 
 | ||||
| # Because you may be using a real ftp site, this configuration allows you | ||||
| # to determine what permissions swim will set for directories it creates | ||||
| # above the default root directory. | ||||
| $permission = '0755'; | ||||
| 
 | ||||
| 
 | ||||
| ############### | ||||
| # AR or DPKG? # | ||||
| ############### | ||||
| 
 | ||||
| # NOTE: users set these next two with the $package_tool variable. | ||||
| 
 | ||||
| # packaging friends dpkg and dpkg-deb come from the essential and | ||||
| # required dpkg package.  ar from the package binutils can also be used (below). | ||||
| # This is the archival program used for deb packages, but binutils is just | ||||
| # a standard non-essential package, and the ar capabilities are built into | ||||
| # dpkg-deb, and it's better not to assume that the standard packages are | ||||
| # even established, yet. | ||||
| $dpkg = (); | ||||
| $dpkg_deb = (); | ||||
| 
 | ||||
| 
 | ||||
| # If you don't have the dpkg package on your system then you can use ar | ||||
| # from the package binutils.  This would be a standard, but not an essential | ||||
| # package in Debian, but this package is also fairly standard amongst all | ||||
| # distributions, and can even be found in the free djgpp for M$ Oses. | ||||
| # Since people who have both dpkg and ar may want to try the ar method, | ||||
| # rather than creating an automatic check, just assign a value to either | ||||
| # ($dpkg & $dpkg_deb) or just $ar. | ||||
| #my $ar = '/usr/bin/ar';  # same for RH | ||||
| $ar = '/usr/bin/ar'; | ||||
| 
 | ||||
| 
 | ||||
| ####### | ||||
| # APT # | ||||
| ####### | ||||
| 
 | ||||
| # NOTE: users set apt-get and apt-cache with the $apt variable | ||||
| 
 | ||||
| # If you have apt you are in luck. | ||||
| $apt_get = (); | ||||
| $apt_cache = (); | ||||
| $sources = '/etc/apt/sources.list'; | ||||
| $apt_sources = '/var/state/apt/lists'; | ||||
| 
 | ||||
| ######### | ||||
| # PAGER # | ||||
| ######### | ||||
| 
 | ||||
| # less is a nice pager, unless you like more!  There is an option  | ||||
| # --nopager or -n.   Pager is used for --help and swim called without any | ||||
| # options.  more comes from the required package util-linux, whereas | ||||
| # less comes from a standard package called less.  In the future there is | ||||
| # a possiblity that a large percentage of swim may use an internal pager. | ||||
| # less, more, or most or... | ||||
| #$ENV{PAGER} = "/usr/bin/less"; # same RH | ||||
| $ENV{PAGER} = "less"; | ||||
| $pager = $ENV{PAGER}; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ################# | ||||
| # SWIM PROGRAMS # | ||||
| ################# | ||||
| 
 | ||||
| # This is replaced by the Makefile. | ||||
| $pre="/usr"; | ||||
| 
 | ||||
| # This is the hash making program fastswim. | ||||
| $fastswim = "$pre/lib/SWIM/fastswim"; | ||||
| 
 | ||||
| # imswim in an alternative to fastswim for --lowmem | ||||
| $imswim = "$pre/lib/SWIM/imswim"; | ||||
| 
 | ||||
| #  This is the low memory program slowswim. | ||||
| $slowswim = "$pre/lib/SWIM/slowswim"; | ||||
| 
 | ||||
| # This is the dir/file making program longswim. | ||||
| $longswim = "$pre/lib/SWIM/longswim"; | ||||
| 
 | ||||
| ############ | ||||
| # TEMP DIR # | ||||
| ############ | ||||
| 
 | ||||
| # If you want to set an alternative directory for the temporary files | ||||
| # created when the databases are made, change here.  You may want to make | ||||
| # $tmp a RAM disk.  See package loadlin for initrd documentation and an | ||||
| # explanation for making such a disk.  There is also | ||||
| # /usr/src/kernel-source.version/Documentation.  Whether this will speed | ||||
| # things up is a subject of experimentation. | ||||
| $tmp = '/tmp'; | ||||
| 
 | ||||
| ################## | ||||
| # MAIN CONFFILES # | ||||
| ################## | ||||
| 
 | ||||
| # if configuration files are not kept in /etc change this | ||||
| # and set up the directories by hand. | ||||
| 
 | ||||
| $swim_conf = '/etc/swim'; | ||||
| 
 | ||||
| 
 | ||||
| ############# | ||||
| # UTILITIES # | ||||
| ############# | ||||
| 
 | ||||
| 
 | ||||
| # This probably never will have to be changed. | ||||
| $pwd = `pwd`; | ||||
| chomp $pwd; | ||||
| 
 | ||||
| # If the command split is somewhere else besides /usr/bin change this. | ||||
| # The required package textutils provides this. | ||||
| #my $splt = '/usr/bin/split'; # same RH | ||||
| $splt = 'split'; | ||||
| 
 | ||||
| # cat comes from the essential and required package textutils. | ||||
| #my $cat = '/bin/cat'; # same RH | ||||
| $cat = 'cat'; | ||||
| 
 | ||||
| # This command also omes from the required and essential package textutils. | ||||
| #my $sort = '/usr/bin/sort'; # same RH | ||||
| $sort = 'sort'; | ||||
| 
 | ||||
| # This program uses md5sum from the dpkg package, it can also use md5sum | ||||
| # from the RH package. | ||||
| #my $md5sum = '/usr/bin/md5sum'; # same RH | ||||
| $md5sum = 'md5sum'; | ||||
| 
 | ||||
| # If you want to view compressed files make sure this is correct. | ||||
| # The required package gzip provides this. | ||||
| #my $zcat = '/bin/zcat'; # same RH | ||||
| $zcat = 'zcat'; | ||||
| 
 | ||||
| # tar comes from the essential and required package tar. | ||||
| #my $tar = '/bin/tar'; # same RH | ||||
| $tar = 'tar'; | ||||
| 
 | ||||
| # grep comes from the essential and required package grep.  This seems | ||||
| # to require a path. | ||||
| $grep = '/bin/grep'; # same RH | ||||
| 
 | ||||
| # gzip comes from the essential and required package gzip. | ||||
| #my $gzip = "/bin/gzip"; # same RH | ||||
| $gzip = "gzip"; | ||||
| 
 | ||||
| # mount comes from the essential and required package mount. | ||||
| #my $mount = '/bin/mount'; # same RH | ||||
| #my $umount = '/bin/umount';  # same RH | ||||
| $mount = 'mount'; | ||||
| $umount = 'umount'; | ||||
| 
 | ||||
| # If your file system isn't an ext2 filesystem, you may want to change | ||||
| # this.  mke2fs comes from the essential and required package e2fsprogs. | ||||
| #my $mke2fs = '/sbin/mke2fs'; # same RH | ||||
| $mke2fs = 'mke2fs'; | ||||
| 
 | ||||
| # cp and mv from the essential and required package fileutils | ||||
| #my $copy = '/bin/cp'; # same RH | ||||
| $copy = 'cp'; | ||||
| $mv = 'mv'; | ||||
| 
 | ||||
| # Your system definitely has gcc if you have ar.  gcc is a standard package | ||||
| # in debian. | ||||
| $gcc = 'gcc'; | ||||
| 
 | ||||
| 
 | ||||
| ###### | ||||
| # FTP # | ||||
| ####### | ||||
| 
 | ||||
| # Major mode --ftp and --file automates the download of Contents and Packages | ||||
| # files. Even if you have apt installed, you may still want to download Packages | ||||
| # from alternative architectures, and the Contents file for your own architecture | ||||
| # or other architectures.  If you want virtual and/or -ld capabilities you need | ||||
| # the Contents file.  You specify a list of ftp or file sites using urls (like | ||||
| # apt). For your system's architecture specify the type deb, for other | ||||
| # architectures specify deb(hyphen)architecture (ex: deb-alpha).  Regardless of | ||||
| # whether or not you specify an architecture, deb implies /dist* found under the | ||||
| # base directory specified by the ftp url, except in the case of experimental, | ||||
| # and to a degree non-us. minor mode --ftp, and --file will use the sites in this | ||||
| # configuration as well, on a fifo (first in first out) basis, so choose the | ||||
| # order of sites based on which are closest, most current, as well as fast. | ||||
| 
 | ||||
| # IMPORTANT:  It is a BIG MISTAKE to use the distributions name (slink,po,etc)  | ||||
| # anywhere in the sources list, or in swim's configuration file..in fact swim | ||||
| # won't work properly, not to mention the fact that someday your favorite name | ||||
| # will suddenly disappear. This is because swim thinks in terms of the real | ||||
| # distribution name (stable,unstable,frozen, experimental).  The problem goes | ||||
| # like this - slink remains slink, but goes from unstable to frozen to stable.  | ||||
| # At first, using the distributions alias may seem appropriate, but the | ||||
| # purpose of swim is to keep tabs on the dists, and not to ignore changes in | ||||
| # the states, this also makes managing swim's databases much easier and | ||||
| # intuitive...more about this later.  | ||||
| 
 | ||||
| # Fun experiments:  Swim uses the naming conventions of apt, but leaves the | ||||
| # Package files compressed in the DF directory.  So you can always decompress | ||||
| # the databases and move them to /var/state/apt/lists.  This ofcourse assumes | ||||
| # that the  appropriate changes to the sources.list reflecting these Packages | ||||
| # (need to be the same architecture as your system) existed before you  | ||||
| # update. (author needs to do this experiment :*)  | ||||
| 
 | ||||
| $ftp1 = "deb ftp://localhost/pub/debian unstable main contrib non-free non-US"; | ||||
| $ftp2 = "deb ftp://localhost/pub/debian unstable main contrib non-free";  | ||||
| $ftp3 = "deb ftp://localhost/pub/debian  project/experimental/"; | ||||
| @FTP = ($ftp1,$ftp2,$ftp3);  | ||||
| 
 | ||||
| # These next variables allow some characteristics of the ftp client | ||||
| # to be altered.  See Net::FTP for ways of altering some of these | ||||
| # variables through the environment. | ||||
| 
 | ||||
| $firewall = 0; | ||||
| $port = 0; | ||||
| $timeout =  120; | ||||
| $debug = 0; | ||||
| $passive = 0; | ||||
| 
 | ||||
| 
 | ||||
| ######################################## | ||||
| # STUFF THAT NEVER NEEDS TO BE CHANGED # | ||||
| ######################################## | ||||
| 
 | ||||
| # You will never need to change this unless for some weird reason all the | ||||
| # files under dpkg are somewhere else (including /info*) , see --dbpath as | ||||
| # an alternative if you decide to access or make the databases somewhere | ||||
| # else. | ||||
| $base = '/var/lib/dpkg'; | ||||
| 
 | ||||
| # --dbpath takes care of this so don't touch. | ||||
| $parent = '/'; | ||||
| $library = '/var/lib/dpkg'; | ||||
| 
 | ||||
| 
 | ||||
| ############################# | ||||
| # LOAD CUSTOM CONFIGURATION # | ||||
| ############################# | ||||
| 
 | ||||
| 
 | ||||
| # Here we load in the customized configuration which override the defaults | ||||
| # Might as well use do, let the world learn Perl ... compare this to apt's  | ||||
| # configuation file with scopes.  Swim's sources.list file (/etc/swim/swimz.list),  | ||||
| # will be grabbed at SWIM::Apt and SWIM::Qftp if it exists. | ||||
| 
 | ||||
| do "$swim_conf/swimrc"; | ||||
| do "$ENV{HOME}/.swim/swimrc"; | ||||
| if ((defined $dpkg && !defined $dpkg_deb) ||  | ||||
|    (!defined $dpkg && defined $dpkg_deb)) { | ||||
|   print "swim: need to give both \$dpkg and \$dpkg_deb a value if you want dpkg\n"; | ||||
|   exit; | ||||
| } | ||||
| if (defined $package_tool) { | ||||
|  if ($package_tool =~ /ar/) { | ||||
|    $ar = $ar; | ||||
|  } | ||||
|  else { | ||||
|    $dpkg = 'dpkg'; | ||||
|    $dpkg_deb = 'dpkg-deb'; | ||||
|    undef $ar; | ||||
|  } | ||||
| } | ||||
| if (defined $apt) { | ||||
|   $apt_get = 'apt-get'; | ||||
|   $apt_cache = 'apt-cache'; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ############################### | ||||
| # MAKE ANY NEEDED DIRECTORIES # | ||||
| ############################### | ||||
| 
 | ||||
| # make sure all the appropriate directories are made | ||||
| if (!-d $default_directory) {   | ||||
|  if (-e $default_directory) { | ||||
|    print "swim: can not create default directory because a file exists\n"; | ||||
|    exit; | ||||
|  } | ||||
|     my @DRD = split(m,/,,$default_directory); | ||||
|     my $placement = "/"; | ||||
|     for (1 .. $#DRD) {   | ||||
|      $_ == 1 ? ($placement = "/$DRD[$_]")  | ||||
|              : ($placement = $placement . "/" . $DRD[$_]); | ||||
|      -d $placement or mkdir("$placement",0755); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| if (!-d "$default_directory$default_root_directory") { | ||||
|     my @DRD = split(m,/,,$default_root_directory); | ||||
|     print "swim: debian must be the final directory before dists\n" | ||||
|     if $DRD[$#DRD] ne "debian"; | ||||
|     exit if $DRD[$#DRD] ne "debian"; | ||||
|     my $placement = "/"; | ||||
|     for (1 .. $#DRD) {   | ||||
|      $_ == 1 ? ($placement = "/$DRD[$_]")  | ||||
|              : ($placement = $placement . "/" . $DRD[$_]); | ||||
|      unless (-d "$default_directory$placement") {  | ||||
|        mkdir("$default_directory$placement",0755)  | ||||
|        or die "swim: could not create root default directory\n"; | ||||
|      } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| # Makefile will make sure these directories exist, unless for some strange | ||||
| # reason you have to change them. | ||||
| 
 | ||||
| if (!-d $library) { | ||||
|     mkdir($library,0755) or die "Couldn't create default directory\n"; | ||||
| } | ||||
| 
 | ||||
| if (!-d $base) { | ||||
|     mkdir($base,0755) or die "Couldn't create default directory\n"; | ||||
| } | ||||
| 
 | ||||
| if (!-d $swim_conf) { | ||||
|     mkdir($swim_conf,0666) or die "Couldn't create configuration file directory, | ||||
|                                    please make the directories which are needed.\n"; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
| __END__ | ||||
| 
 | ||||
| =head1 NAME | ||||
| 
 | ||||
| swimrc - swim configuration file | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| B<swimrc> is the configuartion file for swim allowing many default values | ||||
| to be set so that they do not have to be mentioned on the command line.  | ||||
| Swimrc interacts directly with Perl allowing a wide variety of variables | ||||
| found in B<SWIW::Conf> to be altered. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| =head1 USAGE | ||||
| 
 | ||||
| Values for variable can be altered for B<swim> by assigning different | ||||
| values enclosed in quotes or quoted whitespace (qw()), and ended with a | ||||
| semi-colon. | ||||
| 
 | ||||
|  $variable = "value"; | ||||
|  $variable = "qw(value1 value2 ..)"; | ||||
| 
 | ||||
| =head1 VARIABLES | ||||
| 
 | ||||
| This is a list of variables with explanations.  The default values for | ||||
| B<swim> are shown. | ||||
| 
 | ||||
| =head2 OUTPUT VARIABLE  | ||||
| 
 | ||||
| $my_number can be changed to how many lines you would like "swim -qf <>"  | ||||
| to print out, before the program asks for C<-t> or C<--total>.  Exception:  | ||||
| If C<-i> is used in the query and there is more than one package then the | ||||
| total will be presented.  | ||||
| 
 | ||||
| Hint:  C<-t> can be used with all the various C<--scripts> family members | ||||
| to view the title of the script file regardless of this variable setting, | ||||
| and if C<-t> has to be used, the titles will be displayed, which makes | ||||
| sense.  | ||||
| 
 | ||||
| B<$my_number = 23;> | ||||
| 
 | ||||
| =head2 HISTORY | ||||
| 
 | ||||
| This is a shell-like history kept in relation to searches and the most | ||||
| recent edit when C<--stdin> is used.  | ||||
| 
 | ||||
| B<$HISTORY = 10;> | ||||
| 
 | ||||
| =head2 AR or DPKG? | ||||
| 
 | ||||
| Debian packages are ar archives.  If you are using a Debian Distribution | ||||
| assign "dpkg" to $package_tool, otherwise assign "ar" to $package_tool. | ||||
| 
 | ||||
| B<$package_tool = "/usr/bin/ar";> | ||||
| 
 | ||||
| =head2 APT | ||||
| 
 | ||||
| B<Swim> does not assign a value for apt.  To use C<--apt> and C<-xyz> | ||||
| assign $apt the value "yes".  | ||||
| 
 | ||||
| Example: B<$apt = "yes";> | ||||
| 
 | ||||
| =head2 PAGER | ||||
| 
 | ||||
| less is a nice pager, unless you like more!  Pager is used for C<--help> | ||||
| and B<swim> called without any options. There is an option C<--nopager> or | ||||
| C<-n>.  more comes from the required package util-linux, whereas less | ||||
| comes from a standard package called less.  Values: "less", "more", or | ||||
| "most" or...  | ||||
| 
 | ||||
| B<$ENV{PAGER} = "less";> | ||||
| 
 | ||||
| =head2 NOT-INSTALLED VARIABLES  | ||||
| 
 | ||||
| Assign values for $architecture and/or $distribution to avoid having to | ||||
| use C<--arch> and C<--dists> everytime the not-installed databases are | ||||
| accessed with C<-n> or made or altered. | ||||
| 
 | ||||
| Architectures are always being added so check with Debian to find a list.  | ||||
| There is I<alpha, arm, hurd-i386 (alternative kernel to linux), i386, | ||||
| m68k, powerpc, sparc>.  Just use the arch found after the hyphen in the | ||||
| Contents-(arch) file. | ||||
| 
 | ||||
| B<$architecture = "i386";> | ||||
| 
 | ||||
| The distribution can be either I<stable, unstable, frozen, or experimental | ||||
| (rare)>.  These represent the state of development that the packages are | ||||
| under.  The unstable distribution can have lot's of changes within a very | ||||
| short time period, and frozen may or may not be available. | ||||
| 
 | ||||
| B<$distribution = "unstable";> | ||||
| 
 | ||||
| Distributions are divided into sections.  These sections were called | ||||
| distributions in the version 2.4.1.0 packaging manual, because they were | ||||
| at one time separate distributions, but this has since changed.   | ||||
| 
 | ||||
| You can determine which of the sections I<main, non-free, contrib or | ||||
| non-US> to pull out of the Contents file if you don't want to use | ||||
| C<--main>, C<--contrib>, C<--non-free>, and C<--non-us> to selectively | ||||
| pick the sections.  | ||||
| 
 | ||||
| For efficiency, you should choose the sections which you will be pulling | ||||
| out of the Packages file(s) being targetted.   | ||||
| 
 | ||||
| Rule: Use "non-US" not "non-us". | ||||
| 
 | ||||
| B<@user_defined_section = qw(main contrib non-free non-US);> | ||||
| 
 | ||||
| =head2 DF LOCATION | ||||
| 
 | ||||
| A little philosophy:  B<swim> was developed for maximum versatility, so | ||||
| whether you are just interested in researching, and keeping tabs on the | ||||
| newest packages, or maintaining a Debian virtual distribution on a | ||||
| non-Debian distribution, or you are a using B<swim> for distribution | ||||
| development, B<swim> provides a way.   | ||||
| 
 | ||||
| The next two variables determine the location of the DF (default | ||||
| directory/file system) | ||||
| 
 | ||||
| The default directory keeps track of Contents and/or Packages databases | ||||
| retrieved with --ftp.  The Contents and Packages databases and Release | ||||
| file are give names specific to the distribution and architectures they | ||||
| represent using the naming convention found in apt's sources directory.  | ||||
| You also have the freedom not to use the default directory, in which case | ||||
| swim will still do the renaming and keeping track of the mtime, but you | ||||
| will have to remember where you put the files. | ||||
| 
 | ||||
| B<$default_directory = '/root/.swim';> | ||||
| 
 | ||||
| The default root directory (DRD) is the key to easy management of binary | ||||
| packages, source, dsc, and diff files received from --ftp, and provides an | ||||
| easy way to put together a personalized distribution. This directory can | ||||
| be a real ftp site on your computer, or put wherever else you are | ||||
| allowed to have directories.  The DRD is always placed below the value | ||||
| assigned to $default_directory.  According to the previous assignment to  | ||||
| $default_directory, if the DRD is "/pub/a/debian" then the full path | ||||
| would be "/root/.swim/pub/a/debian".  | ||||
| 
 | ||||
| Example: When a package is downloaded it will be placed in | ||||
| dists/distribution/section/architecture/subject below the DRD.  | ||||
| 
 | ||||
| Rule: debian must be the final directory before dists, this is because | ||||
| other distributions are placed alongside debian, like debian-non-US or | ||||
| personal (specialized distribution). | ||||
| 
 | ||||
| B<$default_root_directory = '/pub/debian';> | ||||
| 
 | ||||
| Because you may be using a real ftp site, this variable allows you to | ||||
| determine what permissions B<swim> will assign for directories it creates | ||||
| below the DRD.  | ||||
| 
 | ||||
| B<$permission = '0755';> | ||||
| 
 | ||||
| =head2 TEMPORARY DIRECTORY | ||||
| 
 | ||||
| If you want to set an alternative directory for the temporary files | ||||
| created when the databases are made, change here.  You may want to make | ||||
| $tmp a RAM disk.  See package loadlin for initrd documentation and an | ||||
| explanation for making such a disk.  There is also documentation in | ||||
| /usr/src/kernel-source.version/Documentation.  Whether this will speed | ||||
| things up is a subject of experimentation.  | ||||
| 
 | ||||
| B<$tmp = "/tmp";> | ||||
| 
 | ||||
| =head2 FTP | ||||
| 
 | ||||
| You can alter the Firewall, Port, Timeout, Debug and Passive | ||||
| characteristics of the ftp client as defined in Net::FTP(3pm) by providing | ||||
| arguments to these variables. All variables but $timeout are set to untrue | ||||
| by default.   | ||||
| 
 | ||||
|  $firewall = 0; (FTP firewall machine name) | ||||
|  $port = 0;  (defaults to 23) | ||||
|  $timeout = 120;  (120 seconds) | ||||
|  $debug = 0;  (1 will turn on STDERR) | ||||
|  $passive = 0; (1 will enable) | ||||
| 
 | ||||
| =head1 OTHER VARIABLES | ||||
| 
 | ||||
| see SWIM::Conf | ||||
| 
 | ||||
| =head1 FILES | ||||
| 
 | ||||
|  /etc/swim/swimrc | ||||
|  ~/.swim/swimrc | ||||
| 
 | ||||
| =head1 SEE ALSO | ||||
| 
 | ||||
| swim(8), Net::FTP(3pm) | ||||
| 
 | ||||
| =head1 BUGS | ||||
| 
 | ||||
| Send directly to mttrader@access.mountain.net. | ||||
| 
 | ||||
| =head1 AUTHOR | ||||
| 
 | ||||
| Jonathan D. Rosenbaum <mttrader@access.mountain.net>  | ||||
| 
 | ||||
| =head1 COPYRIGHT | ||||
| 
 | ||||
| 
 | ||||
| Copyright (c) 1999 Jonathan Rosenbaum. All rights reserved. This program | ||||
| is free software; you can redistribute it and/or modify it under the GPL.  | ||||
| 
 | ||||
| =cut | ||||
							
								
								
									
										672
									
								
								Conf.pm.alternative
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										672
									
								
								Conf.pm.alternative
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,672 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Conf; | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| 
 | ||||
| @EXPORT = qw($my_number $tmp $architecture $distribution @user_defined_section | ||||
|              $default_directory  $default_root_directory $permission $dpkg | ||||
|              $dpkg_deb $ar $gcc $apt_get $apt_cache $sources @FTP $spl $cat | ||||
|              $sort $md5sum $zcat $tar $grep $gzip $fastswim $slowswim $longswim | ||||
|              $mount $umount $mke2fs $copy $pager $base $pwd $parent $library | ||||
|              $splt $mv $imswim $swim_conf $debug $port $timeout | ||||
|              $firewall $passive $apt_sources $HISTORY $alt); | ||||
| %EXPORT_TAGS = ( | ||||
|                Path => [ qw($tmp $parent $base $library) ], | ||||
|                Deb => [ qw($pwd $dpkg_deb $ar $tar $grep $tmp $md5sum $cat $mv) ], | ||||
|                Qftp => [ qw($default_root_directory $permission @FTP  | ||||
|                             $default_directory $swim_conf) ], | ||||
|                Info => [ qw($parent $base $zcat) ] | ||||
|                ); | ||||
| 
 | ||||
| 
 | ||||
|           | ||||
| ############################# | ||||
| # DEFAULT PROGRAM VARIABLES # | ||||
| ############################# | ||||
| 
 | ||||
| # You can change this to how many lines you would like "swim -qf <>" to | ||||
| # print out, before asking for -t or --total, it will automatically ask | ||||
| # though, if there is more than one package and you used the option -i. | ||||
| # Remember -t can be used with --scripts family members to view the | ||||
| # title of the script file regardless of this setting, and if -t has to be | ||||
| # used, the titles will be displayed, which makes sense. | ||||
| $my_number = 23; | ||||
| 
 | ||||
| # Just like a shell, you can keep a history of whatever length you want. | ||||
| $HISTORY = 10; | ||||
| 
 | ||||
| # For not-installed: | ||||
| # This part supplies the default value for --arch. | ||||
| # | ||||
| # You can determine the default architecture used when -n is  | ||||
| # called or a not-installed database is made.  Architectures are always | ||||
| # being added so check with Debian to find a list.  There is alpha, arm, | ||||
| # hurd (alternative kernel to linux), i386, m68k, powerpc, sparc.  Just use | ||||
| # the arch found after the hyphen in the Contents-(arch) file. | ||||
| $architecture = "i386"; | ||||
| 
 | ||||
| # For not-installed: | ||||
| # This part supplies the default value for --dists. | ||||
| # | ||||
| # The default distribution can be either stable, unstable, frozen, or | ||||
| # experimental (rare).  These represent the state of development that the | ||||
| # packages are under.  The unstable distribution can have lot's of changes | ||||
| # within a very short time period, and frozen may or may not be available. | ||||
| $distribution = "unstable"; | ||||
| 
 | ||||
| 
 | ||||
| #For not-installed: | ||||
| #This part supplies the default value for --main, --contrib, --non-free, | ||||
| #and --non-us. | ||||
| 
 | ||||
| # Distributions are divided into the sections.  These sections are called | ||||
| # distributions in the version 2.4.1.0 packaging manual, because they were at | ||||
| # one time separate distributions, but this has since changed.  You can | ||||
| # determine which of these sections (main, non-free, contrib or non-US) to | ||||
| # pull out of the Contents file if you don't want to use --main, --contrib, | ||||
| # --non-free, and --non-us to selectively pick sections.  Basically, whatever | ||||
| # you pull out should match the Package(s) file(s) you are targetting, this | ||||
| # program is friendly if you make a mistake, but it's more effecient to pull | ||||
| # out just what you want.  If the same package happens to exist in two | ||||
| # different sections, main and non-us for example (which is really a | ||||
| # situation that shouldn't exist, yet it does), you will still be able to | ||||
| # find this package in the non-us group, but its section and locations will be | ||||
| # the one which main recognizes assuming that you use the order in the example | ||||
| # below. | ||||
| 
 | ||||
| # Setting it up: | ||||
| # Example: You just want to pull out main and contrib every time you run | ||||
| # --initndb, --rebuildndb, or --ndb.   | ||||
| # @user_defined_section = qw(main contrib non-US);   | ||||
| # remember "non-US" not "non-us".  | ||||
| 
 | ||||
| #untill non-US is fixed the second is better | ||||
| #@user_defined_section = qw(main contrib non-free non-US);  | ||||
| @user_defined_section = qw(main contrib non-free); | ||||
| 
 | ||||
| # Usually, this is                                                       | ||||
| $alt = "debian"; | ||||
| 
 | ||||
| ################ | ||||
| # DF LOCATION  # | ||||
| ################ | ||||
| 
 | ||||
| # A little philosophy: | ||||
| # swim was developed for maximum versatility, so whether you are just | ||||
| # interested in researching, and keeping tabs on the newest packages, | ||||
| # or maintaining a Debian virtual distribution on a non-Debian real | ||||
| # distribution, or you are a using swim for distribution development, swim | ||||
| # provides a way.  The default directory (DF - which can also mean | ||||
| # directory/file) keeps track of Contents and Packages files downloaded | ||||
| # using --ftp, and gives the files names specific to the distribution and | ||||
| # architectures they represent.  But, you also have the freedom not to use | ||||
| # the default directory in this case swim will still do the renaming and | ||||
| # keeping track of the mtime, but you will have to remember where you put | ||||
| # the files. On the other hand, if you use apt, you won't even have to use | ||||
| # the DF directory for Packages files because you can get the ones specific | ||||
| # to your own systems architecture from apt, but if you want to look at | ||||
| # other architectures you will need to use the DF directory or one of your | ||||
| # own choice.  | ||||
| # Naming Convention: Contents = Contents-dist.gz  | ||||
| # Packages = Packages-arch-dist-section.gz  | ||||
| $default_directory = '/root/.swim'; | ||||
| 
 | ||||
| 
 | ||||
| # The default root directory is the key to easy management of packages | ||||
| # downloaded through --ftp and --file, and provides an easy way to put together | ||||
| # a personalized distribution.  Future implementations of swim will provide | ||||
| # a distribution called personal..Packages and Contents files specific to | ||||
| # this distribution will automatically be made.  This directory can be a | ||||
| # real ftp site on your computer, or put where ever else you are allowed | ||||
| # to have directories.  dists/distribution/section/architecture/subject will be | ||||
| # placed above this directory.  No matter what, debian must be the final | ||||
| # directory before dists.  Other distributions are placed alongside debian, | ||||
| # like debian-non-US or personal.  | ||||
| # Feel free to change the permissions.  This directory is above your default_ | ||||
| # directory. | ||||
| $default_root_directory = '/pub/debian'; | ||||
| 
 | ||||
| # Because you may be using a real ftp site, this configuration allows you | ||||
| # to determine what permissions swim will set for directories it creates | ||||
| # above the default root directory. | ||||
| $permission = '0755'; | ||||
| 
 | ||||
| 
 | ||||
| ############### | ||||
| # AR or DPKG? # | ||||
| ############### | ||||
| 
 | ||||
| # NOTE: users set these next two with the $package_tool variable. | ||||
| 
 | ||||
| # packaging friends dpkg and dpkg-deb come from the essential and | ||||
| # required dpkg package.  ar from the package binutils can also be used (below). | ||||
| # This is the archival program used for deb packages, but binutils is just | ||||
| # a standard non-essential package, and the ar capabilities are built into | ||||
| # dpkg-deb, and it's better not to assume that the standard packages are | ||||
| # even established, yet. | ||||
| $dpkg = (); | ||||
| $dpkg_deb = (); | ||||
| 
 | ||||
| 
 | ||||
| # If you don't have the dpkg package on your system then you can use ar | ||||
| # from the package binutils.  This would be a standard, but not an essential | ||||
| # package in Debian, but this package is also fairly standard amongst all | ||||
| # distributions, and can even be found in the free djgpp for M$ Oses. | ||||
| # Since people who have both dpkg and ar may want to try the ar method, | ||||
| # rather than creating an automatic check, just assign a value to either | ||||
| # ($dpkg & $dpkg_deb) or just $ar. | ||||
| #my $ar = '/usr/bin/ar';  # same for RH | ||||
| $ar = '/usr/bin/ar'; | ||||
| 
 | ||||
| 
 | ||||
| ####### | ||||
| # APT # | ||||
| ####### | ||||
| 
 | ||||
| # NOTE: users set apt-get and apt-cache with the $apt variable | ||||
| 
 | ||||
| # If you have apt you are in luck. | ||||
| $apt_get = (); | ||||
| $apt_cache = (); | ||||
| $sources = '/etc/apt/sources.list'; | ||||
| $apt_sources = '/var/state/apt/lists'; | ||||
| 
 | ||||
| ######### | ||||
| # PAGER # | ||||
| ######### | ||||
| 
 | ||||
| # less is a nice pager, unless you like more!  There is an option  | ||||
| # --nopager or -n.   Pager is used for --help and swim called without any | ||||
| # options.  more comes from the required package util-linux, whereas | ||||
| # less comes from a standard package called less.  In the future there is | ||||
| # a possiblity that a large percentage of swim may use an internal pager. | ||||
| # less, more, or most or... | ||||
| #$ENV{PAGER} = "/usr/bin/less"; # same RH | ||||
| $ENV{PAGER} = "less"; | ||||
| $pager = $ENV{PAGER}; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ################# | ||||
| # SWIM PROGRAMS # | ||||
| ################# | ||||
| 
 | ||||
| # This is replaced by the Makefile. | ||||
| $pre="/usr"; # AUTOREPLACE done by Makefile, do not edit. | ||||
| 
 | ||||
| # This is the hash making program fastswim. | ||||
| $fastswim = "$pre/lib/SWIM/bin/fastswim"; | ||||
| 
 | ||||
| # imswim in an alternative to fastswim for --lowmem | ||||
| $imswim = "$pre/lib/SWIM/bin/imswim"; | ||||
| 
 | ||||
| #  This is the low memory program slowswim. | ||||
| $slowswim = "$pre/lib/SWIM/bin/slowswim"; | ||||
| 
 | ||||
| # This is the dir/file making program longswim. | ||||
| $longswim = "$pre/lib/SWIM/bin/longswim"; | ||||
| 
 | ||||
| ############ | ||||
| # TEMP DIR # | ||||
| ############ | ||||
| 
 | ||||
| # If you want to set an alternative directory for the temporary files | ||||
| # created when the databases are made, change here.  You may want to make | ||||
| # $tmp a RAM disk.  See package loadlin for initrd documentation and an | ||||
| # explanation for making such a disk.  There is also | ||||
| # /usr/src/kernel-source.version/Documentation.  Whether this will speed | ||||
| # things up is a subject of experimentation. | ||||
| $tmp = '/tmp'; | ||||
| 
 | ||||
| ################## | ||||
| # MAIN CONFFILES # | ||||
| ################## | ||||
| 
 | ||||
| # if configuration files are not kept in /etc change this | ||||
| # and set up the directories by hand. | ||||
| 
 | ||||
| $swim_conf = '/etc/swim'; | ||||
| 
 | ||||
| 
 | ||||
| ############# | ||||
| # UTILITIES # | ||||
| ############# | ||||
| 
 | ||||
| 
 | ||||
| # This probably never will have to be changed. | ||||
| $pwd = `pwd`; | ||||
| chomp $pwd; | ||||
| 
 | ||||
| # If the command split is somewhere else besides /usr/bin change this. | ||||
| # The required package textutils provides this. | ||||
| #my $splt = '/usr/bin/split'; # same RH | ||||
| $splt = 'split'; | ||||
| 
 | ||||
| # cat comes from the essential and required package textutils. | ||||
| #my $cat = '/bin/cat'; # same RH | ||||
| $cat = 'cat'; | ||||
| 
 | ||||
| # This command also omes from the required and essential package textutils. | ||||
| #my $sort = '/usr/bin/sort'; # same RH | ||||
| $sort = 'sort'; | ||||
| 
 | ||||
| # This program uses md5sum from the dpkg package, it can also use md5sum | ||||
| # from the RH package. | ||||
| #my $md5sum = '/usr/bin/md5sum'; # same RH | ||||
| $md5sum = 'md5sum'; | ||||
| 
 | ||||
| # If you want to view compressed files make sure this is correct. | ||||
| # The required package gzip provides this. | ||||
| #my $zcat = '/bin/zcat'; # same RH | ||||
| $zcat = 'zcat'; | ||||
| 
 | ||||
| # tar comes from the essential and required package tar. | ||||
| #my $tar = '/bin/tar'; # same RH | ||||
| $tar = 'tar'; | ||||
| 
 | ||||
| # grep comes from the essential and required package grep.  This seems | ||||
| # to require a path. | ||||
| $grep = '/bin/grep'; # same RH | ||||
| 
 | ||||
| # gzip comes from the essential and required package gzip. | ||||
| #my $gzip = "/bin/gzip"; # same RH | ||||
| $gzip = "gzip"; | ||||
| 
 | ||||
| # mount comes from the essential and required package mount. | ||||
| #my $mount = '/bin/mount'; # same RH | ||||
| #my $umount = '/bin/umount';  # same RH | ||||
| $mount = 'mount'; | ||||
| $umount = 'umount'; | ||||
| 
 | ||||
| # If your file system isn't an ext2 filesystem, you may want to change | ||||
| # this.  mke2fs comes from the essential and required package e2fsprogs. | ||||
| #my $mke2fs = '/sbin/mke2fs'; # same RH | ||||
| $mke2fs = 'mke2fs'; | ||||
| 
 | ||||
| # cp and mv from the essential and required package fileutils | ||||
| #my $copy = '/bin/cp'; # same RH | ||||
| $copy = 'cp'; | ||||
| $mv = 'mv'; | ||||
| 
 | ||||
| # Your system definitely has gcc if you have ar.  gcc is a standard package | ||||
| # in debian. | ||||
| $gcc = 'gcc'; | ||||
| 
 | ||||
| 
 | ||||
| ###### | ||||
| # FTP # | ||||
| ####### | ||||
| 
 | ||||
| # Major mode --ftp and --file automates the download of Contents and Packages | ||||
| # files. Even if you have apt installed, you may still want to download Packages | ||||
| # from alternative architectures, and the Contents file for your own architecture | ||||
| # or other architectures.  If you want virtual and/or -ld capabilities you need | ||||
| # the Contents file.  You specify a list of ftp or file sites using urls (like | ||||
| # apt). For your system's architecture specify the type deb, for other | ||||
| # architectures specify deb(hyphen)architecture (ex: deb-alpha).  Regardless of | ||||
| # whether or not you specify an architecture, deb implies /dist* found under the | ||||
| # base directory specified by the ftp url, except in the case of experimental, | ||||
| # and to a degree non-us. minor mode --ftp, and --file will use the sites in this | ||||
| # configuration as well, on a fifo (first in first out) basis, so choose the | ||||
| # order of sites based on which are closest, most current, as well as fast. | ||||
| 
 | ||||
| # IMPORTANT:  It is a BIG MISTAKE to use the distributions name (slink,po,etc)  | ||||
| # anywhere in the sources list, or in swim's configuration file..in fact swim | ||||
| # won't work properly, not to mention the fact that someday your favorite name | ||||
| # will suddenly disappear. This is because swim thinks in terms of the real | ||||
| # distribution name (stable,unstable,frozen, experimental).  The problem goes | ||||
| # like this - slink remains slink, but goes from unstable to frozen to stable.  | ||||
| # At first, using the distributions alias may seem appropriate, but the | ||||
| # purpose of swim is to keep tabs on the dists, and not to ignore changes in | ||||
| # the states, this also makes managing swim's databases much easier and | ||||
| # intuitive...more about this later.  | ||||
| 
 | ||||
| # Fun experiments:  Swim uses the naming conventions of apt, but leaves the | ||||
| # Package files compressed in the DF directory.  So you can always decompress | ||||
| # the databases and move them to /var/state/apt/lists.  This ofcourse assumes | ||||
| # that the  appropriate changes to the sources.list reflecting these Packages | ||||
| # (need to be the same architecture as your system) existed before you  | ||||
| # update. (author needs to do this experiment :*)  | ||||
| 
 | ||||
| $ftp1 = "deb ftp://localhost/pub/debian unstable main contrib non-free non-US"; | ||||
| $ftp2 = "deb ftp://localhost/pub/debian unstable main contrib non-free";  | ||||
| $ftp3 = "deb ftp://localhost/pub/debian  project/experimental/"; | ||||
| @FTP = ($ftp1,$ftp2,$ftp3);  | ||||
| 
 | ||||
| # These next variables allow some characteristics of the ftp client | ||||
| # to be altered.  See Net::FTP for ways of altering some of these | ||||
| # variables through the environment. | ||||
| 
 | ||||
| $firewall = 0; | ||||
| $port = 0; | ||||
| $timeout =  120; | ||||
| $debug = 0; | ||||
| $passive = 0; | ||||
| 
 | ||||
| 
 | ||||
| ######################################## | ||||
| # STUFF THAT NEVER NEEDS TO BE CHANGED # | ||||
| ######################################## | ||||
| 
 | ||||
| # You will never need to change this unless for some weird reason all the | ||||
| # files under dpkg are somewhere else (including /info*) , see --dbpath as | ||||
| # an alternative if you decide to access or make the databases somewhere | ||||
| # else. | ||||
| $base = '/var/lib/dpkg'; | ||||
| 
 | ||||
| # --dbpath takes care of this so don't touch. | ||||
| $parent = '/'; | ||||
| $library = '/var/lib/dpkg'; | ||||
| 
 | ||||
| 
 | ||||
| ############################# | ||||
| # LOAD CUSTOM CONFIGURATION # | ||||
| ############################# | ||||
| 
 | ||||
| 
 | ||||
| # Here we load in the customized configuration which override the defaults | ||||
| # Might as well use do, let the world learn Perl ... compare this to apt's  | ||||
| # configuation file with scopes.  Swim's sources.list file (/etc/swim/swimz.list),  | ||||
| # will be grabbed at SWIM::Apt and SWIM::Qftp if it exists. | ||||
| 
 | ||||
| do "$swim_conf/swimrc"; | ||||
| do "$ENV{HOME}/.swim/swimrc"; | ||||
| if ((defined $dpkg && !defined $dpkg_deb) ||  | ||||
|    (!defined $dpkg && defined $dpkg_deb)) { | ||||
|   print "swim: need to give both \$dpkg and \$dpkg_deb a value if you want dpkg\n"; | ||||
|   exit; | ||||
| } | ||||
| if (defined $package_tool) { | ||||
|  if ($package_tool =~ /ar/) { | ||||
|    $ar = $ar; | ||||
|  } | ||||
|  else { | ||||
|    $dpkg = 'dpkg'; | ||||
|    $dpkg_deb = 'dpkg-deb'; | ||||
|    undef $ar; | ||||
|  } | ||||
| } | ||||
| if (defined $apt) { | ||||
|   $apt_get = 'apt-get'; | ||||
|   $apt_cache = 'apt-cache'; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ############################### | ||||
| # MAKE ANY NEEDED DIRECTORIES # | ||||
| ############################### | ||||
| 
 | ||||
| # make sure all the appropriate directories are made | ||||
| if (!-d $default_directory) {   | ||||
|  if (-e $default_directory) { | ||||
|    print "swim: can not create default directory because a file exists\n"; | ||||
|    exit; | ||||
|  } | ||||
|     my @DRD = split(m,/,,$default_directory); | ||||
|     my $placement = "/"; | ||||
|     for (1 .. $#DRD) {   | ||||
|      $_ == 1 ? ($placement = "/$DRD[$_]")  | ||||
|              : ($placement = $placement . "/" . $DRD[$_]); | ||||
|      -d $placement or mkdir("$placement",0755); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| if (!-d "$default_directory$default_root_directory") { | ||||
|     my @DRD = split(m,/,,$default_root_directory); | ||||
|     print "swim: debian must be the final directory before dists\n" | ||||
|     if $DRD[$#DRD] ne "debian"; | ||||
|     exit if $DRD[$#DRD] ne "debian"; | ||||
|     my $placement = "/"; | ||||
|     for (1 .. $#DRD) {   | ||||
|      $_ == 1 ? ($placement = "/$DRD[$_]")  | ||||
|              : ($placement = $placement . "/" . $DRD[$_]); | ||||
|      unless (-d "$default_directory$placement") {  | ||||
|        mkdir("$default_directory$placement",0755)  | ||||
|        or die "swim: could not create root default directory\n"; | ||||
|      } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| # Makefile will make sure these directories exist, unless for some strange | ||||
| # reason you have to change them. | ||||
| 
 | ||||
| if (!-d $library) { | ||||
|     mkdir($library,0755) or die "Couldn't create default directory\n"; | ||||
| } | ||||
| 
 | ||||
| if (!-d $base) { | ||||
|     mkdir($base,0755) or die "Couldn't create default directory\n"; | ||||
| } | ||||
| 
 | ||||
| if (!-d $swim_conf) { | ||||
|     mkdir($swim_conf,0666) or die "Couldn't create configuration file directory, | ||||
|                                    please make the directories which are needed.\n"; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
| __END__ | ||||
| 
 | ||||
| =head1 NAME | ||||
| 
 | ||||
| swimrc - swim configuration file | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| B<swimrc> is the configuartion file for swim allowing many default values | ||||
| to be set so that they do not have to be mentioned on the command line.  | ||||
| Swimrc interacts directly with Perl allowing a wide variety of variables | ||||
| found in B<SWIW::Conf> to be altered. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| =head1 USAGE | ||||
| 
 | ||||
| Values for variable can be altered for B<swim> by assigning different | ||||
| values enclosed in quotes or quoted whitespace (qw()), and ended with a | ||||
| semi-colon. | ||||
| 
 | ||||
|  $variable = "value"; | ||||
|  $variable = "qw(value1 value2 ..)"; | ||||
| 
 | ||||
| =head1 VARIABLES | ||||
| 
 | ||||
| This is a list of variables with explanations.  The default values for | ||||
| B<swim> are shown. | ||||
| 
 | ||||
| =head2 OUTPUT VARIABLE  | ||||
| 
 | ||||
| $my_number can be changed to how many lines you would like "swim -qf <>"  | ||||
| to print out, before the program asks for C<-t> or C<--total>.  Exception:  | ||||
| If C<-i> is used in the query and there is more than one package then the | ||||
| total will be presented.  | ||||
| 
 | ||||
| Hint:  C<-t> can be used with all the various C<--scripts> family members | ||||
| to view the title of the script file regardless of this variable setting, | ||||
| and if C<-t> has to be used, the titles will be displayed, which makes | ||||
| sense.  | ||||
| 
 | ||||
| B<$my_number = 23;> | ||||
| 
 | ||||
| =head2 HISTORY         | ||||
| 
 | ||||
| This is a shell-like history kept in relation to searches and the most | ||||
| recent edit when C<--stdin> is used. | ||||
| 
 | ||||
| B<$HISTORY = 10;> | ||||
| 
 | ||||
| =head2 AR or DPKG? | ||||
| 
 | ||||
| Debian packages are ar archives.  If you are using a Debian Distribution | ||||
| assign "dpkg" to $package_tool, otherwise assign "ar" to $package_tool. | ||||
| 
 | ||||
| B<$package_tool = "/usr/bin/ar";> | ||||
| 
 | ||||
| =head2 APT | ||||
| 
 | ||||
| B<Swim> does not assign a value for apt.  To use C<--apt> and C<-xyz> | ||||
| assign $apt the value "yes".  | ||||
| 
 | ||||
| Example: B<$apt = "yes";> | ||||
| 
 | ||||
| =head2 PAGER | ||||
| 
 | ||||
| less is a nice pager, unless you like more!  Pager is used for C<--help> | ||||
| and B<swim> called without any options. There is an option C<--nopager> or | ||||
| C<-n>.  more comes from the required package util-linux, whereas less | ||||
| comes from a standard package called less.  Values: "less", "more", or | ||||
| "most" or...  | ||||
| 
 | ||||
| B<$ENV{PAGER} = "less";> | ||||
| 
 | ||||
| =head2 NOT-INSTALLED VARIABLES  | ||||
| 
 | ||||
| Assign values for $architecture and/or $distribution to avoid having to | ||||
| use C<--arch> and C<--dists> everytime the not-installed databases are | ||||
| accessed with C<-n> or made or altered. | ||||
| 
 | ||||
| Architectures are always being added so check with Debian to find a list.  | ||||
| There is I<alpha, arm, hurd-i386 (alternative kernel to linux), i386, | ||||
| m68k, powerpc, sparc>.  Just use the arch found after the hyphen in the | ||||
| Contents-(arch) file. | ||||
| 
 | ||||
| B<$architecture = "i386";> | ||||
| 
 | ||||
| The distribution can be either I<stable, unstable, frozen, or experimental | ||||
| (rare)>.  These represent the state of development that the packages are | ||||
| under.  The unstable distribution can have lot's of changes within a very | ||||
| short time period, and frozen may or may not be available. | ||||
| 
 | ||||
| B<$distribution = "unstable";> | ||||
| 
 | ||||
| Distributions are divided into sections.  These sections were called | ||||
| distributions in the version 2.4.1.0 packaging manual, because they were | ||||
| at one time separate distributions, but this has since changed.   | ||||
| 
 | ||||
| You can determine which of the sections I<main, non-free, contrib or | ||||
| non-US> to pull out of the Contents file if you don't want to use | ||||
| C<--main>, C<--contrib>, C<--non-free>, and C<--non-us> to selectively | ||||
| pick the sections.  | ||||
| 
 | ||||
| For efficiency, you should choose the sections which you will be pulling | ||||
| out of the Packages file(s) being targetted.   | ||||
| 
 | ||||
| Rule: Use "non-US" not "non-us". | ||||
| 
 | ||||
| B<@user_defined_section = qw(main contrib non-free non-US);> | ||||
| 
 | ||||
| =head2 DF LOCATION | ||||
| 
 | ||||
| A little philosophy:  B<swim> was developed for maximum versatility, so | ||||
| whether you are just interested in researching, and keeping tabs on the | ||||
| newest packages, or maintaining a Debian virtual distribution on a | ||||
| non-Debian distribution, or you are a using B<swim> for distribution | ||||
| development, B<swim> provides a way.   | ||||
| 
 | ||||
| The next two variables determine the location of the DF (default | ||||
| directory/file system) | ||||
| 
 | ||||
| The default directory keeps track of Contents and/or Packages databases | ||||
| retrieved with --ftp.  The Contents and Packages databases and Release | ||||
| file are give names specific to the distribution and architectures they | ||||
| represent using the naming convention found in apt's sources directory.  | ||||
| You also have the freedom not to use the default directory, in which case | ||||
| swim will still do the renaming and keeping track of the mtime, but you | ||||
| will have to remember where you put the files. | ||||
| 
 | ||||
| B<$default_directory = '/root/.swim';> | ||||
| 
 | ||||
| The default root directory (DRD) is the key to easy management of binary | ||||
| packages, source, dsc, and diff files received from --ftp, and provides an | ||||
| easy way to put together a personalized distribution. This directory can | ||||
| be a real ftp site on your computer, or put wherever else you are | ||||
| allowed to have directories.  The DRD is always placed below the value | ||||
| assigned to $default_directory.  According to the previous assignment to  | ||||
| $default_directory, if the DRD is "/pub/a/debian" then the full path | ||||
| would be "/root/.swim/pub/a/debian".  | ||||
| 
 | ||||
| Example: When a package is downloaded it will be placed in | ||||
| dists/distribution/section/architecture/subject below the DRD.  | ||||
| 
 | ||||
| Rule: debian must be the final directory before dists, this is because | ||||
| other distributions are placed alongside debian, like debian-non-US or | ||||
| personal (specialized distribution). | ||||
| 
 | ||||
| B<$default_root_directory = '/pub/debian';> | ||||
| 
 | ||||
| Because you may be using a real ftp site, this variable allows you to | ||||
| determine what permissions B<swim> will assign for directories it creates | ||||
| below the DRD.  | ||||
| 
 | ||||
| B<$permission = '0755';> | ||||
| 
 | ||||
| =head2 TEMPORARY DIRECTORY | ||||
| 
 | ||||
| If you want to set an alternative directory for the temporary files | ||||
| created when the databases are made, change here.  You may want to make | ||||
| $tmp a RAM disk.  See package loadlin for initrd documentation and an | ||||
| explanation for making such a disk.  There is also documentation in | ||||
| /usr/src/kernel-source.version/Documentation.  Whether this will speed | ||||
| things up is a subject of experimentation.  | ||||
| 
 | ||||
| B<$tmp = "/tmp";> | ||||
| 
 | ||||
| =head2 FTP | ||||
| 
 | ||||
| You can alter the Firewall, Port, Timeout, Debug and Passive | ||||
| characteristics of the ftp client as defined in Net::FTP(3pm) by providing | ||||
| arguments to these variables. All variables but $timeout are set to untrue | ||||
| by default.   | ||||
| 
 | ||||
|  $firewall = 0; (FTP firewall machine name) | ||||
|  $port = 0;  (defaults to 23) | ||||
|  $timeout = 120;  (120 seconds) | ||||
|  $debug = 0;  (1 will turn on STDERR) | ||||
|  $passive = 0; (1 will enable) | ||||
| 
 | ||||
| =head1 OTHER VARIABLES | ||||
| 
 | ||||
| see SWIM::Conf | ||||
| 
 | ||||
| =head1 FILES | ||||
| 
 | ||||
|  /etc/swim/swimrc | ||||
|  ~/.swim/swimrc | ||||
| 
 | ||||
| =head1 SEE ALSO | ||||
| 
 | ||||
| swim(8), Net::FTP(3pm) | ||||
| 
 | ||||
| =head1 BUGS | ||||
|   | ||||
| Send directly to mttrader@access.mountain.net. | ||||
| 
 | ||||
| =head1 AUTHOR | ||||
| 
 | ||||
| Jonathan D. Rosenbaum <mttrader@access.mountain.net>  | ||||
| 
 | ||||
| =head1 COPYRIGHT | ||||
| 
 | ||||
| 
 | ||||
| Copyright (c) 1999 Jonathan Rosenbaum. All rights reserved. This program | ||||
| is free software; you can redistribute it and/or modify it under the GPL.  | ||||
| 
 | ||||
| =cut | ||||
							
								
								
									
										51
									
								
								INSTALL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								INSTALL
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| To install swim, become root and type "make install".   | ||||
| 
 | ||||
| To install extra and important documentation, type "make installdoc". | ||||
| 
 | ||||
| To remove, type "make remove". | ||||
| 
 | ||||
| Pod documentation is found in Conf.pm and swim.pod if you want to make | ||||
| different types of documention using pod translators.  There are SGML | ||||
| documents conforming to the debiandoc DTD for swimrc and swim which can be | ||||
| converted using tools from the debiandoc-sgml package. | ||||
| 
 | ||||
| (The modules mentioned below can be located at CPAN at www.perl.com.)  | ||||
| 
 | ||||
| Some distributions may require this module for ftp capabilities.  | ||||
| 
 | ||||
| Net::FTP from libnet-perl | ||||
| 
 | ||||
| This module provides readline libraries.  There are other similiar modules | ||||
| which also work with Perl's Term::ReadLine(3pm). | ||||
| 
 | ||||
| Term::ReadLine::Gnu from libterm-readline-gnu-perl or | ||||
| Term::ReadLine::Perl from libterm-readline-perl-perl | ||||
| 
 | ||||
| Also read QUICKSTART.text or QUICKSTART.html for additional information. | ||||
| _________________________________________________________________ | ||||
| 
 | ||||
| Alternative Installation | ||||
| 
 | ||||
| The modules are put into /usr/lib/perl5/SWIM because this is in Perl's | ||||
| @INC path, and does not violate Debian's Policy, on the other hand the | ||||
| modules are rather specific to swim, although they definitely could be | ||||
| used for other things. To put it in /usr/lib meant either using 'use lib | ||||
| "/usr/lib"' or pushing the alternative directory into @INC doing a | ||||
| 'BEGIN{}', or setting the Environment variable PERL5LIB. The first method | ||||
| slowed swim down, the second method caused a bad bug in SWIM::Deb, and the | ||||
| third method involved trying to make a universe of shells happy, but this | ||||
| is the best approach for an alternative @INC path.  | ||||
| 
 | ||||
| That's why there is Makefile.alternative.  If you already did a 'make | ||||
| install', now do a 'make remove'.  Change the name of Makefile, and change | ||||
| Makefile.alternative's name to Makefile.  You can change PREFIX in this | ||||
| Makefile to /usr/local if you want to.  Follow the same steps as for the | ||||
| original Makefile, but add one more step, set the Environment vaiable | ||||
| PERL5LIB to the directory where the modules are.  If the PREFIX was not | ||||
| changed, and you are using a bash shell then 'export PERL5LIB=/usr/lib'. | ||||
| 
 | ||||
| This alternative Makefile uses the tradition /usr/doc, /usr/man  | ||||
| directories whereas the other Makefile uses /usr/share/doc and | ||||
| /usr/share/man, this is because of Debian's adherence to the next | ||||
| generation fsstnd. | ||||
| 
 | ||||
							
								
								
									
										76
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| # Use Makefile.alternative if you want the modules in /usr or /usr/local,
 | ||||
| # not in /usr/lib/perl5, see INSTALL.
 | ||||
| 
 | ||||
| PREFIX=/usr | ||||
| 
 | ||||
| all: | ||||
| 
 | ||||
| clean: | ||||
| 	-rm build | ||||
| 	-rm *.bak | ||||
| 
 | ||||
| install:	 | ||||
| 	install -d $(DESTDIR)/var/lib/dpkg | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/sbin | ||||
| 	cp -a swim $(DESTDIR)/$(PREFIX)/sbin/swim | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/lib/perl5/SWIM | ||||
| 	cp -f Conf.pm $(DESTDIR)/$(PREFIX)/lib/perl5/SWIM/Conf.pm | ||||
| 	cp -fa lib/* $(DESTDIR)/$(PREFIX)/lib/perl5/SWIM | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/lib/SWIM  | ||||
| 	cp -fa bin/* $(DESTDIR)/$(PREFIX)/lib/SWIM | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/share/man/man8 | ||||
| 	cp -f swim.8 $(DESTDIR)/$(PREFIX)/share/man/man8 | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/share/man/man5 | ||||
| 	cp -f swimrc.5 $(DESTDIR)/$(PREFIX)/share/man/man5	 | ||||
| 	install -d $(DESTDIR)/usr/share/doc/swim/swim.html | ||||
| 	cp -fa swim.html/* $(DESTDIR)/usr/share/doc/swim/swim.html | ||||
| 	install -d $(DESTDIR)/usr/share/doc/swim/swimrc.html | ||||
| 	cp -fa swimrc.html/* $(DESTDIR)/usr/share/doc/swim/swimrc.html | ||||
| 	cp -f QUICKSTART.html $(DESTDIR)/usr/share/doc/swim | ||||
| 	cp -f REQUIREMENTS.html $(DESTDIR)/usr/share/doc/swim | ||||
| 	cp -f swim_by_example.html $(DESTDIR)/usr/share/doc/swim | ||||
| 	install -d $(DESTDIR)/usr/share/doc/swim/examples | ||||
| 	cp -fa examples/*  $(DESTDIR)/usr/share/doc/swim/examples | ||||
| 	install -d $(DESTDIR)/etc/swim | ||||
| 	cp -f swimz.list $(DESTDIR)/etc/swim | ||||
| 	cp -f swimrc $(DESTDIR)/etc/swim | ||||
| 
 | ||||
| installdoc: | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a QUICKSTART.text $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a REQUIREMENTS.text $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a swim_by_example.html $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a THEMES $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a TODO $(DESTDIR)/$(PREFIX)/share/doc/swim  | ||||
| 	cp -a BUGS $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a TODO $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a COPYING $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a contact_and_website $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a changelog $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a swim.text $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 	cp -a swimrc.text $(DESTDIR)/$(PREFIX)/share/doc/swim | ||||
| 
 | ||||
| remove: | ||||
| 	rm $(PREFIX)/lib/perl5/SWIM/* | ||||
| 	rmdir $(PREFIX)/lib/perl5/SWIM | ||||
| 	rm $(PREFIX)/sbin/swim | ||||
| 	rm /usr/share/doc/swim/swim.html/* | ||||
| 	rmdir /usr/share/doc/swim/swim.html | ||||
| 	rm /usr/share/doc/swim/swimrc.html/* | ||||
| 	rmdir /usr/share/doc/swim/swimrc.html | ||||
| 	rm /usr/share/doc/swim/examples/* | ||||
| 	rmdir /usr/share/doc/swim/examples | ||||
| 	rm /usr/share/doc/swim/* | ||||
| 	rmdir /usr/share/doc/swim | ||||
| 	rm $(PREFIX)/share/man/man5/swimrc.5 | ||||
| 	rm $(PREFIX)/share/man/man8/swim.8 | ||||
| 	rm $(PREFIX)/lib/SWIM/* | ||||
| 	rmdir $(PREFIX)/lib/SWIM | ||||
| 
 | ||||
| debian: | ||||
| 	dpkg-buildpackage -tc -rfakeroot | ||||
| 
 | ||||
| 
 | ||||
| dist: debian localdist stampede rpm | ||||
| 
 | ||||
| .PHONY: debian | ||||
							
								
								
									
										73
									
								
								Makefile.alternative
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								Makefile.alternative
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| # Set this to wherever you want swim to install. Eg, /usr/local or /usr
 | ||||
| PREFIX=/usr | ||||
| 
 | ||||
| all: | ||||
| 
 | ||||
| clean: | ||||
| 	-rm build | ||||
| 	-rm *.bak | ||||
| 
 | ||||
| install:	 | ||||
| 	install -d $(DESTDIR)/var/lib/dpkg | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/sbin | ||||
| 	cp -a swim $(DESTDIR)/$(PREFIX)/sbin/swim | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/lib/SWIM/bin  | ||||
| 	perl -pe '$$_="\$$pre=\"$(PREFIX)\";\n" \
 | ||||
|         if /AUTOREPLACE/' Conf.pm.alternative \
 | ||||
| 		> $(DESTDIR)/$(PREFIX)/lib/SWIM/Conf.pm | ||||
| 	chmod 644 $(DESTDIR)/$(PREFIX)/lib/SWIM/Conf.pm | ||||
| 	cp -fa lib/* $(DESTDIR)/$(PREFIX)/lib/SWIM | ||||
| 	cp -fa bin/* $(DESTDIR)/$(PREFIX)/lib/SWIM/bin | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/man/man8 | ||||
| 	cp -f swim.8 $(DESTDIR)/$(PREFIX)/man/man8 | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/man/man5 | ||||
| 	cp -f swimrc.5 $(DESTDIR)/$(PREFIX)/man/man5	 | ||||
| 	install -d $(DESTDIR)/usr/doc/swim/swim.html | ||||
| 	cp -fa swim.html/* $(DESTDIR)/usr/doc/swim/swim.html | ||||
| 	install -d $(DESTDIR)/usr/doc/swim/swimrc.html | ||||
| 	cp -fa swimrc.html/* $(DESTDIR)/usr/doc/swim/swimrc.html | ||||
| 	cp -f QUICKSTART.html $(DESTDIR)/usr/doc/swim | ||||
| 	cp -f REQUIREMENTS.html $(DESTDIR)/usr/doc/swim | ||||
|  	cp -f swim_by_example.html $(DESTDIR)/usr/doc/swim | ||||
| 	install -d $(DESTDIR)/usr/doc/swim/examples | ||||
| 	cp -fa examples/*  $(DESTDIR)/usr/doc/swim/examples | ||||
| 	install -d $(DESTDIR)/etc/swim | ||||
| 	cp -f swimz.list $(DESTDIR)/etc/swim | ||||
| 	cp -f swimrc $(DESTDIR)/etc/swim | ||||
| 
 | ||||
| installdoc: | ||||
| 	install -d $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a QUICKSTART.text $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a REQUIREMENTS.text $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a swim_by_example.html $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a THEMES $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a TODO $(DESTDIR)/$(PREFIX)/doc/swim  | ||||
| 	cp -a BUGS $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a TODO $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a COPYING $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a contact_and_website $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a changelog $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a swim.text $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| 	cp -a swimrc.text $(DESTDIR)/$(PREFIX)/doc/swim | ||||
| remove: | ||||
| 	rm -rf $(PREFIX)/lib/SWIM/* | ||||
| 	rmdir $(PREFIX)/lib/SWIM | ||||
| 	rm $(PREFIX)/sbin/swim | ||||
| 	rm /usr/doc/swim/swim.html/* | ||||
| 	rmdir /usr/doc/swim/swim.html | ||||
| 	rm /usr/doc/swim/swimrc.html/* | ||||
| 	rmdir /usr/doc/swim/swimrc.html | ||||
| 	rm /usr/doc/swim/examples/* | ||||
| 	rmdir /usr/doc/swim/examples | ||||
| 	rm /usr/doc/swim/* | ||||
| 	rmdir /usr/doc/swim | ||||
| 	rm $(PREFIX)/man/man5/swimrc.5 | ||||
| 	rm $(PREFIX)/man/man8/swim.8 | ||||
| 
 | ||||
| debian: | ||||
| 	dpkg-buildpackage -tc -rfakeroot | ||||
| 
 | ||||
| 
 | ||||
| dist: debian localdist stampede rpm | ||||
| 
 | ||||
| .PHONY: debian | ||||
							
								
								
									
										114
									
								
								Programming_swim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								Programming_swim
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,114 @@ | ||||
| Database Structure  | ||||
| 
 | ||||
| note: what's below was written for readability, not to | ||||
| indicate complex structures, all databases are normal hashes.  stripped | ||||
| implies that the control field was removed, but the data afterwards kept. | ||||
| 
 | ||||
| Structure of statusindex.deb | ||||
| 
 | ||||
| 1). Initially made in SWIM::DB_Init::database | ||||
| 2). Updated in SWIM::DB::db | ||||
| 3). $sb(packagename) = qw(packagename_version group priority | ||||
|                           status(separated with :)); | ||||
|     All fields stripped | ||||
| 
 | ||||
| Structure of nstatusindex-arch-dists.deb | ||||
| 
 | ||||
| 1).  Initally made in SWIM::NDB_Init::not_installed | ||||
| 2).  Updated in SWIM::NDB::update_packages_ndb | ||||
| 3).  $nsb(packagename) = qw(packagename_version group priority); | ||||
|      $nsb{"/."} = qw(packagename_version ...); | ||||
|      All fields stripped | ||||
| 
 | ||||
| 
 | ||||
| Structure of packages.deb | ||||
| 
 | ||||
| 1). Initally made in SWIM::DB_Init::database | ||||
| 2). Updated in SWIM::DB::db | ||||
| 3). %db = [ @name => (packagename packagename_version ...), | ||||
|             @Tdescriptions => (packagename_version format_info ...), | ||||
|             @conf => (packagename_versionCONF | ||||
|                       every_indented_line_after_Conffiles ...), | ||||
|             @REPLACE => (packagename_version(with PRE, DEP, REC, SUG, | ||||
|                          CON, PRO, or REP appended) | ||||
|                          package_relationship_field (unstripped) ...) | ||||
|           ] | ||||
| 
 | ||||
| Structure of npackages-arch-dists.deb | ||||
| 
 | ||||
| 1). Initially made in SWIM::NDB_Init::not_installed | ||||
| 2). Updated in SWIM::NDB::update_packages_ndb | ||||
| 3). %ndb = [ @name => (packagename packagename_version ...), | ||||
|              @Tdescriptions => (packagename_version format_info ...), | ||||
|              @conf => (empty), | ||||
|              @REPLACE => (packagename_version(with PRE, DEP, REC, SUG, | ||||
|                           CON, PRO, REP, MD, and FN appended) | ||||
|                           package_relationship_field (unstripped) ...), | ||||
|              @FILENAME => (packagename_versionFN Filename_field(stripped) ...), | ||||
|              @MD5SUM => (packagename_versionMD | ||||
|                          package_MD5_checksum(stripped) ...), | ||||
|              @revision => (packagename_versionMD(this comes from the | ||||
|                            Filename field) "packagename_versionMD REVISION" | ||||
|                            (this time the version comes from the Version | ||||
|                             field) ...) | ||||
|           ] | ||||
| 
 | ||||
| The revision field is unusual and occurs in the experimental distribution. | ||||
| The hash is used by -p so that the version can be figured out. (check | ||||
| "revision: situation" in SWIM::Deb). | ||||
| 
 | ||||
| Structure of groupindex.deb | ||||
| 
 | ||||
| 1). Initally made in SWIM::DB_Init::database | ||||
| 2). Updated in SWIM::DB::db | ||||
| 3). $gb(group) = qw(packagenames ......) group stripped from Section: | ||||
|   | ||||
| Structure of ngroupindex-arch-dists.deb | ||||
| 
 | ||||
| 1). Initially made in SWIM::NDB_Init::not_installed | ||||
| 2). Updated in SWIM::NDB::update_packages_ndb | ||||
| 3). $ngb = qw(packagenames ......) group stripped from Section:  | ||||
| 
 | ||||
| Structure of searchindex.deb and dirindex.deb | ||||
| 
 | ||||
| 1). When SWIM::DB_Init::database finishes  SWIM::DB_Init::md begins. | ||||
|     This writes @dpackage to transfer.deb, which is processed by either | ||||
|     fastswim (filedir -> big and long) or imswim (which is like longswim, | ||||
|     which produces one large file - filedir.deb), and slowswim (big and | ||||
|     long) into the two files big.debian and long.debian and then the | ||||
|     databases are finished by SWIM::MD::process_md(). | ||||
| 2). Rebuilt by SWIM::DB::rebuildflatdb | ||||
| 3). searchindex.deb = /path/filename\n ...... (1 package) | ||||
|     dirindex.deb    = /path/dir\n ...... (> 1 package) | ||||
|     | ||||
| Structure of nsearchindex-arch-dists.deb and ndirindex-arch-dists.deb | ||||
| 
 | ||||
| 1). After SWIM::NDB_Init::initndb runs SWIM::NDB_Init::not_installed, | ||||
|     SWIM::NDB_Init::nmd runs longswim which produces | ||||
|     filedir.deb, then initndb runs slowswim producing big.debian and | ||||
|     long.debian.  Then the database(s) are finished by | ||||
|     SWIM::MD::prcess_md.   | ||||
| 2). | ||||
| 3). nsearchindex-arch-dists.deb = /path/filename\n ...... (1 package) | ||||
|     ndirindex-arch-dists.deb    = /path/dir\n ...... (> 1 package) | ||||
|     Note:  nsearch* includes elements which pertain to only one | ||||
|            package, this generally implies files, not directories, however | ||||
|            the ni often has more than one package sharing a file, so its | ||||
|            placed into ndir* (this would be rare with an i system).  | ||||
|            SWIM::Search::search processes these two files differently, | ||||
|            which is more effecient for the much larger nsearch*, for this | ||||
|            reason you can't merge the two databases together. | ||||
|                     | ||||
| Structure of ncontentsindex-arch-dists.deb. | ||||
| 
 | ||||
| 1). A compressed Contents database, no alterations (originally the headers | ||||
|     were removed, but this is a waste of time.) If the FDB (flat database | ||||
|     option if given) SWIM::Library::compress_contents is called from | ||||
|     initndb(), otherwise longswim called from SWIM::NDB_Init::nmd  | ||||
|     copies and compresses.  The longswim method compresses, but  | ||||
|     compress_contents does a cp (not -a).  In both cases the header | ||||
|     removal has been depreciated.  The important thing is that the utime | ||||
|     remains the same. | ||||
| 2). The new Contents database is copied (utime) and renamed via | ||||
|     compress_contents called from SWIM::NDB.  | ||||
| 3). Contents format | ||||
							
								
								
									
										206
									
								
								QUICKSTART.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								QUICKSTART.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,206 @@ | ||||
| <html> | ||||
| <head><title>Quickstart</title></head> | ||||
| <body  text="#000000" bgcolor="#FFFFFF" link="#0000EF" vlink="#51188E" | ||||
| alink="#FF0000"> | ||||
| 
 | ||||
| <br><br><br> | ||||
| 
 | ||||
| <h1 align=center>QUICKSTART</h1> | ||||
| 
 | ||||
| <br><br> | ||||
| 
 | ||||
| <h5>READ THE <A HREF="REQUIREMENTS.html">REQUIREMENTS</A></h5> | ||||
| 
 | ||||
| Now you can skip the next three steps if you have an installed Debian | ||||
| distribution and you are in a hurry for a demonstration, but you will miss | ||||
| out on swim's more awesome capabilities. With that said.....  | ||||
| 
 | ||||
| <p> | ||||
| <b>FIRST GET SWIMRC PREPARED</b> | ||||
| 
 | ||||
| <p> Edit the swimrc configution file, you should read <A | ||||
| HREF="swimrc.html/index.html">swimrc(5)</A>, but I'll ask you some | ||||
| question right now.  You can find swimrc in /etc/swim, and swimrc can be | ||||
| placed in your home directory in the subdirectory .swim. Entries in the | ||||
| home directory swimrc override ones in /etc/swim.  | ||||
| 
 | ||||
| <p> | ||||
| Are you using an installed Debian system?  If so, you almost definitely | ||||
| have dpkg installed.  So uncomment this line in /etc/swim/swimrc by | ||||
| removing the pound sign.  | ||||
| 
 | ||||
| <p> | ||||
| <code>$package_tool = "/usr/bin/dpkg";</code> | ||||
| 
 | ||||
| <p>otherwise | ||||
| 
 | ||||
| <p> | ||||
| <code>$package_tool = "/usr/bin/ar";</code> | ||||
| 
 | ||||
| <p> | ||||
| Do you have the apt package installed?  Configure this, or -xyz will not | ||||
| work. | ||||
| 
 | ||||
| <p> | ||||
| <code>$apt = "yes";</code> | ||||
| 
 | ||||
| <p> | ||||
| Now you need to decide what architecture you would like to be swim's | ||||
| default value when you download, build, and query the not-installed | ||||
| databases. | ||||
| 
 | ||||
| <p> | ||||
| What flavor, do you want alpha, arm, hurd-i386, i386, m68k, powerpc, | ||||
| or sparc? (more coming :*)  I decided on ..... | ||||
| 
 | ||||
| <p> | ||||
| <code>$architecture = "i386";</code> | ||||
| 
 | ||||
| <p> | ||||
| What kind of distribution do you want to be your default? stable, | ||||
| unstable, frozen, or experimental (rare)  I like the ever changing ... | ||||
| 
 | ||||
| <p> | ||||
| <code>$distribution = "unstable";</code> | ||||
| 
 | ||||
| <p> | ||||
| Decide which sections you want?  You can have this | ||||
| 
 | ||||
| <p> | ||||
| <code>@user_defined_section = qw(main contrib non-free);</code> | ||||
| 
 | ||||
| <p> | ||||
| or this. | ||||
| 
 | ||||
| <p> | ||||
| <code>@user_defined_section = qw(main);</code> | ||||
| 
 | ||||
| <p> | ||||
| or ..... | ||||
|     | ||||
| <p> | ||||
| <b>SECOND GET SWIMZ.LIST PREPARED</b> | ||||
| 
 | ||||
| <p> Now grab a copy of the <A | ||||
| HREF="http://www.debian.org/misc/README.mirrors">README.mirrors</A> from | ||||
| http://www.debian.org/misc/README.mirrors",  | ||||
| you will need this to set-up the configuration file /etc/swim/swimz.list.  | ||||
| 
 | ||||
| <p> If your using apt make sure to read <A | ||||
| HREF="swim.html/index.html">swim(8)</A> to get the nitty gritty on how you | ||||
| can synchronize swim along with apt :*} using <A | ||||
| HREF="swim.html/ch-important.html#s5.6">swimz.list</A>.  | ||||
| 
 | ||||
| <p> | ||||
| Humm, you found a site which has the distribution you want, and you know | ||||
| which section you want, and you are happy knowing about packages which can | ||||
| install on the architecture you computer happens to have. | ||||
| 
 | ||||
| <p> | ||||
| So what site is that? | ||||
| 
 | ||||
| <p> | ||||
| <code>deb ftp://ftp.swimz.org</code> | ||||
| 
 | ||||
| <p> | ||||
| What was the directory you happened to notice in the README.mirrors page?   | ||||
| 
 | ||||
| <p> | ||||
| <code>deb ftp://ftp.swimz.org/pub/debian</code> | ||||
| 
 | ||||
| <p> | ||||
| What distribution did you want?  Note: You won't want to use the Release | ||||
| code name for the distribution, see | ||||
| <A HREF="swim.html/ch-important.html#s5.6">swimz.list</A>. | ||||
| 
 | ||||
| <p> | ||||
| <code>deb ftp://ftp.swimz.org/pub/debian unstable</code> | ||||
| 
 | ||||
| <p> | ||||
| What sections did you want? | ||||
| 
 | ||||
| <p> | ||||
| <code>deb ftp://ftp.swimz.org/pub/debian unstable main contrib | ||||
| non-free</code> | ||||
| 
 | ||||
| <p> | ||||
| Now put this line in the swimz.list, exactly like written, and ofcourse | ||||
| use the values you want.  | ||||
| 
 | ||||
| <p> | ||||
| <b>THIRD GET THE DEBIAN DATABASE WITH FTP</b> | ||||
| 
 | ||||
| <p> | ||||
| Just issue this command. | ||||
| 
 | ||||
| <p> | ||||
| <kbd>swim --ftp --Contents DF --Packages DF</kbd> | ||||
| 
 | ||||
| <p> | ||||
| and wait a little bit. | ||||
| 
 | ||||
| <p> | ||||
| <b>FOURTH BUILD THE DATABASES</b> | ||||
| 
 | ||||
| <p> | ||||
| This is for a computer system with a Debian distribution installed. | ||||
| 
 | ||||
| <p> | ||||
| <kbd>swim --initdb</kbd> | ||||
| 
 | ||||
| <p> | ||||
| This next part applies to people who followed all the steps to get here, | ||||
| and also read the important requirements at the top.  This makes the | ||||
| not-installed databases.  Go take a walk, or a swim :*} | ||||
| 
 | ||||
| <p> | ||||
| <kbd>swim --initndb --Contents DF DF</kbd> | ||||
| 
 | ||||
| <p> | ||||
| When either of these commands are complete they will say "<samp>over and | ||||
| out</samp>". | ||||
| 
 | ||||
| <p> | ||||
| <b>NOW WHAT?</b> | ||||
| 
 | ||||
| <p> Now the real fun begins.  If you happen to have some experience with | ||||
| rpm you already know some of the options which swim uses, but be prepared | ||||
| for surpises.  <A HREF="swim.html/index.html">swim(8)</A> goes into more detail, the | ||||
| <A HREF="http://www.rpm.org/maximum-rpm.ps.gz">"<cite>Maximum | ||||
| RPM</cite>"</A> book by Edward C. Bailey which is freely available may | ||||
| provide help for swim's <kbd>--query</kbd> option, but you will find that | ||||
| swim greatly diverges from rpm.  | ||||
| 
 | ||||
| <p> Try something like this, and do not use the <kbd>-n</kbd> unless you | ||||
| made the not-installed databases, on the other hand, <em>REMEMBER</em> to | ||||
| use <kbd>-n</kbd> if you do not have an installed Debian system....  | ||||
| 
 | ||||
| <p> | ||||
| <kbd>swim -n --search swim</kbd> | ||||
| 
 | ||||
| <p> | ||||
| now do this.. | ||||
| 
 | ||||
| <p> | ||||
| <kbd>swim -qnSi</kbd> or <kbd>swim -hn</kbd> | ||||
| 
 | ||||
| <p> | ||||
| go to the directory /usr/bin and do | ||||
| 
 | ||||
| <p> | ||||
| <kbd>swim -qnf</kbd> <b>.</b> | ||||
| 
 | ||||
| <p> | ||||
| you probably will have to do | ||||
| 
 | ||||
| <p> | ||||
| <kbd>swim -qnft</kbd> <b>.</b> | ||||
| 
 | ||||
| <p> | ||||
| <b>...the fun is just beginning...</b> | ||||
| 
 | ||||
| <p> | ||||
| <em>Where are you swimming to today?</em> | ||||
| 
 | ||||
| </body>                                                                          | ||||
| </html>   | ||||
							
								
								
									
										140
									
								
								QUICKSTART.text
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								QUICKSTART.text
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,140 @@ | ||||
| READ THE REQUIREMENTS | ||||
| 
 | ||||
| Now you can skip the next three steps if you have an installed Debian | ||||
| distribution and you are in a hurry for a demonstration, but you will miss | ||||
| out on swim's more awesome capabilities. With that said.....  | ||||
| 
 | ||||
| FIRST GET SWIMRC PREPARED | ||||
| 
 | ||||
| Edit the swimrc configution file, you should read swimrc(5), but I'll ask | ||||
| you some question right now.  You can find swimrc in /etc/swim, and in | ||||
| your home directory in the subdirectory .swim.  Entries in the home | ||||
| directory swimrc override ones in /etc/swim. | ||||
| 
 | ||||
| Are you using an installed Debian system?  If so, you almost definitely | ||||
| have dpkg installed.  So uncomment this line in /etc/swim/swimrc by | ||||
| removing the pound sign.  | ||||
| 
 | ||||
| $package_tool = "/usr/bin/dpkg"; | ||||
| 
 | ||||
| otherwise | ||||
| 
 | ||||
| $package_tool = "/usr/bin/ar"; | ||||
| 
 | ||||
| Do you have the apt package installed?  Configure this, or -xyz will not | ||||
| work. | ||||
| 
 | ||||
| $apt = "yes"; | ||||
| 
 | ||||
| Now you need to decide what architecture you would like to be swim's | ||||
| default value when you download, build, and query the not-installed | ||||
| databases. | ||||
| 
 | ||||
| What flavor, do you want alpha, arm, hurd-i386, i386, m68k, powerpc, | ||||
| or sparc? (more coming :*)  I decided on ..... | ||||
| 
 | ||||
| $architecture = "i386"; | ||||
| 
 | ||||
| What kind of distribution do you want to be your default? stable, | ||||
| unstable, frozen, or experimental (rare)  I like the ever changing ... | ||||
| 
 | ||||
| $distribution = "unstable"; | ||||
| 
 | ||||
| Decide which sections you want?  You can have this | ||||
| 
 | ||||
| @user_defined_section = qw(main contrib non-free); | ||||
| 
 | ||||
| or this. | ||||
| 
 | ||||
| @user_defined_section = qw(main); | ||||
| 
 | ||||
| or ..... | ||||
|     | ||||
| 
 | ||||
| SECOND GET SWIMZ.LIST PREPARED | ||||
| 
 | ||||
| Now grab a copy of the README.mirrors from | ||||
| http://www.debian.org/misc/README.mirrors, you will need this to set-up  | ||||
| the configuration file /etc/swim/swimz.list. | ||||
| 
 | ||||
| If your using apt make sure to read swim(8) to get the nitty gritty on how | ||||
| you can synchronize swim along with apt :*} using swimz.list. | ||||
| 
 | ||||
| Humm, you found a site which has the distribution you want, and you know | ||||
| which section you want, and you are happy knowing about packages which can | ||||
| install on the architecture you computer happens to have. | ||||
| 
 | ||||
| So what site is that? | ||||
| 
 | ||||
| deb ftp://ftp.swimz.org | ||||
| 
 | ||||
| What was the directory you happened to notice in the README.mirrors page?   | ||||
| 
 | ||||
| deb ftp://ftp.swimz.org/pub/debian | ||||
| 
 | ||||
| What distribution did you want?  Note: You won't want to use the Release | ||||
| code name for the distribution, see swimz.list. | ||||
| 
 | ||||
| deb ftp://ftp.swimz.org/pub/debian unstable | ||||
| 
 | ||||
| What sections did you want? | ||||
| 
 | ||||
| deb ftp://ftp.swimz.org/pub/debian unstable main contrib non-free | ||||
| 
 | ||||
| Now put this line in the swimz.list, exactly like written, and ofcourse | ||||
| use the values you want.  | ||||
| 
 | ||||
| THIRD GET THE DEBIAN DATABASE WITH FTP | ||||
| 
 | ||||
| Just issue this command. | ||||
| 
 | ||||
| swim --ftp --Contents DF --Packages DF | ||||
| 
 | ||||
| and wait a little bit. | ||||
| 
 | ||||
| 
 | ||||
| FOURTH BUILD THE DATABASES | ||||
| 
 | ||||
| This is for a computer system with a Debian distribution installed. | ||||
| 
 | ||||
| swim --initdb | ||||
| 
 | ||||
| This next part applies to people who followed all the steps to get here, | ||||
| and also read the important requirements at the top.  This makes the | ||||
| not-installed databases.  Go take a walk, or a swim :*} | ||||
| 
 | ||||
| swim --initndb --Contents DF DF | ||||
| 
 | ||||
| When either of these commands are complete they will say "over and out". | ||||
| 
 | ||||
| NOW WHAT? | ||||
| 
 | ||||
| Now the real fun begins.  If you happen to have some experience with rpm | ||||
| you already know some of the options which swim uses, but be prepared for | ||||
| surpises.  swim(8) goes into more detail, the "Maximum RPM" book by | ||||
| Edward C. Bailey which is freely available may provide help for swim's | ||||
| --query option, but you will find that swim greatly diverges from rpm. | ||||
| 
 | ||||
| Try something like this, and do not use the -n unless you made the | ||||
| not-installed databases, on the other hand, REMEMBER to use -n if you | ||||
| do not have an installed system.... | ||||
| 
 | ||||
| swim -n --search swim | ||||
| 
 | ||||
| now do this.. | ||||
| 
 | ||||
| swim -qnSi or swim -hn | ||||
| 
 | ||||
| go to the directory /usr/bin and do | ||||
| 
 | ||||
| swim -qnf . | ||||
| 
 | ||||
| you probably will have to do | ||||
| 
 | ||||
| swim -qnft . | ||||
| 
 | ||||
| ...the fun is just beginning... | ||||
| 
 | ||||
| Where are you swimming to today? | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										139
									
								
								REQUIREMENTS.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								REQUIREMENTS.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,139 @@ | ||||
| <html> | ||||
| <head><title>Requirements</title></head> | ||||
| <body  text="#000000" bgcolor="#FFFFFF" link="#0000EF" vlink="#51188E" | ||||
| alink="#FF0000"> | ||||
| 
 | ||||
| <br><br><br> | ||||
| 
 | ||||
| 
 | ||||
| <h2>REQUIRMENTS:</h2>   | ||||
| 
 | ||||
| <p> | ||||
| Don't get intimidated, this is just to cover all bases, most computer | ||||
| systems meet the requirements.<p> | ||||
| 
 | ||||
| <b>PERL</b>:  Yes, preferably Perl 5.004.04 or greater. | ||||
| 
 | ||||
| <p> <b>FTP CAPABILITIES (optional)</b>: You may need to get <A | ||||
| HREF="ftp://www.perl.com/pub/perl/CPAN/modules/by-category/05_Networking_Devices_IPC/Net/libnet-1.0606.tar.gz">Net::FTP</A> | ||||
| (Debian libnet-perl package) which depends on Data::Dumper (Debian | ||||
| data-dumper package).  You also need <b>gcc</b> if you do not have a | ||||
| Debian system so that <em>swim</em> can figure out what architecture your | ||||
| machine is. You can also find these modules at the <A | ||||
| HREF="http://www.perl.com">CPAN mirrors</A> or the PACKAGES below. | ||||
| 
 | ||||
| <p> <b>READLINE CAPABILITIES (optional)</b>:  For nice readline | ||||
| cpabilities get <A | ||||
| HREF="ftp://www.perl.com/pub/perl/CPAN/modules/by-module/Term/Term-ReadLine-Gnu-1.03.tar.gz">Term::ReadLine::Gnu</A> | ||||
| or alternatively <A | ||||
| HREF="ftp://www.perl.com/pub/perl/CPAN/modules/by-module/Term/Term-ReadLine-Perl-0.990 | ||||
| 6.tar.gz">Term::ReadLine::Perl</A> which depends on <A | ||||
| HREF="ftp://www.perl.com/pub/perl/CPAN/modules/by-module/Term/TermReadKey-2.12.tar.gz">Term::ReadKey</A> | ||||
| . <em>Term::ReadLine::Gnu</em> may be tricky to set-up on non Debian | ||||
| systems because it depends on <em>ncurses3.4</em> and the <em>GNU Readline | ||||
| Library version 2.1 or later</em>, but <em>Term::ReadLine::Perl</em> is | ||||
| much easier to set-up and allows a huge amount of package names to be | ||||
| present on the command line without a segmentation fault. You could get | ||||
| swim's ftp capabilities working first, and then just fetch the Debian | ||||
| ReadLine package(s) and then use swim's --extract option to set the | ||||
| package(s) up, but, it is sure fun doing a 'make test' when setting up the | ||||
| ReadLine modules! You can also find these modules at the <A | ||||
| HREF="http://www.perl.com">CPAN mirrors</A> or the PACKAGES below. <p> | ||||
| 
 | ||||
| <b>DATABASE CAPABILITIES</b>:  DB_File comes standard with Perl. But, | ||||
| this doesn't mean it is compiled for the newer Berkeley Database | ||||
| Libraries. DB 1.85 has | ||||
| known  <A | ||||
| HREF="http://www.sleepycat.com/historic.html">  | ||||
| bugs</A> which effect SWIM. SWIM can work with | ||||
| 1.85, but <kbd>--rebuildflatdb</kbd> and <kbd>--rebuildflatndb</kbd> will | ||||
| not work properly. You can run a test to find out whether or not you need | ||||
| to make the change if you have db_dump available on your system (which | ||||
| db_dump). Enter this:  | ||||
| 
 | ||||
| <P> | ||||
| <code>perl -e 'use DB_File; tie %testdb,'DB_File',"testdb";';<br> | ||||
| db_dump testdb</code> | ||||
| 
 | ||||
| <P>If 'db_dump testdb' produces an error you need to make the change by | ||||
| installing the newest DB_File.  If you have a version of libc6 less than  | ||||
| 2.1, first, install a new version ( 2.3.4  or greater) of the <A | ||||
| HREF="http://www.sleepycat.com">Berkeley DB</A> if you don't already | ||||
| have it installed.   If you get | ||||
| <A | ||||
| HREF="ftp://www.perl.com/pub/perl/CPAN/modules/by-module/DB_File/DB_File-1.65.tar.gz">  | ||||
|  DB_File</A> | ||||
| from CPAN you will need to edit   | ||||
| config.in to point to the location of where libdb2 installed db.h, where  | ||||
| libdb2 is installed on your system, and the name of the library.  For | ||||
| Debian this would be: | ||||
| 
 | ||||
| <P><code>INCLUDE = /usr/include/db2<br> | ||||
| LIB = /usr/lib<br> | ||||
| DBNAME = -ldb2</code> | ||||
| 
 | ||||
| <p><b>PACKAGES</b>: You can get the CPAN modules in some package formats.  | ||||
| Debian 2.1 and Red Hat 5.0 have been tested with these packages:  | ||||
| 
 | ||||
| <p> | ||||
| <u><em>Debian</em></u><br>  | ||||
| <A | ||||
| HREF="http://www.debian.org/Packages/unstable/base/libnet-perl.html">libnet-perl</A> | ||||
| and<br> | ||||
| <A | ||||
| HREF="http://www.debian.org/Packages/unstable/base/data-dumper.html">data-dumper</A> | ||||
| and<br> | ||||
| <A | ||||
| HREF="http://www.debian.org/Packages/unstable/interpreters/libterm-readline-gnu-perl.html">libterm-readline-gnu-perl</A> | ||||
|  (plus a lot more) or<br> | ||||
| <A | ||||
| HREF="http://www.debian.org/Packages/unstable/interpreters/libterm-readline-perl-perl.html">libterm-readline-perl-perl</A> | ||||
| and<br> | ||||
| <A | ||||
| HREF="http://www.debian.org/Packages/unstable/libs/libterm-readkey-perl.html">libterm-readkey-perl</A><br> | ||||
| <A HREF="http://www.debian.org/Packages/unstable/libs/libdb2.html">libdb2</A> | ||||
|  (dump_db utility is now part of libc6 2.1)<br> | ||||
| 
 | ||||
| <p> | ||||
| <u><em>Red Hat</em></u><br> | ||||
| <A | ||||
| HREF="http://filewatcher.org/filename-search/?q=perl-libnet">perl-libnet</A> | ||||
| and<br> | ||||
| <A | ||||
| HREF="http://filewatcher.org/filename-search/?q=perl-Data-Dumper">perl-Data-Dumper</A><br> | ||||
| <A HREF="http://filewatcher.org/description-search/?q=libdb">db-?</a> | ||||
| 
 | ||||
| <p> | ||||
| <b>USER</b>: root.  Some of swim's most important functions will not work | ||||
| properly unless you are running the program as root.  | ||||
| 
 | ||||
| <p><b>HARD DRIVE SPACE</b>: Make sure you have enough hard drive space. | ||||
| 1500 | ||||
| installed packages produces a 10MB fileindex.deb, and the virtual | ||||
| not-installed filesystem database for the unstable distribution is now | ||||
| over 40MB.  100MB of free space on your hard drive is probably a good | ||||
| safety margin, if you run out of hard drive space the program will just | ||||
| hang or quit. | ||||
| 
 | ||||
| <p> | ||||
| 
 | ||||
| <b>MEMORY</b>: Databases made for an installed Debian system require | ||||
| memory in proportion to the amount of packages actually installed; the | ||||
| <kbd>--lowmem</kbd> option is an excellent alternative for making the | ||||
| databases if the computer system is either overloaded or low on memory.  | ||||
| If you get "out of memory" warnings try to free up some memory first then | ||||
| make the databases.  You can also avoid making the virtual filesystem by | ||||
| not using the <kbd>--Contents</kbd> option or using the FDB argument for | ||||
| that option.  Updating the databases uses very little memory.  | ||||
| 
 | ||||
| <p> <b>OTHER SWIM FUNCTIONS</b>:  Most free operating systems have these | ||||
| packages installed:  On a non Debian system, <b>ar</b> from | ||||
| <em>binutils</em> is used to query Debian binary packages. These next | ||||
| packages are essential in a free operating system (Linux) - | ||||
| <em>textutils</em>, <em>fileutils</em>, <em>grep</em>, <em>tar</em>, | ||||
| <em>gzip</em>, and <em>mount</em>.  | ||||
| 
 | ||||
| <p> | ||||
| 
 | ||||
| </body>                                                                          | ||||
| </html> | ||||
							
								
								
									
										90
									
								
								REQUIREMENTS.text
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								REQUIREMENTS.text
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | ||||
| REQUIRMENTS:   | ||||
| 
 | ||||
| Don't get intimidated, this is just to cover all bases, most computer | ||||
| systems meet the requirements. | ||||
| 
 | ||||
| PERL:  Yes, preferably Perl 5.004.04 or greater.    | ||||
| 
 | ||||
| FTP CAPABILITIES: (optional) You may need to get Net::FTP (Debian | ||||
| libnet-perl package) which depends on Data::Dumper (Debian data-dumper | ||||
| package). Also check the CPAN mirrors or the PACKAGES below.  You also | ||||
| need gcc if you do not have a Debian system so that swim can figure out | ||||
| what architecture your machine is. You can also find these modules at the | ||||
| CPAN mirrors or the PACKAGES below.  | ||||
| 
 | ||||
| READLINE CAPABILITIES: (optional) For nice readline cpabilities get | ||||
| Term::ReadLine::Gnu or alternatively Term::ReadLine::Perl which depends on | ||||
| Term::ReadKey.  Term::ReadLine::Gnu may be tricky to set-up on non Debian | ||||
| systems because it depends on ncurses3.4 and the GNU Readline Library | ||||
| version 2.1 or later, but Term::ReadLine::Perl is much easier to set-up | ||||
| and allows a huge amount of package names to be present on the command | ||||
| line without a segmentation fault. You could get swim's ftp capabilities | ||||
| working first, and then just fetch the Debian ReadLine package(s) and then | ||||
| use swim's --extract option to set the package(s) up, but, it is sure fun | ||||
| doing a 'make test' when setting up the ReadLine modules! You can also | ||||
| find these modules at the CPAN mirrors or the PACKAGES below.  | ||||
| 
 | ||||
| DATABASE CAPABILITIES:  DB_File comes standard with Perl.  But, this | ||||
| doesn't mean it is compiled for the newer Berkeley Database Libraries. DB | ||||
| 1.85 has known bugs which effect SWIM.  SWIM can work with 1.85, but | ||||
| --rebuildflatdb and --rebuildflatndb will not work properly.  You can run | ||||
| a test to find out whether or not you need to make the change if you have | ||||
| db_dump available on your system (which db_dump). Enter this:  | ||||
| 
 | ||||
| perl -e 'use DB_File; tie %testdb,'DB_File',"testdb";'; | ||||
| db_dump testdb | ||||
| 
 | ||||
| If 'db_dump testdb' produces an error you need to make the change by | ||||
| installing the newest DB_File.  If you have a version of libc6 less than | ||||
| 2.1, first, install a new version (2.3.4 or greater) of the Berkeley DB if | ||||
| you don't already have it installed.  If you get DB_File from CPAN you | ||||
| will need to edit config.in to point to the location of where libdb2 | ||||
| installed db.h, where libdb2 is installed on your system, and the name of | ||||
| the library.  For Debian this would be:  | ||||
| 
 | ||||
| INCLUDE = /usr/include/db2 | ||||
| LIB = /usr/lib  | ||||
| DBNAME = -ldb2  | ||||
| 
 | ||||
| PACKAGES - You can get the CPAN modules in some package formats.  Debian | ||||
| 2.1 and Red Hat 5.0 have been tested with these packages:  | ||||
| 
 | ||||
| Debian - | ||||
| 
 | ||||
| libnet-perl and | ||||
| data-dumper and | ||||
| libterm-readline-gnu-perl (plus a lot more) or | ||||
| libterm-readline-perl-perl and | ||||
| libterm-readkey-perl | ||||
| libdb2     | ||||
|    | ||||
| Red Hat - | ||||
| 
 | ||||
| perl-libnet and | ||||
| perl-Data-Dumper | ||||
| db-? | ||||
| 
 | ||||
| USER: root.  Some of swim's most important functions will not work | ||||
| properly unless you are running the program as root.    | ||||
| 
 | ||||
| HARD DRIVE SPACE: Make sure you have enough hard drive space.  1500 | ||||
| installed packages produces a 10MB fileindex.deb, and the virtual | ||||
| not-installed filesystem database for the unstable distribution is now | ||||
| over 40MB.  100MB of free space on your hard drive is probably a good | ||||
| safety margin, if you run out of hard drive space the program will just | ||||
| hang or quit.  | ||||
| 
 | ||||
| MEMORY: Databases made for an installed Debian system require memory in | ||||
| proportion to the amount of packages actually installed; the --lowmem | ||||
| option is an excellent alternative for making the databases if the | ||||
| computer system is either overloaded or low on memory.  If you get "out of | ||||
| memory" warnings try to free up some memory first then make the databases.  | ||||
| You can also avoid making the virtual filesystem by not using the | ||||
| --Contents option or using the FDB argument for that option.  Updating the | ||||
| databases uses very little memory.  | ||||
| 
 | ||||
| OTHER SWIM FUNCTIONS:  Most free operating systems have these packages | ||||
| installed:  On a non Debian system, ar from binutils is used to query | ||||
| Debian binary packages. These next packages are essential in a free | ||||
| operating system (Linux) - textutils, fileutils, grep, tar, gzip, and | ||||
| mount.  | ||||
							
								
								
									
										34
									
								
								THEMES
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								THEMES
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| Swim's design gives it the ability to implement features which were once | ||||
| just fiction.   | ||||
| 
 | ||||
| Most people involved with WM (Window Managers) have heard of themes. | ||||
| Themes have become very popular.  You can design a real cool look for your | ||||
| WM and then pass it on to other people to recreate what you have.  But, | ||||
| who ever thought that themes could also apply to distributions?  The only | ||||
| requirement to develop a theme from the Debian distributions is to create | ||||
| a customized Packages database.  Apt can take it from there, by simply | ||||
| clearing the old cache, making a new cache from this Package, and | ||||
| installing everything.  This theme can even be installed along with an | ||||
| existing installation because apt will figure out what needs to be done. | ||||
| 
 | ||||
| Themes can easily be made using swim.  Here's a list of ideas. | ||||
| 
 | ||||
| * A module with the capability of taking the output from apt, and creating | ||||
| a database which would correlate to a successful installation without ever | ||||
| installing one package.  This would essentially be a not-installed | ||||
| database with one major difference, this database would represent the real | ||||
| state of a successful installation.  This would allow a developer to test | ||||
| a hypothetical installation, and look at it's structure.  Then a Packages | ||||
| file could be made from this database and tested on a real installation.  | ||||
| 
 | ||||
| Although this module doesn't exist, yet, it could easily be made with a | ||||
| special designated database interacting with the other functions offered | ||||
| by swim's existing modules. | ||||
| 
 | ||||
| * Swim already allows Packages files to be made from *debs placed in the | ||||
| DF - including creating a place for a personalized distribution (coming).  | ||||
| A person can make there own real personalized distribution in this | ||||
| manner, and then share their unique Packages file with the rest of the | ||||
| world, allowing other people to recreate the state of your own | ||||
| distribution on their machines. | ||||
| 
 | ||||
							
								
								
									
										126
									
								
								TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								TODO
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,126 @@ | ||||
| * Configuration for --dbpath, --root, --main, --contrib, --non-free, | ||||
|   --non-us, --arch, --dists could be automated so that a state could be | ||||
|   established on the command line, without needing to enter any of these | ||||
|   options again, untill a new state was desired, --default would  bring | ||||
|   everything back to the default directory /var/lib/dpkg. | ||||
| 
 | ||||
| * Non-root users could run all functions if permissions were changed, | ||||
|   probably this should be left up to the system administrator. | ||||
| 
 | ||||
| * Add --todo --bugs to -q. | ||||
| 
 | ||||
| * Looks like --source and --source_only is kind of deprecated now that apt_0.3.6 | ||||
|   is out, and there are Sources.gz in the appropriate places.  But, now | ||||
|   there exists three unique ways to get sources, debget which doesn't use | ||||
|   databases, apt which uses databases, and swim which combines the | ||||
|   approaches of both apt and debget, all three ways have their advantages.  | ||||
|   Swim isn't dependent on the existence of an up to date Sources.gz. | ||||
| 
 | ||||
| * --ftp automatically removes packages with changed upstream-revisions.. | ||||
|   perhaps move them to a storage location. | ||||
| 	 | ||||
| * base-files package has changed it's file/dir listing, eventually | ||||
|   SWIM::File can be modified in the future. | ||||
| 
 | ||||
| * SWIM::Apt needs to be modified so that when it reads the Packages names | ||||
|   in the default directory it will look at the basename to take into | ||||
|   account non-Debian distributions.  Non-Debian distributions should  | ||||
|   be presented separately when DF is used as an argument.  Probably a new | ||||
|   option will be added.  This adheres to the swim philosophy of allowing | ||||
|   independent distributions with the exact directory structure of a normal | ||||
|   Debian distribution to exist.   | ||||
| 
 | ||||
| * mention netselect to help people find the best mirror site, and maybe | ||||
|   automatically use netselect on swimz.list to find which sites are up, | ||||
|   and are best to use first, overridding the default sequential order! | ||||
| 
 | ||||
| * Yes, you can 'cp -a' and 'gzip -d' sources from swim to sources for | ||||
|   apt, then just do a swim --apt --check or vica versa. | ||||
| 
 | ||||
| * Make sure this doesn't happen for proposed-updates - "swim: | ||||
|   dists/proposed-updates/single/binary-i386/Release does not exist on the | ||||
|   server", and make a note of proposed-updates in the manual, no Contents. | ||||
|   Incoming can be grabbed by doing something like this, "deb url | ||||
|   debian/Incoming" vs experimental "deb url/debian project/experimental/". | ||||
|   Packages are available here, too, no Release or Contents.  swim is too | ||||
|   hardwired and this needs to be changed. | ||||
| 
 | ||||
| * For now, a trade-off will be made in respect to updating the n* virtual | ||||
|   filesystem, even if Contents hasn't been updated, the versions of C,CR | ||||
|   will still be updated with the old Contents, on the other hand if | ||||
|   nfile* was version-less this wouldn't be necessary, then the behavior | ||||
|   mentioned next could be implemented anyways. If Contents are ever | ||||
|   updated on a more consistent basis, this behavior will be changed to | ||||
|   wait for these packages untill the next Contents, but basically this | ||||
|   should be done anyways, it will mean, quick updates during the week, and | ||||
|   one long one when the new Contents becomes available, the lack of | ||||
|   versioning would make this viable.  Basically, a database will be kept | ||||
|   for .packagesdiff-arch-dist.deb, nfile* will remain versioned because | ||||
|   this means faster lookups. | ||||
| 
 | ||||
| * Implement the "on the fly" distribution creation system.  | ||||
| 
 | ||||
| * Add the DF virtual system which will allow --apt2df and --df2apt to | ||||
|   work. | ||||
| 
 | ||||
| * a search for everything found in -T | ||||
| 
 | ||||
| * -o DPkg::Options::=--purge once --remove isn't a standard option to dpkg | ||||
|  for "remove", and possible --admindir (like --dbpath) --root (like | ||||
|  --root) and --instdir (where packages should be installed). | ||||
| 
 | ||||
| * add --force-* at least for --purge and depends. | ||||
| 
 | ||||
| * an option which would show all packages relationships for a package | ||||
|   being --ftp or -xyrz on the --stdin line | ||||
| 
 | ||||
| * Complete menuindex() which allows a search of the debian menu system. | ||||
| 
 | ||||
| * add the pid (personal information database) editing, and data storage. | ||||
| 
 | ||||
| * Use the MD5 module from libmd5-perl for --md5sum? | ||||
| 
 | ||||
| * gnupg, pgp, and md5sum checking for source probably using dscverify from | ||||
|   package devscripts, this uses the MD5 module | ||||
| 
 | ||||
| * Need to add the capability to deal with weird non-standard Filename: .* | ||||
|   situations, both in retrieval, and archiving.  In situations like this, | ||||
|   the distribution may not be apparent, but the package could still be | ||||
|   found and placed in a special area, and a special database could store | ||||
|   the information.  This database could be transparent, and available for | ||||
|   quering regardless of the distribution default, or command line | ||||
|   specification. | ||||
| 
 | ||||
| * Add the --file and --http capabilities or at least the capability to | ||||
|   look at Packages from strange directories grabbed by apt using these | ||||
|   methods. Meanwhile, swim's ftp capabilities make slow modems happy, and | ||||
|   allow for precise downloading versus downloading every package related | ||||
|   to -T. | ||||
| 
 | ||||
| * Add a hash option so that swim can know that po -> unstable, this would  | ||||
|   work fine, because swim shows the Release version, but the author is | ||||
|   against implementing this ability. | ||||
| 
 | ||||
| * Instead of PWD!full_path, allow multiple filenames to be quoted without | ||||
|   pathnames for --extract. | ||||
| 
 | ||||
| * .., ../, ../../, ../../file-or-dir (not ../../file-or-dir/) ability for  | ||||
|   -qf|p works, but more complex ../ is not implemented, yet.  ../ will | ||||
|   also follow a symbolic link, this is a feature. | ||||
| 
 | ||||
| * --search by dirs when in place using -f. | ||||
| 
 | ||||
| * Add the retro full spectrum of dpkg options, it's nice sometimes to just | ||||
|   do a simple install. | ||||
| 
 | ||||
| * Gather together all the build children into a giant family including the | ||||
|   teacher and the checker. | ||||
| 
 | ||||
| * Do the Perl for Non Free OSes thing. | ||||
| 
 | ||||
| * Remove a large percentage of the bold and underlining from the | ||||
|   documentation. | ||||
| 
 | ||||
| * Make needed changes and improvements to the Manual - a constant TODO. | ||||
| 
 | ||||
| * swim faster and faster! | ||||
							
								
								
									
										167
									
								
								bin/fastswim
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										167
									
								
								bin/fastswim
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,167 @@ | ||||
| #!/usr/bin/perl -w | ||||
| #use diagnostics; | ||||
| require 5.004; | ||||
| use strict; | ||||
| 
 | ||||
| ################################################################################ | ||||
| #    Package administration and research tool for Debian                       # | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum                             # | ||||
| #                                                                              # | ||||
| #    This program is free software; you can redistribute it and/or modify      # | ||||
| #    it under the terms of the GNU General Public License as published by      # | ||||
| #    the Free Software Foundation; either version 2 of the License, or         # | ||||
| #    (at your option) any later version.                                       # | ||||
| #                                                                              # | ||||
| #    This program is distributed in the hope that it will be useful,           # | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of            # | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             # | ||||
| #    GNU General Public License for more details.                              # | ||||
| #                                                                              # | ||||
| #    You should have received a copy of the GNU General Public License         # | ||||
| #    along with this program; if not, write to the Free Software               # | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.# | ||||
| ################################################################################ | ||||
| 
 | ||||
| 
 | ||||
| # Because it is a better to write to disk, rather than trying to do | ||||
| # everthing in memory, and then it's good to close the process which | ||||
| # accomplished this.  I am sure there are better ways. | ||||
| 
 | ||||
| # Anyways if you want to test fastswim do something like this:                   | ||||
| # fastswim --transfer /var/lib/dpkg/info /tmp /var/lib/dpkg and create a         | ||||
| # transfer.deb file beforehand in /tmp which has the packagename_version         | ||||
| # one to a line.  | ||||
| 
 | ||||
| my @ppackage; | ||||
| my %repeaters; | ||||
| my $thingy; | ||||
| my $tingy; | ||||
| my $temp; | ||||
| my %HL; | ||||
| my @name; | ||||
| my %version; | ||||
| 
 | ||||
| #$| = 1; | ||||
| #$#name = 2000; | ||||
| #$#ppackage = 2000; | ||||
| 
 | ||||
|    # This way has been de-pre-c-whatever-ated because it lacks version  | ||||
|    # rememberance, and is just kept for testing purposes | ||||
|    if ($#ARGV == -1) { | ||||
|          print "swim: fastswim requires option/arguments, see program for instructions\n"; | ||||
|          exit; | ||||
|          chdir("$ARGV[1]");          | ||||
|          #consider readdir  | ||||
|          @ppackage = <*.list>; | ||||
|     } | ||||
|     # This does the work | ||||
|     elsif ($ARGV[0] eq "--transfer") { | ||||
|        open(TRANSFER, "$ARGV[2]/transfer.deb"); | ||||
|          while (<TRANSFER>) { | ||||
|            chomp $_; | ||||
|            if (defined $_) { | ||||
|              my @the = split(/_/, $_); | ||||
|              push(@ppackage, "$the[0].list"); | ||||
|              # remember the version. | ||||
|              chomp $the[1];  | ||||
|              $version{$the[0]} = $the[1]; | ||||
|            } | ||||
|          }         | ||||
|         close(TRANSFER); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|      # Make a nice md.  I decided on a Hash of Lists, giving all | ||||
|      # files/dirs unique name, and then a list of packages which | ||||
|      # correspond..because this should be faster than a Hash of Hash | ||||
|      # where you'd have to loop through all packages names..find the | ||||
|      # files/dir in all packages names which are the same..I'd assume a HL | ||||
|      # would be a quicker query, even though the Hash would be enormous.    | ||||
|      # Possible things: a tree for faster query. | ||||
| 
 | ||||
|      # Put everything into an array..every other is package name | ||||
|      # Better check for packages which don't have /. in their *.list... | ||||
|      # which is rare, but does happen.  Sometimes *.list(s) don't have | ||||
|      # all the parent directories, but we won't worry about that. | ||||
|      print "  Making the massive hash\n"; | ||||
|      $| = 1; my $x = 1; | ||||
|      foreach $thingy (sort @ppackage) { | ||||
|        open(LIST, "$ARGV[1]/$thingy") or die "Humm, strange"; | ||||
|         # Because of the version..there are sometimes dots | ||||
|         $thingy =~ m,(.*)\.list,; | ||||
|         my $count = 0; | ||||
|         my @count = <LIST>; | ||||
|         close(LIST); | ||||
|         foreach (@count) {          | ||||
|           $x = 1 if $x == 6; | ||||
|           print "|\r" if $x == 1 || $x == 4; print "/\r" if $x == 2; | ||||
|           print "-\r" if $x == 3 || $x == 6; print "\\\r" if $x == 5; | ||||
|           $x++;      | ||||
|           chomp $_; | ||||
|           # does /. exist?  it should be first. | ||||
|           if ($count == 0) { | ||||
|             if ($_ !~ m,\/\.,) { | ||||
|              my $shifter = $_; | ||||
|              my @redolist = @count; | ||||
|              push(@count,$shifter); | ||||
|              # humm let's rebuild the offending backup list, this | ||||
|              # is important for --db. | ||||
|              unshift(@redolist,"/.");  | ||||
|              open(REDOLIST, ">$ARGV[1]/backup/$thingy.bk.bk") | ||||
|              or warn "needed to edit $thingy because it lacked /., | ||||
|                       but could not open up a backup file\n"; | ||||
|                my $rd; | ||||
|                foreach $rd (@redolist) { | ||||
|                  chomp $rd; | ||||
|                  print REDOLIST "$rd\n"; | ||||
|                } | ||||
|              close(REDOLIST); | ||||
|              rename | ||||
|              ("$ARGV[1]/backup/$thingy.bk.bk","$ARGV[1]/backup/$thingy.bk"); | ||||
|              $_ =  "/.";              | ||||
|             } | ||||
|           } | ||||
|            $count = 1; | ||||
|            $repeaters{$_}++; | ||||
|              if ($repeaters{$_} == 1) {   | ||||
|                $temp = 0; | ||||
|              } | ||||
|              else { | ||||
|                $temp = $repeaters{$_} - 1; | ||||
|              }               | ||||
|              if (defined $version{$1}) { | ||||
|               $HL{$_}[$temp] = "$1_$version{$1}"; | ||||
|              } | ||||
|         }  | ||||
|      } | ||||
|      undef @ppackage; | ||||
|      | ||||
|       # We will create one file with the 1..and another with >1.. | ||||
|       # than split..reverse..and order.accordingly..this makes | ||||
|       # things much faster.  Remember clean-up routines for kill. | ||||
|       print "  Starting ... writing to $ARGV[2]!\n"; | ||||
|       # Create the database  | ||||
|       open(BIG, ">$ARGV[2]/big.debian") or die; | ||||
|       open(LONG, ">$ARGV[2]/long.debian") or die; | ||||
|       foreach $thingy (sort keys %HL ) { | ||||
|           $x = 1 if $x == 6; | ||||
|           print "|\r" if $x == 1 || $x == 4; print "/\r" if $x == 2; | ||||
|           print "-\r" if $x == 3 || $x == 6; print "\\\r" if $x == 5; | ||||
|           $x++; | ||||
|            # Humm, will split or grep be faster? | ||||
|             #my $tingy  = "@{ $HL{$thingy} }" . " " .  @{ $HL{$thingy} }; | ||||
|             my $tingy  = "@{ $HL{$thingy} }"; | ||||
|            if (@{ $HL{$thingy} } > 1 || @{ $HL{$thingy} } eq "") {     | ||||
|              print LONG "$thingy -> $tingy\n"; | ||||
|            }  | ||||
|            elsif (@{ $HL{$thingy} } == 1) { | ||||
|               print BIG "$thingy -> $tingy\n"; | ||||
|            } | ||||
|          } | ||||
|         #print "Finished\n"; | ||||
|         close(BIG); | ||||
|         close(LONG); | ||||
|         #undef %HL; | ||||
|         print "  Cleaning up\n";  | ||||
| 
 | ||||
| __END__ | ||||
							
								
								
									
										99
									
								
								bin/imswim
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										99
									
								
								bin/imswim
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,99 @@ | ||||
| #!/usr/bin/perl -w | ||||
| #use diagnostics; | ||||
| require 5.004; | ||||
| use strict; | ||||
| 
 | ||||
| ################################################################################ | ||||
| #    Package administration and research tool for Debian                       # | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum                             # | ||||
| #                                                                              # | ||||
| #    This program is free software; you can redistribute it and/or modify      # | ||||
| #    it under the terms of the GNU General Public License as published by      # | ||||
| #    the Free Software Foundation; either version 2 of the License, or         # | ||||
| #    (at your option) any later version.                                       # | ||||
| #                                                                              # | ||||
| #    This program is distributed in the hope that it will be useful,           # | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of            # | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             # | ||||
| #    GNU General Public License for more details.                              # | ||||
| #                                                                              # | ||||
| #    You should have received a copy of the GNU General Public License         # | ||||
| #    along with this program; if not, write to the Free Software               # | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.# | ||||
| ################################################################################ | ||||
| 
 | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| This allows computers with a small amount of memory or overloaded system | ||||
| to succeed in making the databases for SWIM::DB_Init.  Instead of using | ||||
| transfer.deb to grab everything into memory and then creating the | ||||
| long.debian and big.debian files right out of memory for processing by | ||||
| SWIM::MD, it works like longswim by creating one large file to the disk | ||||
| (this can use lots of memory, but can swap easily)  then it uses slowswim | ||||
| to create long.debian and big.debian using a minimal memory method, then | ||||
| it finishes using SWIM::MD.  | ||||
| 
 | ||||
| To test supply these arguments - info dir, temporary dir "imswim | ||||
| /var/lib/dpkg/info /tmp" and create a transfer.deb file | ||||
| beforehand in the temporary dir which has the packagename_version one to a | ||||
| line.  | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| 
 | ||||
|    if ($#ARGV == -1) {                                                           | ||||
|      print "swim: imswim requires arguments, see program for instructions\n";                                                                       | ||||
|          exit;                                                                   | ||||
|    }                                                                            | ||||
|    else { | ||||
|      $| = 1; my $x = 1; | ||||
|      open(FILEDIR, ">$ARGV[1]/filedir.deb")  | ||||
|      or warn "could not create filedir.deb\n"; | ||||
|      open(TRANSFER, "$ARGV[1]/transfer.deb") or warn "needs transfer.deb";  | ||||
|       while (<TRANSFER>) { | ||||
|        chomp; | ||||
|        my @the = split(/_/, $_); | ||||
|        open (LIST, "$ARGV[0]/$the[0].list")  | ||||
|        or warn "could not file *list"; | ||||
|         chomp; | ||||
|         # better check if /. is missing in any of the *list | ||||
|         my $count = 0;                                                           | ||||
|         my @count = <LIST>;   | ||||
|         close(LIST);                                                             | ||||
|         foreach (@count) {                                                       | ||||
|           $x = 1 if $x == 6; | ||||
|           print "|\r" if $x == 1 || $x == 4; print "/\r" if $x == 2; | ||||
|           print "-\r" if $x == 3 || $x == 6; print "\\\r" if $x == 5; | ||||
|           $x++; | ||||
|           chomp $_;                                                              | ||||
|           # does /. exist?  it should be first.                                  | ||||
|           if ($count == 0) {                                                     | ||||
|             if ($_ !~ m,\/\.,) {                                                 | ||||
|              my $shifter = $_;                                                   | ||||
|              my @redolist = @count;                                              | ||||
|              push(@count,$shifter);                                              | ||||
|              # humm let's rebuild the offending backup list, this                | ||||
|              # is important for --db.                                            | ||||
|              unshift(@redolist,"/.");                                            | ||||
|              open(REDOLIST, ">$ARGV[0]/backup/$the[0].list.bk.bk")         | ||||
|              or warn "needed to edit $the[0].list because it lacked /.,               | ||||
|                       but could not open up a backup file\n";                    | ||||
|                my $rd;                                                           | ||||
|                foreach $rd (@redolist) {                                         | ||||
|                  chomp $rd;                                                      | ||||
|                  print REDOLIST "$rd\n";                                         | ||||
|                }                                                                 | ||||
|              close(REDOLIST);                                                    | ||||
|              rename("$ARGV[0]/backup/$the[0].list.bk.bk", | ||||
|                     "$ARGV[0]/backup/$the[0].list.bk");     | ||||
|              $_ =  "/.";                                                         | ||||
|             }                                                                    | ||||
|           }                                                                      | ||||
|          $count = 1;       | ||||
|          print FILEDIR "$_ -> $the[0]_$the[1]\n"; | ||||
|         } # foreach @count | ||||
|       } # while TRANSFER | ||||
|      close(TRANSFER); | ||||
|      close(FILEDIR);  | ||||
|   } # else | ||||
							
								
								
									
										591
									
								
								bin/longswim
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										591
									
								
								bin/longswim
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,591 @@ | ||||
| #!/usr/bin/perl -w | ||||
| 
 | ||||
| #use diagnostics; | ||||
| use strict; | ||||
| use DB_File; | ||||
| 
 | ||||
| ################################################################################ | ||||
| #    Package administration and research tool for Debian                       # | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum                             # | ||||
| #                                                                              # | ||||
| #    This program is free software; you can redistribute it and/or modify      # | ||||
| #    it under the terms of the GNU General Public License as published by      # | ||||
| #    the Free Software Foundation; either version 2 of the License, or         # | ||||
| #    (at your option) any later version.                                       # | ||||
| #                                                                              # | ||||
| #    This program is distributed in the hope that it will be useful,           # | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of            # | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             # | ||||
| #    GNU General Public License for more details.                              # | ||||
| #                                                                              # | ||||
| #    You should have received a copy of the GNU General Public License         # | ||||
| #    along with this program; if not, write to the Free Software               # | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.# | ||||
| ################################################################################ | ||||
| 
 | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| This program creates the file filedir.deb using choice() and | ||||
| comma_choice()  (which both use timing() in case Contents is newer than | ||||
| Packages). It establishes the file based on --main, --contrib, --non-free, | ||||
| --non-us or the default.  This program is quite time consuming and uses | ||||
| more and more memory as it runs.  Afterwared, the output can be processed | ||||
| by fastswim (high memory approach) or slowswim (low memory approach), | ||||
| whether either is faster is still subject to experimentation.  swim packs | ||||
| everything into the databases.  It also produces the report | ||||
| .contentsdiff-arch-dists.deb which shows which packages exist in Contents | ||||
| which don't exist in Packages.  | ||||
| 
 | ||||
| This program takes a large amount of arguments.  Look at nmd() in | ||||
| SWIM::NDB_Init. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| 
 | ||||
|  if ($#ARGV == -1) { | ||||
|   print "swim: longswim requires many arguments, see program for instructions\n"; | ||||
|   exit; | ||||
|  } | ||||
| 
 | ||||
| my $Contents; | ||||
| my $contentsindex; | ||||
| my ($main,$contrib,$non_free,$non_us); | ||||
| my $tmp; | ||||
| my (%watch,%ndb); | ||||
| my $npackages; | ||||
| my $gzip; | ||||
| my $place; | ||||
| 
 | ||||
| # process @ARGV | ||||
| $Contents = $ARGV[0]; $contentsindex = $ARGV[1]; | ||||
| $main = $ARGV[2]; $contrib = $ARGV[3];  | ||||
| $non_free = $ARGV[4]; $non_us = $ARGV[5]; | ||||
| $tmp = $ARGV[6]; | ||||
| $npackages = $ARGV[7]; | ||||
| $gzip = $ARGV[8]; | ||||
| $place = $ARGV[9]; | ||||
| my $Contents_mtime = $ARGV[10]; | ||||
| 
 | ||||
| # tie it once not a quarter million times | ||||
| tie %ndb, 'DB_File', "$npackages" or die "DB_File: $!"; | ||||
| 
 | ||||
| # Let's find the arch and dists | ||||
| my @archdist = split(m,/,,$contentsindex); | ||||
| my($arch,$dist) = (split(m,-,,$archdist[$#archdist]))[1,2];  | ||||
| $dist =~ s,\.deb,,; | ||||
| 
 | ||||
| unlink("$place/.contentsdiff-$arch-$dist.deb")  | ||||
|  if -e "$place/.contentsdiff-$arch-$dist.deb"; | ||||
| 
 | ||||
| nmd(); | ||||
| 
 | ||||
| # main processing program | ||||
| sub nmd { | ||||
| 
 | ||||
|   my %again; | ||||
|   my %all; | ||||
| 
 | ||||
|     $| = 1; my $x = 1; | ||||
|     open(CONTENTS, "$Contents") or die "where is it?\n"; | ||||
|     open(FILEDIR,">$tmp/filedir.deb"); | ||||
|     open(CONTENTSDB,">$contentsindex"); | ||||
|     while (<CONTENTS>) { | ||||
|       print CONTENTSDB $_; | ||||
|       if (/^FILE\s*LOCATION$/) { | ||||
|          while (<CONTENTS>) { | ||||
|              s,^(\./)+,,;  # filter for Debians altered dir structure  | ||||
|              print CONTENTSDB $_; | ||||
|           $x = 1 if $x == 6; | ||||
|           print "|\r" if $x == 1 || $x == 4; print "/\r" if $x == 2; | ||||
|           print "-\r" if $x == 3 || $x == 6; print "\\\r" if $x == 5; | ||||
|           $x++;              | ||||
|              chomp $_; | ||||
|              # find all directories | ||||
|               # split is the way to go.  | ||||
|               # If it ends with / its a directory | ||||
|               my($dirfile,$package,@packs,@dirfile,@package,@comma); | ||||
| 
 | ||||
| 
 | ||||
|               ###################### | ||||
|               #    ENDS WITH /     # | ||||
|               ###################### | ||||
|               if (m,.*/\s+\w*,) { | ||||
|                 ($dirfile,$package) = split(/\s+/,$_,2); | ||||
|                 if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|                  my @more_things = split(/\s+/,$package); | ||||
|                  $package = $more_things[$#more_things]; | ||||
|                  (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|                  my @dirfile = split(/\s+$backpackage/,$_); | ||||
|                  $dirfile = $dirfile[0]; | ||||
|                 } | ||||
|                 @dirfile = split(/\//,$dirfile); $dirfile =~ s,/$,,; | ||||
|                 @comma = split(/,/,$package); | ||||
| 
 | ||||
|                 ################# | ||||
|                 # HAS A COMMA   # | ||||
|                 #################  | ||||
|                 if (scalar(@comma) >= 2) { | ||||
|                 # humm many packages share this file/dir | ||||
|                   my @choice_package; | ||||
|                     ########## | ||||
|                     ## MAIN ## | ||||
|                     ########## | ||||
|                     if ($main eq "yes") { | ||||
|                        foreach (@comma) { | ||||
|                         if (defined $_) {  | ||||
|                          if ($_ !~ m,^non-free/|^contrib/|^non-us/,) { | ||||
|                            push(@choice_package,$_);                       | ||||
|                          } | ||||
|                         } | ||||
|                        }     | ||||
|                        @packs = comma_choice(@choice_package);                                            | ||||
|                     }   # choice in main | ||||
|                     ############  | ||||
|                     ##NON-FREE## | ||||
|                     ############ | ||||
|                     if ($non_free eq "yes") { | ||||
|                       foreach (@comma) { | ||||
|                         if (m,^non-free/,) { | ||||
|                           push(@choice_package,$_);                       | ||||
|                         } | ||||
|                       } | ||||
|                       @packs = comma_choice(@choice_package); | ||||
|                     }  # choice non-free | ||||
|                     ########### | ||||
|                     ##CONTRIB## | ||||
|                     ########### | ||||
|                     if ($contrib eq "yes") { | ||||
|                       foreach (@comma) { | ||||
|                         if (m,^contrib/,) { | ||||
|                           push(@choice_package,$_);                       | ||||
|                         } | ||||
|                       } | ||||
|                       @packs = comma_choice(@choice_package); | ||||
|                     } # choice contrib | ||||
|                     ######### | ||||
|                     #NON-US## | ||||
|                     ######### | ||||
|                     if ($non_us eq "yes") { | ||||
|                       foreach (@comma) { | ||||
|                         if (m,^non-us/,) { | ||||
|                            push(@choice_package,$_);                       | ||||
|                         } | ||||
|                       } | ||||
|                       @packs = comma_choice(@choice_package); | ||||
|                     }  # choice non-us | ||||
| 
 | ||||
|                 } # scalar @comma >= 2 | ||||
| 
 | ||||
|                 # When only one package exists for dir | ||||
|                 #############                   | ||||
|                 ############## | ||||
|                 # NO COMMA   # | ||||
|                 ############## | ||||
|                 elsif (scalar(@comma) == 1) { | ||||
|                     my $choice_package; | ||||
|                     ########## | ||||
|                     ## MAIN ## | ||||
|                     ########## | ||||
|                     if ($main eq "yes") { | ||||
|                        # only one package found related to choice section | ||||
|                         if (defined $package) {  | ||||
|                          if ($package !~ m,^non-free/|^contrib/|^non-us/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
|                     ############  | ||||
|                     ##NON-FREE## | ||||
|                     ############ | ||||
|                     if ($non_free eq "yes") { | ||||
|                         if (defined $package) {  | ||||
|                          if ($package =~ m,^non-free/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
|                     ########### | ||||
|                     ##CONTRIB## | ||||
|                     ########### | ||||
|                     if ($contrib eq "yes") { | ||||
|                         if (defined $package) {  | ||||
|                          if ($package =~ m,^contrib/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
|                     ######### | ||||
|                     #NON-US## | ||||
|                     ######### | ||||
|                     if ($non_us eq "yes") { | ||||
|                         if (defined $package) {  | ||||
|                          if ($package =~ m,^non-us/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
| 
 | ||||
|                 } # @comma = 1 | ||||
| 
 | ||||
|                ################# | ||||
|                # WRITE TO FILE # | ||||
|                ################# | ||||
|               foreach $package (@packs) { | ||||
|                my ($count,$holder); | ||||
|                for ($count = 0; $count <= $#dirfile; $count++) { | ||||
|                     if ($count == 0) { | ||||
|                       $holder = "/$dirfile[$count]"; | ||||
|                       my $again = "$dirfile[$count] -> $package";  | ||||
|                       my $all = "/. -> $package";  | ||||
|                       $again{$again}++; | ||||
|                       $all{$all}++; | ||||
|                       if ($all{$all} == 1) { | ||||
|                        print FILEDIR "/. -> $package\n"; | ||||
|                        ##repeaters("/.",$package); | ||||
|                       } | ||||
|                       if ($again{$again} == 1) { | ||||
|                        print FILEDIR "/$dirfile[$count] -> $package\n";  | ||||
|                        ##repeaters("/$dirfile[$count]",$package); | ||||
|                       } | ||||
|                     } | ||||
|                     else { | ||||
|                       $holder =  $holder . "/$dirfile[$count]"; | ||||
|                       #print "$holder -> $package\n"; | ||||
|                       #repeaters($holder,$package); | ||||
|                       my $again = "$holder -> $package";  | ||||
|                       $again{$again}++; | ||||
|                       if ($again{$again} == 1) { | ||||
|                        print FILEDIR "$holder -> $package\n"; | ||||
|                        ##repeaters($holder,$package); | ||||
|                       } | ||||
|                     } | ||||
|                } # end for | ||||
|               } | ||||
|               } # does end with / | ||||
| 
 | ||||
|               ###################### | ||||
|               # DOESN'T END WITH / # | ||||
|               ###################### | ||||
|               # find all files and directories | ||||
|               else { | ||||
|               ($dirfile,$package) = split(/\s+/,$_,2); | ||||
|                 if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|                  my @more_things = split(/\s+/,$package); | ||||
|                  $package = $more_things[$#more_things]; | ||||
|                  (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|                  # watch this | ||||
|                  my @dirfile = split(/\s+$backpackage/,$_); | ||||
|                  $dirfile = $dirfile[0]; | ||||
|                 } | ||||
|                 @dirfile = split(/\//,$dirfile); | ||||
|                 @comma = split(/,/,$package); | ||||
| 
 | ||||
|                 ################# | ||||
|                 # HAS A COMMA   # | ||||
|                 #################  | ||||
|                 if (scalar(@comma) >= 2) { | ||||
|                 # humm many packages share this file/dir | ||||
|                   my @choice_package; | ||||
|                     ########## | ||||
|                     ## MAIN ## | ||||
|                     ########## | ||||
|                     if ($main eq "yes") { | ||||
|                        foreach (@comma) { | ||||
|                         if (defined $_) {  | ||||
|                          if ($_ !~ m,^non-free/|^contrib/|^non-us/,) { | ||||
|                            push(@choice_package,$_);                       | ||||
|                          } | ||||
|                         } | ||||
|                        }     | ||||
|                         @packs = comma_choice(@choice_package);                                            | ||||
|                     }   # choice in main | ||||
|                     ############  | ||||
|                     ##NON-FREE## | ||||
|                     ############ | ||||
|                     if ($non_free eq "yes") { | ||||
|                       foreach (@comma) { | ||||
|                         if (m,^non-free/,) { | ||||
|                           push(@choice_package,$_);                       | ||||
|                         } | ||||
|                       } | ||||
|                       @packs = comma_choice(@choice_package); | ||||
|                     }  # choice non-free | ||||
|                     ########### | ||||
|                     ##CONTRIB## | ||||
|                     ########### | ||||
|                     if ($contrib eq "yes") { | ||||
|                       foreach (@comma) { | ||||
|                         if (m,^contrib/,) { | ||||
|                           push(@choice_package,$_);                       | ||||
|                         } | ||||
|                       } | ||||
|                       @packs = comma_choice(@choice_package); | ||||
|                     } # choice contrib | ||||
|                     ######### | ||||
|                     #NON-US## | ||||
|                     ######### | ||||
|                     if ($non_us eq "yes") { | ||||
|                       foreach (@comma) { | ||||
|                         if (m,^non-us/,) { | ||||
|                            push(@choice_package,$_);                       | ||||
|                         } | ||||
|                       } | ||||
|                       @packs = comma_choice(@choice_package); | ||||
|                     }  # choice non-us | ||||
| 
 | ||||
|                 } # scalar @comma == 2 | ||||
| 
 | ||||
|                 # When only one package exists for file | ||||
|                 #############                   | ||||
|                 ############## | ||||
|                 # NO COMMA   # | ||||
|                 ############## | ||||
|                 elsif (scalar(@comma) == 1) { | ||||
|                     my $choice_package; | ||||
|                     ########## | ||||
|                     ## MAIN ## | ||||
|                     ########## | ||||
|                     if ($main eq "yes") {              | ||||
|                        # only one package found related to choice section | ||||
|                         if (defined $package) {  | ||||
|                          if ($package !~ m,^non-free/|^contrib/|^non-us/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
|                     ############  | ||||
|                     ##NON-FREE## | ||||
|                     ############ | ||||
|                     if ($non_free eq "yes") { | ||||
|                         if (defined $package) {  | ||||
|                          if ($package =~ m,^non-free/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
|                     ########### | ||||
|                     ##CONTRIB## | ||||
|                     ########### | ||||
|                     if ($contrib eq "yes") { | ||||
|                         if (defined $package) {  | ||||
|                          if ($package =~ m,^contrib/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
|                     ######### | ||||
|                     #NON-US## | ||||
|                     ######### | ||||
|                     if ($non_us eq "yes") { | ||||
|                         if (defined $package) {  | ||||
|                          if ($package =~ m,^non-us/,) { | ||||
|                            $choice_package = $package;                       | ||||
|                            @package = split(/\//,$choice_package); | ||||
|                          } | ||||
|                         } | ||||
|                         @packs = choice(@package); | ||||
|                     } # end choice main | ||||
| 
 | ||||
| 
 | ||||
|                 } # @comma = 1 | ||||
| 
 | ||||
|               ################# | ||||
|               # WRITE TO FILE # | ||||
|               ################# | ||||
|               foreach $package (@packs) { | ||||
|                my ($count,$holder); | ||||
|                for ($count = 0; $count <= $#dirfile; $count++) { | ||||
|                     if ($count == 0) { | ||||
|                       $holder = "/$dirfile[$count]"; | ||||
|                       my $again = "$dirfile[$count] -> $package";  | ||||
|                       my $all = "/. -> $package";  | ||||
|                       $again{$again}++; | ||||
|                       $all{$all}++; | ||||
|                       if ($all{$all} == 1) { | ||||
|                        print FILEDIR "/. -> $package\n"; | ||||
|                       } | ||||
|                       if ($again{$again} == 1) { | ||||
|                        print FILEDIR "/$dirfile[$count] -> $package\n"; | ||||
|                       } | ||||
|                     } | ||||
|                     # Here's where things really start to turn ugly. | ||||
|                     else { | ||||
|                       $holder =  $holder . "/$dirfile[$count]"; | ||||
|                       my $again = "$holder -> $package";  | ||||
|                       $again{$again}++; | ||||
|                      if ($again{$again} == 1) { | ||||
|                        print FILEDIR "$holder -> $package\n"; | ||||
|                       } | ||||
|                     } | ||||
|                } # end for | ||||
|               } # @packs - more than one package for this file | ||||
|               } # end else not dir | ||||
|           } | ||||
|         } | ||||
|     } | ||||
|     close(FILEDIR); | ||||
|     close(CONTENTS); | ||||
| 
 | ||||
|     print "Compress contents\n"; | ||||
|     system "$gzip", "-9", "$contentsindex"; | ||||
|     utime(time,$Contents_mtime,$contentsindex);  | ||||
|     print "Cleaning up\n"; | ||||
|     # this will add a newline, but better to do a Ctrl-C than to have the | ||||
|     # process hang and respawn itself - something which sometimes happens | ||||
|     kill INT => $$; | ||||
|     print "swim: please press Ctrl-c\n"; # just in case :) | ||||
| 
 | ||||
|     # probably don't need to do this ends the program  | ||||
|     #undef %all; | ||||
|     #undef %again; | ||||
| 
 | ||||
| } # end sub nmd | ||||
| 
 | ||||
| # this finds the package or none which equal choice section when a | ||||
| # file/dir is found with one package | ||||
| sub choice { | ||||
| 
 | ||||
|    my (@package) = @_; | ||||
|    my @packs; | ||||
|                         if ($#package == 1) { | ||||
|                           my $what = timing($package[1]);  | ||||
|                           if (defined $what) { | ||||
|                            #$package[1] = version($package[1]); | ||||
|                            @packs = $what; | ||||
|                           } | ||||
|                         } | ||||
|                         elsif ($#package == 2) { | ||||
|                           my $what = timing($package[2]);  | ||||
|                           if (defined $what) {                           | ||||
|                            #$package[2] = version($package[2]); | ||||
|                            @packs = $what; | ||||
|                           } | ||||
|                         }  | ||||
| 
 | ||||
|                 return @packs; | ||||
| 
 | ||||
| } # end sub choice | ||||
| 
 | ||||
| 
 | ||||
| # this finds the package(s) or none which equal choice section when a | ||||
| # file/dir is found with more than one package | ||||
| sub comma_choice { | ||||
| 
 | ||||
|    my (@choice_package) = @_; | ||||
|    my (@package,@packs); | ||||
| 
 | ||||
|                       if (@choice_package) { | ||||
|                        if ($#choice_package == 0) { | ||||
|                           @package = split(/\//,$choice_package[0]); | ||||
|                           if ($#package == 1) { | ||||
|                              my $what = timing($package[1]);  | ||||
|                              if (defined $what) { | ||||
|                               #$package[1] = version($package[1]); | ||||
|                               push(@packs,$what); | ||||
|                              } | ||||
|                            } | ||||
|                            elsif ($#package == 2) { | ||||
|                              my $what = timing($package[2]);  | ||||
|                              if (defined $what) { | ||||
|                               #$package[2] = version($package[2]); | ||||
|                               push(@packs,$what); | ||||
|                              } | ||||
|                            }   | ||||
|                        } | ||||
|                        elsif ($#choice_package > 0) { | ||||
|                         # Basically, we will keep all conflicting dirs/files | ||||
|                         # because often they are related | ||||
|                         foreach (@choice_package) {    | ||||
|                           @package = split(/\//,$_); | ||||
|                           if ($#package == 1) { | ||||
|                              my $what = timing($package[1]);                         | ||||
|                              if (defined $what) { | ||||
|                               push(@packs,$what); | ||||
|                              } | ||||
|                            } | ||||
|                            elsif ($#package == 2) { | ||||
|                              my $what = timing($package[2]);    | ||||
|                              if (defined $what) { | ||||
|                               push(@packs,$what); | ||||
|                              } | ||||
|                            }   | ||||
|                         }                      | ||||
|                        } # else more than 1 for choice | ||||
|                       } # defined choice | ||||
|                       return @packs; | ||||
| 
 | ||||
| } # end sub comma_choice | ||||
| 
 | ||||
| 
 | ||||
| # this sub produces a report file..in case Packages is older than Contents | ||||
| # there will be other reports, ofcourse, like if Packages is newer than | ||||
| # Contents.  Uses version(); | ||||
| sub timing { | ||||
| 
 | ||||
|   my ($lookup) = @_; | ||||
| 
 | ||||
|       my $afterlookup = nversion($lookup); | ||||
|        if ($afterlookup eq 1) { | ||||
|          $watch{$lookup}++; | ||||
|          if ($watch{$lookup} == 1) { | ||||
|           open(REPORT,">>$place/.contentsdiff-$arch-$dist.deb")  | ||||
|            or die "can't create a file\n"; | ||||
|             print REPORT "Found in Contents, not in Packages:  $lookup\n"; | ||||
|           close(REPORT); | ||||
|          }  | ||||
|        return; | ||||
|        } | ||||
|        else { | ||||
|          return $afterlookup; | ||||
|        } | ||||
| 
 | ||||
| } # end my timing | ||||
| 
 | ||||
| # checks npackage.deb to find version for package found in Contents | ||||
| sub nversion { | ||||
|           | ||||
|   my ($argument) = @_; | ||||
|   #ndb();         | ||||
|             | ||||
|   if (defined $argument) { | ||||
|      # We will check for more than two..just in case | ||||
|      if ($argument !~ /_/) { | ||||
|        if (defined $ndb{$argument}) { | ||||
|          $argument = $ndb{$argument}; | ||||
|          return $argument; | ||||
|        } | ||||
|        # fixed the space packages | ||||
|        else { | ||||
|          return 1; | ||||
|        } | ||||
|      } | ||||
|   } | ||||
|   #untie %ndb; | ||||
| 
 | ||||
| } # end sub nversion | ||||
| 
 | ||||
| sub ndb { | ||||
|      #tie %ndb, 'DB_File', "$npackages" or die "DB_File: $!"; | ||||
| } # end sub ndb | ||||
							
								
								
									
										131
									
								
								bin/slowswim
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										131
									
								
								bin/slowswim
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,131 @@ | ||||
| #!/usr/bin/perl -w | ||||
| 
 | ||||
| #use diagnostics; | ||||
| use strict; | ||||
| 
 | ||||
| ################################################################################ | ||||
| #    Package administration and research tool for Debian                       # | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum                             # | ||||
| #                                                                              # | ||||
| #    This program is free software; you can redistribute it and/or modify      # | ||||
| #    it under the terms of the GNU General Public License as published by      # | ||||
| #    the Free Software Foundation; either version 2 of the License, or         # | ||||
| #    (at your option) any later version.                                       # | ||||
| #                                                                              # | ||||
| #    This program is distributed in the hope that it will be useful,           # | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of            # | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             # | ||||
| #    GNU General Public License for more details.                              # | ||||
| #                                                                              # | ||||
| #    You should have received a copy of the GNU General Public License         # | ||||
| #    along with this program; if not, write to the Free Software               # | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.# | ||||
| ################################################################################ | ||||
| 
 | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| This program only takes two argument, a temp directory and the name of the | ||||
| binary sort..sort.  You can test a filedir.deb file.  | ||||
| 
 | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
|  if ($#ARGV == -1) { | ||||
|   print "swim: slowswim requires arguments, see program for instructions\n"; | ||||
|   exit; | ||||
|  } | ||||
| 
 | ||||
| my $tmp = $ARGV[0]; | ||||
| my $sort = $ARGV[1]; | ||||
| 
 | ||||
| pre_md(); | ||||
| 
 | ||||
| # This is nmd()'s version of fastswim..also a lowmem method, after making | ||||
| # long.debian and big.debian, process_md() finishes the job. | ||||
| sub pre_md { | ||||
| 
 | ||||
|   my %HL; | ||||
|   my $temp; | ||||
|   my %repeaters; | ||||
|   my $fcount = 0; | ||||
|   my @tempholder; | ||||
| 
 | ||||
|   print "Sorting everything\n"; | ||||
|   system ("$sort $tmp/filedir.deb > $tmp/sortfiledir.deb"); | ||||
|   unlink("$tmp/filedir.deb"); | ||||
| 
 | ||||
|     # grab the keys from the sorted file | ||||
|      print "Making the massive hash using lowmem\n"; | ||||
|      $| = 1; my $x = 1; | ||||
|      open(FILEDIR, "$tmp/sortfiledir.deb") or die "where is sortfiledir.deb?\n"; | ||||
|          while (<FILEDIR>) { | ||||
|           $x = 1 if $x == 6; | ||||
|           print "|\r" if $x == 1 || $x == 4; print "/\r" if $x == 2; | ||||
|           print "-\r" if $x == 3 || $x == 6; print "\\\r" if $x == 5; | ||||
|           $x++; | ||||
|              my ($place, $packname) = split(/ -> /,$_,2); | ||||
|              push(@tempholder,"$place -> $packname"); | ||||
|               if ($fcount != 0) { | ||||
|               my($tplace,$tpackname) = split(/ -> /,$tempholder[$fcount - 1],2); | ||||
|               chomp $tpackname; | ||||
|                 # As long as they aren't different add to HL because they | ||||
|                 # belong to a group. | ||||
|                 if ($tplace eq $place) { | ||||
|                     #print "$tplace and $place\n"; | ||||
|                     $repeaters{$tplace}++; | ||||
|                     if ($repeaters{$tplace} == 1) {   | ||||
|                        $temp = 0; | ||||
|                     } | ||||
|                     else { | ||||
|                       $temp = $repeaters{$tplace} - 1; | ||||
|                     }               | ||||
|                     $HL{$tplace}[$temp] = $tpackname; | ||||
|                 }  | ||||
|                 # they new guy is different, but the old guy belongs to the | ||||
|                 # previous group or not, so finish adding to %HL and then | ||||
|                 # print out, and undef %HL | ||||
|                 else { | ||||
|                    #print "I AM DIFF $tplace\n"; | ||||
|                     # finish adding | ||||
|                     $repeaters{$tplace}++; | ||||
|                     if ($repeaters{$tplace} == 1) {   | ||||
|                        $temp = 0; | ||||
|                     } | ||||
|                     else { | ||||
|                       $temp = $repeaters{$tplace} - 1; | ||||
|                     }               | ||||
|                     $HL{$tplace}[$temp] = $tpackname; | ||||
|                   | ||||
|                    # print out | ||||
|                    open(BIG, ">>$tmp/big.debian") or die; | ||||
|                    open(LONG, ">>$tmp/long.debian") or die; | ||||
|                    my $thingo; | ||||
|                    foreach $thingo (sort keys %HL ) { | ||||
|                     my $tingy  = "@{ $HL{$thingo} }"; | ||||
|                     if (@{ $HL{$thingo} } > 1 || @{ $HL{$thingo} } eq "") { | ||||
|                       print LONG "$thingo -> $tingy\n"; | ||||
|                     } | ||||
|                     elsif (@{ $HL{$thingo} } == 1) { | ||||
|                       print BIG "$thingo -> $tingy\n";  | ||||
|                     } | ||||
|                   } | ||||
|                  close(BIG); | ||||
|                  close(LONG); | ||||
| 
 | ||||
|                  # The whole key for lowmem systems | ||||
|                  undef %repeaters;  | ||||
|                  undef %HL;  | ||||
|                  undef $tempholder[$fcount - 1]; | ||||
| 
 | ||||
|                }               | ||||
|               } # if fcount ne 0 | ||||
|                                 | ||||
|          $fcount++; | ||||
|          } | ||||
| 
 | ||||
|          # also do this in db() & ndb() | ||||
|          unlink("$tmp/sortfiledir.deb"); | ||||
|           | ||||
| 
 | ||||
| } # end sub pre_md | ||||
							
								
								
									
										78
									
								
								changelog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								changelog
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| swim (0.3.6) -  October 20 2000 | ||||
| 
 | ||||
| -- Made swim perl-5.6 happy.  Thanks to Douglas du Boulay  | ||||
|    <ddb@crystal.uwa.edu.au> for pointing this out. | ||||
| 
 | ||||
| swim (0.3.5) - January 28 2000 | ||||
| 
 | ||||
| -- Fixed a minor bug pertaining to the mtime of Contents which occured | ||||
|    during initial building of the uninstalled filesystem using FDBDF or | ||||
|    DF.  This bug arose as a result of a bug fix in 0.3.4. | ||||
| 
 | ||||
| swim (0.3.4) - January 23 2000 | ||||
| 
 | ||||
| -- Made the changelog and copyright option work properly in relation to | ||||
|    the fsstnd Debian has adopted with backwards compatibility.  Fixed a | ||||
|    regexp in Qftp to properly deal with packages which match one another, | ||||
|    but aren't the same.  Fixed xyzr to work properly with ps.  Fixed share | ||||
|    -d/l output for p option.  Added an indication when extraction | ||||
|    succeeds.  Now Contents is properly filtered for ndb. Removed extra | ||||
|    output from menu for package option.  Added example documentation, | ||||
|    thanks to John Lapeyre for the suggestion.  Also, thanks to Joel Soete | ||||
|    for reporting corrupt sources from a faulty upload, and to tucows.com | ||||
|    for adding swim to their archive and awarding swim 5 Penguins.  | ||||
| 
 | ||||
| swim (0.3.3) - January 15 2000 | ||||
| 
 | ||||
| -- Repaired a bug in longswim causing the uninstalled filesystem to be | ||||
|    made with packages which looked like spaces due to a return code error, | ||||
|    which caused some trouble for the virtual directories.  ncontents is  | ||||
|    now filtered of ./, though it was cool to look at. | ||||
| 
 | ||||
| swim (0.3.2) - January 05 2000 | ||||
| 
 | ||||
| -- Fixed to properly find documentation in the not-installed new Debian  | ||||
|    share directories, perl5 in Depends for the new Debian perl policy, and  | ||||
|    year 2000 in help.    | ||||
| 
 | ||||
| swim (0.3.1) - January 04 2000                                                   | ||||
|                                                                                  | ||||
| -- Because of change in Debian's directory structure in Contents, added a        | ||||
|    filter so that not-installed database is properly made without repeats.       | ||||
|    Fixed a documentation error in QUICKSTART.  Made swim@the.netpedia.net        | ||||
|    default anonymous login.  Minor documentation improvements.  | ||||
| 
 | ||||
| swim (0.3.0) - June 15 1999 | ||||
| 
 | ||||
| -- The cleaned up version of 0.2.9.  Rebuild databases if you were using | ||||
|    version 0.2.8 or less. | ||||
| 
 | ||||
| swim (0.2.9) - May 14 1999 | ||||
| 
 | ||||
| -- This is an interim release until 0.3.0 is released.  Major bug fixes, | ||||
|    and some new features, including a history, and updating for | ||||
|    not-installed db. Rebuild databases if you were using an older version.  | ||||
| 
 | ||||
| swim (0.2.8) - Mar 13 1999 | ||||
| 
 | ||||
| -- Fixed a minor bug which was preventing virtual options --xyz and --ftp | ||||
|    from working with searches. | ||||
| -- Set the $swim_version variable to the right version number, and | ||||
|    automated the release process to avoid problems like the failure to | ||||
|    change this variable in the 0.2.7 release from occurring again. | ||||
| 
 | ||||
| swim (0.2.7) -  Mar 12 1999 | ||||
| 
 | ||||
| -- Fixed a file test in SWIM::Conf which kept the initial directories from | ||||
|    being created on startup, making the program fail.  Three names deserve | ||||
|    recognition:  John Lapeyre, Jonathan P. Tomer, and Cale Epstein who all | ||||
|    provided their own perspective to the problem, I combined all three | ||||
|    approaches.  Shaleh pointed out a packaging error. | ||||
| 
 | ||||
| swim (0.2.6) | ||||
| 
 | ||||
| -- First initial public offering around the beginning of March, 1999, | ||||
|    includes the main swim program, four exercise programs to help with | ||||
|    database creation, important swim manuals and twenty-five module  | ||||
|    members. | ||||
| -- swimmers ... take your mark ... go! | ||||
							
								
								
									
										7
									
								
								contact_and_website
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								contact_and_website
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| email: | ||||
| 
 | ||||
| Jonathan D. Rosenbaum <mttrader@access.mountain.net> | ||||
| 
 | ||||
| http: | ||||
| 
 | ||||
| the.netpedia.net | ||||
							
								
								
									
										20
									
								
								examples/Cron
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								examples/Cron
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,20 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| # This is a simple approach.  You could have a monthly Cron for stable and | ||||
| # then update if any changes were observed, a weekly Cron for frozen, and | ||||
| # a daily Cron for unstable. | ||||
| 
 | ||||
| # For this example a default of unstable is assumed. | ||||
| # This downloads only one Contents-arch for the unstable distribution. | ||||
| # Updates the Packages using apt, and grabs the Contents-arch and Packages | ||||
| # for the stable distribution if there are any changes. | ||||
| # Update the sources: | ||||
| swim --ftp --Contents DF --onec >> /var/log/swim.log 2>&1; | ||||
| swim --apt --update >> /var/log/swim.log 2>&1; | ||||
| swim --ftp --dists stable --onec  >> /var/log/swim.log 2>&1; | ||||
| 
 | ||||
| # This will update the database for the default distribution/architecture | ||||
| # using 'cron' to automatically pick the newest packages. | ||||
| # Update the databases: | ||||
| swim --db >> /var/log/swim.log 2>&1; | ||||
| swim --ndb APT --cron --Contents DF >> /var/log/swim.log 2>&1; | ||||
							
								
								
									
										263
									
								
								lib/Ag.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								lib/Ag.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,263 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum  | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Ag; | ||||
| use strict; | ||||
| use SWIM::Global qw(:Info $file_now);    | ||||
| use SWIM::DB_Library qw(:Xyz); | ||||
| use SWIM::Info; | ||||
| use SWIM::Pn_print; | ||||
| use SWIM::Deps; | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(description q_description); | ||||
| 
 | ||||
| 
 | ||||
| # stuff to query package names, -a, and groups | ||||
| 
 | ||||
| # -qi <packages name>  Anotherwards that big thing of info...also | ||||
| # -c, -l | ||||
| sub description { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|       $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|       $commands->{"postrm"}) { | ||||
|        scripts(\%commands); | ||||
|   } | ||||
|   menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|   copyright(\%commands) if $commands->{"copyright"};  | ||||
|   changelog(\%commands) if $commands->{"changelog"};  | ||||
|   | ||||
|   if (!$commands->{"n"}) { | ||||
|    dbi(\%commands); | ||||
|   } | ||||
|   else { | ||||
|    ndb(\%commands); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|      # We will check for more than two..just in case | ||||
|      if ($argument !~ /_/) { | ||||
|        if (defined $db{$argument}) { | ||||
|          $argument = $db{$argument}; | ||||
|        } | ||||
|      } | ||||
|     if ($db{"$argument"}){ | ||||
|        my $package = $db{"$argument"}; | ||||
|        print $package; | ||||
|     } | ||||
|       else {  | ||||
|         print "package $argument is not installed\n";  | ||||
|         exit; | ||||
|       } | ||||
|   } | ||||
|   untie %db; | ||||
| 
 | ||||
| 
 | ||||
|     character(\%commands); | ||||
|     shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|    | ||||
|     if ($commands->{"c"} && !($commands->{"l"} || $commands->{"d"})) { | ||||
|         if (conf(\%commands) ne 0) { | ||||
|          print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|          # here for a reason | ||||
|          # if -i because calls from qindexer. | ||||
|          if ($commands->{"i"}) { | ||||
|            require SWIM::File; | ||||
|            SWIM::File->import(qw(file)); | ||||
|            file(\%commands)  | ||||
|          } | ||||
|         } | ||||
|     }  | ||||
|     if (($commands->{"c"} && ($commands->{"l"} || $commands->{"d"})) || | ||||
|         ($commands->{"l"} || $commands->{"d"})) { | ||||
|          if ($commands->{"c"} && conf(\%commands) ne 0) { | ||||
|            print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|          } | ||||
|          require SWIM::File; | ||||
|          SWIM::File->import(qw(file)); | ||||
|          file(\%commands); | ||||
|     } | ||||
| 
 | ||||
|     if (!($commands->{"z"} || $commands->{"ftp"} || | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"})) { | ||||
|      if ($commands->{"x"} || $commands->{"ftp"} || $commands->{"source"} || | ||||
|        $commands->{"source_only"} || $commands->{"remove"} ||  | ||||
|        $commands->{"r"} || $commands->{"purge"}) { | ||||
|            require SWIM::Safex; | ||||
|            SWIM::Safex->import(qw(safex)); | ||||
|            safex(\%commands); | ||||
|      } | ||||
|     } | ||||
| 
 | ||||
| } # end sub description | ||||
| 
 | ||||
| # Access Descriptions, and other stuff for known <packages>. | ||||
| # This includes -ql(d)c, -qc or plain -q (just the package name and | ||||
| # version).  Anotherwards if -i isn't used this sub is called.  And | ||||
| # -ql is handled by file.  Mostly, this was designed for calling a single | ||||
| # package name on the command line without a known package title except | ||||
| # when -q is called by itself, but using -T is an exception since this is | ||||
| # useful. | ||||
| sub q_description { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|       $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|       $commands->{"postrm"}) { | ||||
|       scripts(\%commands); | ||||
|   } | ||||
|   menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|   copyright(\%commands) if $commands->{"copyright"};  | ||||
|   changelog(\%commands) if $commands->{"changelog"};  | ||||
| 
 | ||||
| 
 | ||||
|   if (!$commands->{"n"}) { | ||||
|    dbi(\%commands); | ||||
|   } | ||||
|   else { | ||||
|    ndb(\%commands); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|      if ($argument !~ /_/) { | ||||
|        if (defined $db{$argument}) { | ||||
|          $argument = $db{$argument}; | ||||
|        } | ||||
|        if ($commands->{"c"} && $commands->{"d"}) { | ||||
|            require SWIM::File; | ||||
|            SWIM::File->import(qw(file)); | ||||
|            print "$argument\n" if $commands->{"g"}; | ||||
|            character(\%commands); | ||||
|            shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|           if (conf(\%commands) ne 0) { | ||||
|             print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|           }  | ||||
|           # it's nice to print out -d with -c, so this was added. | ||||
|           file(\%commands); | ||||
|         }  | ||||
|         elsif ($commands->{"c"}) { | ||||
|           # this produces annoying spaces | ||||
|           print "$argument\n" if $commands->{"g"} && conf(\%commands) ne 0; | ||||
|           character(\%commands); | ||||
|           shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|           if (conf(\%commands) ne 0) { | ||||
|             print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|             if ($commands->{"md5sum"}) { | ||||
|              require SWIM::File; | ||||
|              SWIM::File->import(qw(file)); | ||||
|              file(\%commands); | ||||
|             } | ||||
|           }  | ||||
|         } | ||||
|         elsif ($db{$argument} && !$commands->{"c"}) {  | ||||
|            print "$argument\n" if $commands->{"T"} || | ||||
|             $commands->{"depends"} || $commands->{"pre_depends"} || | ||||
|             $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|             $commands->{"conflicts"} || $commands->{"replaces"} || | ||||
|             $commands->{"provides"};  | ||||
|            singular(\%commands); | ||||
|            character(\%commands); | ||||
|            shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|            print "\n" if $commands->{"T"} || | ||||
|             $commands->{"depends"} || $commands->{"pre_depends"} || | ||||
|             $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|             $commands->{"conflicts"} || $commands->{"replaces"} || | ||||
|             $commands->{"provides"};  | ||||
|         }   | ||||
|         else { print "package $argument is not installed\n"; } | ||||
|      } | ||||
|      elsif ($argument =~ /_/) { | ||||
|        if ($commands->{"c"} && $commands->{"d"}) { | ||||
|            print "$argument\n" if $commands->{"g"}; | ||||
|            character(\%commands); | ||||
|            shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|            print conf(\%commands) if conf(\%commands) ne 0 && !$commands->{"md5sum"}; | ||||
|            require SWIM::File; | ||||
|            SWIM::File->import(qw(file)); | ||||
|            file(\%commands); | ||||
|         }  | ||||
|         elsif ($commands->{"c"}) { | ||||
|          my $check = conf(\%commands); | ||||
|          print "$argument\n" if $commands->{"g"} && $check ne 0 || | ||||
|                                 $commands->{"l"}; | ||||
|          character(\%commands); | ||||
|          shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|          if (conf(\%commands) ne 0) { | ||||
|            print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|            require SWIM::File; | ||||
|            SWIM::File->import(qw(file)); | ||||
|            file(\%commands); | ||||
|          } | ||||
|          elsif (conf(\%commands) == 0) { | ||||
|            require SWIM::File; | ||||
|            SWIM::File->import(qw(file)); | ||||
|            file(\%commands); | ||||
|          } | ||||
|         } | ||||
|         elsif ($db{$argument} && !$commands->{"c"}) {  | ||||
|            # watch this | ||||
|            ##print "$argument\n" if $commands->{"g"}; | ||||
|            print "$argument\n" if $commands->{"T"} ||  | ||||
|             $commands->{"depends"} || $commands->{"pre_depends"} || | ||||
|             $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|             $commands->{"conflicts"} || $commands->{"replaces"} || | ||||
|             $commands->{"provides"};  | ||||
|            singular(\%commands); | ||||
|            character(\%commands); | ||||
|            shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|            print "\n" if $commands->{"T"} || | ||||
|             $commands->{"depends"} || $commands->{"pre_depends"} || | ||||
|             $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|             $commands->{"conflicts"} || $commands->{"replaces"} || | ||||
|             $commands->{"provides"};  | ||||
|         }   | ||||
|         else { print "package $argument is not installed\n"; } | ||||
|      } | ||||
| 
 | ||||
|   } | ||||
|   untie %db; | ||||
| 
 | ||||
|   if (!defined $file_now &&  | ||||
|               !($commands->{"z"} || $commands->{"ftp"} || | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"})) { | ||||
|     if ($commands->{"x"} || $commands->{"ftp"} || $commands->{"source"} || | ||||
|        $commands->{"source_only"} || $commands->{"remove"} ||  | ||||
|        $commands->{"r"} || $commands->{"purge"}) { | ||||
|            require SWIM::Safex; | ||||
|            SWIM::Safex->import(qw(safex)); | ||||
|            safex(\%commands); | ||||
|     } | ||||
|   }  | ||||
| } # end sub q_description | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										1219
									
								
								lib/Apt.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1219
									
								
								lib/Apt.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										358
									
								
								lib/Compare.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								lib/Compare.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,358 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Compare; | ||||
| use strict;  | ||||
| use SWIM::Conf qw($dpkg); | ||||
| use SWIM::Library; | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(comparison compare_versions); | ||||
| 
 | ||||
| # comparison function and checking function (-v) for not-installed databases | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| DEVELOPMENTAL | ||||
| 
 | ||||
| This uses the comparison method mentioned in the packaging manual.  It | ||||
| will look for an epoch *: or the absence, and a revision -* or the | ||||
| absence.  First the epoch is compared, then the upstream-version, than | ||||
| the debian-revision.  The sub will stop and return a value as soon as | ||||
| a difference is found.  A look in the dpkg attic helped out (compare_vnumbers) | ||||
| here, but lib.pl used separate subs, and doesn't appear to check for | ||||
| an epoch separately, ofcourse there may have not been an epoch.  This | ||||
| uses the special variable $&, but apparently this isn't as big a waste | ||||
| of resources in later versions of Perl, but there will be some | ||||
| experiments and benchmarks for alternatives in the future for this sub. | ||||
| There some rules built into comparison() to deal with patch to non-patch, | ||||
| more than one hyphen (-).  This involves a little transformation. | ||||
| You can verify that this sub is working by doing perl -e '$five =\ | ||||
| system "dpkg --compare-versions 10 gt 1.0.17";  print "nop\n" if $five\ | ||||
| == 256; print "yes\n" if $five == 0', take a look at the scripts, too. | ||||
| Also, use -v (compare_versions()) when using --initndb or --rebuildndb | ||||
| for a report.  | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| sub comparison { | ||||
| 
 | ||||
|   # $pversion = version from Packages.gz    | ||||
|   # $eversion = version from nstatusindex-arch-dist.deb  | ||||
| 
 | ||||
|   my($pversion,$eversion) = @_;   | ||||
|   my($epoch, $upstream, $revision); | ||||
|   my($eepoch, $eupstream, $erevision); | ||||
|   my($revisiond,$erevisiond); | ||||
|   my $result; | ||||
| 
 | ||||
|  # If the two versions "eq" one another no reason to go on | ||||
|  if ($pversion ne $eversion) { | ||||
| 
 | ||||
|  # check epoch first, go on if the same | ||||
|  ######### | ||||
|  # EPOCH # | ||||
|  ######### | ||||
|  if ($pversion =~ /:/ || $eversion =~ /:/) { | ||||
|     if ($pversion =~ /:/) { | ||||
|      ($epoch,$upstream) = split(/:/,$pversion,2); | ||||
|     } | ||||
|     else { | ||||
|       $epoch = 0; $upstream = $pversion; | ||||
|     } | ||||
|     if ($eversion =~ /:/) { | ||||
|      ($eepoch,$eupstream) = split(/:/,$eversion,2); | ||||
|     } | ||||
|     else { | ||||
|       $eepoch = 0; $eupstream = $eversion; | ||||
|     }       | ||||
|   do { | ||||
| 
 | ||||
|    $epoch =~ s/^\d*//; my $epochd = $&; | ||||
|    $eepoch =~ s/^\d*//; my $eepochd = $&; | ||||
|    $result = $epochd <=> $eepochd;  | ||||
|    return "<" if $result == -1; | ||||
|    return ">" if $result == 1; | ||||
| 
 | ||||
|   } while (length ($epoch) && length ($eepoch)); | ||||
|     #return length ($a) cmp length ($b); | ||||
|  } # end if epoch | ||||
|  else { | ||||
|       $epoch = 0; $upstream = $pversion; | ||||
|       $eepoch = 0; $eupstream = $eversion; | ||||
|  } | ||||
| 
 | ||||
|  # Check the upstream-revision next | ||||
|  ##################### | ||||
|  # UPSTREAM-REVISION # | ||||
|  ##################### | ||||
|  if ($upstream || $eupstream) { | ||||
|     # we need to run a little test in case hyphens exists more than once | ||||
|     if ($upstream =~ /-/) { | ||||
|       my $hyphen = ($upstream =~ tr/-//); | ||||
|       if ($hyphen > 1) { | ||||
|         $upstream =~ m,(^.*)-(.*$),; | ||||
|         $upstream = $1; | ||||
|         $revision = $2; | ||||
|       } | ||||
|       else  {   | ||||
|         ($upstream,$revision) = split(/-/,$upstream,2);  | ||||
|       } | ||||
|     } | ||||
|     else { | ||||
|       # because the absence is considered earlier, and the convention | ||||
|       # is to use -1. | ||||
|       $revision = 0; | ||||
|     } | ||||
|     # we need to run a little test in case hyphens exists more than once | ||||
|     if ($eupstream =~ /-/) { | ||||
|       my $hyphen = ($eupstream =~ tr/-//); | ||||
|       if ($hyphen > 1) { | ||||
|         $eupstream =~ m,(^.*)-(.*$),; | ||||
|         $eupstream = $1; | ||||
|         $erevision = $2; | ||||
|       } | ||||
|       else {   | ||||
|       ($eupstream,$erevision) = split(/-/,$eupstream,2);  | ||||
|       } | ||||
|     } | ||||
|     else { | ||||
|       # because the absence is considered earlier, and the convention | ||||
|       # is to use -1. | ||||
|       $erevision = 0; | ||||
|     } | ||||
|   do { | ||||
|    # letters | ||||
|    $upstream =~ s/^\D*//; my $upstreamd = $&; | ||||
|    $eupstream =~ s/^\D*//; my $eupstreamd = $&;  | ||||
| 
 | ||||
|    # hopefully this handles nasty beta situations | ||||
|    if ($upstreamd eq "b" and $eupstreamd eq "." ) { | ||||
|     return "<"; | ||||
|    } | ||||
|    elsif ($upstreamd eq "." and $eupstreamd eq "b" ) { | ||||
|     return ">"; | ||||
|    } | ||||
|    elsif ($upstreamd eq "beta" and $eupstreamd eq "." ) {                        | ||||
|     return "<";                                                                  | ||||
|    }                                                                             | ||||
|    elsif ($upstreamd eq "." and $eupstreamd eq "beta" ) {                        | ||||
|     return ">";                                                                  | ||||
|    }  | ||||
|    elsif ($upstreamd eq "." and $eupstreamd eq "-pre-") { | ||||
|     return ">"; | ||||
|    } | ||||
|    elsif ($eupstreamd eq "." and $upstreamd eq "-pre-") { | ||||
|     return "<"; | ||||
|    } | ||||
| 
 | ||||
|    # solves problems when "." is compared to letters, and also a weird | ||||
|    #  case involving a patched version changing to a non-patched version. | ||||
|    if ($upstreamd =~  /\./) { | ||||
|      if ($eupstreamd =~ /\w/) { | ||||
|        if ($eupstreamd =~ /pl/ && $upstreamd !~ /pl/) { | ||||
|           $eupstreamd = "";           | ||||
|        } | ||||
|        elsif ($upstreamd !~ /\.\w{2,10}/) { | ||||
|           $eupstreamd = "."; | ||||
|        } | ||||
|      } | ||||
|      elsif ($eupstreamd eq "") { | ||||
|        $eupstreamd = "."; | ||||
|      } | ||||
|    }  | ||||
|   # the weird -pre situation | ||||
|   elsif ($upstreamd =~ /-pre/ || $eupstreamd =~ /-pre/) { | ||||
|       $upstreamd = ""; $eupstreamd = ""; | ||||
|   } | ||||
| 
 | ||||
|    if ( $eupstreamd =~ /\./) { | ||||
|      if ($upstreamd =~ /\w/) { | ||||
|        if ($upstreamd =~ /pl/ && $eupstreamd !~ /pl/) { | ||||
|           $upstreamd = "";           | ||||
|        } | ||||
|        elsif ($upstreamd !~ /\.\w{2,10}/) { | ||||
|           $upstreamd = "."; | ||||
|        }   | ||||
|      } | ||||
|      elsif ($upstreamd eq "") { | ||||
|        $upstreamd = "."; | ||||
|      } | ||||
|    }  | ||||
|    # the weird -pre situation | ||||
|    elsif ($upstreamd =~ /-pre/ || $eupstreamd =~ /-pre/) { | ||||
|       $upstreamd = ""; $eupstreamd = ""; | ||||
|    } | ||||
| 
 | ||||
|    $result = $upstreamd cmp $eupstreamd;  | ||||
|    return "<" if $result == -1; | ||||
|    return ">" if $result == 1; | ||||
|    # it's importantant to realize that . & + are being checked for | ||||
|    # above. : and - have already been dealt with. cmp seems to deal with | ||||
|    # these characters with no problems. | ||||
| 
 | ||||
| 
 | ||||
|    # numbers | ||||
|   | ||||
|    # found a little problem with <=> when number's eq "", | ||||
|    # but this doesn't effect cmp.   | ||||
|    if ($upstream eq "") { | ||||
|      if ($eupstream eq ".") { | ||||
|        $upstream = "."; | ||||
|      } | ||||
|      else { | ||||
|        $upstream = 0; | ||||
|      }  | ||||
|    }  | ||||
|    if ( $eupstream eq "") { | ||||
|      if ($upstream eq ".") { | ||||
|        $eupstream = "."; | ||||
|      } | ||||
|      else { | ||||
|        $eupstream = 0; | ||||
|      }  | ||||
|    }  | ||||
| 
 | ||||
|    $upstream =~ s/^\d*//; $upstreamd = $&; | ||||
|    $eupstream =~ s/^\d*//; $eupstreamd = $&; | ||||
|    $result = $upstreamd <=> $eupstreamd;  | ||||
|    return "<" if $result == -1; | ||||
|    return ">" if $result == 1; | ||||
|   } while (length ($upstream) || length ($eupstream)) | ||||
|  } # end if upstream | ||||
|  else { | ||||
|       $revision = 0; | ||||
|       $erevision = 0; | ||||
|  } | ||||
| 
 | ||||
|  # Finally, check the revision | ||||
|  ############ | ||||
|  # REVISION # | ||||
|  ############ | ||||
|  if ($revision || $erevision) { | ||||
|   do { | ||||
|    # letters | ||||
|    $revision =~ s/^\D*//;  $revisiond = $&; #$revisiond =~ s/\W/ /g; | ||||
|    $erevision =~ s/^\D*//; $erevisiond = $&; #$erevisiond =~ s/\W/ /g; | ||||
| 
 | ||||
|    # pre in the revision | ||||
|    if ($revisiond eq "." and $erevisiond eq "pre") { | ||||
|     return "r>"; | ||||
|    } | ||||
|    elsif ($erevisiond eq "." and $revisiond eq "pre") { | ||||
|     return "r<"; | ||||
|    } | ||||
|    $result = $revisiond cmp $erevisiond;  | ||||
|    return "r<" if $result == -1; | ||||
|    return "r>" if $result == 1; | ||||
|    # it's importantant to realize that . & + are being checked for | ||||
|    # above. : and - have already been dealt with. cmp seems to deal with | ||||
|    # these characters with no problems. | ||||
| 
 | ||||
|    # numbers | ||||
|    # found a little problem with <=> when number's eq "", | ||||
|    # but this doesn't effect cmp.   | ||||
|    if ($revision eq "") { | ||||
|      if ($erevision eq ".") { | ||||
|        $revision = "."; | ||||
|      } | ||||
|      else { | ||||
|        $revision = 0; | ||||
|      }  | ||||
|    }  | ||||
|    if ( $erevision eq "") { | ||||
|      if ($revision eq ".") { | ||||
|        $erevision = "."; | ||||
|      } | ||||
|      else { | ||||
|        $erevision = 0; | ||||
|      }  | ||||
|    } | ||||
| 
 | ||||
|    $revision =~ s/^\d*//; $revisiond = $&; | ||||
|    $erevision =~ s/^\d*//; $erevisiond = $&; | ||||
|    $result = $revisiond <=> $erevisiond;  | ||||
|    return "r<" if $result == -1; | ||||
|    return "r>" if $result == 1; | ||||
|   } while (length ($revision) && length ($erevision)); | ||||
|  } # end if revision | ||||
| 
 | ||||
|   # still 0? check the remainder..this is just for letters which may have | ||||
|   # been mulled over because they looked like words \w. | ||||
|  if ($result == 0) { | ||||
|     $result = $epoch cmp $eepoch || $upstream cmp $eupstream ||  | ||||
|               $revision cmp $erevision;  | ||||
|     return "<" if $result == -1; | ||||
|     return ">" if $result == 1; | ||||
|  } | ||||
|  } | ||||
| 
 | ||||
| } # end sub comparison | ||||
| 
 | ||||
| 
 | ||||
| # This produces a report to make sure that comparison() is up to par, and | ||||
| # is called with -v.  It uses dpkg's --compare-versions.  The advantage of | ||||
| # not normally running --compare-versions is portability.  People using | ||||
| # other distribution's don't need dpkg installed, and people using weird | ||||
| # Oses who can't use dpkg can still explore a virtual installation. | ||||
| sub compare_versions { | ||||
| 
 | ||||
|   # The test result is put in .version_compare | ||||
| 
 | ||||
|   # $result = operand (result from comparison) | ||||
|   # $virtual = version from Packages.gz    | ||||
|   # $installed = version from nstatusindex-arch-dist.deb  | ||||
|   # $name = packagename | ||||
|   # $commands = options | ||||
|    | ||||
|    my ($result, $virtual, $installed, $name, $commands) = @_; | ||||
|    my %commands = %$commands; | ||||
|    my ($cv, $cv_result, $cresult); | ||||
|    my $place = finddb(\%commands); | ||||
| 
 | ||||
|    # usually it will be greater | ||||
|    if (defined $dpkg) { | ||||
|    $cv = system "$dpkg", "--compare-versions", "$virtual", "gt", "$installed";  | ||||
| 
 | ||||
|    $cv_result = "no" if $cv == 256; | ||||
|    $cv_result = "yes" if $cv == 0; | ||||
|    #$cresult = "no" if $result =~ m,[r]?<,; | ||||
|    #$cresult = "yes" if $result =~ m,[r]?>,; | ||||
|    $cresult = "no" if $result eq "<" || $result eq "r<"; | ||||
|    $cresult = "yes" if $result eq ">" || $result eq "r>"; | ||||
| 
 | ||||
|   open(CV,">>$place/.version_compare")  | ||||
|   or warn "couldn't create version compare report\n"; | ||||
|       if ($cresult eq "yes" && $cv_result eq "no") { | ||||
|   print CV "$name:\ndpkg - $virtual < $installed\nswim - $virtual > $installed\n\n"; | ||||
|       }   | ||||
|       elsif ($cresult eq "no" && $cv_result eq "yes") { | ||||
|   print CV "$name:\ndpkg - $virtual > $installed\nswim - $virtual < $installed\n\n"; | ||||
|       } | ||||
|       else { | ||||
|        return; | ||||
|       } | ||||
|   close(CV); | ||||
|   } | ||||
| 
 | ||||
| } # end sub compare_versions | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										672
									
								
								lib/Conf.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										672
									
								
								lib/Conf.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,672 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Conf; | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| 
 | ||||
| @EXPORT = qw($my_number $tmp $architecture $distribution @user_defined_section | ||||
|              $default_directory  $default_root_directory $permission $dpkg | ||||
|              $dpkg_deb $ar $gcc $apt_get $apt_cache $sources @FTP $spl $cat | ||||
|              $sort $md5sum $zcat $tar $grep $gzip $fastswim $slowswim $longswim | ||||
|              $mount $umount $mke2fs $copy $pager $base $pwd $parent $library | ||||
|              $splt $mv $imswim $swim_conf $debug $port $timeout | ||||
|              $firewall $passive $apt_sources $HISTORY $alt); | ||||
| %EXPORT_TAGS = ( | ||||
|                Path => [ qw($tmp $parent $base $library) ], | ||||
|                Deb => [ qw($pwd $dpkg_deb $ar $tar $grep $tmp $md5sum $cat $mv) ], | ||||
|                Qftp => [ qw($default_root_directory $permission @FTP  | ||||
|                             $default_directory $swim_conf) ], | ||||
|                Info => [ qw($parent $base $zcat) ] | ||||
|                ); | ||||
| 
 | ||||
| 
 | ||||
|           | ||||
| ############################# | ||||
| # DEFAULT PROGRAM VARIABLES # | ||||
| ############################# | ||||
| 
 | ||||
| # You can change this to how many lines you would like "swim -qf <>" to | ||||
| # print out, before asking for -t or --total, it will automatically ask | ||||
| # though, if there is more than one package and you used the option -i. | ||||
| # Remember -t can be used with --scripts family members to view the | ||||
| # title of the script file regardless of this setting, and if -t has to be | ||||
| # used, the titles will be displayed, which makes sense. | ||||
| $my_number = 23; | ||||
| 
 | ||||
| # Just like a shell, you can keep a history of whatever length you want.   | ||||
| $HISTORY = 10; | ||||
| 
 | ||||
| # For not-installed: | ||||
| # This part supplies the default value for --arch. | ||||
| # | ||||
| # You can determine the default architecture used when -n is  | ||||
| # called or a not-installed database is made.  Architectures are always | ||||
| # being added so check with Debian to find a list.  There is alpha, arm, | ||||
| # hurd (alternative kernel to linux), i386, m68k, powerpc, sparc.  Just use | ||||
| # the arch found after the hyphen in the Contents-(arch) file. | ||||
| $architecture = "i386"; | ||||
| 
 | ||||
| # For not-installed: | ||||
| # This part supplies the default value for --dists. | ||||
| # | ||||
| # The default distribution can be either stable, unstable, frozen, or | ||||
| # experimental (rare).  These represent the state of development that the | ||||
| # packages are under.  The unstable distribution can have lot's of changes | ||||
| # within a very short time period, and frozen may or may not be available. | ||||
| $distribution = "unstable"; | ||||
| 
 | ||||
| 
 | ||||
| #For not-installed: | ||||
| #This part supplies the default value for --main, --contrib, --non-free, | ||||
| #and --non-us. | ||||
| 
 | ||||
| # Distributions are divided into the sections.  These sections are called | ||||
| # distributions in the version 2.4.1.0 packaging manual, because they were at | ||||
| # one time separate distributions, but this has since changed.  You can | ||||
| # determine which of these sections (main, non-free, contrib or non-US) to | ||||
| # pull out of the Contents file if you don't want to use --main, --contrib, | ||||
| # --non-free, and --non-us to selectively pick sections.  Basically, whatever | ||||
| # you pull out should match the Package(s) file(s) you are targetting, this | ||||
| # program is friendly if you make a mistake, but it's more effecient to pull | ||||
| # out just what you want.  If the same package happens to exist in two | ||||
| # different sections, main and non-us for example (which is really a | ||||
| # situation that shouldn't exist, yet it does), you will still be able to | ||||
| # find this package in the non-us group, but its section and locations will be | ||||
| # the one which main recognizes assuming that you use the order in the example | ||||
| # below. | ||||
| 
 | ||||
| # Setting it up: | ||||
| # Example: You just want to pull out main and contrib every time you run | ||||
| # --initndb, --rebuildndb, or --ndb.   | ||||
| # @user_defined_section = qw(main contrib non-US);   | ||||
| # remember "non-US" not "non-us".  | ||||
| 
 | ||||
| # untill non-US is fixed the second is better | ||||
| #@user_defined_section = qw(main contrib non-free non-US);  | ||||
| @user_defined_section = qw(main contrib non-free); | ||||
| 
 | ||||
| # Usually, this is  | ||||
| $alt = "debian"; | ||||
| 
 | ||||
| ################ | ||||
| # DF LOCATION  # | ||||
| ################ | ||||
| 
 | ||||
| # A little philosophy: | ||||
| # swim was developed for maximum versatility, so whether you are just | ||||
| # interested in researching, and keeping tabs on the newest packages, | ||||
| # or maintaining a Debian virtual distribution on a non-Debian real | ||||
| # distribution, or you are a using swim for distribution development, swim | ||||
| # provides a way.  The default directory (DF - which can also mean | ||||
| # directory/file) keeps track of Contents and Packages files downloaded | ||||
| # using --ftp, and gives the files names specific to the distribution and | ||||
| # architectures they represent.  But, you also have the freedom not to use | ||||
| # the default directory in this case swim will still do the renaming and | ||||
| # keeping track of the mtime, but you will have to remember where you put | ||||
| # the files. On the other hand, if you use apt, you won't even have to use | ||||
| # the DF directory for Packages files because you can get the ones specific | ||||
| # to your own systems architecture from apt, but if you want to look at | ||||
| # other architectures you will need to use the DF directory or one of your | ||||
| # own choice.  | ||||
| # Naming Convention: Contents = Contents-dist.gz  | ||||
| # Packages = Packages-arch-dist-section.gz  | ||||
| $default_directory = '/root/.swim'; | ||||
| 
 | ||||
| 
 | ||||
| # The default root directory is the key to easy management of packages | ||||
| # downloaded through --ftp and --file, and provides an easy way to put together | ||||
| # a personalized distribution.  Future implementations of swim will provide | ||||
| # a distribution called personal..Packages and Contents files specific to | ||||
| # this distribution will automatically be made.  This directory can be a | ||||
| # real ftp site on your computer, or put where ever else you are allowed | ||||
| # to have directories.  dists/distribution/section/architecture/subject will be | ||||
| # placed above this directory.  No matter what, debian must be the final | ||||
| # directory before dists.  Other distributions are placed alongside debian, | ||||
| # like debian-non-US or personal.  | ||||
| # Feel free to change the permissions.  This directory is above your default_ | ||||
| # directory. | ||||
| $default_root_directory = '/pub/debian'; | ||||
| 
 | ||||
| # Because you may be using a real ftp site, this configuration allows you | ||||
| # to determine what permissions swim will set for directories it creates | ||||
| # above the default root directory. | ||||
| $permission = '0755'; | ||||
| 
 | ||||
| 
 | ||||
| ############### | ||||
| # AR or DPKG? # | ||||
| ############### | ||||
| 
 | ||||
| # NOTE: users set these next two with the $package_tool variable. | ||||
| 
 | ||||
| # packaging friends dpkg and dpkg-deb come from the essential and | ||||
| # required dpkg package.  ar from the package binutils can also be used (below). | ||||
| # This is the archival program used for deb packages, but binutils is just | ||||
| # a standard non-essential package, and the ar capabilities are built into | ||||
| # dpkg-deb, and it's better not to assume that the standard packages are | ||||
| # even established, yet. | ||||
| $dpkg = (); | ||||
| $dpkg_deb = (); | ||||
| 
 | ||||
| 
 | ||||
| # If you don't have the dpkg package on your system then you can use ar | ||||
| # from the package binutils.  This would be a standard, but not an essential | ||||
| # package in Debian, but this package is also fairly standard amongst all | ||||
| # distributions, and can even be found in the free djgpp for M$ Oses. | ||||
| # Since people who have both dpkg and ar may want to try the ar method, | ||||
| # rather than creating an automatic check, just assign a value to either | ||||
| # ($dpkg & $dpkg_deb) or just $ar. | ||||
| #my $ar = '/usr/bin/ar';  # same for RH | ||||
| $ar = '/usr/bin/ar'; | ||||
| 
 | ||||
| 
 | ||||
| ####### | ||||
| # APT # | ||||
| ####### | ||||
| 
 | ||||
| # NOTE: users set apt-get and apt-cache with the $apt variable | ||||
| 
 | ||||
| # If you have apt you are in luck. | ||||
| $apt_get = (); | ||||
| $apt_cache = (); | ||||
| $sources = '/etc/apt/sources.list'; | ||||
| $apt_sources = '/var/state/apt/lists'; | ||||
| 
 | ||||
| ######### | ||||
| # PAGER # | ||||
| ######### | ||||
| 
 | ||||
| # less is a nice pager, unless you like more!  There is an option  | ||||
| # --nopager or -n.   Pager is used for --help and swim called without any | ||||
| # options.  more comes from the required package util-linux, whereas | ||||
| # less comes from a standard package called less.  In the future there is | ||||
| # a possiblity that a large percentage of swim may use an internal pager. | ||||
| # less, more, or most or... | ||||
| #$ENV{PAGER} = "/usr/bin/less"; # same RH | ||||
| $ENV{PAGER} = "less"; | ||||
| $pager = $ENV{PAGER}; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ################# | ||||
| # SWIM PROGRAMS # | ||||
| ################# | ||||
| 
 | ||||
| # This is replaced by the Makefile. | ||||
| $pre="/usr"; | ||||
| 
 | ||||
| # This is the hash making program fastswim. | ||||
| $fastswim = "$pre/lib/SWIM/fastswim"; | ||||
| 
 | ||||
| # imswim in an alternative to fastswim for --lowmem | ||||
| $imswim = "$pre/lib/SWIM/imswim"; | ||||
| 
 | ||||
| #  This is the low memory program slowswim. | ||||
| $slowswim = "$pre/lib/SWIM/slowswim"; | ||||
| 
 | ||||
| # This is the dir/file making program longswim. | ||||
| $longswim = "$pre/lib/SWIM/longswim"; | ||||
| 
 | ||||
| ############ | ||||
| # TEMP DIR # | ||||
| ############ | ||||
| 
 | ||||
| # If you want to set an alternative directory for the temporary files | ||||
| # created when the databases are made, change here.  You may want to make | ||||
| # $tmp a RAM disk.  See package loadlin for initrd documentation and an | ||||
| # explanation for making such a disk.  There is also | ||||
| # /usr/src/kernel-source.version/Documentation.  Whether this will speed | ||||
| # things up is a subject of experimentation. | ||||
| $tmp = '/tmp'; | ||||
| 
 | ||||
| ################## | ||||
| # MAIN CONFFILES # | ||||
| ################## | ||||
| 
 | ||||
| # if configuration files are not kept in /etc change this | ||||
| # and set up the directories by hand. | ||||
| 
 | ||||
| $swim_conf = '/etc/swim'; | ||||
| 
 | ||||
| 
 | ||||
| ############# | ||||
| # UTILITIES # | ||||
| ############# | ||||
| 
 | ||||
| 
 | ||||
| # This probably never will have to be changed. | ||||
| $pwd = `pwd`; | ||||
| chomp $pwd; | ||||
| 
 | ||||
| # If the command split is somewhere else besides /usr/bin change this. | ||||
| # The required package textutils provides this. | ||||
| #my $splt = '/usr/bin/split'; # same RH | ||||
| $splt = 'split'; | ||||
| 
 | ||||
| # cat comes from the essential and required package textutils. | ||||
| #my $cat = '/bin/cat'; # same RH | ||||
| $cat = 'cat'; | ||||
| 
 | ||||
| # This command also omes from the required and essential package textutils. | ||||
| #my $sort = '/usr/bin/sort'; # same RH | ||||
| $sort = 'sort'; | ||||
| 
 | ||||
| # This program uses md5sum from the dpkg package, it can also use md5sum | ||||
| # from the RH package. | ||||
| #my $md5sum = '/usr/bin/md5sum'; # same RH | ||||
| $md5sum = 'md5sum'; | ||||
| 
 | ||||
| # If you want to view compressed files make sure this is correct. | ||||
| # The required package gzip provides this. | ||||
| #my $zcat = '/bin/zcat'; # same RH | ||||
| $zcat = 'zcat'; | ||||
| 
 | ||||
| # tar comes from the essential and required package tar. | ||||
| #my $tar = '/bin/tar'; # same RH | ||||
| $tar = 'tar'; | ||||
| 
 | ||||
| # grep comes from the essential and required package grep.  This seems | ||||
| # to require a path. | ||||
| $grep = '/bin/grep'; # same RH | ||||
| 
 | ||||
| # gzip comes from the essential and required package gzip. | ||||
| #my $gzip = "/bin/gzip"; # same RH | ||||
| $gzip = "gzip"; | ||||
| 
 | ||||
| # mount comes from the essential and required package mount. | ||||
| #my $mount = '/bin/mount'; # same RH | ||||
| #my $umount = '/bin/umount';  # same RH | ||||
| $mount = 'mount'; | ||||
| $umount = 'umount'; | ||||
| 
 | ||||
| # If your file system isn't an ext2 filesystem, you may want to change | ||||
| # this.  mke2fs comes from the essential and required package e2fsprogs. | ||||
| #my $mke2fs = '/sbin/mke2fs'; # same RH | ||||
| $mke2fs = 'mke2fs'; | ||||
| 
 | ||||
| # cp and mv from the essential and required package fileutils | ||||
| #my $copy = '/bin/cp'; # same RH | ||||
| $copy = 'cp'; | ||||
| $mv = 'mv'; | ||||
| 
 | ||||
| # Your system definitely has gcc if you have ar.  gcc is a standard package | ||||
| # in debian. | ||||
| $gcc = 'gcc'; | ||||
| 
 | ||||
| 
 | ||||
| ###### | ||||
| # FTP # | ||||
| ####### | ||||
| 
 | ||||
| # Major mode --ftp and --file automates the download of Contents and Packages | ||||
| # files. Even if you have apt installed, you may still want to download Packages | ||||
| # from alternative architectures, and the Contents file for your own architecture | ||||
| # or other architectures.  If you want virtual and/or -ld capabilities you need | ||||
| # the Contents file.  You specify a list of ftp or file sites using urls (like | ||||
| # apt). For your system's architecture specify the type deb, for other | ||||
| # architectures specify deb(hyphen)architecture (ex: deb-alpha).  Regardless of | ||||
| # whether or not you specify an architecture, deb implies /dist* found under the | ||||
| # base directory specified by the ftp url, except in the case of experimental, | ||||
| # and to a degree non-us. minor mode --ftp, and --file will use the sites in this | ||||
| # configuration as well, on a fifo (first in first out) basis, so choose the | ||||
| # order of sites based on which are closest, most current, as well as fast. | ||||
| 
 | ||||
| # IMPORTANT:  It is a BIG MISTAKE to use the distributions name (slink,po,etc)  | ||||
| # anywhere in the sources list, or in swim's configuration file..in fact swim | ||||
| # won't work properly, not to mention the fact that someday your favorite name | ||||
| # will suddenly disappear. This is because swim thinks in terms of the real | ||||
| # distribution name (stable,unstable,frozen, experimental).  The problem goes | ||||
| # like this - slink remains slink, but goes from unstable to frozen to stable.  | ||||
| # At first, using the distributions alias may seem appropriate, but the | ||||
| # purpose of swim is to keep tabs on the dists, and not to ignore changes in | ||||
| # the states, this also makes managing swim's databases much easier and | ||||
| # intuitive...more about this later.  | ||||
| 
 | ||||
| # Fun experiments:  Swim uses the naming conventions of apt, but leaves the | ||||
| # Package files compressed in the DF directory.  So you can always decompress | ||||
| # the databases and move them to /var/state/apt/lists.  This ofcourse assumes | ||||
| # that the  appropriate changes to the sources.list reflecting these Packages | ||||
| # (need to be the same architecture as your system) existed before you  | ||||
| # update. (author needs to do this experiment :*)  | ||||
| 
 | ||||
| $ftp1 = "deb ftp://localhost/pub/debian unstable main contrib non-free non-US"; | ||||
| $ftp2 = "deb ftp://localhost/pub/debian unstable main contrib non-free";  | ||||
| $ftp3 = "deb ftp://localhost/pub/debian  project/experimental/"; | ||||
| @FTP = ($ftp1,$ftp2,$ftp3);  | ||||
| 
 | ||||
| # These next variables allow some characteristics of the ftp client | ||||
| # to be altered.  See Net::FTP for ways of altering some of these | ||||
| # variables through the environment. | ||||
| 
 | ||||
| $firewall = 0; | ||||
| $port = 0; | ||||
| $timeout =  120; | ||||
| $debug = 0; | ||||
| $passive = 0; | ||||
| 
 | ||||
| 
 | ||||
| ######################################## | ||||
| # STUFF THAT NEVER NEEDS TO BE CHANGED # | ||||
| ######################################## | ||||
| 
 | ||||
| # You will never need to change this unless for some weird reason all the | ||||
| # files under dpkg are somewhere else (including /info*) , see --dbpath as | ||||
| # an alternative if you decide to access or make the databases somewhere | ||||
| # else. | ||||
| $base = '/var/lib/dpkg'; | ||||
| 
 | ||||
| # --dbpath takes care of this so don't touch. | ||||
| $parent = '/'; | ||||
| $library = '/var/lib/dpkg'; | ||||
| 
 | ||||
| 
 | ||||
| ############################# | ||||
| # LOAD CUSTOM CONFIGURATION # | ||||
| ############################# | ||||
| 
 | ||||
| 
 | ||||
| # Here we load in the customized configuration which override the defaults | ||||
| # Might as well use do, let the world learn Perl ... compare this to apt's  | ||||
| # configuation file with scopes.  Swim's sources.list file (/etc/swim/swimz.list),  | ||||
| # will be grabbed at SWIM::Apt and SWIM::Qftp if it exists. | ||||
| 
 | ||||
| do "$swim_conf/swimrc"; | ||||
| do "$ENV{HOME}/.swim/swimrc"; | ||||
| if ((defined $dpkg && !defined $dpkg_deb) ||  | ||||
|    (!defined $dpkg && defined $dpkg_deb)) { | ||||
|   print "swim: need to give both \$dpkg and \$dpkg_deb a value if you want dpkg\n"; | ||||
|   exit; | ||||
| } | ||||
| if (defined $package_tool) { | ||||
|  if ($package_tool =~ /ar/) { | ||||
|    $ar = $ar; | ||||
|  } | ||||
|  else { | ||||
|    $dpkg = 'dpkg'; | ||||
|    $dpkg_deb = 'dpkg-deb'; | ||||
|    undef $ar; | ||||
|  } | ||||
| } | ||||
| if (defined $apt) { | ||||
|   $apt_get = 'apt-get'; | ||||
|   $apt_cache = 'apt-cache'; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ############################### | ||||
| # MAKE ANY NEEDED DIRECTORIES # | ||||
| ############################### | ||||
| 
 | ||||
| # make sure all the appropriate directories are made | ||||
| if (!-d $default_directory) {   | ||||
|  if (-e $default_directory) { | ||||
|    print "swim: can not create default directory because a file exists\n"; | ||||
|    exit; | ||||
|  } | ||||
|     my @DRD = split(m,/,,$default_directory); | ||||
|     my $placement = "/"; | ||||
|     for (1 .. $#DRD) {   | ||||
|      $_ == 1 ? ($placement = "/$DRD[$_]")  | ||||
|              : ($placement = $placement . "/" . $DRD[$_]); | ||||
|      -d $placement or mkdir("$placement",0755); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| if (!-d "$default_directory$default_root_directory") { | ||||
|     my @DRD = split(m,/,,$default_root_directory); | ||||
|     print "swim: debian must be the final directory before dists\n" | ||||
|     if $DRD[$#DRD] ne "debian"; | ||||
|     exit if $DRD[$#DRD] ne "debian"; | ||||
|     my $placement = "/"; | ||||
|     for (1 .. $#DRD) {   | ||||
|      $_ == 1 ? ($placement = "/$DRD[$_]")  | ||||
|              : ($placement = $placement . "/" . $DRD[$_]); | ||||
|      unless (-d "$default_directory$placement") {  | ||||
|        mkdir("$default_directory$placement",0755)  | ||||
|        or die "swim: could not create root default directory\n"; | ||||
|      } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| # Makefile will make sure these directories exist, unless for some strange | ||||
| # reason you have to change them. | ||||
| 
 | ||||
| if (!-d $library) { | ||||
|     mkdir($library,0755) or die "Couldn't create default directory\n"; | ||||
| } | ||||
| 
 | ||||
| if (!-d $base) { | ||||
|     mkdir($base,0755) or die "Couldn't create default directory\n"; | ||||
| } | ||||
| 
 | ||||
| if (!-d $swim_conf) { | ||||
|     mkdir($swim_conf,0666) or die "Couldn't create configuration file directory, | ||||
|                                    please make the directories which are needed.\n"; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
| __END__ | ||||
| 
 | ||||
| =head1 NAME | ||||
| 
 | ||||
| swimrc - swim configuration file | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| B<swimrc> is the configuartion file for swim allowing many default values | ||||
| to be set so that they do not have to be mentioned on the command line.  | ||||
| Swimrc interacts directly with Perl allowing a wide variety of variables | ||||
| found in B<SWIW::Conf> to be altered. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| =head1 USAGE | ||||
| 
 | ||||
| Values for variable can be altered for B<swim> by assigning different | ||||
| values enclosed in quotes or quoted whitespace (qw()), and ended with a | ||||
| semi-colon. | ||||
| 
 | ||||
|  $variable = "value"; | ||||
|  $variable = "qw(value1 value2 ..)"; | ||||
| 
 | ||||
| =head1 VARIABLES | ||||
| 
 | ||||
| This is a list of variables with explanations.  The default values for | ||||
| B<swim> are shown. | ||||
| 
 | ||||
| =head2 OUTPUT VARIABLE  | ||||
| 
 | ||||
| $my_number can be changed to how many lines you would like "swim -qf <>"  | ||||
| to print out, before the program asks for C<-t> or C<--total>.  Exception:  | ||||
| If C<-i> is used in the query and there is more than one package then the | ||||
| total will be presented.  | ||||
| 
 | ||||
| Hint:  C<-t> can be used with all the various C<--scripts> family members | ||||
| to view the title of the script file regardless of this variable setting, | ||||
| and if C<-t> has to be used, the titles will be displayed, which makes | ||||
| sense.  | ||||
| 
 | ||||
| B<$my_number = 23;> | ||||
| 
 | ||||
| =head2 HISTORY | ||||
| 
 | ||||
| This is a shell-like history kept in relation to searches and the most | ||||
| recent edit when C<--stdin> is used.  | ||||
| 
 | ||||
| B<$HISTORY = 10;> | ||||
| 
 | ||||
| =head2 AR or DPKG? | ||||
| 
 | ||||
| Debian packages are ar archives.  If you are using a Debian Distribution | ||||
| assign "dpkg" to $package_tool, otherwise assign "ar" to $package_tool. | ||||
| 
 | ||||
| B<$package_tool = "/usr/bin/ar";> | ||||
| 
 | ||||
| =head2 APT | ||||
| 
 | ||||
| B<Swim> does not assign a value for apt.  To use C<--apt> and C<-xyz> | ||||
| assign $apt the value "yes".  | ||||
| 
 | ||||
| Example: B<$apt = "yes";> | ||||
| 
 | ||||
| =head2 PAGER | ||||
| 
 | ||||
| less is a nice pager, unless you like more!  Pager is used for C<--help> | ||||
| and B<swim> called without any options. There is an option C<--nopager> or | ||||
| C<-n>.  more comes from the required package util-linux, whereas less | ||||
| comes from a standard package called less.  Values: "less", "more", or | ||||
| "most" or...  | ||||
| 
 | ||||
| B<$ENV{PAGER} = "less";> | ||||
| 
 | ||||
| =head2 NOT-INSTALLED VARIABLES  | ||||
| 
 | ||||
| Assign values for $architecture and/or $distribution to avoid having to | ||||
| use C<--arch> and C<--dists> everytime the not-installed databases are | ||||
| accessed with C<-n> or made or altered. | ||||
| 
 | ||||
| Architectures are always being added so check with Debian to find a list.  | ||||
| There is I<alpha, arm, hurd-i386 (alternative kernel to linux), i386, | ||||
| m68k, powerpc, sparc>.  Just use the arch found after the hyphen in the | ||||
| Contents-(arch) file. | ||||
| 
 | ||||
| B<$architecture = "i386";> | ||||
| 
 | ||||
| The distribution can be either I<stable, unstable, frozen, or experimental | ||||
| (rare)>.  These represent the state of development that the packages are | ||||
| under.  The unstable distribution can have lot's of changes within a very | ||||
| short time period, and frozen may or may not be available. | ||||
| 
 | ||||
| B<$distribution = "unstable";> | ||||
| 
 | ||||
| Distributions are divided into sections.  These sections were called | ||||
| distributions in the version 2.4.1.0 packaging manual, because they were | ||||
| at one time separate distributions, but this has since changed.   | ||||
| 
 | ||||
| You can determine which of the sections I<main, non-free, contrib or | ||||
| non-US> to pull out of the Contents file if you don't want to use | ||||
| C<--main>, C<--contrib>, C<--non-free>, and C<--non-us> to selectively | ||||
| pick the sections.  | ||||
| 
 | ||||
| For efficiency, you should choose the sections which you will be pulling | ||||
| out of the Packages file(s) being targetted.   | ||||
| 
 | ||||
| Rule: Use "non-US" not "non-us". | ||||
| 
 | ||||
| B<@user_defined_section = qw(main contrib non-free non-US);> | ||||
| 
 | ||||
| =head2 DF LOCATION | ||||
| 
 | ||||
| A little philosophy:  B<swim> was developed for maximum versatility, so | ||||
| whether you are just interested in researching, and keeping tabs on the | ||||
| newest packages, or maintaining a Debian virtual distribution on a | ||||
| non-Debian distribution, or you are a using B<swim> for distribution | ||||
| development, B<swim> provides a way.   | ||||
| 
 | ||||
| The next two variables determine the location of the DF (default | ||||
| directory/file system) | ||||
| 
 | ||||
| The default directory keeps track of Contents and/or Packages databases | ||||
| retrieved with --ftp.  The Contents and Packages databases and Release | ||||
| file are give names specific to the distribution and architectures they | ||||
| represent using the naming convention found in apt's sources directory.  | ||||
| You also have the freedom not to use the default directory, in which case | ||||
| swim will still do the renaming and keeping track of the mtime, but you | ||||
| will have to remember where you put the files. | ||||
| 
 | ||||
| B<$default_directory = '/root/.swim';> | ||||
| 
 | ||||
| The default root directory (DRD) is the key to easy management of binary | ||||
| packages, source, dsc, and diff files received from --ftp, and provides an | ||||
| easy way to put together a personalized distribution. This directory can | ||||
| be a real ftp site on your computer, or put wherever else you are | ||||
| allowed to have directories.  The DRD is always placed below the value | ||||
| assigned to $default_directory.  According to the previous assignment to  | ||||
| $default_directory, if the DRD is "/pub/a/debian" then the full path | ||||
| would be "/root/.swim/pub/a/debian".  | ||||
| 
 | ||||
| Example: When a package is downloaded it will be placed in | ||||
| dists/distribution/section/architecture/subject below the DRD.  | ||||
| 
 | ||||
| Rule: debian must be the final directory before dists, this is because | ||||
| other distributions are placed alongside debian, like debian-non-US or | ||||
| personal (specialized distribution). | ||||
| 
 | ||||
| B<$default_root_directory = '/pub/debian';> | ||||
| 
 | ||||
| Because you may be using a real ftp site, this variable allows you to | ||||
| determine what permissions B<swim> will assign for directories it creates | ||||
| below the DRD.  | ||||
| 
 | ||||
| B<$permission = '0755';> | ||||
| 
 | ||||
| =head2 TEMPORARY DIRECTORY | ||||
| 
 | ||||
| If you want to set an alternative directory for the temporary files | ||||
| created when the databases are made, change here.  You may want to make | ||||
| $tmp a RAM disk.  See package loadlin for initrd documentation and an | ||||
| explanation for making such a disk.  There is also documentation in | ||||
| /usr/src/kernel-source.version/Documentation.  Whether this will speed | ||||
| things up is a subject of experimentation.  | ||||
| 
 | ||||
| B<$tmp = "/tmp";> | ||||
| 
 | ||||
| =head2 FTP | ||||
| 
 | ||||
| You can alter the Firewall, Port, Timeout, Debug and Passive | ||||
| characteristics of the ftp client as defined in Net::FTP(3pm) by providing | ||||
| arguments to these variables. All variables but $timeout are set to untrue | ||||
| by default.   | ||||
| 
 | ||||
|  $firewall = 0; (FTP firewall machine name) | ||||
|  $port = 0;  (defaults to 23) | ||||
|  $timeout = 120;  (120 seconds) | ||||
|  $debug = 0;  (1 will turn on STDERR) | ||||
|  $passive = 0; (1 will enable) | ||||
| 
 | ||||
| =head1 OTHER VARIABLES | ||||
| 
 | ||||
| see SWIM::Conf | ||||
| 
 | ||||
| =head1 FILES | ||||
| 
 | ||||
|  /etc/swim/swimrc | ||||
|  ~/.swim/swimrc | ||||
| 
 | ||||
| =head1 SEE ALSO | ||||
| 
 | ||||
| swim(8), Net::FTP(3pm) | ||||
| 
 | ||||
| =head1 BUGS | ||||
| 
 | ||||
| Send directly to mttrader@access.mountain.net. | ||||
| 
 | ||||
| =head1 AUTHOR | ||||
| 
 | ||||
| Jonathan D. Rosenbaum <mttrader@access.mountain.net>  | ||||
| 
 | ||||
| =head1 COPYRIGHT | ||||
| 
 | ||||
| 
 | ||||
| Copyright (c) 1999 Jonathan Rosenbaum. All rights reserved. This program | ||||
| is free software; you can redistribute it and/or modify it under the GPL.  | ||||
| 
 | ||||
| =cut | ||||
							
								
								
									
										947
									
								
								lib/DB.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										947
									
								
								lib/DB.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,947 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::DB; | ||||
| use strict; | ||||
| use SWIM::DB_Library qw(:Db); | ||||
| use SWIM::Format; | ||||
| use SWIM::Conf qw(:Path); | ||||
| use SWIM::Global; | ||||
| use vars qw(@ISA @EXPORT_OK); | ||||
|     | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT_OK = qw(db rebuildflatdb); | ||||
| 
 | ||||
| 
 | ||||
| # --db --rebuildflatdb  db() rebuildflatdb() | ||||
| 
 | ||||
| # The goal here is to save some time by just updating the database rather | ||||
| # than rebuilding it.  Generally, though, swim -i <package> would be the | ||||
| # favorable way of doing this, and ultimately may become the primary way of | ||||
| # setting up the databases after the required packages for this program are  | ||||
| # set-up.  This is because --db has to check the status file, whereas -i | ||||
| # uses statusindex.db, and grabs package information right from the | ||||
| # package, there are exceptions to this, certain things like the status | ||||
| # will have to be found from the status file or some other method. | ||||
| sub db { | ||||
| 
 | ||||
|   # Well, we better check for any changes in the status file, before we | ||||
|   # attempt anything. This is made easy by the version reference hash created | ||||
|   # when --initdb or --rebuilddb is run, and then comparing this to the new | ||||
|   # results when --db is run.  Only then will we process, add, and remove | ||||
|   # packages when we know what is gone, and what is new (whether its a  | ||||
|   # new package name, or a package with a new version or older version). | ||||
|   # The statusindex.deb could be used for version checking, instead the | ||||
|   # important status field is compared, so if we have situations like  | ||||
|   # "deinstall ok config-file" this will be recognized as a CHANGE.  The | ||||
|   # update takes place so that the status field remain proper. | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   # description stuff | ||||
|   my (@description, @ldescription); | ||||
|   # my @dpackage; # not needed here | ||||
|    | ||||
|   # does status exist | ||||
|   my $the_status;  | ||||
| 
 | ||||
|   # Keep track of changes to the status file | ||||
|   my $rootsky = "/."; | ||||
|   my @package; | ||||
|   my @name; | ||||
|   my $status; | ||||
|   my @changed_packages; | ||||
|   my @gone; | ||||
|   my (@GONE, @CHANGED, @NEW); | ||||
|   my @before; | ||||
|   my %compare; | ||||
| 
 | ||||
|   # The mys for NEW | ||||
|   my $count = 0; | ||||
|   # a special one to deal with package[1] version change. | ||||
|   my $packv;  | ||||
|   my (@essential,$priority,$section,$installed_size,$maintainer,$source); | ||||
|   my (%group, $group); | ||||
| 
 | ||||
|   # Keeps a package->version database  | ||||
|   # to save time over using status | ||||
|   my @status; | ||||
|   my ($replaces, $provides, $depends, $pre_depends, $recommends, $suggests,  | ||||
|       $conflicts); | ||||
|   my (@conffiles,$line_before,@conf,@complete,@form,@formly); | ||||
|   my $format_deb = "$tmp/format.deb"; | ||||
| 
 | ||||
|   dbi(\%commands); ib(\%commands); sb(\%commands); | ||||
|   # Check differences now. | ||||
|   print "checking for new, changed, and removed packages\n"; | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|       open(DIFFERENCE,"$parent$library/status"); | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|       open(DIFFERENCE,"$parent$base/status"); | ||||
|   } | ||||
|       while (<DIFFERENCE>) { | ||||
|        # Package name | ||||
|         if (/^Package:/i) {              | ||||
|           @package = split(/: /,$_);                                    | ||||
|           chomp $package[1]; | ||||
|         }  | ||||
|         elsif (/^Status:/) { | ||||
|             chomp; | ||||
|             $status = substr($_,8); | ||||
|             # a test | ||||
|             #if ($status eq "purge ok not-installed") { | ||||
|             #  if (defined $db{$package[1]}) { | ||||
|             #   print "$db{$package[1]}\n"; | ||||
|             #  } | ||||
|             #} | ||||
|         } | ||||
|         # hold ok not-installed - may want to change this just to | ||||
|         # non-installed. | ||||
|         ########### | ||||
|         # VERSION # | ||||
|         ########### | ||||
|         elsif (/^Version:/ && $status !~ /not-installed/) { | ||||
|              my $version = $_; chomp $version; | ||||
|              my $ver = m,Version:\s(.*),; my $statusname; | ||||
|              if (defined $sb{$package[1]}) {  | ||||
|               $statusname = (split(/\s/,$sb{$package[1]}))[3]; | ||||
|               $statusname =~ s/:/ /g; | ||||
|              } | ||||
|               ######## | ||||
|               # GONE # | ||||
|               ########  | ||||
|               if (defined $db{$package[1]}) { | ||||
|                  push(@gone,"$package[1]_$1"); | ||||
|                if ("$package[1]_$1" ne $db{$package[1]}) { | ||||
|                   $compare{$package[1]} = "$package[1]_$1"; | ||||
|                } | ||||
|               # Version remained the same, but status changed | ||||
|               # even though $statusname may be undefined..this | ||||
|               # routine is only done when it does exist.  | ||||
|               ###### | ||||
|               # CR # | ||||
|               ###### | ||||
|               elsif ("$package[1]_$1" eq $db{$package[1]} && | ||||
|                      $statusname ne $status) { | ||||
|                  push(@changed_packages, "$package[1]"); | ||||
|                  $compare{$package[1]} = "$package[1]_$1"; | ||||
|               } | ||||
|              } | ||||
|              ####### | ||||
|              # NEW # | ||||
|              ####### | ||||
|              elsif (!defined $db{$package[1]}) { | ||||
|                  push(@NEW,$package[1]); | ||||
|                  $compare{$package[1]} = "$package[1]_$1"; | ||||
|                  push(@gone,"$package[1]_$1"); | ||||
|              } | ||||
|         } | ||||
|       } | ||||
|       close(DIFFERENCE); | ||||
|        | ||||
|     # lets find what existed before, ofcourse mistakes in /. better be | ||||
|     # taken care of beforehand, because this ignores those here.  Some time | ||||
|     # may have been saved by using a separate database rather than /., but, | ||||
|     # this keeps things clean. | ||||
|     if ($ib{$rootsky}){ | ||||
|       @before  = split(/\s/,$ib{$rootsky}); | ||||
|       my %tracker; | ||||
|       grep($tracker{$_}++,@gone); | ||||
|       my @goners = grep(!$tracker{$_},@before); | ||||
|       foreach (@goners) { | ||||
|          m,(^.*)_.*$,; | ||||
|          if (!defined $compare{$1}) { | ||||
|             push(@GONE,$1); | ||||
|          } | ||||
|          else {             | ||||
|             # these will be process like @GONE for original, and @NEW for | ||||
|             # new | ||||
|            push(@CHANGED,$1); | ||||
|          } | ||||
|       }       | ||||
|      } | ||||
|      else { | ||||
|        print "swim: missing important database\n"; exit; | ||||
|      } | ||||
|      | ||||
|      foreach (@GONE) { | ||||
|         print "GONE $_\n"; | ||||
|      } | ||||
|      foreach (@CHANGED) { | ||||
|        print "CHANGED $_\n"; | ||||
|      } | ||||
|      foreach (@changed_packages) { | ||||
|        push(@CHANGED,$_); | ||||
|        print "CHANGED STATUS $_\n"; | ||||
|      } | ||||
|      foreach (@NEW) { | ||||
|       print "NEW $_\n"; | ||||
|      } | ||||
| 
 | ||||
|       my $new=$#NEW + 1; my $cr=$#changed_packages + 1; | ||||
|       my $ch=($#CHANGED + 1) - $cr; my $gon= $#GONE + 1; | ||||
|     if ($commands->{"check"}) { | ||||
|       print "\n       TOTAL\n       -----\n"; | ||||
|       print "NEW $new\n"; print "GONE $gon\n"; | ||||
|       print "CHANGED $ch\n"; print "CHANGED STATUS $cr\n"; exit; | ||||
|     } | ||||
|       print "\n       TOTAL\n       -----\n"; | ||||
|       print "NEW $new\n"; print "GONE $gon\n"; | ||||
|       print "CHANGED $ch\n"; print "CHANGED STATUS $cr\n"; | ||||
| 
 | ||||
| 
 | ||||
|     @GONE = (@GONE,@CHANGED); | ||||
|     @NEW = (@NEW,@CHANGED); | ||||
| 
 | ||||
|     undef @before; # can use below. | ||||
|     untie %db; | ||||
|     undef %db; | ||||
|     untie %ib; | ||||
|     undef %ib; | ||||
| 
 | ||||
|     # Going to be adding some stuff to nsearchindex.deb and ndirindex.deb | ||||
|     # so better remove any compressed versions if they exist | ||||
|     if (defined @GONE || defined @NEW) { | ||||
|      if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|       ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|       (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|          if (-e "$parent$library/searchindex.deb") { | ||||
|              unlink("$parent$library/searchindex.deb.gz"); | ||||
|              unlink("$parent$library/dirindex.deb.gz"); | ||||
|          }  | ||||
|      } | ||||
|      elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|          if (-e "$parent$base/searchindex.deb") { | ||||
|              unlink("$parent$base/searchindex.deb.gz"); | ||||
|              unlink("$parent$base/dirindex.deb.gz"); | ||||
|           } | ||||
|      } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     # Time for some fun stuff | ||||
|     # There are three states:  GONE - all information about this package | ||||
|     # needs to be removed from the databases.  NEW - all information about | ||||
|     # this package needs to be put in the databases.  CHANGED - a  | ||||
|     # combination of the two previous, information could be cross | ||||
|     # referenced and checked for changes, but it's probably no saving of | ||||
|     # time, so first remove information from the same package of a | ||||
|     # different version, then add the information about the package of the | ||||
|     # new version (older or newer)  | ||||
| 
 | ||||
|     ############# | ||||
|     #           # | ||||
|     #   GONE    # | ||||
|     #           # | ||||
|     ############# | ||||
|     # GONE.  (reverse applies to NEW) | ||||
|     #  For package.deb - Delete description  | ||||
|     # (packagename_version), packagenameREP, packagenamePRO,  | ||||
|     # packagenameDEP, packagenamePRE, packagenameREC, | ||||
|     # packagenameSUG, packagenameCON, packagenameCONF. delete package -> | ||||
|     # version.   | ||||
|     # | ||||
|     # for fileindex.deb -  | ||||
|     # Find all files and directories associated with the package. Delete | ||||
|     # these files (keys). Find all directories where the file | ||||
|     # exists..delete package name from value, delete whole key if it is the | ||||
|     # only package name.  | ||||
|     # | ||||
|     # for groupindex - delete package name (value) from Section | ||||
|     # it belonged to..humm, find section package belongs to in | ||||
|     # statusuindex.deb, and delete whole Section key if only one.   | ||||
|     # | ||||
|     # for statusindex.deb - | ||||
|     # delete package -> version group.  | ||||
|     # | ||||
|     # for flat files dirindex and searchindex - | ||||
|     # the removal of files and/or directories can be put on hold, and | ||||
|     # done with an option at a later time, since fileindex.deb remembers | ||||
|     # current state, at a later time the old state of the flat files can be | ||||
|     # compared to the new state of fileindex, and these files can be | ||||
|     # rewritten.  This is all o.k. because these extra files or directories  | ||||
|     # will return undef in search() if the packages don't exist.   | ||||
|   | ||||
|     ping(\%commands); # uses $ping for package.deb | ||||
|     zing(\%commands); # uses $zing for fileindex.deb | ||||
|     ging(\%commands); # uses $ging for groupindex.deb | ||||
|     sing(\%commands); # uses $sing for statusindex.deb | ||||
| 
 | ||||
|    $| = 1; my $x = 1; | ||||
|    foreach (@GONE) { | ||||
|      print "G|C|CS $x $_.list\r"; | ||||
|      $x++; | ||||
|      #first delete keys from package.deb | ||||
|       # If I kept this the name_version would be remembered. | ||||
|       $ping->del($_); | ||||
|       my $orig_argument = $_; | ||||
|       my $packname_version = (split(/\s/,$sb{$orig_argument}))[0];       | ||||
|       $packname_version =~ s,\+,\\\+,g; | ||||
|       $argument = "$_"; | ||||
|       ver(\%commands); | ||||
|        $ping->del($argument); | ||||
|       my $conf = $argument . "CONF"; | ||||
|        $ping->del($conf); | ||||
|       $conf = $argument . "REP"; | ||||
|        $ping->del($conf); | ||||
|       $conf = $argument . "PRO"; | ||||
|        $ping->del($conf); | ||||
|       $conf = $argument . "DEP"; | ||||
|        $ping->del($conf); | ||||
|       $conf = $argument . "PRE"; | ||||
|        $ping->del($conf); | ||||
|       $conf = $argument . "REC"; | ||||
|        $ping->del($conf); | ||||
|       $conf = $argument . "SUG"; | ||||
|        $ping->del($conf); | ||||
|       $conf = $argument . "CON"; | ||||
|        $ping->del($conf); | ||||
|      untie $ping; | ||||
| 
 | ||||
|     # next let's go into fileindex.deb and hunt down all directories and | ||||
|     # files associated with this package.  It would be kind of nice to use | ||||
|     # package_name.list, but it's probably more realistic not to depend on | ||||
|     # the existence of these file..unless a backup is made.  Now if -i is used | ||||
|     # this would be a simple matter, but in this case things are different. | ||||
|     # A database to accomplish this wasn't realistic, so the backup | ||||
|     # files for *.list are in ./info/backup/*.list.bk.  We will also have to | ||||
|     # deal with those rare cases that forget /. (smail 2.0v).  We should remove | ||||
|     # this file as well as the packagename-conf.md5sums file below. | ||||
|     my $file = "$parent$base/info/backup/$_.list.bk"; | ||||
|     my $md5sum_file = "$parent$base/info/$_-conf.md5sums"; | ||||
|      open(LIST,"$file"); | ||||
|      while (<LIST>) { | ||||
|        chomp; | ||||
|        if (defined $ib{$_}) { | ||||
|           my $status = ($ib{$_} =~ s,$packname_version ,,); | ||||
|           if ($status eq "") { | ||||
|             $status = ($ib{$_} =~ s, $packname_version,,); | ||||
|             if ($status eq "") { | ||||
|               $ib{$_} =~ s,$packname_version,,; | ||||
|             } | ||||
|           } | ||||
|           if ($ib{$_} eq "") { | ||||
|             $zing->del($_); | ||||
|           } | ||||
|        } # if defined         | ||||
|      } | ||||
|     close(LIST);   | ||||
|     unlink("$file"); | ||||
| 
 | ||||
|        #######################   | ||||
|        # deinstall situation # | ||||
|        ####################### | ||||
|        my $yit = (split(/\s/,$sb{$orig_argument}))[3]; | ||||
|        if ($yit eq "deinstall:ok:config-files" ||  | ||||
|            $yit eq "purge:ok:config-files") { | ||||
|         if (defined $ib{"/."}) { | ||||
|           my $status = ($ib{"/."} =~ s,$packname_version ,,); | ||||
|           if ($status eq "") { | ||||
|             $status = ($ib{"/."} =~ s, $packname_version,,); | ||||
|             if ($status eq "") { | ||||
|               $ib{"/."} =~ s,$packname_version,,; | ||||
|             } | ||||
|           } | ||||
|           if ($ib{"/."} eq "") { | ||||
|             $zing->del($_); | ||||
|           } | ||||
|         } # if defined         | ||||
|        } # deinstall situation | ||||
| 
 | ||||
|     if (-e $md5sum_file) { | ||||
|      unlink("$md5sum_file"); | ||||
|     } | ||||
| 
 | ||||
|      # remove from the group, and if only one remove the group.   | ||||
|      # Let's first find out which group this monster belongs to. | ||||
|      if (defined $sb{$orig_argument}) { | ||||
|         (my $oa = $orig_argument) =~ s,\+,\\\+,g; | ||||
|         my($section) = (split(/\s/,$sb{$orig_argument}))[1]; | ||||
|         if (defined $gb{$section}) { | ||||
|           my $status = ($gb{$section} =~ s,$oa ,,); | ||||
|           if ($status eq "") { | ||||
|             $status = ($gb{$section} =~ s, $oa,,); | ||||
|             if ($status eq "") { | ||||
|               $gb{$section} =~ s,$oa,,; | ||||
|             } | ||||
|           } | ||||
|           if ($gb{$section} eq "") { | ||||
|             $ging->del($section); | ||||
|           } | ||||
|         } | ||||
|      }  | ||||
|      | ||||
|      # Now ditch the package->version group in statusindex.deb | ||||
|      $sing->del($orig_argument); | ||||
|      untie $sing; | ||||
| 
 | ||||
|    } # end foreach OLD    | ||||
| 
 | ||||
|    print "\n" if $#GONE != -1 && $#NEW == -1; | ||||
| 
 | ||||
|    ############# | ||||
|    #           # | ||||
|    #   NEW     # | ||||
|    #           # | ||||
|    ############# | ||||
|    if (-e "$parent$base/status" && -e "$parent$base/info") { | ||||
|        $the_status = "$parent$base/status"; | ||||
|    } | ||||
|    else { | ||||
|        print "swim: crucial file(s)/directories are missing in $parent\n"; | ||||
|        exit; | ||||
|    } | ||||
|    my %exacts; | ||||
|    my $goon; | ||||
|    print "\n" if $#NEW != -1; $x = 1; | ||||
|    foreach (@NEW) { | ||||
|      $exacts{$_} = "yes"; | ||||
|    }  | ||||
|      # first let's find the fields to put into packages.deb | ||||
|      # We'll have to go through the status file again, something we | ||||
|      # wouldn't have had to do with swim -i.  As it turns out, a good | ||||
|      # percentage of the information can be processed into the database | ||||
|      # while going through status. | ||||
|     open(PRETTY, ">$format_deb"); | ||||
|     open(AVAIL, "$the_status"); | ||||
|       while (<AVAIL>) { | ||||
|       # here's the difference with database(), we just find the packages | ||||
|       # which belong to the hash %exacts | ||||
|        # Package name | ||||
|         if (/^Package:|^PACKAGE:/) {                                               | ||||
|           @package = split(/: /,$_);                                                   | ||||
|           chomp $package[1]; | ||||
|           if (defined $exacts{$package[1]}) { | ||||
|              print "N|C|CS $x\r"; $x++; | ||||
|              $goon = "yes"; | ||||
|           } | ||||
|           else { | ||||
|              $goon = "no"; | ||||
|              undef @package; | ||||
|              next; | ||||
|           } | ||||
|         }  | ||||
|        elsif ($goon eq "no") { | ||||
|          next; | ||||
|        } | ||||
|        elsif (/^Status:/) { | ||||
|             $status = $_; | ||||
|         } | ||||
|         elsif (/^Essential/) { | ||||
|            @essential = split(/: /,$_);                                                   | ||||
|         } | ||||
|         # missing priority and section will be dealt with below | ||||
|         elsif (/^Priority:/) { | ||||
|             $priority = $_; | ||||
|         } | ||||
|         elsif (/^Section:/) { | ||||
|             $section = $_; | ||||
|             # make the hash for the groupindex.deb | ||||
|             $group = substr($section,9); | ||||
|             chomp $group; | ||||
|             # we will put not-installed in their own group for reference | ||||
|             if ($status !~ /not-installed/) { | ||||
|               if (!defined $gb{$group}) { | ||||
|                    $ging->put($group,$package[1]); | ||||
|               } | ||||
|               else { | ||||
|                   my $change_group = "$gb{$group} $package[1]"; | ||||
|                   $ging->del($group); | ||||
|                   $ging->put($group,"$change_group"); | ||||
|               }  | ||||
|             } | ||||
|         } | ||||
|         elsif (/^Installed-Size:/) { | ||||
|             $installed_size = $_; | ||||
|         } | ||||
|         elsif (/^Maintainer:/) { | ||||
|             $maintainer = $_; | ||||
|         } | ||||
|         elsif (/^Source:/) { | ||||
|             $source = $_; | ||||
|         } | ||||
|         # hold ok not-installed - may want to change this just to | ||||
|         # non-installed. | ||||
|         elsif (/^Version:/ && $status !~ /not-installed/) { | ||||
|             my $version = $_; | ||||
|             chomp $version; | ||||
|             ########### | ||||
|             # SECTION # | ||||
|             ########### | ||||
|             if (defined $section) { | ||||
|               chomp $section; | ||||
|             } | ||||
|             else { | ||||
|               nsb(\%commands); | ||||
|               if (defined $nsb{$package[1]}) { | ||||
|                 my ($nvname,$ngname,$npriorname) = | ||||
|                 split(/\s/,"$nsb{$package[1]}",3); | ||||
|                 $group = $ngname; | ||||
|               }  | ||||
|               else { | ||||
|                 $group = "unavailable"; | ||||
|               } | ||||
|             } | ||||
|             $col1 = "Package: $package[1]"; | ||||
|             $col2 = $status; | ||||
|             write PRETTY; | ||||
|             $col1 = $version; | ||||
|             my $ver = m,Version:\s(.*),;          | ||||
|              # This creates a name -> version index in package.deb, | ||||
|              # and the statusindex.deb database which will serve to | ||||
|              #  determine if the status has changed when  --db or -i is | ||||
|              # run. | ||||
|              $packv = "$package[1]_$1"; | ||||
|              $ping->put($package[1],$packv); | ||||
|              my ($priory,$statusy); | ||||
|              ############ | ||||
|              # PRIORITY # | ||||
|              ############ | ||||
|              if (defined $priority) {        | ||||
|               $priory = substr($priority,10); | ||||
|              } | ||||
|              else { | ||||
|               nsb(\%commands); | ||||
|               if (defined $nsb{$package[1]}) { | ||||
|                 my ($nvname,$ngname,$npriorname) = | ||||
|                 split(/\s/,"$nsb{$package[1]}",3); | ||||
|                 $priory = $npriorname; | ||||
|               } | ||||
|               else { | ||||
|                 $priory = "unavailable"; | ||||
|               } | ||||
|              } | ||||
|              chomp $priory; | ||||
|              $statusy = substr($status,8); | ||||
|              chomp $statusy; | ||||
|              $statusy =~ s/\s/:/g; | ||||
|              my $thimk = "$packv $group $priory $statusy"; | ||||
|              $sing->put($package[1],$thimk); | ||||
|              $package[1] = "$packv"; | ||||
|             if(defined($essential[1])) {               | ||||
|              $col2 = "Essential: $essential[1]"; | ||||
|              @essential = (); | ||||
|             } | ||||
|             else { | ||||
|               $col2 = "Essential: no\n"; | ||||
|             } | ||||
|             write PRETTY; | ||||
|             ###################### | ||||
|             # SECTION & PRIORITY # | ||||
|             ###################### | ||||
|             if (defined $section) { | ||||
|               $col1 = $section; | ||||
|             } | ||||
|             else { | ||||
|               nsb(\%commands); | ||||
|               $package[1] =~ m,(.*)_.*,; | ||||
|               my $packthing = $1; | ||||
|               if (defined $nsb{$packthing}) { | ||||
|                 my ($nvname,$ngname,$npriorname) = | ||||
|                 split(/\s/,"$nsb{$packthing}",3); | ||||
|                 $col1 = "Section: $ngname"; | ||||
|                 # we can put it in now, no deletion needed | ||||
|                 if (!defined $gb{$group}) { | ||||
|                    $ging->put($group,$packthing); | ||||
|                 } | ||||
|                 else { | ||||
|                   my $change_group = "$gb{$group} $packthing"; | ||||
|                   $ging->del($group); | ||||
|                   $ging->put($group,"$change_group"); | ||||
|                 }  | ||||
|               } | ||||
|               else { | ||||
|                 $col1 = "Section: unavailable"; | ||||
|               } | ||||
|             } | ||||
|             if (defined $priority) { | ||||
|               $col2 = $priority; | ||||
|             } | ||||
|             else { | ||||
|               nsb(\%commands); | ||||
|               $package[1] =~ m,(.*)_.*,; | ||||
|               my $packthing = $1; | ||||
|               if (defined $nsb{$packthing}) {           | ||||
|                 my ($nvname,$ngname,$npriorname) = | ||||
|                 split(/\s/,"$nsb{$packthing}",3); | ||||
|                 $col2 = "Section: $npriorname"; | ||||
|               } | ||||
|               else { | ||||
|                  $col2 = "Priority: unavailable\n"; | ||||
|               } | ||||
|             } | ||||
|             write PRETTY; | ||||
|             #my $cool = $installed_size . $maintainer; | ||||
|             #print PRETTY $cool; | ||||
|             $col1 = $installed_size; | ||||
|             if (defined $source) { | ||||
|               $col2 = $source; | ||||
|             } | ||||
|             else { | ||||
|               $col2 = ""; | ||||
|             }  | ||||
|             write PRETTY; | ||||
|             undef $source; | ||||
|             print PRETTY $maintainer | ||||
|         } | ||||
| 
 | ||||
|         # This stuff will be available with seperate query flags or All | ||||
|         elsif (/^Replaces:/) { | ||||
|             $replaces = $_; | ||||
|               if (defined($replaces)) { | ||||
|                  $ping->put("$package[1]REP",$replaces); | ||||
|               } | ||||
|          } | ||||
|         elsif (/^Provides:/) { | ||||
|             $provides = $_; | ||||
|               if (defined($provides)) { | ||||
|                  $ping->put("$package[1]PRO",$provides); | ||||
|               } | ||||
|         }          | ||||
|         elsif (/^Depends:/) { | ||||
|             $depends = $_; | ||||
|               if (defined($depends)) { | ||||
|                  $ping->put("$package[1]DEP",$depends); | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Pre-Depends:/) { | ||||
|             $pre_depends = $_; | ||||
|               if (defined($pre_depends)) { | ||||
|                  $ping->put("$package[1]PRE",$pre_depends); | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Recommends:/) { | ||||
|             $recommends = $_; | ||||
|               if (defined($recommends)) { | ||||
|                  $ping->put("$package[1]REC",$recommends); | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Suggests:/) { | ||||
|             $suggests = $_; | ||||
|               if (defined($suggests)) { | ||||
|                  $ping->put("$package[1]SUG",$suggests); | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Conflicts:/) { | ||||
|             $conflicts = $_; | ||||
|               if (defined($conflicts)) { | ||||
|                  $ping->put("$package[1]CON",$conflicts); | ||||
|               } | ||||
|         }         | ||||
|        # Gather the Configuration Files, Description comes after. | ||||
|        # Available with a single flag. | ||||
|         elsif (/^Conffiles:/) { | ||||
|              my $line = <AVAIL>; | ||||
|              while ($line !~ /^Description:/) { | ||||
|                  push(@conffiles,$line); | ||||
|                  $line = <AVAIL>; | ||||
|                    if ($line =~ /^Description/) { | ||||
|                          $line_before = $line; | ||||
|                    # put conffiles into one variable | ||||
|                      if (defined $package[1]) { | ||||
|                      } | ||||
|                        my ($c, $cool); | ||||
|                          if ($#conffiles != 0) {  | ||||
|                             for ($c = $#conffiles; $c >= 0; $c--) { | ||||
|                               if ($c > 0) { | ||||
|                                 $cool = $conffiles[$c-1] .= $conffiles[$c];    | ||||
|                               }              | ||||
|                              } #end for | ||||
|                           } | ||||
|                           else { | ||||
|                             $cool = $conffiles[0]; | ||||
|                           } | ||||
|                           @conffiles = (); | ||||
|                           $ping->put("$package[1]CONF",$cool); | ||||
|                    } #if ($line =~ /^Desc  | ||||
|               }  # while ($line ! /^Desc           | ||||
|         } # elsif (/^Conffiles  | ||||
|         untie %nsb; | ||||
| 
 | ||||
|         # Only interested in available packages..so this is fine. | ||||
|         # To be combined with first fields. | ||||
|         if (/Description:|^\s\w*|^\s\.\w*/ ||  | ||||
|             defined($line_before) =~ /^Description/){  | ||||
|            my $many_lines; | ||||
|             if (defined($line_before)) { | ||||
|                 push(@ldescription, $line_before); | ||||
|                 push(@ldescription, $_); | ||||
|                 $line_before = (); | ||||
|             } | ||||
|             else { | ||||
|                  $many_lines = $_; | ||||
|             }  | ||||
|            if ($_ !~ /^\n$/) { | ||||
|              $count++; | ||||
|              if ($count == 1) { | ||||
|                if (defined $package[1]) { | ||||
|                  #chomp $package[1]; | ||||
|                  #push(@dpackage,$package[1]); | ||||
|                  push(@description,$package[1]); | ||||
|                } | ||||
|               }  | ||||
|                if (defined($many_lines)) { | ||||
|                push(@ldescription,$many_lines); | ||||
|                } | ||||
|            } # end if ($_ !~ /^\n$/ | ||||
|            else { | ||||
|              $count = 0; | ||||
|              # let's put each description into one scalar | ||||
|              my ($c, $cool); | ||||
|               if ($#ldescription != 0) {  | ||||
|                 for ($c = $#ldescription; $c >= 0; $c--) { | ||||
|                   if ($c > 0) { | ||||
|                     $cool = $ldescription[$c-1] .= $ldescription[$c];    | ||||
|                   }              | ||||
|                } #end for | ||||
|               }  # end if ($#ld | ||||
|               else { | ||||
|                 $cool = $ldescription[0]; | ||||
|               } | ||||
|               if (defined $cool) { | ||||
|                  push(@description,$cool); | ||||
|               }  | ||||
|                  @ldescription = (); | ||||
|            } # end else         | ||||
|            $line_before = (); | ||||
|         }  | ||||
|       untie $ping; | ||||
|       untie $ging; | ||||
|       untie $sing; | ||||
|       } # end while (<AVAIL>) | ||||
|       close(PRETTY); | ||||
| 
 | ||||
| 
 | ||||
|   # Let's put together the description with the rest of its fields. | ||||
|   open(FIELDS,"$format_deb"); | ||||
|   while (<FIELDS>) { | ||||
|      push(@form,$_); | ||||
|   } | ||||
|   close(FIELDS);   | ||||
| 
 | ||||
|   foreach (@form) { | ||||
|     push(@formly,$_);     | ||||
|     my ($cool); | ||||
|     $count++;   | ||||
|     if ($count == 5) { | ||||
|              my ($c, $cool); | ||||
|               if ($#formly != 0) {  | ||||
|                 for ($c = $#formly; $c >= 0; $c--) { | ||||
|                   if ($c > 0) { | ||||
|                     $cool = $formly[$c-1] .= $formly[$c];    | ||||
|                   }              | ||||
|                } #end for | ||||
|               }  # end if ($#ld | ||||
|               else { | ||||
|                 $cool = $formly[0]; | ||||
|               } | ||||
|     push(@complete,$cool); | ||||
|     @formly = (); | ||||
|     $count = 0; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   my $name_version; | ||||
|   foreach (@description) { | ||||
|    if ($count == 1) { | ||||
|      # -i | ||||
|      my $lingo = shift(@complete); | ||||
|      $lingo = $lingo . $_; | ||||
|      #push(@Tdescription, $lingo);  | ||||
|      $ping->put($name_version,$lingo); | ||||
|      $lingo = (); | ||||
|      $count = 1; | ||||
|    } | ||||
|    else { | ||||
|      # packagename_version | ||||
|      #push(@Tdescription, $_);  | ||||
|      $name_version = $_; | ||||
|      $count = 0; | ||||
|    } | ||||
|    $count++; | ||||
|    untie $ping; | ||||
|  } | ||||
|  undef $ping; | ||||
|   | ||||
|    unlink($format_deb); | ||||
| 
 | ||||
|    # Now time to do some file/dir stuff.  A backup of *list needs to be | ||||
|    # made, might as well use this.  There is a possibility this can be | ||||
|    # used instead of fastswim for initial fileindex.deb. | ||||
|      my $package_name; | ||||
|      if (!-d "$parent$base/info/backup") { | ||||
|         mkdir("$parent$base/info/backup",0666); | ||||
|      } | ||||
|      print "\n" if $#NEW != -1; $x = 1; | ||||
| 
 | ||||
|   foreach $package_name (@NEW) { | ||||
|      open(FILENAME,"$parent$base/info/$package_name.list"); | ||||
|      open(CP,">$parent$base/info/backup/$package_name.list.bk"); | ||||
|        while (<FILENAME>) { | ||||
|          print CP $_; | ||||
|        } | ||||
|      close(FILENAME); | ||||
|      close(CP); | ||||
| 
 | ||||
|      my $file = "$parent$base/info/backup/$package_name.list.bk"; | ||||
|      print "#$x"; print " N|C $package_name.list             \r"; | ||||
|      $x++; | ||||
|      open(LIST,"$file"); | ||||
|      while (<LIST>) { | ||||
|        chomp; | ||||
| 
 | ||||
|        # Better add the new stuff to the flat files first | ||||
|        if (!defined $ib{$_}) { | ||||
|          if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|              ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|              (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|                open(SEARCHINDEX,">>$parent$library/searchindex.deb"); | ||||
|          } | ||||
|          elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|                open(SEARCHINDEX,">>$parent$base/searchindex.deb"); | ||||
|          } | ||||
|          if (!-d) { | ||||
|             print SEARCHINDEX "$_\n"; | ||||
|          } | ||||
|          if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|              ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|              (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|                open(DIRINDEX,">>$parent$library/dirindex.deb"); | ||||
|          } | ||||
|          elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|                open(DIRINDEX,">>$parent$base/dirindex.deb"); | ||||
|          } | ||||
|          if (-d) { | ||||
|            print DIRINDEX "$_\n";   | ||||
|          } | ||||
|        } # !defined | ||||
| 
 | ||||
|        # If the directory already exists we can just append  | ||||
|        # to the end of the value | ||||
|        if (defined $ib{$_}) { | ||||
|            dbi(\%commands); | ||||
|            my $cvalue = $ib{$_} . " $db{$package_name}"; | ||||
|            # put overwrites by default! | ||||
|            $zing->put($_,$cvalue);    | ||||
|        } # if defined         | ||||
|        else { | ||||
|            dbi(\%commands); | ||||
|            $zing->put($_,$db{$package_name});     | ||||
|        } | ||||
|      untie %db; | ||||
|      untie $zing; | ||||
|      } | ||||
|     close(LIST);   | ||||
|     close(SEARCHINDEX); | ||||
|     close(DIRINDEX); | ||||
| 
 | ||||
|      my $zit; my ($nit,$yit) = (split(/\s/,$sb{$package_name}))[0,3]; | ||||
|      if ($yit eq "deinstall:ok:config-files" || | ||||
|          $yit eq "purge:ok:config-files") { | ||||
|       ($zit = $nit) =~ s,\+,\\\+,; | ||||
|       if ($ib{"/."} !~ m,$zit,) { | ||||
|        $ib{"/."} = $ib{"/."} . " $zit";  | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|   }  # end foreach NEW    | ||||
|   print "\n" if $#NEW != -1; | ||||
| 
 | ||||
| } # end sub db | ||||
| 
 | ||||
| # Generally, it's unecessary to rebuild the flat databases unless major | ||||
| # changes have occurred to a person's installation, and the database has | ||||
| # become very repetitive, or a file has changed into a directory.  This | ||||
| # function has also been tried by tieing the flat file to an array, but | ||||
| # there doesn't seem to be that much of a speed advantage unless ib() | ||||
| # happens to be in memory, but more experimentation will be tried in the | ||||
| # future. | ||||
| sub rebuildflatdb { | ||||
| 
 | ||||
|   my($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   ib(\%commands); | ||||
| 
 | ||||
|   print scalar(localtime), "\n"; | ||||
|   | ||||
|   my $file; | ||||
|   my $dir; | ||||
| 
 | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      !($commands->{"dbpath"} && $commands->{"root"})) { | ||||
|         if (-e "$parent$library/searchindex.deb") { | ||||
|             $dir = "$parent$library/dirindex.deb"; | ||||
|             $file = "$parent$library/searchindex.deb"; | ||||
|             unlink($file); | ||||
|             unlink("$file.gz") if -e "$file.gz"; | ||||
|             unlink($dir); | ||||
|             unlink("$dir.gz") if -e "$dir.gz"; | ||||
|         }  | ||||
|         else { | ||||
| 	    print "swim: operation only implemented for installed system\n"; | ||||
| 	    exit; | ||||
|        	} | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|         if (-e "$parent$base/searchindex.deb") { | ||||
|             $file = "$parent$base/searchindex.deb"; | ||||
|             $dir = "$parent$base/dirindex.deb"; | ||||
|             unlink($file); | ||||
|             unlink("$file.gz") if -e "$file.gz"; | ||||
|             unlink($dir); | ||||
|             unlink("$dir.gz") if -e "$dir.gz"; | ||||
|          } | ||||
|         else { | ||||
| 	    print "swim: operation only implemented for installed system\n"; | ||||
| 	    exit; | ||||
|         } | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   open(DIR,">$dir"); | ||||
|   open(FILE,">$file"); | ||||
|   # We need to reconstruct long.debian & DEBIAN*, but can't take into account | ||||
|   # weirdisms with the database - NEW packages which aren't NEW. | ||||
|   foreach (keys %ib) { | ||||
|    if (defined $ib{$_}) {  | ||||
|        my $filedir = $_; | ||||
|        my $package = $ib{$_}; | ||||
|        #$package =~ s/\s/\n/g; | ||||
|        my @the_amount  = split(/\s/, $package); | ||||
|      if ($#the_amount > 0) { | ||||
|        print DIR "$filedir\n"; | ||||
|      } | ||||
|      elsif ($#the_amount == 0) { | ||||
|        print FILE "$filedir\n"; | ||||
|     } | ||||
|    } | ||||
|   } | ||||
|   untie %ib; | ||||
|   print scalar(localtime), "\n"; | ||||
| 
 | ||||
| } # end sub rebuildflatdb | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										648
									
								
								lib/DB_Init.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										648
									
								
								lib/DB_Init.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,648 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::DB_Init; | ||||
| use strict; | ||||
| use SWIM::Conf qw(:Path $fastswim $imswim $slowswim $sort); | ||||
| #use SWIM::Global; | ||||
| use SWIM::Format; | ||||
| use SWIM::MD; | ||||
| use DB_File; | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(database); | ||||
| 
 | ||||
| 
 | ||||
| # database() md()  --initdb --rebuilddb  | ||||
| 
 | ||||
| # Time to get serious and make a database  | ||||
| sub database { | ||||
| 
 | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   print scalar(localtime), "\n"; | ||||
| 
 | ||||
|   #my whatever that is | ||||
|   my @dpackage; # passes name_version to md() | ||||
|   my @Tdescription; | ||||
|   my @description;  | ||||
|   my @ldescription; | ||||
|   my @package; | ||||
|   my %db; | ||||
|   my @name; | ||||
|   my $count = 0; | ||||
| 
 | ||||
|   my $the_status;  | ||||
| 
 | ||||
|   my $status;  | ||||
|   my @essential; | ||||
|   my $priority;  | ||||
|   my $section;  | ||||
|   my $installed_size;  | ||||
|   my $maintainer;  | ||||
|   my $source; | ||||
|   my $version; | ||||
|   my $ver; | ||||
| 
 | ||||
|   my %gb; | ||||
|   my %group; | ||||
|   my $group; | ||||
| 
 | ||||
|   # Keeps a package->version database  | ||||
|   # to save time over using status | ||||
|   my %sb; | ||||
|   my @status; | ||||
| 
 | ||||
|   my ($replaces, @REPLACE, $provides, $depends, $pre_depends, | ||||
|       $recommends, $suggests, $conflicts); | ||||
| 
 | ||||
|   my @conffiles; | ||||
|   my $line_before; | ||||
|   my @conf; | ||||
|   my @complete; | ||||
|   my @form; | ||||
|   my @formly; | ||||
|   my $format_deb = "$tmp/format.deb"; | ||||
| 
 | ||||
| # Let's decide whether we should even go on.  If it is --initdb, and | ||||
| # the databases already exist, nothing should be touched, but if it is | ||||
| # --rebuilddb and they exist, then they are removed and remade from | ||||
| # scratch.  | ||||
| 
 | ||||
|    # But first, better clean up any files in $tmp in case of an aborted | ||||
|    # database formation | ||||
|     unlink(<$tmp/DEBIAN*>) if -e "$tmp/DEBIANaa"; | ||||
|     unlink("$tmp/transfer.deb") if -e "$tmp/transfer.deb"; | ||||
|     unlink("$tmp/big.debian") if -e "$tmp/big.debian"; | ||||
|     unlink("$tmp/long.debian") if -e "$tmp/long.debian"; | ||||
| 
 | ||||
| 
 | ||||
|   if (-e "$parent$base/status" && -e "$parent$base/info") { | ||||
|       $the_status = "$parent$base/status"; | ||||
|   } | ||||
|   else { | ||||
|       print "swim: crucial file(s)/directories are missing in $parent\n"; | ||||
|       exit; | ||||
|   } | ||||
| 
 | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|       if ($commands->{"initdb"}) {   | ||||
|         if (-e "$parent$library/packages.deb" && | ||||
|             -e "$parent$library/fileindex.deb") {             | ||||
|             print "swim:  use --rebuilddb\n"; | ||||
|             exit; | ||||
|         } | ||||
|         else { | ||||
|           # if a database happens to be missing  | ||||
|           if (-e "$parent$library/packages.deb") { | ||||
|              unlink("$parent$library/packages.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/fileindex.deb") { | ||||
|              unlink("$parent$library/fileindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/groupindex.deb") { | ||||
|              unlink("$parent$library/groupindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/statusindex.deb") { | ||||
|              unlink("$parent$library/statusindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/searchindex.deb") { | ||||
|              unlink("$parent$library/searchindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/searchindex.deb.gz") { | ||||
|              unlink("$parent$library/searchindex.deb.gz"); | ||||
|           } | ||||
|           if (-e "$parent$library/dirindex.deb") { | ||||
|              unlink("$parent$library/dirindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/dirindex.deb.gz") { | ||||
|              unlink("$parent$library/dirindex.deb.gz"); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       #  this only works if all databases exist. | ||||
|       elsif ($commands->{"rebuilddb"}) { | ||||
|         if (-e "$parent$library/packages.deb" &&         | ||||
|             -e "$parent$library/fileindex.deb") {             | ||||
|           unlink("$parent$library/packages.deb"); | ||||
|           unlink("$parent$library/fileindex.deb"); | ||||
|           unlink("$parent$library/groupindex.deb"); | ||||
|           unlink("$parent$library/statusindex.deb"); | ||||
|           unlink("$parent$library/searchindex.deb"); | ||||
|           unlink("$parent$library/searchindex.deb") | ||||
|           if -e "$parent$library/searchindex.deb";            | ||||
|           unlink("$parent$library/dirindex.deb"); | ||||
|           unlink("$parent$library/dirindex.deb") | ||||
|           if -e "$parent$library/dirindex.deb.gz";            | ||||
|         } | ||||
|         else { | ||||
|           print "swim:  use --initdb to create databases\n"; | ||||
|           exit; | ||||
|         } | ||||
|       }   | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|       if ($commands->{"initdb"}) {   | ||||
|         if (-e "$parent$base/packages.deb" && | ||||
|             -e "$parent$base/fileindex.deb") {             | ||||
|             print "swim:  use --rebuilddb\n"; | ||||
|             exit; | ||||
|         } | ||||
|         else { | ||||
|           # if a database happens to be missing  | ||||
|           if (-e "$parent$base/packages.deb") { | ||||
|              unlink("$parent$base/packages.deb"); | ||||
|           } | ||||
|           if (-e "$parent$base/fileindex.deb") { | ||||
|              unlink("$parent$base/fileindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$base/groupindex.deb") { | ||||
|              unlink("$parent$base/groupindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/statusindex.deb") { | ||||
|              unlink("$parent$library/statusindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/searchindex.deb") { | ||||
|              unlink("$parent$library/searchindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/searchindex.deb.gz") { | ||||
|              unlink("$parent$library/searchindex.deb.gz"); | ||||
|           } | ||||
|           if (-e "$parent$library/dirindex.deb") { | ||||
|              unlink("$parent$library/dirindex.deb"); | ||||
|           } | ||||
|           if (-e "$parent$library/dirindex.deb.gz") { | ||||
|              unlink("$parent$library/dirindex.deb.gz"); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       #  this only works if all databases exist. | ||||
|       elsif ($commands->{"rebuilddb"}) { | ||||
|         if (-e "$parent$base/packages.deb" &&         | ||||
|             -e "$parent$base/fileindex.deb") {             | ||||
|           unlink("$parent$base/packages.deb"); | ||||
|           unlink("$parent$base/fileindex.deb"); | ||||
|           unlink("$parent$base/groupindex.deb"); | ||||
|           unlink("$parent$base/statusindex.deb"); | ||||
|           unlink("$parent$library/searchindex.deb"); | ||||
|           unlink("$parent$library/searchindex.deb") | ||||
|           if -e "$parent$library/searchindex.deb";            | ||||
|           unlink("$parent$library/dirindex.deb"); | ||||
|           unlink("$parent$library/dirindex.deb") | ||||
|           if -e "$parent$library/dirindex.deb.gz";            | ||||
|         } | ||||
|         else { | ||||
|           print "swim:  use --initdb to create databases\n"; | ||||
|           exit; | ||||
|         } | ||||
|       }   | ||||
|   } | ||||
| 
 | ||||
|      # This makes a backup of all the *.list files in ./backup.  When | ||||
|      # --initdb/--rebuilddb runs these files should be built or rebuilt, | ||||
|      # but if changes have occured and --db(-i wasn't used) wasn't run | ||||
|      # this won't cause problems because everything is rebuilt, there may  | ||||
|      # just be some lingering small files in backup. | ||||
| 
 | ||||
|      # Seems like both approaches are about the same speed. | ||||
|      #use File::Copy;  | ||||
|      print "Making backups of *.list\n"; | ||||
|      if (!-d "$parent$base/info/backup") { | ||||
|         mkdir("$parent$base/info/backup",0666); | ||||
|      } | ||||
|      opendir(COPY,"$parent$base/info"); | ||||
|      foreach (sort grep(/\.list$/, readdir(COPY))) { | ||||
|        #copy ("$parent$base/info/$_","$parent$base/info/backup/$_.bk"); | ||||
|        open(FILENAME,"$parent$base/info/$_"); | ||||
|        open(CP,">$parent$base/info/backup/$_.bk"); | ||||
|         while (<FILENAME>) { | ||||
|          print CP $_; | ||||
|         } | ||||
|      } | ||||
|      closedir(COPY); | ||||
| 
 | ||||
|  print "Description Database is being made\n"; | ||||
| 
 | ||||
|     $| = 1; my $x = 0; | ||||
|     open(PRETTY, ">$format_deb"); | ||||
|     open(AVAIL, "$the_status"); | ||||
|       while (<AVAIL>) { | ||||
|        # Package name | ||||
|         if (/^Package:|^PACKAGE:/) {                                               | ||||
|           @package = split(/: /,$_);                                                   | ||||
|           chomp	 $package[1]; | ||||
|           $x = 1 if $x == 6; | ||||
|           print "|\r" if $x == 1 || $x == 4; print "/\r" if $x == 2; | ||||
|           print "-\r" if $x == 3 || $x == 6; print "\\\r" if $x == 5; | ||||
|           $x++;          | ||||
|         }  | ||||
|   # Some other pertinent fields | ||||
|   # All this stuff can be placed together..since it is generally nice | ||||
|   # to know these things at one glance, in this order. | ||||
|   # Package:                    Status:  | ||||
|   # Version:                    Essential: (yes or no) | ||||
|   # Section:                    Priority: | ||||
|   # Installed-Size: | ||||
|   # Maintainer: | ||||
|   # Description: | ||||
| 
 | ||||
|         elsif (/^Status:/) { | ||||
|             $status = $_; | ||||
|         } | ||||
|         elsif (/^Essential/) { | ||||
|            @essential = split(/: /,$_);                                                   | ||||
|         } | ||||
|         elsif (/^Priority:/) { | ||||
|             $priority = $_; | ||||
|         } | ||||
|         elsif (/^Section:/) { | ||||
|             $section = $_; | ||||
|             # make the hash for the groupindex.deb | ||||
|             $group = substr($section,9); | ||||
|             chomp $group; | ||||
|             # we will put not-installed in their own group for reference | ||||
|             if ($status !~ /not-installed/) { | ||||
|               if (!defined $group{$group}) { | ||||
|                   $group{$group} = $package[1]; | ||||
|               } | ||||
|               else { | ||||
|                   $group{$group} = "$group{$group} $package[1]"; | ||||
|               }  | ||||
|             } | ||||
|         } | ||||
|         elsif (/^Installed-Size:/) { | ||||
|             $installed_size = $_; | ||||
|         } | ||||
|         elsif (/^Maintainer:/) { | ||||
|             $maintainer = $_; | ||||
|         } | ||||
|         elsif (/^Source:/) { | ||||
|             $source = $_; | ||||
|         } | ||||
|         # hold ok not-installed - may want to change this just to | ||||
|         # non-installed. | ||||
|         elsif (/^Version:/ && $status !~ /not-installed/) { | ||||
|             $version = $_; | ||||
|             chomp($version, $section); | ||||
|             $col1 = "Package: $package[1]"; | ||||
|             $col2 = $status; | ||||
|             write PRETTY; | ||||
|             $col1 = $version; | ||||
|              $ver = m,Version:\s(.*),;          | ||||
|              # This creates a name -> version index in package.deb, | ||||
|              # and the statusindex.deb database which will serve to | ||||
|              #  determine if the status has changed when  --db or -i is | ||||
|              # ran. | ||||
|              push(@name, $package[1]); | ||||
|              push(@status, $package[1]); | ||||
|              $package[1] = "$package[1]_$1"; | ||||
|              push(@name, $package[1]); | ||||
|              my $priory = substr($priority,10); | ||||
|              chomp $priory; | ||||
|              my $statusy = substr($status,8); | ||||
|              chomp $statusy; | ||||
|              $statusy =~ s/\s/:/g; | ||||
|              my $thimk = "$package[1] $group $priory $statusy"; | ||||
|              push(@status, $thimk); | ||||
|             if(defined($essential[1])) {               | ||||
|              $col2 = "Essential: $essential[1]"; | ||||
|              @essential = (); | ||||
|             } | ||||
|             else { | ||||
|               $col2 = "Essential: no\n"; | ||||
|             } | ||||
|             write PRETTY; | ||||
|             if (defined $section) { | ||||
|              $col1 = $section; | ||||
|             } | ||||
|             else { | ||||
|              $col1 = "Section: unavailable"; | ||||
|             } | ||||
|             if (defined $priority) { | ||||
|              $col2 = $priority; | ||||
|             } | ||||
|             else { | ||||
|              $col2 = "Priority: unavailable\n"; | ||||
|             } | ||||
|             write PRETTY; | ||||
|             #my $cool = $installed_size . $maintainer; | ||||
|             $col1 = $installed_size; | ||||
|             if (defined $source) { | ||||
|               $col2 = $source; | ||||
|             } | ||||
|             else { | ||||
|               $col2 = ""; | ||||
|             }  | ||||
|             write PRETTY; | ||||
|             undef $source; | ||||
|             print PRETTY $maintainer | ||||
|         } | ||||
| 
 | ||||
|         # This stuff will be available with seperate query flags or All | ||||
|         elsif (/^Replaces:/) { | ||||
|             $replaces = $_; | ||||
|               if (defined($replaces)) { | ||||
|                push(@REPLACE, "$package[1]REP"); | ||||
|                push(@REPLACE, $replaces);  | ||||
|               } | ||||
|          } | ||||
|         elsif (/^Provides:/) { | ||||
|             $provides = $_; | ||||
|               if (defined($provides)) { | ||||
|                push(@REPLACE, "$package[1]PRO"); | ||||
|                push(@REPLACE, $provides);  | ||||
|               } | ||||
|         }          | ||||
|         elsif (/^Depends:/) { | ||||
|             $depends = $_; | ||||
|               if (defined($depends)) { | ||||
|                push(@REPLACE, "$package[1]DEP"); | ||||
|                push(@REPLACE, $depends);  | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Pre-Depends:/) { | ||||
|             $pre_depends = $_; | ||||
|               if (defined($pre_depends)) { | ||||
|                push(@REPLACE, "$package[1]PRE"); | ||||
|                push(@REPLACE, $pre_depends);  | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Recommends:/) { | ||||
|             $recommends = $_; | ||||
|               if (defined($recommends)) { | ||||
|                push(@REPLACE, "$package[1]REC"); | ||||
|                push(@REPLACE, $recommends);  | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Suggests:/) { | ||||
|             $suggests = $_; | ||||
|               if (defined($suggests)) { | ||||
|                push(@REPLACE, "$package[1]SUG"); | ||||
|                push(@REPLACE, $suggests);  | ||||
|               } | ||||
|         } | ||||
|         elsif (/^Conflicts:/) { | ||||
|             $conflicts = $_; | ||||
|               if (defined($conflicts)) { | ||||
|                push(@REPLACE, "$package[1]CON"); | ||||
|                push(@REPLACE, $conflicts);  | ||||
|               } | ||||
|         }         | ||||
|        # Gather the Configuration Files, Description comes after. | ||||
|        # Available with a single flag. | ||||
|         elsif (/^Conffiles:/) { | ||||
|              my $line = <AVAIL>; | ||||
|              while ($line !~ /^Description:/) { | ||||
|                  push(@conffiles,$line); | ||||
|                  $line = <AVAIL>; | ||||
|                    if ($line =~ /^Description/) { | ||||
|                          $line_before = $line; | ||||
|                    # put conffiles into one variable | ||||
|                      if (defined $package[1]) { | ||||
|                        #chomp $package[1]; | ||||
|                        push(@conf,"$package[1]CONF"); | ||||
|                      } | ||||
|                        my ($c, $cool); | ||||
|                          if ($#conffiles != 0) {  | ||||
|                             for ($c = $#conffiles; $c >= 0; $c--) { | ||||
|                               if ($c > 0) { | ||||
|                                 $cool = $conffiles[$c-1] .= $conffiles[$c];    | ||||
|                               }              | ||||
|                              } #end for | ||||
|                           } | ||||
|                           else { | ||||
|                             $cool = $conffiles[0]; | ||||
|                           } | ||||
|                           @conffiles = (); | ||||
|                           push(@conf,$cool); | ||||
|                    } #if ($line =~ /^Desc  | ||||
|               }  # while ($line ! /^Desc           | ||||
|         } # elsif (/^Conffiles  | ||||
| 
 | ||||
|         # Only interested in available packages..so this is fine. | ||||
|         # To be combined with first fields. | ||||
|         if (/Description:|^\s\w*|^\s\.\w*/ ||  | ||||
|             defined($line_before) =~ /^Description/){  | ||||
|            my $many_lines; | ||||
|             if (defined($line_before)) { | ||||
|                 push(@ldescription, $line_before); | ||||
|                 push(@ldescription, $_); | ||||
|                 $line_before = (); | ||||
|             } | ||||
|             else { | ||||
|                  $many_lines = $_; | ||||
|             }  | ||||
|            if ($_ !~ /^\n$/) { | ||||
|              $count++; | ||||
|              if ($count == 1) { | ||||
|                if (defined $package[1]) { | ||||
|                  #chomp $package[1]; | ||||
|                  push(@dpackage,$package[1]); | ||||
|                  push(@description,$package[1]); | ||||
|                } | ||||
|               }  | ||||
|                if (defined($many_lines)) { | ||||
|                push(@ldescription,$many_lines); | ||||
|                } | ||||
|            } # end if ($_ !~ /^\n$/ | ||||
|            else { | ||||
|              $count = 0; | ||||
|              # let's put each description into one scalar | ||||
|              my ($c, $cool); | ||||
|               if ($#ldescription != 0) {  | ||||
|                 for ($c = $#ldescription; $c >= 0; $c--) { | ||||
|                   if ($c > 0) { | ||||
|                     $cool = $ldescription[$c-1] .= $ldescription[$c];    | ||||
|                   }              | ||||
|                } #end for | ||||
|               }  # end if ($#ld | ||||
|               else { | ||||
|                 $cool = $ldescription[0]; | ||||
|               } | ||||
|               if (defined $cool) { | ||||
|                  push(@description,$cool); | ||||
|               }  | ||||
|                  @ldescription = (); | ||||
|            } # end else         | ||||
|            $line_before = (); | ||||
|         }  | ||||
|       } # end while (<AVAIL>) | ||||
|       close(PRETTY); | ||||
| 
 | ||||
|   # Let's put together the description with the rest of its fields. | ||||
|   open(FIELDS,"$format_deb"); | ||||
|   while (<FIELDS>) { | ||||
|      push(@form,$_); | ||||
|   } | ||||
|   close(FIELDS);   | ||||
| 
 | ||||
|   foreach (@form) { | ||||
|     push(@formly,$_);     | ||||
|     my ($cool); | ||||
|     $count++;   | ||||
|     if ($count == 5) { | ||||
|              my ($c, $cool); | ||||
|               if ($#formly != 0) {  | ||||
|                 for ($c = $#formly; $c >= 0; $c--) { | ||||
|                   if ($c > 0) { | ||||
|                     $cool = $formly[$c-1] .= $formly[$c];    | ||||
|                   }              | ||||
|                } #end for | ||||
|               }  # end if ($#ld | ||||
|               else { | ||||
|                 $cool = $formly[0]; | ||||
|               } | ||||
|     push(@complete,$cool); | ||||
|     @formly = (); | ||||
|     $count = 0; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   foreach (@description) { | ||||
|    if ($count == 1) { | ||||
|      my $lingo = shift(@complete); | ||||
|      $lingo = $lingo . $_; | ||||
|      push(@Tdescription, $lingo);  | ||||
|      $lingo = (); | ||||
|      $count = 1; | ||||
|    } | ||||
|    else { | ||||
|      push(@Tdescription, $_);  | ||||
|      $count = 0; | ||||
|    } | ||||
|    $count++; | ||||
| 
 | ||||
|  } | ||||
|      unlink($format_deb); | ||||
| 
 | ||||
|   # We'll keep databases local so that md() doesn't get confused with | ||||
|   # database(). | ||||
| 
 | ||||
|   # Put the groups into the groupindex.deb database. | ||||
|   print "Group Database is being made\n"; | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      tie %gb, 'DB_File', "$parent$library/groupindex.deb" or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     tie %gb, 'DB_File', "$parent$base/groupindex.deb" or die "DB_File: $!"; | ||||
|   } | ||||
|    | ||||
|   %gb = %group; | ||||
| 
 | ||||
|   untie %gb; | ||||
|   undef %gb; | ||||
|   undef %group; | ||||
| 
 | ||||
|   # Create the important status database. | ||||
|   print "Status Database is being made\n"; | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|       ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|       (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|         tie %sb, 'DB_File', "$parent$library/statusindex.deb" or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|         tie %sb, 'DB_File', "$parent$base/statusindex.deb" or die "DB_File: $!"; | ||||
|   } | ||||
| 
 | ||||
|   %sb = @status; | ||||
| 
 | ||||
|   untie %sb; | ||||
|   undef %sb; | ||||
|   undef @status; | ||||
| 
 | ||||
|   # Put everything into the package.deb database. | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      tie %db, 'DB_File', "$parent$library/packages.deb" or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     tie %db, 'DB_File', "$parent$base/packages.deb" or die "DB_File: $!"; | ||||
|   } | ||||
| 
 | ||||
|   %db = (@name,@Tdescription,@conf,@REPLACE); | ||||
|   untie %db; | ||||
|   undef @Tdescription; | ||||
|   undef @conf;  | ||||
|   undef @REPLACE; | ||||
|   undef %db; | ||||
| 
 | ||||
| 
 | ||||
|   # To the total db thing. | ||||
|   if ($commands->{"initdb"} || $commands->{"rebuilddb"}) { | ||||
|      md(\@dpackage,\%commands); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| } # end sub database | ||||
| 
 | ||||
| 
 | ||||
| # Basically, this writes @dpackage to transfer.deb, which is processed by | ||||
| # either fastswim into two files big.debian and long.debian for further  | ||||
| # processing by process_md() or is processed by imswim, then slowswim into  | ||||
| # the two files big.debian and long.debian then finished by process_md() | ||||
| sub md { | ||||
| 
 | ||||
|      my($dpackage,$commands) = @_; # creates transfer.deb | ||||
|      my %commands = %$commands;  | ||||
| 
 | ||||
| 
 | ||||
|      unless (-e "$parent$base/info") {     | ||||
|       die 'This program requires the /var/lib/dpkg/info directory set-up by dpkg';                                   | ||||
|      }     | ||||
|      | ||||
|      # Put all file/dir(*.list)->package_name(s) into an massive array. | ||||
|      # fastswim runs this process separately. | ||||
|       | ||||
|       # This enables info files to be used from a different root system | ||||
|       my $argument2 = "$parent$base/info"; | ||||
| 
 | ||||
|      # This is just for testing purposes, and serves no real purpose. | ||||
|      if (!defined(@$dpackage)) { | ||||
|         system("$fastswim"); | ||||
|       } | ||||
|      # This is what is used. | ||||
|       else { | ||||
|         open(TRANSFER, ">$tmp/transfer.deb"); | ||||
|          foreach (@$dpackage) { | ||||
|           print TRANSFER "$_\n"; | ||||
|          }							 | ||||
|          close(TRANSFER); | ||||
|          if (!$commands->{"lowmem"}) { | ||||
|           system $fastswim, "--transfer", $argument2, $tmp; | ||||
|          } | ||||
|          else { | ||||
|           print "Gathering the file(s)/dir(s)\n"; | ||||
|           system $imswim, $argument2, $tmp; | ||||
|           system $slowswim, $tmp, $sort; | ||||
|          } | ||||
|      } | ||||
|      undef @$dpackage; | ||||
|      process_md(\%commands);  | ||||
| 
 | ||||
| } # end sub md | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										497
									
								
								lib/DB_Library.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										497
									
								
								lib/DB_Library.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,497 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::DB_Library; | ||||
| use strict;   | ||||
| use SWIM::Conf; | ||||
| use SWIM::Global; | ||||
| use SWIM::Library; | ||||
| use DB_File; | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS); | ||||
|    | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(ib nib dbi ndb sb exist_sb nsb ping zing nzing ging gb | ||||
|              ngb sing ram_on version ver nver nping nzing nging nsing); | ||||
| %EXPORT_TAGS = (  | ||||
|                  Search =>  [ qw(ib dbi nib nsb ndb gb ram_on version ngb) ], | ||||
|                  Db => [ qw(sb ib gb nsb ver dbi zing ging ping sing) ], | ||||
|                  Md => [ qw(sb ib nsb nzing) ], | ||||
|                  Deb => [ qw(sb nsb ndb) ], | ||||
|                  NDb => [ qw(ndb nsb ngb nver nping nzing nging nsing | ||||
|                           exist_sb sb) ], | ||||
|                  Groups => [ qw(gb ngb) ], | ||||
|                  Xyz => [ qw(dbi ndb) ] | ||||
|                ); | ||||
| 
 | ||||
| 
 | ||||
| # functions which use DB_File | ||||
| 
 | ||||
| 
 | ||||
| sub ib { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|    if (-e "$parent$library/fileindex.deb") { | ||||
|      tie %ib, 'DB_File', "$parent$library/fileindex.deb" or die "DB_File: $!"; | ||||
|    } | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|    if (-e "$parent$base/fileindex.deb") { | ||||
|     tie %ib, 'DB_File', "$parent$base/fileindex.deb" or die "DB_File: $!"; | ||||
|    } | ||||
|   } | ||||
| } # end sub ib | ||||
| 
 | ||||
| sub dbi { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|    if (-e "$parent$library/packages.deb" || | ||||
|       ($commands->{"initndb"} || $commands->{"rebuildndb"})) { | ||||
|      tie %db, 'DB_File', "$parent$library/packages.deb" or die "DB_File: $!"; | ||||
|    } | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|    if (-e  "$parent$base/packages.deb" || | ||||
|        ($commands->{"initndb"} || $commands->{"rebuildndb"})) { | ||||
|     tie %db, 'DB_File', "$parent$base/packages.deb" or die "DB_File: $!"; | ||||
|    } | ||||
|   } | ||||
| } # end sub dbi | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| sub nib { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|    | ||||
|   my ($arch,$dist) = which_archdist(\%commands); | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      if (!-e "$parent$library/nfileindex$arch$dist.deb") { | ||||
|        return; | ||||
|      } | ||||
|      tie %ib, 'DB_File', "$parent$library/nfileindex$arch$dist.deb" or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|      if (!-e "$parent$base/nfileindex$arch$dist.deb") { | ||||
|        return; | ||||
|      } | ||||
|     tie %ib, 'DB_File', "$parent$base/nfileindex$arch$dist.deb" or die "DB_File: $!"; | ||||
|   } | ||||
| } # end sub nib | ||||
| 
 | ||||
| 
 | ||||
| sub ndb { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my ($arch,$dist) = which_archdist(\%commands); | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|     if (-e "$parent$library/npackages$arch$dist.deb" || | ||||
|         ($commands->{"initndb"} || $commands->{"rebuildndb"} || | ||||
|          $commands->{"ndb"})) { | ||||
|      tie %db, 'DB_File', "$parent$library/npackages$arch$dist.deb"  | ||||
|      or die "swim: use pre-existing databases for this option"; | ||||
|     } | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|    if (-e  "$parent$base/npackages$arch$dist.deb" || | ||||
|       ($commands->{"initndb"} || $commands->{"rebuildndb"} || | ||||
|        $commands->{"ndb"})) { | ||||
|      tie %db, 'DB_File', "$parent$base/npackages$arch$dist.deb"  | ||||
|      or die "swim: use pre-existing databases for this option"; | ||||
|    } | ||||
|   } | ||||
| } # end sub ndb | ||||
| 
 | ||||
| 
 | ||||
| sub sb { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      if (-e "$parent$library/statusindex.deb") { | ||||
|       tie %sb, 'DB_File', "$parent$library/statusindex.deb"  | ||||
|       or die "DB_File: $!"; | ||||
|      } | ||||
|      else { | ||||
|       return; | ||||
|     } | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     if (-e "$parent$base/statusindex.deb") { | ||||
|      tie %sb, 'DB_File', "$parent$base/statusindex.deb"  | ||||
|      or die "DB_File: $!"; | ||||
|     } | ||||
|     else { | ||||
|      return; | ||||
|     }  | ||||
|   } | ||||
| } # end sub sb | ||||
| 
 | ||||
| # exist_sb & sb seem to be used primarily in NDB_Init | ||||
| 
 | ||||
| # This first looks in the immediate directory for statusindex.deb, if it | ||||
| # isn't found here, it look in the default directory.  It then returns | ||||
| # undef, or initializes the database based on its findings. | ||||
| sub exist_sb { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my $yep;  | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      if (-e "$parent$library/statusindex.deb") { | ||||
|          $yep = "yes"; | ||||
|      } | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|      if (-e "$parent$base/statusindex.deb") { | ||||
|          $yep = "yes"; | ||||
|      } | ||||
|   } | ||||
| 
 | ||||
|   if (!defined $yep) { | ||||
|     if (-e "$parent$base/statusindex.deb") { | ||||
|      tie %sb, 'DB_File', "$parent$base/statusindex.deb"  | ||||
|       or die "DB_File: $!"; | ||||
|       return "yes"; | ||||
|     } | ||||
|     else { | ||||
|       return; | ||||
|     } | ||||
|   } | ||||
|   elsif (defined $yep) { | ||||
|       sb(\%commands);              | ||||
|       return "yes"; | ||||
|   } | ||||
| 
 | ||||
| } # end sub exist_sb | ||||
| 
 | ||||
| sub nsb { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my($arch,$dist) = which_archdist(\%commands); | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|     if (-e "$parent$library/nstatusindex$arch$dist.deb" || | ||||
|         ($commands->{"initndb"} || $commands->{"rebuildndb"} || | ||||
|          $commands->{"ndb"})) { | ||||
|      tie %nsb, 'DB_File', "$parent$library/nstatusindex$arch$dist.deb" | ||||
|      or die "swim: use pre-existing databases for this option"; | ||||
|     } | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|    if (-e "$parent$base/nstatusindex$arch$dist.deb" || | ||||
|         ($commands->{"initndb"} || $commands->{"rebuildndb"} || | ||||
|          $commands->{"ndb"})) { | ||||
|     tie %nsb, 'DB_File', "$parent$base/nstatusindex$arch$dist.deb" or die | ||||
|      or die "swim: use pre-existing databases for this option"; | ||||
|    } | ||||
|   } | ||||
| } # end sub nsb | ||||
| 
 | ||||
| sub ping { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|       if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|          ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|          (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|          $ping = tie %db, 'DB_File', "$parent$library/packages.deb" or die "DB_File: $!"; | ||||
|       } | ||||
|       elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|          $ping = tie %db, 'DB_File', "$parent$base/packages.deb" or die "DB_File: $!"; | ||||
|       } | ||||
| } | ||||
| 
 | ||||
| sub nping { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my ($arch,$dist) = which_archdist(\%commands); | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $ping = tie %db, 'DB_File', "$parent$library/npackages$arch$dist.deb" | ||||
|                or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     $ping = tie %db, 'DB_File', "$parent$base/npackages$arch$dist.deb"  | ||||
|              or die "DB_File: $!"; | ||||
|   } | ||||
| } # end sub nping | ||||
| 
 | ||||
| 
 | ||||
| sub zing { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|       if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|          ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|          (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|          $zing = tie %ib, 'DB_File', "$parent$library/fileindex.deb"  | ||||
|                  or die "DB_File: $!"; | ||||
|       } | ||||
|       elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|          $zing = tie %ib, 'DB_File', "$parent$base/fileindex.deb"  | ||||
|                  or die "DB_File: $!"; | ||||
|       } | ||||
| } # end sub zing | ||||
| 
 | ||||
| sub nzing { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my ($arch,$dist) = which_archdist(\%commands); | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $zing = tie %ib, 'DB_File', "$parent$library/nfileindex$arch$dist.deb" | ||||
|                or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     $zing = tie %ib, 'DB_File', "$parent$base/nfileindex$arch$dist.deb"  | ||||
|              or die "DB_File: $!"; | ||||
|   } | ||||
| } # end sub nzing | ||||
| 
 | ||||
| 
 | ||||
| sub ging { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $ging = tie %gb, 'DB_File', "$parent$library/groupindex.deb" or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     $ging = tie %gb, 'DB_File', "$parent$base/groupindex.deb" or die "DB_File: $!"; | ||||
|   } | ||||
| } #end sub ging | ||||
| 
 | ||||
| 
 | ||||
| sub nging { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my ($arch,$dist) = which_archdist(\%commands); | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $ging = tie %gb, 'DB_File',"$parent$library/ngroupindex$arch$dist.deb" | ||||
|                or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     $ging = tie %gb, 'DB_File', "$parent$base/ngroupindex$arch$dist.deb"  | ||||
|              or die "DB_File: $!"; | ||||
|   } | ||||
| } # end sub nging | ||||
| 
 | ||||
| 
 | ||||
| sub gb { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|       if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|          ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|          (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|          if (-e  "$parent$library/groupindex.deb" || | ||||
|             ($commands->{"initndb"} || $commands->{"rebuildndb"})) { | ||||
|           tie %gb, 'DB_File', "$parent$library/groupindex.deb" or die "DB_File: $!"; | ||||
|          } | ||||
|       } | ||||
|       elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|          if (-e "$parent$base/groupindex.deb" || | ||||
|             ($commands->{"initndb"} || $commands->{"rebuildndb"})) { | ||||
|           tie %gb, 'DB_File', "$parent$base/groupindex.deb" or die "DB_File: $!"; | ||||
|          } | ||||
|       } | ||||
| } | ||||
| 
 | ||||
| sub ngb { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|     my ($arch,$dist) = which_archdist(\%commands); | ||||
|       if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|          ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|          (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|         if (-e "$parent$library/ngroupindex$arch$dist.deb" || | ||||
|            ($commands->{"initndb"} || $commands->{"rebuildndb"})) { | ||||
|           tie %gb, 'DB_File', "$parent$library/ngroupindex$arch$dist.deb"  | ||||
|           or die "DB_File: $!"; | ||||
|         } | ||||
|       } | ||||
|       elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|         if (-e "$parent$base/ngroupindex$arch$dist.deb" || | ||||
|            ($commands->{"initndb"} || $commands->{"rebuildndb"})) { | ||||
|           tie %gb, 'DB_File', "$parent$base/ngroupindex$arch$dist.deb"  | ||||
|           or die "DB_File: $!"; | ||||
|         } | ||||
|       } | ||||
| } | ||||
| 
 | ||||
| sub sing { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|       ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|       (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|        $sing =  tie %sb, 'DB_File', "$parent$library/statusindex.deb"  | ||||
|        or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|        $sing = tie %sb, 'DB_File', "$parent$base/statusindex.deb" or die "DB_File: $!"; | ||||
|   } | ||||
| } # sub sing | ||||
| 
 | ||||
| sub nsing { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my ($arch,$dist) = which_archdist(\%commands); | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $sing = tie %nsb, 'DB_File', "$parent$library/nstatusindex$arch$dist.deb" | ||||
|                or die "DB_File: $!"; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     $sing = tie %nsb, 'DB_File', "$parent$base/nstatusindex$arch$dist.deb"  | ||||
|              or die "DB_File: $!"; | ||||
|   } | ||||
| } # end sub nsing | ||||
| 
 | ||||
| 
 | ||||
| # This doesn't depend on DB so it can be placed somewhere else if it is used by more | ||||
| # than SWIM::Search. | ||||
| 
 | ||||
| # checks to see if ramdisk is on, searchdf() & nfile()-process_nfile() | ||||
| # (used by file()) uses this | ||||
| sub ram_on { | ||||
| 
 | ||||
|    my $ramdisk; | ||||
| 
 | ||||
|    # this monster runs for every argument | ||||
|    my  $rambo =  "$cat /proc/mounts|"; | ||||
|    open(RAM, "$rambo");  | ||||
|     while (<RAM>) { | ||||
|       if (/ram/) { | ||||
|         my($device,$mount) = split(/\s/,$_,2); | ||||
|           if ($mount =~ /dramdisk/) { | ||||
|            $ramdisk = "yes"; | ||||
|            return $ramdisk; | ||||
|           } | ||||
|       } | ||||
|     } | ||||
|     close(RAM); | ||||
| } # end sub ram_on | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # finds package name and version | ||||
| sub version { | ||||
|   | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   if (!$commands{"n"}) { | ||||
|     dbi(\%commands); | ||||
|   } | ||||
|   else { | ||||
|     ndb(\%commands); | ||||
|   } | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|      # We will check for more than two..just in case | ||||
|      if ($argument !~ /_/) { | ||||
|        if (defined $db{$argument}) { | ||||
|          $argument = $db{$argument}; | ||||
|        } | ||||
|      } | ||||
|   } | ||||
| 
 | ||||
| } # end sub version | ||||
| # returns version but and then is untied | ||||
| sub ver { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   dbi(\%commands); | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|      # We will check for more than two..just in case | ||||
|      if ($argument !~ /_/) { | ||||
|        if (defined $db{$argument}) { | ||||
|          $argument = $db{$argument}; | ||||
|        } | ||||
|      } | ||||
|   } | ||||
| 
 | ||||
|   untie %db; | ||||
| 
 | ||||
| } # end sub ver | ||||
| 
 | ||||
| sub nver { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   ndb(\%commands); | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|      # We will check for more than two..just in case | ||||
|      if ($argument !~ /_/) { | ||||
|        if (defined $db{$argument}) { | ||||
|          $argument = $db{$argument}; | ||||
|        } | ||||
|      } | ||||
|   } | ||||
| 
 | ||||
|   untie %db; | ||||
| 
 | ||||
| } # end sub nver | ||||
| 
 | ||||
							
								
								
									
										1752
									
								
								lib/Deb.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1752
									
								
								lib/Deb.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										456
									
								
								lib/Deps.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										456
									
								
								lib/Deps.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,456 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Deps; | ||||
| use strict; | ||||
| use SWIM::Global qw(:Info);    | ||||
| use SWIM::DB_Library qw(:Xyz); | ||||
| use vars qw(@ISA @EXPORT); | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(character s_character which_character the_character); | ||||
| 
 | ||||
| # the -T and siblings | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub replaces { | ||||
|   my ($commands) = @_;  | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "REP"; | ||||
|     if (defined $db{$conf}) { | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub replaces | ||||
| 
 | ||||
| # process the database for provides | ||||
| sub provides { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "PRO"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub provides | ||||
| 
 | ||||
| # process the database for depends | ||||
| sub depends { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "DEP"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub depends | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub pre_depends { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "PRE"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub pre_depends | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub recommends { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "REC"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub recommends | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub suggests { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "SUG"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub suggests | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub conflicts { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "CON"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub conflicts | ||||
| 
 | ||||
| #These subroutines are for cases where only packages related to the | ||||
| # characteristics are printed out. | ||||
| # process the database for replaces | ||||
| sub s_replaces { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "REP"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return "$argument\n$db{$conf}"; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub s_replaces | ||||
| 
 | ||||
| # process the database for provides | ||||
| sub s_provides { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "PRO"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return "$argument\n$db{$conf}"; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub s_provides | ||||
| 
 | ||||
| # process the database for depends | ||||
| sub s_depends { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "DEP"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return "$argument\n$db{$conf}"; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub s_depends | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub s_pre_depends { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "PRE"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return "$argument\n$db{$conf}"; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub s_pre_depends | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub s_recommends { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "REC"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return "$argument\n$db{$conf}"; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub s_recommends | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub s_suggests { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "SUG"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return "$argument\n$db{$conf}"; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub s_suggests | ||||
| 
 | ||||
| # process the database for replaces | ||||
| sub s_conflicts { | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands;   | ||||
|   !$commands->{"n"} ? dbi(\%commands) : ndb(\%commands); | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "CON"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return "$argument\n$db{$conf}"; | ||||
|     } | ||||
|     else { return ""; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub s_conflicts | ||||
| 
 | ||||
| 
 | ||||
| # This figures out which characteristics (Replaces, Provides, etc) the | ||||
| # options are pointing to.  Isn't choosey, prints all packages | ||||
| sub character { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   # for singular cases | ||||
|   if ($commands->{"g"} && ($commands->{"T"} || $commands->{"pre_depends"} || | ||||
|       $commands->{"depends"} || $commands->{"recommends"} || | ||||
|       $commands->{"suggests"} || $commands->{"provides"} || | ||||
|       $commands->{"replaces"} || $commands->{"conflicts"}) &&  | ||||
|       !($commands->{"c"} || $commands->{"d"} || $commands->{"l"} || | ||||
|       $commands->{"i"})) { | ||||
|        print "$argument\n"; | ||||
|   }        | ||||
|   | ||||
|   # all the characteristics | ||||
|   if (defined $commands->{"T"}) { | ||||
|         print pre_depends(\%commands); | ||||
|         print depends(\%commands); | ||||
|         print recommends(\%commands); | ||||
|         print suggests(\%commands); | ||||
|         print provides(\%commands); | ||||
|         print replaces(\%commands); | ||||
|         print conflicts(\%commands); | ||||
|    } | ||||
|    else { | ||||
| 
 | ||||
|     if (defined $commands->{"pre_depends"}) { | ||||
|         print pre_depends(\%commands); | ||||
|         delete $commands{"pre_depends"} if !($commands->{"S"} || $commands->{"g"}); | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"depends"}) { | ||||
|         print depends(\%commands); | ||||
|         delete $commands{"depends"} if !($commands->{"S"} || $commands->{"g"}); | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"recommends"}) { | ||||
|         print recommends(\%commands); | ||||
|         delete $commands{"recommends"} if !($commands->{"S"} || $commands->{"g"}); | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"suggests"}) { | ||||
|         print suggests(\%commands); | ||||
|         delete $commands{"suggests"} if !($commands->{"S"} || $commands->{"g"}); | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"replaces"}) { | ||||
|         print replaces(\%commands); | ||||
|         delete $commands{"replaces"} if !($commands->{"S"} || $commands->{"g"}); | ||||
|      }  | ||||
| 
 | ||||
|     if (defined $commands->{"provides"}) { | ||||
|         print provides(\%commands); | ||||
|         delete $commands{"provides"} if !($commands->{"S"} || $commands->{"g"}); | ||||
|      } | ||||
|    | ||||
|     if (defined $commands->{"conflicts"}) { | ||||
|         print conflicts(\%commands); | ||||
|         delete $commands{"conflicts"} if !($commands->{"S"} || $commands->{"g"}); | ||||
|     }  | ||||
|    } | ||||
|      | ||||
| } # end sub character | ||||
| 
 | ||||
| # Prints out the characteristics only for the packages which have them. | ||||
| sub s_character { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|     if ($commands->{"pre_depends"}) { | ||||
|         print s_pre_depends(\%commands); | ||||
|         delete $commands{"pre_depends"}; | ||||
|          if (s_pre_depends(\%commands) ne "") { | ||||
|            character(\%commands); | ||||
|          } | ||||
| #        else { s_character(\%commands) }  | ||||
|      } | ||||
|     elsif ($commands->{"depends"}) { | ||||
|         print s_depends(\%commands); | ||||
|         delete $commands{"depends"}; | ||||
|          if (s_depends(\%commands) ne "") { | ||||
|            character(\%commands); | ||||
|          } | ||||
| #         else { s_character(\%commands) }  | ||||
|      } | ||||
|     elsif ($commands->{"recommends"}) { | ||||
|         print s_recommends(\%commands); | ||||
|         delete $commands{"recommends"}; | ||||
|          if (s_recommends(\%commands) ne "") { | ||||
|            character(\%commands); | ||||
|          } | ||||
| #         else { s_character(\%commands) }  | ||||
|      } | ||||
|     elsif ($commands->{"suggests"}) { | ||||
|         print s_suggests(\%commands); | ||||
|         delete $commands{"suggests"}; | ||||
|          if (s_suggests(\%commands) ne "") { | ||||
|            character(\%commands); | ||||
|          } | ||||
| #         else { s_character(\%commands) }  | ||||
|      } | ||||
|     elsif ($commands->{"replaces"}) { | ||||
|         print s_replaces(\%commands); | ||||
|         delete $commands{"replaces"}; | ||||
|          if (s_replaces(\%commands) ne "") { | ||||
|            character(\%commands); | ||||
|          } | ||||
| #         else { s_character(\%commands) }  | ||||
|      }  | ||||
|     elsif ($commands->{"provides"}) { | ||||
|         print s_provides(\%commands); | ||||
|         delete $commands{"provides"}; | ||||
|          if (s_provides(\%commands) ne "") { | ||||
|            character(\%commands); | ||||
|          } | ||||
| #         else { s_character(\%commands) }  | ||||
|      } | ||||
|     elsif ($commands->{"conflicts"}) { | ||||
|         print s_conflicts(\%commands); | ||||
|         delete $commands{"conflicts"}; | ||||
|          if (s_conflicts(\%commands) ne "") { | ||||
|            character(\%commands); | ||||
|          } | ||||
| #         else { s_character(\%commands) }  | ||||
|     }  | ||||
| 
 | ||||
|     # all the characteristics | ||||
|     if ($commands->{"T"}) { | ||||
|         print s_pre_depends(\%commands); | ||||
|         print s_depends(\%commands); | ||||
|         print s_recommends(\%commands); | ||||
|         print s_suggests(\%commands); | ||||
|         print s_provides(\%commands); | ||||
|         print s_replaces(\%commands); | ||||
|         print s_conflicts(\%commands); | ||||
|      } | ||||
| 
 | ||||
|      | ||||
| } # end sub s_character | ||||
| 
 | ||||
| 
 | ||||
| # helps to determine if character(\%commands) should be used | ||||
| sub which_character { | ||||
|   my ($commands) = @_; | ||||
|       if ($commands->{"pre_depends"} || $commands->{"depends"} ||  | ||||
|           $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|           $commands->{"replaces"} || $commands->{"provides"} || | ||||
|           $commands->{"conflicts"}) { | ||||
|           return 1; | ||||
|        }   | ||||
| } # end sub which_character | ||||
| 
 | ||||
| # This runs a test to see whether or not the characters being asked for | ||||
| # apply to this package. | ||||
| sub the_character { | ||||
| 
 | ||||
|   my ($commands) = @_;  | ||||
|   my %commands = %$commands;   | ||||
| 
 | ||||
|     if (defined $commands->{"pre_depends"}) { | ||||
|         if (pre_depends(\%commands) eq "") { | ||||
|           print ""; | ||||
|         } | ||||
|         else { return "ok"; } | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"depends"}) { | ||||
|         if (depends(\%commands) eq "") { | ||||
|           print ""; | ||||
|         } | ||||
|         else { return "ok"; } | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"recommends"}) { | ||||
|         if (recommends(\%commands) eq "") { | ||||
|           print ""; | ||||
|         } | ||||
|         else { return "ok"; } | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"suggests"}) { | ||||
|         if (suggests(\%commands) eq "") { | ||||
|           print ""; | ||||
|         } | ||||
|         else { return "ok"; } | ||||
|      } | ||||
| 
 | ||||
|     if (defined $commands->{"replaces"}) { | ||||
|         if (replaces(\%commands) eq "") { | ||||
|           print ""; | ||||
|         } | ||||
|         else { return "ok"; } | ||||
|      }  | ||||
| 
 | ||||
|     if (defined $commands->{"provides"}) { | ||||
|         if (provides(\%commands) eq "") { | ||||
|           print ""; | ||||
|         } | ||||
|         else { return "ok"; } | ||||
|      } | ||||
|    | ||||
|     if (defined $commands->{"conflicts"}) { | ||||
|         if (conflicts(\%commands) eq "") { | ||||
|           print ""; | ||||
|         } | ||||
|         else { return "ok"; } | ||||
|     }  | ||||
| 
 | ||||
| } # end sub the_character | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										110
									
								
								lib/Dir.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								lib/Dir.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Dir; | ||||
| use strict; | ||||
| use SWIM::Global qw($argument); | ||||
| use SWIM::Conf qw($pwd); | ||||
| use vars qw(@ISA @EXPORT @EXPORT_OK); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(dir fir); | ||||
| 
 | ||||
| # dir() fir() | ||||
| 
 | ||||
| # When --dir is used checks argument (when -f is called) and determines dir | ||||
| # stuff..is it real or not. | ||||
| sub dir { | ||||
| 
 | ||||
|    my ($commands) = @_; | ||||
| 
 | ||||
|    if ($commands->{"dir"}) { | ||||
|       if (! -d $argument) { | ||||
|         if (! -e $argument) { | ||||
|           print "$argument is not a directory or file\n"; | ||||
|         } | ||||
|         else { | ||||
|           print "$argument is not a directory\n"; | ||||
|         } | ||||
|         exit; | ||||
|       } | ||||
|     elsif ($argument =~ m,\/$,) { | ||||
|       if ($argument !~ m,^\/,) { | ||||
|         if ($pwd =~ m,^\/$,) { | ||||
|           $argument =~ m,(.*)\/$,; | ||||
|           $argument = "$pwd$1"; | ||||
|         } | ||||
|         else { | ||||
|           $argument =~ m,(.*)\/$,; | ||||
|           $argument = "$pwd/$1"; | ||||
|         } | ||||
|       } | ||||
|       else { | ||||
|         $argument =~ m,(.*)\/$,; | ||||
|         $argument = $1; | ||||
|       } | ||||
|     } | ||||
|     elsif ($argument !~ m,\/$|^\/, && $argument =~ m,\/,) { | ||||
|         if ($pwd =~ m,^\/$,) { | ||||
|           $argument = "/$argument"; | ||||
|         }        | ||||
|         else { | ||||
|           $argument = "$pwd/$argument"; | ||||
|         } | ||||
|     } | ||||
|    } | ||||
| } # end sub dir | ||||
| 
 | ||||
| # when --dir isn't called...does the same thing as dir. | ||||
| sub fir { | ||||
|      | ||||
|     my ($commands) = @_; | ||||
| 
 | ||||
|     if ($argument =~ m,\/$,) { | ||||
|       # Let's test to see whether it really is a file or directory. | ||||
|            if (! -d $argument) { | ||||
|             print "$argument is not a file\n"; | ||||
|             exit; | ||||
|            } | ||||
|       if ($argument !~ m,^\/,) { | ||||
|         if ($pwd =~ m,^\/$,) { | ||||
|           $argument =~ m,(.*)\/$,; | ||||
|           $argument = "$pwd$1";           | ||||
|         } | ||||
|         else {           | ||||
|           $argument =~ m,(.*)\/$,; | ||||
|           $argument = "$pwd/$1"; | ||||
|         } | ||||
|       } | ||||
|       else { | ||||
|         $argument =~ m,(.*)\/$,; | ||||
|         $argument = $1; | ||||
|       } | ||||
|     } | ||||
|     elsif ($argument !~ m,\/$|^\/, && $argument =~ m,\/,) { | ||||
|         if ($pwd =~ m,^\/$,) { | ||||
|           $argument = "/$argument"; | ||||
|         } | ||||
|         else {  | ||||
|           $argument = "$pwd/$argument"; | ||||
|        } | ||||
|     } | ||||
| } # end sub fir | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
							
								
								
									
										92
									
								
								lib/F.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								lib/F.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,92 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::F; | ||||
| use Carp;                                                                        | ||||
| use strict; | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(get); | ||||
| 
 | ||||
| 
 | ||||
| # This is Net::FTP::get with minor modifications.  Not all the features | ||||
| # are used, but are kept, just in case they will be. | ||||
| 
 | ||||
| sub get                                                                          | ||||
| {                                                                                | ||||
|  my($ftp,$remote,$local,$where) = @_;                                            | ||||
|                                                                                  | ||||
|  my($loc,$len,$buf,$resp,$localfd,$data);                                        | ||||
|  local *FD;                                                                      | ||||
|  $| = 1;                                                                                | ||||
|  $localfd = ref($local) ? fileno($local)                                         | ||||
|                         : undef;                                                 | ||||
|                                                                                  | ||||
|  ($local = $remote) =~ s#^.*/##                                                  | ||||
|         unless(defined $local);                                                  | ||||
|                                                                                  | ||||
|  ${*$ftp}{'net_ftp_rest'} = $where                                               | ||||
|         if ($where);                                                             | ||||
|                                                                                  | ||||
|  delete ${*$ftp}{'net_ftp_port'};                                                | ||||
|  delete ${*$ftp}{'net_ftp_pasv'};                                                | ||||
|                                                                                  | ||||
|  $data = $ftp->retr($remote) or                                                  | ||||
|         return undef;                                                            | ||||
|                                                                                  | ||||
|  if(defined $localfd) | ||||
|   {                                                                              | ||||
|    $loc = $local;                                                                | ||||
|   }                                                                              | ||||
|  else                                                                            | ||||
|   {                                                                              | ||||
|    $loc = \*FD;                                                                  | ||||
|                                                                                  | ||||
|    unless(($where) ? open($loc,">>$local") : open($loc,">$local"))               | ||||
|     {                                                                            | ||||
|      carp "Cannot open Local file $local: $!\n";                                 | ||||
|      $data->abort;                                                               | ||||
|      return undef;                                                               | ||||
|     }                                                                            | ||||
|   }                                                                              | ||||
|                                                                                  | ||||
|  if($ftp->type eq 'I' && !binmode($loc))                                         | ||||
|   {                                                                              | ||||
|    carp "Cannot binmode Local file $local: $!\n";                                | ||||
|    $data->abort;                                                                 | ||||
|    return undef;                                                                 | ||||
|   }                                                                              | ||||
|                                                                                  | ||||
|  $buf = '';  my $amt = 0;                                                                      | ||||
|  #print "\n"; | ||||
|  do                                                                              | ||||
|   {                                                                              | ||||
|    $len = $data->read($buf,1024);  | ||||
|    $amt = $len + $amt; | ||||
|    print "[$amt]\r"; | ||||
|   }                                                                              | ||||
|  while($len > 0 && syswrite($loc,$buf,$len) == $len);                            | ||||
|                                                                                  | ||||
|  close($loc)                                                                     | ||||
|         unless defined $localfd;                                                 | ||||
|                                                                                  | ||||
|  $data->close(); # implied $ftp->response                                        | ||||
|                                                                                  | ||||
|  return $local;                                                                  | ||||
| }              | ||||
							
								
								
									
										877
									
								
								lib/File.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										877
									
								
								lib/File.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,877 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::File; | ||||
| use strict; | ||||
| use SWIM::Global;    | ||||
| use SWIM::DB_Library qw(:Xyz ram_on nsb); | ||||
| use SWIM::Library; | ||||
| use SWIM::Conf qw(:Path $md5sum); | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(file); | ||||
| 
 | ||||
| 
 | ||||
| #=pod | ||||
| # | ||||
| #This provides the list of files belonging to a package.  Although a | ||||
| #database could be used..it's probably faster, and cheaper on space | ||||
| #accessing from the /var/lib/dpkg/info* files.  And if --md5sum is | ||||
| #called, the md5sums are shown for the -d ,-l, or -c files they exist for. | ||||
| #md5sums are checked for, and reported back as OK or FAILED. -l or | ||||
| #-d(overrides l). -qd(l)  md5sum from RH has a slightly different | ||||
| #output.. filepath/filename: file OK before swim's output..this can be | ||||
| #altered | ||||
| # | ||||
| #=end | ||||
| 
 | ||||
| sub file { | ||||
| 
 | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my $file; | ||||
|   my $md5; | ||||
|   my @md5; | ||||
|   my $path; | ||||
|   my @path; | ||||
|   my $md5sums; | ||||
|   my $md5sums_conf; | ||||
|   my %md5sums = (); | ||||
|   my $orig_argument; | ||||
|   my $count = 0; | ||||
| 
 | ||||
| 
 | ||||
|   if (!$commands->{"n"}) { | ||||
|     dbi(\%commands); | ||||
|   } | ||||
|   # files/dirs will be found from contents.deb (compressed) | ||||
|   else { | ||||
|     ndb(\%commands); | ||||
|   } | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|     if ($argument =~ /_/) { | ||||
|        my $check; | ||||
|        if (defined $db{"$argument"}) { | ||||
|         $check = $db{"$argument"}; | ||||
|        } | ||||
|        $argument =~ m,(^.*)_(.*$),; | ||||
|         if (defined $check) { | ||||
|          $argument = $1; | ||||
|          } | ||||
|          else {} | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|    if (!$commands->{"n"}) { | ||||
|     $file = "$parent$base/info/$argument.list";   | ||||
|     if (-e "$parent$base/info/$argument.md5sums") { | ||||
|         $md5sums = "$parent$base/info/$argument.md5sums"; | ||||
|     }  | ||||
|     if (-e "$parent$base/info/$argument-conf.md5sums" && $commands->{"c"}) { | ||||
|         $md5sums_conf = "$parent$base/info/$argument-conf.md5sums"; | ||||
|     }  | ||||
| 
 | ||||
| 
 | ||||
|        ################## | ||||
|        # MD5SUMS FOR -C # | ||||
|        ################## | ||||
|        if ($commands->{"md5sum"} && $commands->{"c"} && !($commands->{"d"} || | ||||
|            $commands->{"l"})) { | ||||
|        if (!defined $md5sums_conf && $commands->{"c"}) {  | ||||
|          $md5sums_conf = make_conf(\%commands); | ||||
|        } | ||||
|        # now we can process $md5sums and $md5sums_conf assuming one or | ||||
|        # both actually exist | ||||
|      if (defined $md5sums_conf) { | ||||
|        chdir("/");  | ||||
|        my %path; | ||||
|        open (MD5SUM, "$md5sums_conf"); | ||||
|        open (MD5SUMCHECK, "|$md5sum -c 2>$tmp/md5sumcheck"); | ||||
|        while (<MD5SUM>) {                                            | ||||
|           if ($_ =~ /newconffile/) { | ||||
|             $path = substr($_, 13);   | ||||
|             push(@path,$path); | ||||
|             $md5 = substr($_, 0, 11); | ||||
|             push(@md5,$md5); | ||||
|             chomp $path; | ||||
|             chomp $md5; | ||||
|             $path{"$path"} = $md5; | ||||
|             print MD5SUMCHECK $_; | ||||
|             next; | ||||
|           }  | ||||
|           $path = substr($_, 34);   | ||||
|           push(@path,$path); | ||||
|           $md5 = substr($_, 0, 32); | ||||
|           push(@md5,$md5); | ||||
|           chomp $path; | ||||
|           chomp $md5; | ||||
|           $path{"$path"} = $md5; | ||||
|           print MD5SUMCHECK $_; | ||||
|         }  | ||||
|         close(MD5SUMCHECK); | ||||
|         close(MD5SUM);   | ||||
|            #now check with md5sum from the dpkg package | ||||
|            my $check_md5sum; | ||||
|            # won't bother going into this while unless there is a reason | ||||
|            if (defined "$tmp/md5sumcheck" && $md5 ne "newconffile") { | ||||
|             open(MD5SUMFILE, "$tmp/md5sumcheck"); | ||||
|             while (<MD5SUMFILE>) { | ||||
|              if ($_ !~ /no files checked/) { | ||||
|               if (/failed/) { | ||||
|                # Humm may be two situations watch or due to coding change | ||||
|                #$check_md5sum = substr($_,39); | ||||
|                $check_md5sum = substr($_,30); | ||||
|                $check_md5sum =~ s/'//;            | ||||
|                chomp $check_md5sum; | ||||
|                $md5sums{"$check_md5sum"} = "FAILED"; | ||||
|               } | ||||
|               elsif (/can't open/) { | ||||
|                # Humm may be two situations watch or due to coding change | ||||
|                #$check_md5sum = substr($_,28); | ||||
|                $check_md5sum = substr($_,19); | ||||
|                chomp $check_md5sum; | ||||
|                $md5sums{"$check_md5sum"} = "MISSING"; | ||||
|               } | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|           close(MD5SUMCHECK); | ||||
|           unlink("$tmp/md5sumcheck");         | ||||
|        # This finishes everything | ||||
|        open (LIST,"$md5sums_conf"); | ||||
|        while (<LIST>) {                                            | ||||
|           if ($_ =~ /newconffile/) { | ||||
|             $_ = substr($_, 13);   | ||||
|             chomp; | ||||
|           }  | ||||
|           else { | ||||
|             $_ = substr($_, 34);   | ||||
|             chomp; | ||||
|           } | ||||
|            if (defined $path{$_}) { | ||||
|                # humm  file_now() not necessary here | ||||
|                if (defined $md5sums{$_}) { | ||||
|                  print " /$_  $path{$_}  $md5sums{$_}\n"; | ||||
|                } | ||||
|                elsif ($path{$_} ne "newconffile") { | ||||
|                  print " /$_  $path{$_}  OK"; | ||||
|                  print "\n";  | ||||
|               }             | ||||
|                else { | ||||
|                  print " /$_  $path{$_}\n"; | ||||
|                } | ||||
|            } | ||||
|        } # last while | ||||
|        close(LIST); | ||||
|        %md5sums = (); | ||||
|        %path = (); | ||||
|        @path = (); | ||||
|        @md5 = (); | ||||
|      } # do the md5sum files even exist? | ||||
|      } | ||||
| 
 | ||||
|      ######################## | ||||
|      # MD5SUMS FOR -C &| -L # | ||||
|      ######################## | ||||
|      # checking for -e $md5sums is a questionable practice because it | ||||
|      # may not exist, but the conf files do. | ||||
|      if ($commands->{"md5sum"} && !$commands->{"d"} &&  | ||||
|          (($commands->{"l"} && $commands->{"c"}) || $commands->{"l"}))  { | ||||
|        # I decided on three while loops, because it was the most practical | ||||
|        # way to handle STDERR from md5sum, and all types of | ||||
|        # experimentation didn't yield a better way of doing it, but there | ||||
|        # is probably a better way.   | ||||
|        # first do things normally, and no chomping | ||||
|        # but, first grab conf info. | ||||
|        if (!defined $md5sums_conf && $commands->{"c"}) {  | ||||
|          $md5sums_conf = make_conf(\%commands);  | ||||
|        } | ||||
|        # now we can process $md5sums and $md5sums_conf assuming one or | ||||
|        # both actually exist | ||||
|      if (defined $md5sums || defined $md5sums_conf) { | ||||
|      #if ($md5sums_conf ne 1) {     | ||||
|        chdir("/");  | ||||
|        my %path; | ||||
|        if ($commands->{"c"} && $md5sums_conf) { | ||||
|          open (MD5SUM,"$md5sums_conf");        | ||||
|        } | ||||
|        else { | ||||
|         open (MD5SUM,"$md5sums"); | ||||
|         $count = 1; | ||||
|        } | ||||
|       while ($count <= 1) { | ||||
|       if (($count == 1 && defined $md5sums) || $count == 0) { | ||||
|        open (MD5SUMCHECK, "|$md5sum -c 2>$tmp/md5sumcheck"); | ||||
|        while (<MD5SUM>) {                                            | ||||
|           if ($_ =~ /newconffile/) { | ||||
|             $path = substr($_, 13);   | ||||
|             push(@path,$path); | ||||
|             $md5 = substr($_, 0, 11); | ||||
|             push(@md5,$md5); | ||||
|             chomp $path; | ||||
|             chomp $md5; | ||||
|             $path{"/$path"} = $md5; | ||||
|             print MD5SUMCHECK $_; | ||||
|             next; | ||||
|           }  | ||||
|           $path = substr($_, 34);   | ||||
|           push(@path,$path); | ||||
|           $md5 = substr($_, 0, 32); | ||||
|           push(@md5,$md5); | ||||
|           chomp $path; | ||||
|           chomp $md5; | ||||
|           $path{"/$path"} = $md5; | ||||
|           print MD5SUMCHECK $_; | ||||
|         }  | ||||
|         close(MD5SUMCHECK); | ||||
|         close(MD5SUM);   | ||||
|            #now check with md5sum from the dpkg package | ||||
|            my $check_md5sum; | ||||
|            #my $count = 0; | ||||
|            # won't bother going into this while unless there is a reason | ||||
|            if (defined "$tmp/md5sumcheck" && $md5 ne "newconffile") { | ||||
|             open(MD5SUMFILE, "$tmp/md5sumcheck"); | ||||
|             while (<MD5SUMFILE>) {         | ||||
|              if ($_ !~ /no files checked/) { | ||||
|               if (/failed/) { | ||||
|                $check_md5sum = substr($_,30); | ||||
|                $check_md5sum =~ s/'//;            | ||||
|                chomp $check_md5sum; | ||||
|                $md5sums{"/$check_md5sum"} = "FAILED"; | ||||
|               } | ||||
|               elsif (/can't open/) { | ||||
|                $check_md5sum = substr($_,19); | ||||
|                #$check_md5sum =~ s/'//;            | ||||
|                chomp $check_md5sum; | ||||
|                $md5sums{"/$check_md5sum"} = "MISSING"; | ||||
|               } | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|           close(MD5SUMCHECK); | ||||
|           unlink("$tmp/md5sumcheck");         | ||||
|       } | ||||
|        # This finishes everything | ||||
|        # This prunes stuff out and assumes that *.list and *.md5sums | ||||
|        # overlap. | ||||
|        open (LIST,"$file"); | ||||
|       ###### | ||||
|       # -L # | ||||
|       ###### | ||||
|       if ($commands->{"l"}  && !$commands->{"df"}) { | ||||
|        while (<LIST>) {                                            | ||||
|          chomp; | ||||
|          if (!-d $_ && $argument ne "base-files") {        | ||||
|           my $line = $_; | ||||
|           file_now(\%commands); | ||||
|           md5_print(\%path,\%md5sums,$line,$count); | ||||
|          }  | ||||
|          ############## | ||||
|          # BASE-FILES # | ||||
|          ############## | ||||
|          elsif ($argument eq "base-files") { | ||||
|           my $line = $_; | ||||
|           md5_print(\%path,\%md5sums,$line,$count); | ||||
|          }       | ||||
|        } # last while | ||||
|       } | ||||
|       ############# | ||||
|       # -L & --DF # | ||||
|       ############# | ||||
|       elsif ($commands->{"l"} && $commands->{"df"}) { | ||||
|        while (<LIST>) {                                            | ||||
|          chomp; | ||||
|           my $line = $_; | ||||
|           file_now(\%commands); | ||||
|           md5_print(\%path,\%md5sums,$line,$count); | ||||
|        } # last while | ||||
|       } | ||||
|        close(LIST); | ||||
|        %md5sums = (); | ||||
|        %path = (); | ||||
|        @path = (); | ||||
|        @md5 = (); | ||||
|       $count++; | ||||
|        if ($count == 1) { | ||||
|         open (MD5SUM,"$md5sums") if $md5sums; | ||||
|        } | ||||
|       } # loop through -c or not | ||||
|      } # do the md5sum files even exist? | ||||
|      #} | ||||
|      } | ||||
|      #@@  got to watch this for -l's called directly, will allow -l to | ||||
|      # be seen whether or not --md5sum is used, changed elsif to if. | ||||
|      # if already found above don't use below here. | ||||
|      # && ||'s tricky here | ||||
|      if (-e $file && !$commands->{"d"} && (!defined $md5sums && | ||||
|          !defined $md5sums_conf) || -e $file && | ||||
|          (!$commands->{"md5sum"} && !$commands->{"d"})) { | ||||
|        file_now(\%commands) if !$commands->{"f"}; | ||||
|        open (LIST,"$file"); | ||||
|        while (<LIST>) {                                            | ||||
|         chomp; | ||||
|         if ($commands->{"l"} && !$commands->{"df"}) { | ||||
|          if (!-d $_ && $argument ne "base-files") {        | ||||
|           print "$_\n";              | ||||
|          } | ||||
|          elsif ($argument eq "base-files") { | ||||
|           print "$_\n"; | ||||
|          }       | ||||
|         } | ||||
|         elsif ($commands->{"l"} && $commands->{"df"}) { | ||||
|          if ($argument ne "base-files") {        | ||||
|           print "$_\n";              | ||||
|          } | ||||
|          elsif ($argument eq "base-files") { | ||||
|           print "$_\n"; | ||||
|          }       | ||||
|         } | ||||
|      } | ||||
|      }  | ||||
|         | ||||
|      ######################## | ||||
|      # MD5SUMS FOR -C &| -D # | ||||
|      ######################## | ||||
|      # for Documentation. | ||||
|      elsif ($commands->{"md5sum"} && ($commands->{"d"} || ($commands->{"d"} && | ||||
|             $commands->{"c"}))) { | ||||
|        if (!defined $md5sums_conf && $commands->{"c"}) {  | ||||
|          $md5sums_conf = make_conf(\%commands); | ||||
|        } | ||||
|        # now we can process $md5sums and $md5sums_conf assuming one or | ||||
|        # both actually exist | ||||
|      if (defined $md5sums || defined $md5sums_conf) { | ||||
|        chdir("/");  | ||||
|        my %path; | ||||
|        if ($commands->{"c"} && $md5sums_conf) { | ||||
|          open (MD5SUM,"$md5sums_conf");        | ||||
|        } | ||||
|        else { | ||||
|         open (MD5SUM,"$md5sums"); | ||||
|         $count = 1; | ||||
|        } | ||||
|       while ($count <= 1) { | ||||
|       if (($count == 1 && defined $md5sums) || $count == 0) { | ||||
|        open (MD5SUMCHECK, "|$md5sum -c 2>$tmp/md5sumcheck"); | ||||
|        while (<MD5SUM>) {                                            | ||||
|           if ($_ =~ /newconffile/) { | ||||
|             $path = substr($_, 13);   | ||||
|             push(@path,$path); | ||||
|             $md5 = substr($_, 0, 11); | ||||
|             push(@md5,$md5); | ||||
|             chomp $path; | ||||
|             chomp $md5; | ||||
|             $path{"/$path"} = $md5; | ||||
|             print MD5SUMCHECK $_; | ||||
|             next; | ||||
|           } | ||||
|           $path = substr($_, 34);   | ||||
|           push(@path,$path); | ||||
|           $md5 = substr($_, 0, 32); | ||||
|           push(@md5,$md5); | ||||
|           chomp $path; | ||||
|           chomp $md5; | ||||
|           $path{"/$path"} = $md5; | ||||
|           print MD5SUMCHECK $_; | ||||
|         }  | ||||
|         close(MD5SUMCHECK); | ||||
|         close(MD5SUM);  | ||||
|            #now check with md5sum from the dpkg package | ||||
|            my $check_md5sum; | ||||
|            # won't bother going into this while unless there is a reason | ||||
|            if (defined "$tmp/md5sumcheck") { | ||||
|             open(MD5SUMFILE, "$tmp/md5sumcheck"); | ||||
|             while (<MD5SUMFILE>) { | ||||
|              if ($_ !~ /no files checked/) { | ||||
|               if (/failed/) { | ||||
|                $check_md5sum = substr($_,30); | ||||
|                $check_md5sum =~ s/'//;            | ||||
|                chomp $check_md5sum; | ||||
|                $md5sums{"/$check_md5sum"} = "FAILED"; | ||||
|               } | ||||
|               elsif (/can't open/) { | ||||
|                $check_md5sum = substr($_,19); | ||||
|                chomp $check_md5sum; | ||||
|                $md5sums{"/$check_md5sum"} = "MISSING"; | ||||
|               } | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|           close(MD5SUMCHECK); | ||||
|           unlink("$tmp/md5sumcheck"); | ||||
|        } | ||||
|        # This finishes everything | ||||
|        open (LIST,"$file"); | ||||
|        while (<LIST>) {                                            | ||||
|          chomp; | ||||
|         # humm, checking for existence? | ||||
|         #if (-e $_ && $argument ne "base-files") {        | ||||
|         if ($argument ne "base-files") {        | ||||
|             #@@ | ||||
|             ###### | ||||
|             # -D # | ||||
|             ###### | ||||
|             if (defined $path{$_}) { | ||||
|               if (defined $md5sums{$_}) { | ||||
|                 if ($count == 0) {   | ||||
|                   print " $_  $path{$_}  $md5sums{$_}" if $count == 0; | ||||
|                   print "$_  $path{$_}  $md5sums{$_}" if $count == 1; | ||||
|                   print "\n"; | ||||
|                 } | ||||
|                 elsif (m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/, && | ||||
|                       $count == 1) {                       | ||||
|                   print " $_  $path{$_}  $md5sums{$_}" if $count == 0; | ||||
|                   print "$_  $path{$_}  $md5sums{$_}" if $count == 1; | ||||
|                   print "\n"; | ||||
|                 } | ||||
|               } | ||||
|               elsif ($path{$_} ne "newconffile") { | ||||
|                 if ($count == 0) { | ||||
|                   print " $_  $path{$_}  OK" if $count == 0; | ||||
|                   print "$_  $path{$_}  OK" if $count == 1; | ||||
|                   print "\n"; | ||||
|                 } | ||||
|                 elsif (m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/, && | ||||
|                       $count == 1) {                       | ||||
|                   print " $_  $path{$_}  OK" if $count == 0; | ||||
|                   print "$_  $path{$_}  OK" if $count == 1; | ||||
|                   print "\n"; | ||||
|                 } | ||||
|               }  | ||||
|               else { | ||||
|                 if ($count == 0) { | ||||
|                   print " $_  $path{$_}\n" if $count == 0; | ||||
|                   print "$_  $path{$_}\n" if $count == 1; | ||||
|                   print "\n"; | ||||
|                 } | ||||
|                 elsif (m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/, && | ||||
|                       $count == 1) {                       | ||||
|                   print " $_  $path{$_}  OK" if $count == 0; | ||||
|                   print "$_  $path{$_}  OK" if $count == 1; | ||||
|                   print "\n"; | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|           elsif ($count == 1) { | ||||
|             if (m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/, && !-d) {                       | ||||
|               file_now(\%commands); | ||||
|               print "$_\n"; | ||||
|             } | ||||
|           }  | ||||
|         } | ||||
|         # humm? treated specially, hopefully. | ||||
|         ###################### | ||||
|         # BASE-FILES PACKAGE # | ||||
|         ######################  | ||||
|         elsif ($argument eq "base-files") { | ||||
|           my $line = $_; | ||||
|           if ($line =~ m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/, || | ||||
|               defined $path{$line}) { | ||||
|             md5_print(\%path,\%md5sums,$line,$count); | ||||
|           } | ||||
|         }       | ||||
|        } # another while | ||||
|        close(LIST); | ||||
|        %md5sums = (); | ||||
|        %path = (); | ||||
|        @path = (); | ||||
|        @md5 = (); | ||||
|       $count++; | ||||
|        if ($count == 1) { | ||||
|         open (MD5SUM,"$md5sums") if $md5sums; | ||||
|        } | ||||
|       } # loop through -c or not | ||||
|      } # do the md5sum files even exist? | ||||
|      } | ||||
|      #@@ another important change, print --md5sum and -l together | ||||
|      if (-e $file && $commands->{"d"} && (!defined $md5sums && | ||||
|          !defined $md5sums_conf) || -e $file && | ||||
|          (!$commands->{"md5sum"} && $commands->{"d"})) { | ||||
|        file_now(\%commands) if !$commands->{"f"}; | ||||
|      #if (-e $file && $commands->{"d"}) { | ||||
|        open (LIST,"$file"); | ||||
|        while (<LIST>) { | ||||
|          chomp; | ||||
|           if (m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/, && !-d) {  | ||||
|               print "$_\n"; | ||||
|           } | ||||
|        } | ||||
|      } | ||||
|      else { | ||||
|        #if (!defined $md5sums || !defined $md5sums_conf) { | ||||
|         if (!-e $file) { | ||||
|          print "package $argument is not installed\n"; | ||||
|        } | ||||
|      } | ||||
|    } # if !--n | ||||
|    else { | ||||
|      # Let's check first if this package actually exists, files are checked | ||||
|      # earlier. | ||||
|      if (defined $argument) { | ||||
|         if (!defined $db{"$argument"}) { | ||||
|          print "package $argument is not installed\n";           | ||||
|          exit; | ||||
|         } | ||||
|      } | ||||
|      nfile(\%commands); | ||||
|    }  | ||||
|   } # if defined $argument  | ||||
| 
 | ||||
|  untie %db; | ||||
|   | ||||
| 
 | ||||
|          if (defined $file_now && !($commands->{"z"} || | ||||
|                                     $commands->{"ftp"} || | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"})) { | ||||
|           if ($commands{"x"} || $commands{"ftp"} || $commands{"source"} || | ||||
|               $commands{"source_only"} || $commands{"remove"} || | ||||
|               $commands{"r"} || $commands{"purge"}) { | ||||
|             require SWIM::Safex; | ||||
|             SWIM::Safex->import(qw(safex)); | ||||
|             safex(\%commands); | ||||
|           }  | ||||
|          } | ||||
| 
 | ||||
| 
 | ||||
| } # end sub file | ||||
| 
 | ||||
| # this manages situation involving -qlcx & -qglx | ||||
| sub file_now { | ||||
| 
 | ||||
|        my ($commands) = @_; | ||||
|        my %commands = %$commands; | ||||
| 
 | ||||
|        #if (!$commands->{"g"} && !defined $file_now) { | ||||
|        if (!$commands->{"g"}) { | ||||
|         if ($arg_count < $#ARGV) { | ||||
|            push(@arg_holder,$argument); | ||||
|            # humm | ||||
|            #@PACKAGES = "DEFINEDONE"; | ||||
|            #@PACKAGES = "$ARGV[$#ARGV]"; | ||||
|            $arg_count++; | ||||
|         } | ||||
|         else {  | ||||
|          @PACKAGES = @arg_holder; | ||||
|          push(@PACKAGES,$argument); | ||||
|         } | ||||
|        } | ||||
|        else { | ||||
|         if ($arg_count < $#stuff) { | ||||
|            push(@arg_holder,$argument); | ||||
|            #$arg_count++; | ||||
|         } | ||||
|         else {  | ||||
|          @PACKAGES = @arg_holder; | ||||
|          push(@PACKAGES,$argument); | ||||
|         } | ||||
|        } | ||||
| 
 | ||||
| } # end file_now | ||||
| 
 | ||||
| # In order to run a md5sum test on configuration files directly recognized | ||||
| # by dpkg, a file with package_name-conf.md5sums is created, in addition to | ||||
| # any existing package_name.md5sums file. | ||||
| sub make_conf { | ||||
| 
 | ||||
|        my ($commands) = @_; | ||||
|        my %commands = %$commands; | ||||
| 
 | ||||
|         my $md5sums_conf; | ||||
|         if (!$commands->{"n"}) { | ||||
|          dbi(\%commands); | ||||
|         } | ||||
|         # humm, just a trap | ||||
|         else { | ||||
|          ndb(\%commands); | ||||
|         } | ||||
| 
 | ||||
|         if ($argument !~ /_/ ) { | ||||
|          # I guess we can stop here here is there are no configuration | ||||
|          # files | ||||
|          if (defined $db{$argument}) { | ||||
|            require SWIM::Info; | ||||
|            SWIM::Info->import(qw(conf)); | ||||
|            my $orig_argument = $argument; | ||||
|            $argument = $db{$argument}; | ||||
|            my ($conf, @conf, %conf); | ||||
|            my ($m5, $dir, $thing); | ||||
|             if (conf(\%commands) ne 0) { | ||||
|               $conf = conf(\%commands); | ||||
|               @conf = split(/\n/, $conf); | ||||
|               open(PACKCONF,">$parent$base/info/$orig_argument-conf.md5sums"); | ||||
|               foreach (@conf) { | ||||
|                $_ =~ m,( \/)(.*$),; | ||||
|                ($dir, $m5)  = split(/ /, $2, 2); | ||||
|                 $thing = "$m5  $dir\n"; | ||||
|                 print PACKCONF $thing;  | ||||
|               } | ||||
|               close(PACKCONF); | ||||
|               $md5sums_conf = | ||||
|               "$parent$base/info/$orig_argument-conf.md5sums"; | ||||
|               return $md5sums_conf; | ||||
|             }  | ||||
|             else { | ||||
|              return; | ||||
|             } | ||||
|           } | ||||
|         }        | ||||
|         untie %db; | ||||
| 
 | ||||
| }  # end sub make_conf | ||||
| 
 | ||||
| 
 | ||||
| # prints out the results from the md5sum test for -l & -l --df | ||||
| sub md5_print { | ||||
| 
 | ||||
|  my ($path, $md5sums, $line, $count) = @_; | ||||
|    | ||||
|            if (defined $path->{$line}) { | ||||
|                if (defined $md5sums->{$line}) { | ||||
|                   print " $line  $path->{$line}  $md5sums->{$line}" if $count == 0; | ||||
|                   print "$line  $path->{$line}  $md5sums->{$line}" if $count == 1; | ||||
|                   print "\n"; | ||||
|                } | ||||
|                elsif ($path->{$line} ne "newconffile") { | ||||
|                  print " $line  $path->{$line}  OK" if $count == 0; | ||||
|                  print "$line  $path->{$line}  OK" if $count == 1; | ||||
|                  print "\n"; | ||||
|                }             | ||||
|                else { | ||||
|                  print " $line  $path->{$line}\n" if $count == 0; | ||||
|                  print "$line  $path->{$line}\n" if $count == 1; | ||||
|                } | ||||
|            } | ||||
|            elsif ($count == 1) { | ||||
|              print "$line\n"; | ||||
|            } | ||||
| 
 | ||||
| } # end md5_print | ||||
| 
 | ||||
| 
 | ||||
| # -n The list of files/dirs belonging to a package.  No md5sum here. | ||||
| sub nfile { | ||||
| 
 | ||||
|    my ($commands) = @_; | ||||
|    my %commands = %$commands;   | ||||
|    my $ramdisk = ram_on(\%commands); | ||||
| 
 | ||||
|   # Here's a case where gnu grep is faster than using open.  | ||||
|   if ($ramdisk eq "yes") { | ||||
|    my $what = "yes"; | ||||
|    process_nfile($what,\%commands); | ||||
|   } # if ramdisk | ||||
| 
 | ||||
|   elsif ($ramdisk eq 1) { | ||||
|     my $what = "no"; | ||||
|     process_nfile($what,\%commands); | ||||
|   } | ||||
| 
 | ||||
| } # end sub nfile | ||||
| 
 | ||||
| # -n figure out --df, -d & -l using the contents db  | ||||
| sub process_nfile { | ||||
| 
 | ||||
|    my ($what,$commands) = @_; | ||||
|    my %commands = %$commands; | ||||
|    my $contentsdb = finddb(\%commands); | ||||
|    my ($arch,$dist) = which_archdist(\%commands); | ||||
|    my ($Contents,$subject); | ||||
| 
 | ||||
| 
 | ||||
|    # the + solution | ||||
|    nsb(\%commands); | ||||
|    $subject = (split(/\s/,$nsb{$argument}))[1]; | ||||
|    $argument =~ s,\+,\\\\+,g if $argument =~ m,\+,; | ||||
|    untie %nsb; | ||||
| 
 | ||||
|    if ($what eq "no") {  | ||||
|     if (-e "$contentsdb/ncontentsindex$arch$dist.deb.gz") { | ||||
|      $Contents = "zgrep -E $argument\ $contentsdb/ncontentsindex$arch$dist.deb.gz|";  | ||||
|     } | ||||
|    else { | ||||
|       print "swim: stopping, cannot perform this operation without contents\n"; | ||||
|       exit; | ||||
|    } | ||||
|    } | ||||
|    elsif ($what eq "yes") { | ||||
|     if (-e "$contentsdb/dramdisk/ncontentsindex$arch$dist.deb.gz") { | ||||
|      $Contents = "zgrep -E $argument\ $contentsdb/dramdisk/ncontentsindex$arch$dist.deb.gz|"; | ||||
|     } | ||||
|     else { | ||||
|       print "swim: stopping, cannot perform this operation without contents\n"; | ||||
|       exit; | ||||
|     } | ||||
|    } | ||||
| 
 | ||||
| 
 | ||||
|    my($dirfile,$package,@dirfile,@comma,%all,%again); | ||||
|     open(CONTENTSDB, "$Contents");  | ||||
|     while (<CONTENTSDB>) { | ||||
|     # changed for >= 0.2.9 - will have to watch for these | ||||
|     # guys net/sendfile, x11/xscreensaver, x11/xscreensaver, | ||||
|     # graphics/ucbmpeg, admin/cfengine .. there is a space before them | ||||
|     #if (/^FILE\s*LOCATION$/) {                                              | ||||
|     #while (<CONTENTSDB>) {   | ||||
|       if (!$commands->{"df"}) { | ||||
|         # this isn't acurate for groups of packages ,,, so will use the | ||||
|         # subject section instead of \b and $ | ||||
|         $argument =~ s,\\\\+,\\\+,g if $argument =~ m,\+,; | ||||
|         if (m,$subject/$argument,) { | ||||
|          ###################### | ||||
|          # DOESN'T END WITH / # | ||||
|          ###################### | ||||
|          if ($_ !~ m,.*/\s+\w*,) { | ||||
|            ($dirfile,$package) = split(/\s+/,$_,2);   | ||||
|            if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|            my @more_things = split(/\s+/,$package); | ||||
|            $package = $more_things[$#more_things]; | ||||
|            (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|            my @dirfile = split(/\s+$backpackage/,$_); | ||||
|            $dirfile = $dirfile[0]; | ||||
|            } | ||||
|            $dirfile = "/$dirfile"; | ||||
|            ###### | ||||
|            # -L # | ||||
|            ###### | ||||
|            if (!$commands->{"d"} && $commands->{"l"}) {  | ||||
|              print "$dirfile\n"; | ||||
|            } | ||||
|            ###### | ||||
|            # -D # | ||||
|            ###### | ||||
|            elsif ($commands->{"d"}) { | ||||
|             if ($dirfile =~ m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/,) { | ||||
|              print "$dirfile\n"; | ||||
|             }  | ||||
|            } | ||||
|          } | ||||
|         } | ||||
|       } | ||||
|       ######## | ||||
|       # --DF # | ||||
|       ######## | ||||
|       elsif ($commands->{"df"} && $commands->{"l"} && !$commands->{"d"}) { | ||||
|         $argument =~ s,\\\\+,\\\+,g if $argument =~ m,\+,; | ||||
|         if (m,$subject/$argument,) { | ||||
|         #if (m,\b$argument\b,) { | ||||
| 
 | ||||
|          ###################### | ||||
|          #    ENDS WITH /     # | ||||
|          ###################### | ||||
|          if (m,.*/\s+\w*,) { | ||||
|            ($dirfile,$package) = split(/\s+/,$_,2); | ||||
|            if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|            my @more_things = split(/\s+/,$package); | ||||
|            $package = $more_things[$#more_things]; | ||||
|            (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|            my @dirfile = split(/\s+$backpackage/,$_); | ||||
|            $dirfile = $dirfile[0]; | ||||
|            } | ||||
|            @dirfile = split(/\//,$dirfile); $dirfile =~ s,/$,,; | ||||
|          }  | ||||
|          ###################### | ||||
|          # DOESN'T END WITH / # | ||||
|          ###################### | ||||
|          else { | ||||
|            ($dirfile,$package) = split(/\s+/,$_,2);   | ||||
|            if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|            my @more_things = split(/\s+/,$package); | ||||
|            $package = $more_things[$#more_things]; | ||||
|            (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|            my @dirfile = split(/\s+$backpackage/,$_); | ||||
|            $dirfile = $dirfile[0]; | ||||
|            } | ||||
|            @dirfile = split(/\//,$dirfile); | ||||
|          } | ||||
|          ########################### | ||||
|          # PROCESS INTO FILES/DIRS # | ||||
|          ########################### | ||||
|          my ($count,$holder); | ||||
|          for ($count = 0; $count <= $#dirfile; $count++) { | ||||
|               if ($count == 0) { | ||||
|                 $holder = "/$dirfile[$count]"; | ||||
|                 my $again = "$dirfile[$count]"; | ||||
|                 my $all = "/."; | ||||
|                 $again{$again}++; | ||||
|                 $all{$all}++; | ||||
|                 if ($all{$all} == 1) { | ||||
|                   print "/.\n"; | ||||
|                 } | ||||
|                 if ($again{$again} == 1) { | ||||
|                   print "/$dirfile[$count]\n"; | ||||
|                 } | ||||
|               } | ||||
|               else {   | ||||
|                 $holder =  $holder . "/$dirfile[$count]"; | ||||
|                 my $again = "$holder"; | ||||
|                 $again{$again}++; | ||||
|                 if ($again{$again} == 1) { | ||||
|                    print "$holder\n"; | ||||
|                 } | ||||
|               } | ||||
|          } # end for | ||||
|        } | ||||
|       } | ||||
|       ################### | ||||
|       # -D & --DF &| -L # | ||||
|       ################### | ||||
|       elsif (($commands->{"d"} && $commands->{"df"}) ||  | ||||
|               $commands->{"d"} && $commands->{"df"} && $commands->{"l"}) { | ||||
|          $argument =~ s,\\\\+,\\\+,g if $argument =~ m,\+,; | ||||
|          if (m,$subject/$argument,) { | ||||
|          #if (m,\b$argument$,) { | ||||
| 
 | ||||
|          ###################### | ||||
|          # DOESN'T END WITH / # | ||||
|          ###################### | ||||
|          if ($_ !~ m,.*/\s+\w*,) { | ||||
|            ($dirfile,$package) = split(/\s+/,$_,2);   | ||||
|            if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|            my @more_things = split(/\s+/,$package); | ||||
|            $package = $more_things[$#more_things]; | ||||
|            (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|            my @dirfile = split(/\s+$backpackage/,$_); | ||||
|            $dirfile = $dirfile[0]; | ||||
|            } | ||||
|            $dirfile = "/$dirfile"; | ||||
|            ###### | ||||
|            # -D # | ||||
|            ###### | ||||
|            if ($dirfile =~ m,/usr/doc/|/usr/share/doc/|/man[\d]/|/usr/info/|/usr/share/info/,) { | ||||
|             print "$dirfile\n"; | ||||
|            }  | ||||
|          } | ||||
|         } | ||||
|      } | ||||
|     #} | ||||
|     #} | ||||
|     } # while | ||||
|    close(CONTENTSDB); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										358
									
								
								lib/Findex.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								lib/Findex.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,358 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Findex; | ||||
| use strict; | ||||
| use SWIM::Global; | ||||
| use SWIM::Conf qw($my_number); | ||||
| use SWIM::DB_Library qw(:Xyz ib nib nsb); | ||||
| use SWIM::Info; | ||||
| use SWIM::Deps; | ||||
| use SWIM::Dir; | ||||
| use vars qw(@ISA @EXPORT_OK); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT_OK = qw(findexer qindexer); | ||||
| 
 | ||||
| 
 | ||||
| # findexer(\%commands) and qindexer used for -a -n -f | ||||
| 
 | ||||
| # query filelist for file name.. -qfl -qal, but not -qfl(d)c ... actually | ||||
| # yes... -qlfd under certain conditions, but not with -c.  And -T and  | ||||
| # singular capabilities. | ||||
| sub findexer { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   my @alot; | ||||
|   require SWIM::File; | ||||
|   SWIM::File->import(qw(file)); | ||||
| 
 | ||||
|       | ||||
|   if (!$commands->{"n"}) { | ||||
|    ib(\%commands); | ||||
|   } | ||||
|   else { | ||||
|    my $return = nib(\%commands); | ||||
|    if (!defined $return && $commands->{"a"}) { | ||||
|        untie %ib; | ||||
|        nsb(\%commands); | ||||
|        $ib{"/."} = $nsb{"/."}; | ||||
|    } | ||||
|   } | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|    if ($commands->{"dir"}) { | ||||
|      dir(\%commands); | ||||
|    } | ||||
|    elsif ($commands->{"f"}) { | ||||
|      fir(\%commands); | ||||
|    } | ||||
|     if ($ib{"$argument"}){ | ||||
|        my $package = $ib{"$argument"}; | ||||
|        @alot = split(/\s/, $package);        | ||||
|        @PACKAGES = @alot; | ||||
|        if ($commands->{"z"} || $commands->{"ftp"} || | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"}) { | ||||
|            require SWIM::Safex; | ||||
|            SWIM::Safex->import(qw(safex)); | ||||
|            safex(\%commands); | ||||
|        } | ||||
|        @alot = @PACKAGES; | ||||
|        if ($commands->{"total"} || $commands->{"t"}) { | ||||
|         if ($commands->{"T"}) {  | ||||
|          foreach (@alot) { | ||||
|           $argument = $_; | ||||
|             if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|              scripts(\%commands); | ||||
|           } | ||||
|           menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|           copyright(\%commands) if $commands->{"copyright"};  | ||||
|           changelog(\%commands) if $commands->{"changelog"};  | ||||
|           # nice to print package names before file listings | ||||
|           if (!$commands->{"i"} || !$commands->{"d"} || !$commands->{"c"}) { | ||||
|             print "$argument\n"; | ||||
|           }  | ||||
|           character(\%commands); | ||||
|           shlibs(\%commands) if $commands->{"shlibs"};        | ||||
|           file(\%commands); | ||||
|           print "\n"; | ||||
|          } | ||||
|         } # if -T | ||||
|           elsif (which_character(\%commands)) { | ||||
|            foreach (@alot) { | ||||
|              my %store_commands = %commands; | ||||
|              $argument = $_;            | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"};  | ||||
|              changelog(\%commands) if $commands->{"changelog"};  | ||||
|              if  (the_character(\%commands) ne "ok") { | ||||
|                print "$argument\n"; | ||||
|              }              | ||||
|              if (defined s_character(\%commands)) {}    | ||||
|              shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|              file(\%commands); | ||||
|              print "\n";           | ||||
|              %commands = %store_commands; | ||||
|              undef %store_commands; | ||||
|            } | ||||
|           } | ||||
|           # no -Ts. | ||||
|           foreach (@alot) { | ||||
|              $argument = $_;                      | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"};  | ||||
|              changelog(\%commands) if $commands->{"changelog"};  | ||||
|              if (defined $argument) { | ||||
|              print "\n" if $commands->{"l"}; | ||||
|              print "$argument\n"; | ||||
|              } | ||||
|             shlibs(\%commands) if $commands->{"shlibs"};        | ||||
|             file(\%commands); | ||||
|              if ($commands->{"d"} && !$commands->{"T"} && !which_character(\%commands)) {  | ||||
|                print "\n" if !$commands->{"l"}; | ||||
|              } | ||||
|           } # end not's | ||||
|        } # if -t  | ||||
| 
 | ||||
| 
 | ||||
|         elsif ($#ARGV > $my_number) { | ||||
|           my $total = $#ARGV + 1; | ||||
|           print "use --total or -t to see all $total packages\n";        | ||||
|           exit; | ||||
|         } | ||||
|         elsif ($#alot > $my_number) { | ||||
|           my $total = $#alot + 1; | ||||
|           print "use --total or -t to see all $total packages\n";        | ||||
|         } | ||||
| 
 | ||||
|         else { | ||||
|           if ($commands->{"T"}) { | ||||
|            foreach (@alot) {                                                     | ||||
|              $argument = $_;                                      | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                  scripts(\%commands);                                                      | ||||
|              }                                                                   | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"};  | ||||
|              changelog(\%commands) if $commands->{"changelog"};  | ||||
|              print "$argument\n";                                                | ||||
|               character(\%commands);  | ||||
|               shlibs(\%commands) if $commands->{"shlibs"};        | ||||
|               file(\%commands); | ||||
|               print "\n"; | ||||
|            } | ||||
|           } # end -T | ||||
|           elsif (which_character(\%commands)) { | ||||
|            foreach (@alot) { | ||||
|              my %store_commands = %commands; | ||||
|              $argument = $_;            | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                  $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                  $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"};  | ||||
|              changelog(\%commands) if $commands->{"changelog"};  | ||||
|              if  (the_character($argument) ne "ok") { | ||||
|                print "$argument\n"; | ||||
|              } | ||||
|              if (defined s_character(\%commands)) {}    | ||||
|              shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|              file(\%commands); | ||||
|              print "\n";           | ||||
|              %commands = %store_commands; | ||||
|              undef %store_commands; | ||||
|            } | ||||
|           } # which_character | ||||
|           foreach (@alot) { | ||||
|             $argument = $_;                      | ||||
|             if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                 scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"};  | ||||
|              changelog(\%commands) if $commands->{"changelog"};  | ||||
|              if (defined $argument) { | ||||
|               print "$argument\n"; | ||||
|              } | ||||
|             file(\%commands); | ||||
|              if ($commands->{"d"} && !$commands->{"T"} && !which_character(\%commands)) {  | ||||
|                print "\n"; | ||||
|              }          | ||||
|           } # end not's | ||||
|        } # else | ||||
|     } | ||||
|      else { | ||||
|         $argument =~ m,.*\/(.*$),; | ||||
|          if (defined $1) { | ||||
|           my $file = $1;  | ||||
|           if (!$commands->{"n"} && -e "/usr/sbin/update-alternatives") { | ||||
|            my $it = "update-alternatives --display $1|"; | ||||
|            open (IT,"$it") or exit; | ||||
|            if (<IT> =~ /No alternatives/) { | ||||
|             print "file $file is not owned by any package\n"; | ||||
|            } | ||||
|            else { | ||||
|             my @LINES = <IT>; | ||||
|             print "For $argument ->\n"; | ||||
|             $LINES[0] =~ m,(/.*$),; $argument = $1; | ||||
|             print "@LINES\n"; findexer(\%commands); | ||||
|            } | ||||
|           }  | ||||
|           else { | ||||
|            print "file $file is not owned by any package\n";  | ||||
|           } | ||||
|          } | ||||
|      } | ||||
|   } | ||||
|   untie %ib; | ||||
| 
 | ||||
|   if (!($commands->{"z"} || $commands->{"ftp"} || | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"})) { | ||||
|     if ($commands->{"x"} || $commands->{"ftp"} || $commands->{"source"} || | ||||
|          $commands->{"source_only"} || $commands->{"remove"} || | ||||
|          $commands->{"r"} || $commands->{"purge"}) { | ||||
|            require SWIM::Safex; | ||||
|            SWIM::Safex->import(qw(safex)); | ||||
|            safex(\%commands); | ||||
|     } | ||||
|   }  | ||||
| 
 | ||||
| } # end sub findexer | ||||
| 
 | ||||
| 
 | ||||
| # query description of file name..-i  (-qfi) | ||||
| sub qindexer { | ||||
| 
 | ||||
|    my ($commands) = @_; | ||||
|    my %commands = %$commands; | ||||
|    require SWIM::Ag; | ||||
|    SWIM::Ag->import(qw(description)); | ||||
| 
 | ||||
|    if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|        $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|        $commands->{"postrm"}) { | ||||
|       scripts(\%commands); | ||||
|    } | ||||
|    menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|    copyright(\%commands) if $commands->{"copyright"};  | ||||
|    changelog(\%commands) if $commands->{"changelog"};  | ||||
| 
 | ||||
|    my @alot; | ||||
|    | ||||
|   if (!$commands->{"n"}) { | ||||
|    ib(\%commands); | ||||
|   } | ||||
|   else { | ||||
|    my $return = nib(\%commands); | ||||
|    if (!defined $return && $commands->{"a"}) { | ||||
|        untie %ib; | ||||
|        nsb(\%commands); | ||||
|        $ib{"/."} = $nsb{"/."}; | ||||
|    } | ||||
|   } | ||||
|   | ||||
|   if (defined $argument) { | ||||
|     dir(\%commands); | ||||
|     fir(\%commands); | ||||
|      | ||||
|     # this will be moved above for safex(\%commands) | ||||
|     if ($ib{"$argument"}){ | ||||
|        my $package = $ib{"$argument"}; | ||||
|        @alot = split(/\s/, $package); | ||||
|        @PACKAGES = @alot; | ||||
|        if ($commands->{"z"} || $commands->{"ftp"} || | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"}) {  | ||||
|            require SWIM::Safex; | ||||
|            SWIM::Safex->import(qw(safex)); | ||||
|            safex(\%commands); | ||||
|        }  | ||||
|        @alot = @PACKAGES; | ||||
|         if ($commands->{"total"} || $commands->{"t"}) { | ||||
|          foreach (@alot) { | ||||
|           $argument = $_; | ||||
|           description(\%commands); | ||||
|           print "\n"; | ||||
|          }  | ||||
|         }  | ||||
|         elsif ($#ARGV > 0) { | ||||
|           my $total = $#ARGV + 1; | ||||
|           print "use --total or -t to see all $total packages\n";               | ||||
|           exit; | ||||
|         } | ||||
|         elsif ($#alot > 0) { | ||||
|           my $total = $#alot + 1; | ||||
|           print "use --total or -t to see all $total packages\n";        | ||||
|         } | ||||
|         else { | ||||
|           $argument = $package; | ||||
|           description(\%commands);      | ||||
|         } | ||||
|     } | ||||
|     else {  | ||||
|         $argument =~ m,.*\/(.*$),; | ||||
|          if (defined $1) { | ||||
|           my $file = $1;  | ||||
|           if (!$commands->{"n"} && -e "/usr/sbin/update-alternatives") { | ||||
|            my $it = "update-alternatives --display $1|"; | ||||
|            open (IT,"$it") or exit; | ||||
|            if (<IT> =~ /No alternatives/) { | ||||
|             print "file $file is not owned by any package\n"; | ||||
|            } | ||||
|            else { | ||||
|             my @LINES = <IT>; | ||||
|             print "For $argument ->\n"; | ||||
|             $LINES[0] =~ m,(/.*$),; $argument = $1; | ||||
|             print "@LINES\n"; qindexer(\%commands); | ||||
|            } | ||||
|           }  | ||||
|           else { | ||||
|            print "file $file is not owned by any package\n";  | ||||
|           } | ||||
|          } | ||||
|     } | ||||
|   } | ||||
|   untie %ib; | ||||
|     | ||||
| 
 | ||||
| 
 | ||||
| } # end sub qindexer | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										62
									
								
								lib/Format.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								lib/Format.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Format; | ||||
| use vars qw(@ISA @EXPORT);              | ||||
| 
 | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(*PRETTY *ALLGROUPS *SUBJECT *CENTER *SDS $col1 $col2 $ag1 | ||||
|            $ag2 $ag3 $number $subsite $subdate $subsize $subrelease | ||||
|            $center $number $sdsite $sdsdate $sdsize $sdsrelease); | ||||
| 
 | ||||
| 
 | ||||
| # A nice format to make things look prettier, hopefully. | ||||
| format PRETTY = | ||||
| @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | ||||
| $col1, $col2 | ||||
| . | ||||
| 
 | ||||
| # A format for --allgroups, shouldn't run out of room. | ||||
| format ALLGROUPS  = | ||||
| @<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<   | ||||
| $ag1,                     $ag2,                     $ag3  | ||||
| . | ||||
| 
 | ||||
| # center for DF|APT call | ||||
| format SUBJECT = | ||||
| @||         @|||                     @|||              @|||||||||||  @|||||| | ||||
| $number,    $subsite,                $subdate,         $subsize, $subrelease | ||||
| 
 | ||||
| . | ||||
| 
 | ||||
| 
 | ||||
| format CENTER = | ||||
|                              @||||||||||||||||||||||| | ||||
|                                  $center | ||||
| . | ||||
| 
 | ||||
| 
 | ||||
| format SDS = | ||||
| @>> @||||||||||||||||||||| @||||||||||||||||||||||||||| @||||||||    @||||| | ||||
| $number,       $sdsite,           $sdsdate,              $sdsize,  $sdsrelease | ||||
| . | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										62
									
								
								lib/Global.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								lib/Global.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Global; | ||||
| #use strict; | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS); | ||||
|    | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(%db $ping %ndb %ib $zing %gb $ging %sb $sing %nsb %commands | ||||
|              $argument $save @stuff @PACKAGES @arg_holder $file_now | ||||
|              $arg_count $aptor_count $aptor_group $swim_version); | ||||
| %EXPORT_TAGS = ( | ||||
|                  Info =>  [ qw($argument %db) ] | ||||
|                ); | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| Globals used by all program, which are not related to SWIM::Conf globals. | ||||
| Most will probably be placed in SWIM::DB_Library. | ||||
| 
 | ||||
| =cut | ||||
| # Nothing to be done here. | ||||
| # these could be put into SWIM::DB_Library | ||||
| my (%db,$ping); # package.deb | ||||
| my %ndb;        # npackage.deb  | ||||
| my (%ib, $zing, %it); # fileindex.deb | ||||
| my (%gb, $ging); # groupindex.deb | ||||
| my (%sb, $sing); # statusindex.deb | ||||
| my %nsb;         # nstatusindex.deb | ||||
| my %commands; # standard for Getopt::Long, but should usually  | ||||
|               # be passed from ::*, although it can be global to a module | ||||
| my $argument; # standard for package name | ||||
| my $save; #for pager | ||||
| 
 | ||||
| # Globals related to -xyz | ||||
| my @stuff; # for -g & x | ||||
| my @PACKAGES;  # a replacement for @ARGV | ||||
| my @arg_holder; # helps in tricky situations -> -qxl|d | ||||
| my $file_now;   # defined flag for -qlcx & -qglx for file()   | ||||
| $arg_count = 0; # helps in tricky situations | ||||
| my $aptor_group; # helps when -z is called for groups | ||||
| 
 | ||||
| # Swim's version | ||||
| $swim_version = "0.3.6"; | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										73
									
								
								lib/Groups.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								lib/Groups.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Groups; | ||||
| use strict; | ||||
| use SWIM::DB_Library qw(:Groups); | ||||
| use SWIM::Format; | ||||
| use SWIM::Global qw(%gb); | ||||
| use vars qw(@ISA @EXPORT);    | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(allgroups); | ||||
| 
 | ||||
| 
 | ||||
| # show all the groups present on this system and exit | ||||
| sub allgroups { | ||||
| 
 | ||||
|     my ($commands) = @_; | ||||
|     my %commands = %$commands;  | ||||
| 
 | ||||
|     if (!($commands->{"q"} || $commands->{"query"}) && $commands->{"allgroups"}) { | ||||
|        print "swim: --allgroups may only be used during queries\n"; | ||||
|        exit; | ||||
|     } | ||||
|     if ($commands->{"q"} && $commands->{"allgroups"}) { | ||||
|       $~ = "ALLGROUPS"; | ||||
| 
 | ||||
|      if (!$commands->{"n"}) { | ||||
|         gb(\%commands); | ||||
|      } | ||||
|      else { | ||||
|         ngb(\%commands); | ||||
|      } | ||||
|   | ||||
|       my @complete = sort keys %gb; | ||||
|       my $three = 0; | ||||
|       while ($three <= $#complete) { | ||||
|         if (defined $complete[$three]) { | ||||
|           $ag1 = $complete[$three]; | ||||
|         } | ||||
|         if (defined $complete[$three + 1]) { | ||||
|           $ag2 = $complete[$three + 1]; | ||||
|         } | ||||
|         if (defined $complete[$three + 2]) { | ||||
|           $ag3 = $complete[$three + 2]; | ||||
|         }         | ||||
|        write STDOUT; | ||||
|        $ag1 = ""; | ||||
|        $ag2 = ""; | ||||
|        $ag3 = ""; | ||||
|        $three = $three + 3;  | ||||
|       } | ||||
|     exit; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										509
									
								
								lib/Indexer.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										509
									
								
								lib/Indexer.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,509 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Indexer; | ||||
| use strict; | ||||
| use SWIM::Global; | ||||
| use SWIM::Conf qw($my_number); | ||||
| use SWIM::DB_Library qw(:Xyz ib nib nsb); | ||||
| use SWIM::Info; | ||||
| use SWIM::Pn_print;    | ||||
| use SWIM::Deps; | ||||
| use SWIM::Dir; | ||||
| use vars qw(@ISA @EXPORT_OK); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT_OK = qw(indexer); | ||||
| 
 | ||||
| 
 | ||||
| # The next few subs are provided to shorten indexer | ||||
| # for -d or -l, but not -c when -T | ||||
| sub T_indexer { | ||||
| 
 | ||||
|    my ($alot,$commands) = @_; | ||||
|    my %commands = %$commands; | ||||
| 
 | ||||
|            foreach (@$alot) { | ||||
|              $argument = $_; | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"}; | ||||
|              changelog(\%commands) if $commands->{"changelog"}; | ||||
|              # looks o.k. | ||||
|              print "$argument\n"; | ||||
|              character(\%commands); | ||||
|              shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|              if ($commands->{"d"} && !$commands->{"c"}) { | ||||
|               require SWIM::File; | ||||
|               SWIM::File->import(qw(file)); | ||||
|               file(\%commands); | ||||
|              } | ||||
|              print "\n"; | ||||
|            } | ||||
| } # end sub T_indexer | ||||
| 
 | ||||
| 
 | ||||
| sub which_character_indexer { | ||||
| 
 | ||||
|           my ($alot,$commands) = @_; | ||||
|           my %commands = %$commands; | ||||
| 
 | ||||
|            foreach (@$alot) { | ||||
|              my %store_commands = %commands; | ||||
|              $argument = $_; | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                  $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                  $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"}; | ||||
|              changelog(\%commands) if $commands->{"changelog"}; | ||||
|              if  (the_character(\%commands) ne "ok") { | ||||
|                print "$argument\n"; | ||||
|              } | ||||
|              if (defined s_character(\%commands)) {} | ||||
|              shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|              if ($commands->{"d"} && !$commands->{"c"}) { | ||||
|               require SWIM::File; | ||||
|               SWIM::File->import(qw(file)); | ||||
|               file(\%commands); | ||||
|              } | ||||
|              print "\n"; | ||||
|              %commands = %store_commands; | ||||
|              undef %store_commands; | ||||
|            } | ||||
| 
 | ||||
| } # end sub which_character_indexer  | ||||
| 
 | ||||
| sub noT_indexer { | ||||
| 
 | ||||
| 
 | ||||
|           my ($alot,$commands) = @_; | ||||
|           my %commands = %$commands; | ||||
|           require SWIM::File; | ||||
|           SWIM::File->import(qw(file)); | ||||
| 
 | ||||
|           foreach (@$alot) { | ||||
|             $argument = $_;                      | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"};  | ||||
|              changelog(\%commands) if $commands->{"changelog"};  | ||||
|              if (defined $argument) { | ||||
|               # should be o.k., almost everything has documentation | ||||
|               print "$argument\n"; | ||||
|              } | ||||
|             shlibs(\%commands) if $commands->{"shlibs"};        | ||||
|             file(\%commands); | ||||
|              if ($commands->{"d"} && !$commands->{"T"} && !which_character(\%commands)) {  | ||||
|                print "\n"; | ||||
|              } | ||||
|           } | ||||
| 
 | ||||
| } # end sub noT_indexer | ||||
| 
 | ||||
| # different enough from noT_indexer, used when -c,-d,-l aren't called. | ||||
| sub nonoT_indexer { | ||||
| 
 | ||||
|           my ($alot,$commands) = @_; | ||||
|           my %commands = %$commands; | ||||
| 
 | ||||
|            foreach (@$alot) { | ||||
|               $argument = $_;   | ||||
|              if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|              } | ||||
|              menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|              copyright(\%commands) if $commands->{"copyright"};  | ||||
|              changelog(\%commands) if $commands->{"changelog"};  | ||||
|              # package name will print out even if there is no script | ||||
|              # definitely useful here | ||||
|              singular(\%commands); | ||||
|              if ($commands->{"scripts"}) { | ||||
|                  print "\n"; | ||||
|              } | ||||
|              shlibs(\%commands) if $commands->{"shlibs"};  | ||||
|            } | ||||
|            | ||||
| 
 | ||||
| } # end sub nonoT_indexer | ||||
| 
 | ||||
| 
 | ||||
| # when -c is called with or without -l or -d.  This sub got rather huge.  | ||||
| sub c_indexer { | ||||
| 
 | ||||
|   my ($alot,$commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   my $arg_save; | ||||
|   require SWIM::File; | ||||
|   SWIM::File->import(qw(file)); | ||||
| 
 | ||||
|           foreach (@$alot) { | ||||
|            $argument = $_;            | ||||
|            if (conf(\%commands) ne 0) { | ||||
|              if ($commands->{"T"}) { | ||||
|               # covers first argument, but not the rest. | ||||
|               if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                 $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                 $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|               } | ||||
|               menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|               copyright(\%commands) if $commands->{"copyright"};  | ||||
|               changelog(\%commands) if $commands->{"changelog"};  | ||||
|                 print "$argument\n";  | ||||
|                 character(\%commands);    | ||||
|                 shlibs(\%commands) if $commands->{"shlibs"};                | ||||
|                 print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|                 file(\%commands); | ||||
|                 #file(\%commands) if $commands->{"md5sum"}; | ||||
|                  if (($commands->{"c"} && (!$commands->{"d"} || !$commands->{"l"}))) { | ||||
|                      print "\n"; | ||||
|                  } | ||||
|               $arg_save = $argument; | ||||
|              } # end "T"  | ||||
|   | ||||
|              elsif (which_character(\%commands)) { | ||||
|                  my %store_commands = %commands; | ||||
|                  $argument = $_;            | ||||
|                  if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                      $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                      $commands->{"postrm"}) { | ||||
|                     scripts(\%commands); | ||||
|                  } | ||||
|                  menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|                  copyright(\%commands) if $commands->{"copyright"};  | ||||
|                  changelog(\%commands) if $commands->{"changelog"};  | ||||
|                  if  (the_character(\%commands) ne "ok") { | ||||
|                    print "$argument\n"; | ||||
|                  } | ||||
|                  if (defined s_character(\%commands)) {}    | ||||
|                  shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|                  print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|                  file(\%commands); | ||||
|                  #file(\%commands) if $commands->{"md5sum"}; | ||||
|                  if (($commands->{"c"} && (!$commands->{"d"} || !$commands->{"l"}))) { | ||||
|                      print "\n"; | ||||
|                  } | ||||
|                  %commands = %store_commands; | ||||
|                  undef %store_commands; | ||||
|               $arg_save = $argument; | ||||
|              } | ||||
| 
 | ||||
|              # no Ts. | ||||
|              else { | ||||
|                 if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                     $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                     $commands->{"postrm"}) { | ||||
|                     scripts(\%commands); | ||||
|                 } | ||||
|                 menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|                 copyright(\%commands) if $commands->{"copyright"};  | ||||
|                 changelog(\%commands) if $commands->{"changelog"};  | ||||
|                 print "$argument\n"; | ||||
|                 shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|                 print conf(\%commands) if !$commands->{"md5sum"}; | ||||
|                 file(\%commands); | ||||
|                 print "\n"; | ||||
|              } | ||||
|            $arg_save = $argument; | ||||
|            } # end if (conf(\%commands)    | ||||
| 
 | ||||
|            # this spot here can determine whether or not -c overrides l&d | ||||
|            # in packages which don't have conf files.  it's nicer to view | ||||
|            # everything.  watch this..these are packages which don't have | ||||
|            # conf files  | ||||
|            if ($commands->{"d"} || $commands->{"l"}) { | ||||
|             if (defined $arg_save) { | ||||
|             if ($argument ne $arg_save) {  | ||||
|             #if (!defined $arg_save) { | ||||
|             if (conf(\%commands) ne 0) { | ||||
|                shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|                file(\%commands); | ||||
|                print "\n"; | ||||
|              }  | ||||
| 
 | ||||
|              # no conf files | ||||
|              elsif (conf(\%commands) eq 0) {  | ||||
|               if ($commands->{"T"}) { | ||||
|                 $argument = $_;            | ||||
|               if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                   $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                   $commands->{"postrm"}) { | ||||
|                  scripts(\%commands); | ||||
|               } | ||||
|               menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|               copyright(\%commands) if $commands->{"copyright"};  | ||||
|               changelog(\%commands) if $commands->{"changelog"};  | ||||
|                 print "$argument\n";  | ||||
|                 character(\%commands);    | ||||
|                 shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|                 file(\%commands) if $commands->{"md5sum"}; | ||||
|                  print "\n"; | ||||
|               } # end "T"  | ||||
| 
 | ||||
|               elsif (which_character(\%commands)) { | ||||
|                  my %store_commands = %commands; | ||||
|                  $argument = $_;            | ||||
|                  if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                      $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                      $commands->{"postrm"}) { | ||||
|                     scripts(\%commands); | ||||
|                  } | ||||
|                  menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|                  copyright(\%commands) if $commands->{"copyright"};  | ||||
|                  changelog(\%commands) if $commands->{"changelog"};  | ||||
|                  if  (the_character(\%commands) ne "ok") { | ||||
|                    print "$argument\n"; | ||||
|                  } | ||||
|                  if (defined s_character(\%commands)) {}    | ||||
|                  shlibs(\%commands) if $commands->{"shlibs"}; | ||||
|                  %commands = %store_commands; | ||||
|                  undef %store_commands; | ||||
|                  file(\%commands); | ||||
|                  print "\n"; | ||||
|               } | ||||
| 
 | ||||
|               # no Ts.  | ||||
|               else { | ||||
|                  if ($commands->{"scripts"} || $commands->{"preinst"} || | ||||
|                     $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|                     $commands->{"postrm"}) { | ||||
|                      scripts(\%commands); | ||||
|                  } | ||||
|                  menu(\%commands) if $commands->{"menu"} || $commands->{"m"}; | ||||
|                  copyright(\%commands) if $commands->{"copyright"};  | ||||
|                  changelog(\%commands) if $commands->{"changelog"};  | ||||
|                  singular(\%commands); | ||||
|                  if ($commands->{"scripts"}) { | ||||
|                      print "\n"; | ||||
|                  } | ||||
|                  shlibs(\%commands) if $commands->{"shlibs"};  | ||||
|                  file(\%commands); | ||||
|                  print "\n"; | ||||
|               } | ||||
|              }  | ||||
|             } | ||||
|             } | ||||
|            } # end if ($commands->{"d"} ||  | ||||
|           } # end foreach | ||||
| 
 | ||||
| } # end sub c_indexer | ||||
| 
 | ||||
| 
 | ||||
| # handles -qf by itself or with -l(-d)&-c or -d by itself, and -qa by itself | ||||
| # or with -c with -d and/or -l ...essentially not -i. <file> is the | ||||
| # argument And ofcourse -T or singular capabilities.  | ||||
| sub indexer { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   my @alot; | ||||
| 
 | ||||
| 
 | ||||
|   if (!$commands->{"n"}) { | ||||
|    ib(\%commands); | ||||
|   } | ||||
|   else { | ||||
|    my $return = nib(\%commands); | ||||
|    if (!defined $return && $commands->{"a"}) { | ||||
|        untie %ib; | ||||
|        nsb(\%commands); | ||||
|        $ib{"/."} = $nsb{"/."}; | ||||
|    } | ||||
|   } | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|    dir(\%commands); | ||||
|    fir(\%commands); | ||||
|     if ($ib{"$argument"}){ | ||||
|        my $package = $ib{"$argument"}; | ||||
|        $package =~ s/\s/\n/g; | ||||
|         @alot = split(/\s/, $package); | ||||
|         if (defined @alot) { | ||||
|          @PACKAGES = @alot; | ||||
|         } | ||||
|         if ($commands->{"z"} || $commands->{"ftp"}|| | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"}) { | ||||
|            require SWIM::Safex; | ||||
|            SWIM::Safex->import(qw(safex)); | ||||
|            safex(\%commands);           | ||||
|         }  | ||||
| 
 | ||||
| 
 | ||||
|         @alot = @PACKAGES; | ||||
|         if ($commands->{"total"} || $commands->{"t"}) { | ||||
|          # The whole reason for the complicated if/elsif/else routines  | ||||
|          # below is to allow simultaneous printing of -c & -d|-l.  Other | ||||
|          # options can just be included within. | ||||
|            | ||||
|           ########### | ||||
|           # -D & -t # | ||||
|           ########### | ||||
|          if ($commands->{"d"} && !$commands->{"c"}) { | ||||
|           if ($commands->{"T"}) { | ||||
|             T_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           elsif (which_character(\%commands)) { | ||||
|            which_character_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           # no -Ts. | ||||
|            noT_indexer(\@alot,\%commands); | ||||
|          } | ||||
| 
 | ||||
|          ####################### | ||||
|          # -t BUT NOT -C,-D,-L # | ||||
|          ####################### | ||||
|          elsif (!$commands->{"c"} && (!$commands->{"d"} || !$commands->{"l"})) {      | ||||
|           if ($commands->{"T"}) { | ||||
|             T_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           elsif (which_character(\%commands)) { | ||||
|             which_character_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           # humm smail is missing mysteriously, like it never became part | ||||
|           # of /.., basically, fastswim isn't placing it in long.debian. | ||||
|           # no -Ts. | ||||
|           else { | ||||
|             nonoT_indexer(\@alot,\%commands); | ||||
|           } | ||||
|          } | ||||
| 
 | ||||
|          #####################         | ||||
|          # -t -C &| -D || -L # | ||||
|          ##################### | ||||
|          # conf stuf.  Will only show stuff related to -a or -f with conf. | ||||
|          elsif (($commands->{"c"} && (!$commands->{"d"} || !$commands->{"l"})) || | ||||
|                 ($commands->{"c"} && ($commands->{"d"} || $commands->{"l"}))) { | ||||
|            c_indexer(\@alot,\%commands);         | ||||
|          } # end elsif          | ||||
|         }  | ||||
| 
 | ||||
|         ######################### | ||||
|         #  > NUMBER FOR -t # | ||||
|         ########################## | ||||
|         elsif ($#ARGV > $my_number) { | ||||
|           my $total = $#ARGV + 1; | ||||
|           print "use --total or -t to see all $total packages\n";               | ||||
|           exit; | ||||
|         } | ||||
|         elsif ($#alot > $my_number) { | ||||
|           my $total = $#alot + 1; | ||||
|           print "use --total or -t to see all $total packages\n";        | ||||
|         } | ||||
| 
 | ||||
|        # without -t | ||||
|         else { | ||||
| 
 | ||||
|          ###### | ||||
|          # -D # | ||||
|          ###### | ||||
|          if ($commands->{"d"} && !$commands->{"c"}) { | ||||
|           if ($commands->{"T"}) { | ||||
|             T_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           elsif (which_character(\%commands)) { | ||||
|            which_character_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           # the noties | ||||
|           noT_indexer(\@alot,\%commands); | ||||
|          } | ||||
| 
 | ||||
|          ################ | ||||
|          # NOT -C,-D,-L  # | ||||
|          ################ | ||||
|          elsif (!$commands->{"c"} && (!$commands->{"d"} || !$commands->{"l"})) {      | ||||
|           if ($commands->{"T"}) { | ||||
|              T_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           elsif (which_character(\%commands)) { | ||||
|              which_character_indexer(\@alot,\%commands); | ||||
|           } | ||||
|           else { | ||||
|              nonoT_indexer(\@alot,\%commands);  | ||||
|           } | ||||
|          } | ||||
| 
 | ||||
| 
 | ||||
|          ##################         | ||||
|          # -C &| -D || -L # | ||||
|          ################## | ||||
|          # conf stuf.  Will only show stuff related to -a or -f with conf. | ||||
|          elsif (($commands->{"c"} && (!$commands->{"d"} || !$commands->{"l"})) || | ||||
|                 ($commands->{"c"} && ($commands->{"d"} || $commands->{"l"}))) { | ||||
|                c_indexer(\@alot,\%commands); | ||||
|          }          | ||||
|          | ||||
|         } # without -t | ||||
|     } | ||||
|       else {  | ||||
|         $argument =~ m,.*\/(.*$),; | ||||
|          if (defined $1) { | ||||
|           my $file = $1;  | ||||
|           if (!$commands->{"n"} && -e "/usr/sbin/update-alternatives") { | ||||
|            my $it = "update-alternatives --display $1|"; | ||||
|            open (IT,"$it") or exit; | ||||
|            if (<IT> =~ /No alternatives/) { | ||||
|             print "file $file is not owned by any package\n"; | ||||
|            } | ||||
|            else { | ||||
|             my @LINES = <IT>; | ||||
|             print "For $argument ->\n"; | ||||
|             $LINES[0] =~ m,(/.*$),; $argument = $1; | ||||
|             print "@LINES\n"; indexer(\%commands); | ||||
|            } | ||||
|           }  | ||||
|           else { | ||||
|            print "file $file is not owned by any package\n";  | ||||
|           } | ||||
|          } | ||||
|       } | ||||
|   } | ||||
|   untie %ib; | ||||
| 
 | ||||
|   if (defined @alot) { | ||||
|    @PACKAGES = @alot; | ||||
|   } | ||||
|   if (!($commands->{"z"} || $commands->{"ftp"} || | ||||
|                    $commands->{"remove"} || $commands->{"r"} || | ||||
|                    $commands->{"purge"})) { | ||||
|     if ($commands->{"x"} || $commands->{"ftp"} || $commands->{"source"} || | ||||
|          $commands->{"source_only"} || $commands->{"remove"} ||  | ||||
|          $commands->{"r"} || $commands->{"purge"}) { | ||||
|            require SWIM::Safex; | ||||
|            SWIM::Safex->import(qw(safex)); | ||||
|            safex(\%commands);           | ||||
|     }  | ||||
|   } | ||||
|   | ||||
| } # end sub indexer | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										586
									
								
								lib/Info.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										586
									
								
								lib/Info.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,586 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Info; | ||||
| use strict; | ||||
| use SWIM::Conf qw(:Info); | ||||
| use SWIM::Global qw(:Info);    | ||||
| use SWIM::DB_Library qw(:Xyz); | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(scripts copyright changelog menu conf shlibs); | ||||
| 
 | ||||
| # scripts() copyright() changelog() menu() conf() shlibs() | ||||
| # the text stuff taken out of info for the installed system, though the | ||||
| # not-installed system in checked for, just in case. | ||||
| 
 | ||||
| # This shows all the scripts identified with a package(s).  In certain | ||||
| # cases it is valuable to print a script without the name of the package, | ||||
| # so if --scripts, -a, or -t isn't called, the pure script will be | ||||
| # presented. | ||||
| sub scripts { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my ($file, $preinst, $postinst, $prerm, | ||||
|       $postrm, $orig_argument); | ||||
|        | ||||
| 
 | ||||
|   if ($commands->{"n"}) { | ||||
|     print "swim: no scripts for not-installed, consider --diff\n"; exit; | ||||
|   } | ||||
| 
 | ||||
|   dbi(\%commands); | ||||
| 
 | ||||
|     if ($argument =~ /_/) { | ||||
|        $orig_argument = $argument; | ||||
|        my $check = $db{"$argument"}; | ||||
|        $argument =~ m,(^.*)_(.*$),; | ||||
|         if (defined $check) { | ||||
|          $argument = $1; | ||||
|          } | ||||
|         else {}; | ||||
|     } | ||||
|   untie %db; | ||||
|        | ||||
| 
 | ||||
|    # here we will print out whatever we find including the file name. | ||||
|    if ($commands->{"scripts"} && !($commands->{"preinst"} || | ||||
|        $commands->{"postinst"} || $commands->{"prerm"} || | ||||
|        $commands->{"postrm"})) { | ||||
|      if (defined "$parent$base/info/$argument.preinst") {      | ||||
|          $preinst = "$parent$base/info/$argument.preinst"; | ||||
|      } | ||||
|      if (defined "$parent$base/info/$argument.postinst") {      | ||||
|         $postinst = "$parent$base/info/$argument.postinst"; | ||||
|      } | ||||
|      if (defined "$parent$base/info/$argument.prerm") {      | ||||
|         $prerm = "$parent$base/info/$argument.prerm"; | ||||
|      } | ||||
|      if (defined "$parent$base/info/$argument.postrm") {      | ||||
|         $postrm = "$parent$base/info/$argument.postrm"; | ||||
|      } | ||||
|       | ||||
|      if (-e $preinst) { | ||||
|        print "#####$argument.preinst#####\n\n"; | ||||
|        open (LIST,"$preinst"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|      }  | ||||
|      if (-e $postinst) { | ||||
|        print "#####$argument.postinst#####\n\n"; | ||||
|        open (LIST,"$postinst"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|      }  | ||||
|      if (-e $prerm) { | ||||
|        open (LIST,"$prerm"); | ||||
|        print "#####$argument.prerm#####\n\n"; | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|      }  | ||||
|      if (-e $postrm) { | ||||
|        open (LIST,"$postrm"); | ||||
|        print "#####$argument.postrm#####\n\n"; | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|      }  | ||||
|    } # if scripts | ||||
| 
 | ||||
| 
 | ||||
|    # from here on we just print out the particular script(s) called | ||||
|    # literally with no filename, unless -a or -t is called.  This is one | ||||
|    # situation in which -t has a use apart from the global default.  A | ||||
| 
 | ||||
|    # title is printed out for singular scripts in this case. | ||||
|     | ||||
|    if ($commands->{"preinst"}) { | ||||
|      if (defined "$parent$base/info/$argument.preinst") {      | ||||
|          $preinst = "$parent$base/info/$argument.preinst"; | ||||
|      } | ||||
|      if (-e $preinst) { | ||||
|       if ($commands->{"a"} || $commands->{"t"}) {  | ||||
|        print "#####$argument.preinst#####\n\n"; | ||||
|        open (LIST,"$preinst"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|       } | ||||
|       else { | ||||
|        open (LIST,"$preinst"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|      }  | ||||
|      } | ||||
|    } | ||||
| 
 | ||||
|    if ($commands->{"postinst"}) {  | ||||
|      if (defined "$parent$base/info/$argument.postinst") {      | ||||
|         $postinst = "$parent$base/info/$argument.postinst"; | ||||
|      } | ||||
|      if (-e $postinst) { | ||||
|       if ($commands->{"a"} || $commands->{"t"}) {  | ||||
|        print "#####$argument.postinst#####\n\n"; | ||||
|        open (LIST,"$postinst"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|       } | ||||
|       else { | ||||
|        open (LIST,"$postinst"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|       } | ||||
|      } | ||||
|    } | ||||
| 
 | ||||
|    if ($commands->{"prerm"}) { | ||||
|      if (defined "$parent$base/info/$argument.prerm") {      | ||||
|         $prerm = "$parent$base/info/$argument.prerm"; | ||||
|      } | ||||
|      if (-e $prerm) { | ||||
|       if ($commands->{"a"} || $commands->{"t"}) {  | ||||
|        print "#####$argument.prerm#####\n\n"; | ||||
|        open (LIST,"$prerm"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|       } | ||||
|       else { | ||||
|        open (LIST,"$prerm"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|       } | ||||
|      }  | ||||
|    } | ||||
| 
 | ||||
|    if ($commands->{"postrm"}) { | ||||
|      if (defined "$parent$base/info/$argument.postrm") {      | ||||
|         $postrm = "$parent$base/info/$argument.postrm"; | ||||
|      } | ||||
|      if (-e $postrm) { | ||||
|       if ($commands->{"a"} || $commands->{"t"}) {  | ||||
|        print "#####$argument.postrm#####\n\n"; | ||||
|        open (LIST,"$postrm"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|       } | ||||
|       else { | ||||
|        open (LIST,"$postrm"); | ||||
|        while (<LIST>) {                                            | ||||
|         print $_;              | ||||
|        }       | ||||
|       } | ||||
|      }  | ||||
|    } | ||||
| 
 | ||||
|      if (!$commands->{"i"}) { | ||||
|       if (defined $orig_argument) { | ||||
|        $argument = $orig_argument; | ||||
|       } | ||||
|      } | ||||
| 
 | ||||
| } # end sub scripts | ||||
| 
 | ||||
| # show the scripts for /usr/lib/menu | ||||
| sub menu { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my $filelist; | ||||
|   my $orig_argument = $argument; | ||||
|   my %parent; | ||||
| 
 | ||||
|   if ($commands->{"n"}) { | ||||
|     print "swim: no menu for not-installed, consider --diff\n"; exit; | ||||
|   } | ||||
| 
 | ||||
|   dbi(\%commands); | ||||
|    | ||||
| 
 | ||||
|     if ($argument =~ /_/) { | ||||
|        $orig_argument = $argument; | ||||
|        my $check = $db{"$argument"}; | ||||
|        $argument =~ m,(^.*)_(.*$),; | ||||
|         if (defined $check) { | ||||
|          $argument = $1; | ||||
|          } | ||||
|         else {}; | ||||
|     } | ||||
|   untie %db; | ||||
|     | ||||
|    if (defined $argument) { | ||||
|     if (-e "$parent$base/info/$argument.list") { | ||||
|         $filelist = "$parent$base/info/$argument.list"; | ||||
|     }  | ||||
|      if (defined $filelist) {  | ||||
|       # basically, re-find file/package passed to previous sub | ||||
|       open(FINDMENU,"$filelist"); | ||||
|        while (<FINDMENU>) { | ||||
|          chomp; | ||||
|          if (m,^\/usr\/lib\/menu\/(.*[\w-\+\.]),) { | ||||
|           if (!-d) {  | ||||
|            print "#####menu for $orig_argument($1)#####\n"; | ||||
|            open(MENU,"$_"); | ||||
|            while (<MENU>) { | ||||
|              print; | ||||
|            } | ||||
|           print "\n"; | ||||
|           } | ||||
|          } | ||||
|        } | ||||
|        close(FINDMENU); | ||||
|        close(MENU); | ||||
|     } | ||||
|    } # defined | ||||
| 
 | ||||
|      if (!$commands->{"i"}) { | ||||
|        $argument = $orig_argument; | ||||
|      } | ||||
| 
 | ||||
| } # end sub menu | ||||
| 
 | ||||
| 
 | ||||
| # Show changelog, default zcat.  This will show all the changelogs in | ||||
| # the directory /usr/doc/package_name/, there are cases where there is | ||||
| # a debian.changelog and one provided by the individual(s) working on the | ||||
| # software, as well as a variety of other cases. | ||||
| sub changelog { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my $file; | ||||
|   my $orig_argument = $argument; | ||||
| 
 | ||||
|   if ($commands->{"n"}) { | ||||
|     print "swim: no changelog for not-installed, consider --diff\n"; exit; | ||||
|   } | ||||
| 
 | ||||
|     dbi(\%commands); | ||||
| 
 | ||||
|     if ($argument =~ /_/) { | ||||
|        $orig_argument = $argument; | ||||
|        my $check = $db{"$argument"}; | ||||
|        $argument =~ m,(^.*)_(.*$),; | ||||
|         if (defined $check) { | ||||
|          $argument = $1; | ||||
|          } | ||||
|         else {}; | ||||
|     } | ||||
|   untie %db; | ||||
| 
 | ||||
|     | ||||
|      # Using swim -qadt | grep -i change it looks like all the files which | ||||
|      # have change in their name are changelogs when in /usr/doc/$argument, | ||||
|      # sometimes there are more above, but these are the most significant. | ||||
|      my @fsstnd; | ||||
|      if (-e "$parent/usr/doc/$argument" && | ||||
|          -d "$parent/usr/doc/$argument") { | ||||
|         my $directory = "$parent/usr/doc/$argument"; | ||||
|         opendir(CHANGE, "$directory") || die "I thought it existed"; | ||||
|           my @change = sort grep(/change/i, readdir(CHANGE)); | ||||
|        closedir(CHANGE); | ||||
|        foreach (@change) { | ||||
|          if (m,\.gz$,i) { | ||||
|            push(@fsstnd,$_); | ||||
|            print "#####$_ for $argument#####\n\n"; | ||||
|            open(ZCAT,"|$zcat") || die "swim: this option requires zcat"; | ||||
|            open(CHANGELOG, "$directory/$_"); | ||||
|             while (<CHANGELOG>) { | ||||
|              print ZCAT $_; | ||||
|             } | ||||
|            close(ZCAT); | ||||
|            close(CHANGELOG); | ||||
|            print "\n"; | ||||
|          }  | ||||
|          elsif ($_ !~ m,html$|htm$|ps$|dvi$|sgml$|gs$,) { | ||||
|            push(@fsstnd,$_); | ||||
|            print "#####$_ for $argument#####\n\n"; | ||||
|            open(CHANGELOG, "$directory/$_"); | ||||
|             while (<CHANGELOG>) { | ||||
|              print "$_"; | ||||
|             } | ||||
|            close(CHANGELOG); | ||||
|            print "\n"; | ||||
|          } | ||||
|        } | ||||
|      }  | ||||
| 
 | ||||
|      if (-e "$parent/usr/share/doc/$argument" && | ||||
|          -d "$parent/usr/share/doc/$argument") { | ||||
|         my $directory = "$parent/usr/share/doc/$argument"; | ||||
|         opendir(CHANGE, "$directory") || die "I thought it existed"; | ||||
|           my @change = sort grep(/change/i, readdir(CHANGE)); | ||||
|        closedir(CHANGE); | ||||
|        foreach (@change) { | ||||
|          if (m,\.gz$,i) { | ||||
|           my $cf = grep(m,^$_$,,@fsstnd); | ||||
|           if ($cf == 0 ) { | ||||
|            print "#####$_ for $argument#####\n\n"; | ||||
|            open(ZCAT,"|$zcat") || die "swim: this option requires zcat"; | ||||
|            open(CHANGELOG, "$directory/$_"); | ||||
|             while (<CHANGELOG>) { | ||||
|              print ZCAT $_; | ||||
|             } | ||||
|            close(ZCAT); | ||||
|            close(CHANGELOG); | ||||
|            print "\n"; | ||||
|           } | ||||
|          }  | ||||
|          elsif ($_ !~ m,html$|htm$|ps$|dvi$|sgml$|gs$,) { | ||||
|           my $cf = grep(m,^$_$,,@fsstnd); | ||||
|           if ($cf == 0 ) { | ||||
|            print "#####$_ for $argument#####\n\n"; | ||||
|            open(CHANGELOG, "$directory/$_"); | ||||
|             while (<CHANGELOG>) { | ||||
|              print "$_"; | ||||
|             } | ||||
|            close(CHANGELOG); | ||||
|            print "\n"; | ||||
|           } | ||||
|          } | ||||
|        } | ||||
|      }  | ||||
| 
 | ||||
| 
 | ||||
|      if (!$commands->{"i"}) { | ||||
|        $argument = $orig_argument; | ||||
|      } | ||||
| 
 | ||||
| } # end sub changelog | ||||
| 
 | ||||
| # Show copyright, default zcat.  This will show all the copyrights in | ||||
| # the directory /usr/doc/package_name/.  Rather than passing the | ||||
| # greped argument to changelog(), this subroutine was created instead which | ||||
| # keeps things sensible. | ||||
| sub copyright { | ||||
| 
 | ||||
|   my $file; | ||||
|   my $orig_argument = $argument; | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|        | ||||
| 
 | ||||
|   if ($commands->{"n"}) { | ||||
|     print "swim: no copyright for not-installed, consider --diff\n"; exit; | ||||
|   } | ||||
| 
 | ||||
|   dbi(\%commands); | ||||
| 
 | ||||
| 
 | ||||
|     if ($argument =~ /_/) { | ||||
|        $orig_argument = $argument; | ||||
|        my $check = $db{"$argument"}; | ||||
|        $argument =~ m,(^.*)_(.*$),; | ||||
|         if (defined $check) { | ||||
|          $argument = $1; | ||||
|          } | ||||
|         else {}; | ||||
|     } | ||||
|   untie %db; | ||||
| 
 | ||||
|     | ||||
|      # Using swim -qadt | grep -i copy it looks like all the files which | ||||
|      # have copy in their name are generally copyrights when in | ||||
|      # /usr/doc/$argument, sometimes there are more above, but these are | ||||
|      # the most significant. | ||||
|      my @fsstnd; | ||||
|      if (-e "$parent/usr/doc/$argument" && | ||||
|          -d "$parent/usr/doc/$argument") { | ||||
|         my $directory = "$parent/usr/doc/$argument"; | ||||
|         opendir(CHANGE, "$directory") || die "I thought it existed"; | ||||
|           my @change = sort grep(/copy|license/i, readdir(CHANGE)); | ||||
|        closedir(CHANGE);        | ||||
|        foreach (@change) { | ||||
|         if (defined $_) { | ||||
|          if (m,\.gz$,i) { | ||||
|            push(@fsstnd,$_); | ||||
|            print "#####$_ for $orig_argument#####\n\n"; | ||||
|            open(ZCAT,"|$zcat") || die "swim: this option requires zcat"; | ||||
|            open(COPYRIGHT, "$directory/$_"); | ||||
|             while (<COPYRIGHT>) { | ||||
|              print ZCAT $_; | ||||
|             } | ||||
|            # Sometimes these next two mysteriously open, and don't close | ||||
|            # even when no previous gz file was found, causing error output, | ||||
|            # but doesn't effect what's trying to be accomplished.  Doesn't | ||||
|            # happen with changelog(). | ||||
|            close(ZCAT); | ||||
|            close(COPYRIGHT); | ||||
|            print "\n"; | ||||
|          }  | ||||
|          elsif ($_ !~ m,html$|htm$|ps$|dvi$|sgml$|gs$,) { | ||||
|            push(@fsstnd,$_); | ||||
|            print "#####$_ for $orig_argument#####\n\n"; | ||||
|            open(COPYRIGHT, "$directory/$_"); | ||||
|             while (<COPYRIGHT>) { | ||||
|              print "$_"; | ||||
|             } | ||||
|            close(COPYRIGHT); | ||||
|            print "\n"; | ||||
|          } | ||||
|         } # if defined | ||||
|        } | ||||
|      }  | ||||
| 
 | ||||
|      if (-e "$parent/usr/share/doc/$argument" && | ||||
|          -d "$parent/usr/share/doc/$argument") { | ||||
|         my $directory = "$parent/usr/share/doc/$argument"; | ||||
|         opendir(CHANGE, "$directory") || die "I thought it existed"; | ||||
|           my @change = sort grep(/copy|license/i, readdir(CHANGE)); | ||||
|        closedir(CHANGE);        | ||||
|        foreach (@change) { | ||||
|         if (defined $_) { | ||||
|          if (m,\.gz$,i) { | ||||
|           my $cf = grep(m,^$_$,,@fsstnd); | ||||
|           if ($cf == 0 ) { | ||||
|            print "#####$_ for $orig_argument#####\n\n"; | ||||
|            open(ZCAT,"|$zcat") || die "swim: this option requires zcat"; | ||||
|            open(COPYRIGHT, "$directory/$_"); | ||||
|             while (<COPYRIGHT>) { | ||||
|              print ZCAT $_; | ||||
|             } | ||||
|            # Sometimes these next two mysteriously open, and don't close | ||||
|            # even when no previous gz file was found, causing error output, | ||||
|            # but doesn't effect what's trying to be accomplished.  Doesn't | ||||
|            # happen with changelog(). | ||||
|            close(ZCAT); | ||||
|            close(COPYRIGHT); | ||||
|            print "\n"; | ||||
|           } | ||||
|          }  | ||||
|          elsif ($_ !~ m,html$|htm$|ps$|dvi$|sgml$|gs$,) { | ||||
|           my $cf = grep(m,^$_$,,@fsstnd); | ||||
|           if ($cf == 0 ) { | ||||
|            print "#####$_ for $orig_argument#####\n\n"; | ||||
|            open(COPYRIGHT, "$directory/$_"); | ||||
|             while (<COPYRIGHT>) { | ||||
|              print "$_"; | ||||
|             } | ||||
|            close(COPYRIGHT); | ||||
|            print "\n"; | ||||
|           } | ||||
|          } | ||||
|         } # if defined | ||||
|        } | ||||
|      }  | ||||
| 
 | ||||
|      if (!$commands->{"i"}) { | ||||
|        $argument = $orig_argument; | ||||
|      } | ||||
| 
 | ||||
| } # end copyright | ||||
| 
 | ||||
| # process the database for the configuration files | ||||
| sub conf { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   # added for -xyz, but not necessary | ||||
|   if (defined $argument) { | ||||
|      if ($argument !~ /_/) { | ||||
|        if (defined $db{$argument}) { | ||||
|          $argument = $db{$argument}; | ||||
|        } | ||||
|      } | ||||
|   } | ||||
|   if (!$commands->{"n"}) { | ||||
|    dbi(\%commands); | ||||
|   } | ||||
|   else {} | ||||
|   if (defined $argument) { | ||||
|     my $conf = $argument . "CONF"; | ||||
|     if (defined $db{$conf}) {       | ||||
|      return $db{$conf}; | ||||
|     } | ||||
|     else { return 0; } | ||||
|   } | ||||
|  untie %db; | ||||
| } # end sub conf | ||||
| 
 | ||||
| # shared libraries provided by the package | ||||
| sub shlibs { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my $shlibs; | ||||
|   my $orig_argument; | ||||
| 
 | ||||
|   if ($commands->{"n"}) { | ||||
|     print "catswim: no shlibs for not-installed, consider --diff\n"; exit; | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   dbi(\%commands); | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|     if ($argument =~ /_/) { | ||||
|        $orig_argument = $argument; | ||||
|        my $check; | ||||
|        if (defined $db{"$argument"}) { | ||||
|         $check = $db{"$argument"}; | ||||
|        } | ||||
|        $argument =~ m,(^.*)_(.*$),; | ||||
|         if (defined $check) { | ||||
|          $argument = $1; | ||||
|          } | ||||
|          else {} | ||||
|     } | ||||
|     else { | ||||
|        $orig_argument = $argument; | ||||
|     } | ||||
|   } | ||||
|   untie %db; | ||||
| 
 | ||||
|   if (defined $argument) { | ||||
|     if (-e "$parent$base/info/$argument.shlibs") { | ||||
|         $shlibs = "$parent$base/info/$argument.shlibs"; | ||||
|     }  | ||||
|   } | ||||
|      | ||||
|     if (defined $shlibs) { | ||||
|      print "Shlibs:\n";  | ||||
|      open(SHLIBS,"$shlibs"); | ||||
|       while (<SHLIBS>) { | ||||
|         if ($_ !~ m,^\n$,) { | ||||
|          print; | ||||
|         } | ||||
|       } | ||||
|      } | ||||
| 
 | ||||
|    $argument = $orig_argument; | ||||
|        | ||||
| } # end sub shlibs | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										144
									
								
								lib/Library.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								lib/Library.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,144 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Library; | ||||
| use strict; | ||||
| use SWIM::Conf; | ||||
| use SWIM::Global; | ||||
| use vars qw(@ISA @EXPORT); | ||||
|     | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(which_archdist finddb root compress_contents); | ||||
| 
 | ||||
| 
 | ||||
| # functions which do not use DB_File  which_archdist() finddb() root() | ||||
| 
 | ||||
| # which archictecture and distribution does this database involve | ||||
| sub which_archdist { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|      my ($arch,$dist); | ||||
|      #if ($commands->{"initndb"} || $commands->{"rebuildndb"}) { | ||||
|       if ($commands->{"arch"}) { | ||||
|         $arch = "-" . $commands->{"arch"}; | ||||
|       } | ||||
|       else { | ||||
|         $arch = "-$architecture"; | ||||
|       } | ||||
|   | ||||
|       if ($commands->{"dists"}) { | ||||
|         $dist = "-" . $commands->{"dists"}; | ||||
|       } | ||||
|       else { | ||||
|         $dist = "-$distribution"; | ||||
|       } | ||||
|      return ($arch,$dist); | ||||
|     # }  | ||||
| 
 | ||||
| } # end sub which_archdist | ||||
| 
 | ||||
| 
 | ||||
| # finding any database | ||||
| sub finddb { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|   my $fileplace; | ||||
|   | ||||
|   if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|      ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|      (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|     $fileplace = "$parent$library"; | ||||
|     return $fileplace; | ||||
|   } | ||||
|   elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|     $fileplace = "$parent$base"; | ||||
|     return $fileplace; | ||||
|   } | ||||
| 
 | ||||
| } # end sub finddb | ||||
| 
 | ||||
| # This gives the option to be able to used -d & -l, but not -f, by only | ||||
| # copying Contents over to contentsindex*.deb.gz.  This the fast way. | ||||
| sub compress_contents { | ||||
|   | ||||
|   my ($Contents,$commands) = @_; | ||||
|   my %commands = %$commands; | ||||
|   my $contentsdb = finddb(\%commands); | ||||
|   my($arch,$dist) = which_archdist(\%commands); | ||||
|   my $contentsindex = "$contentsdb/ncontentsindex$arch$dist.deb"; | ||||
|   my ($contentsindexgz, $mtime); | ||||
|   if (-e "$contentsdb/ncontentsindex$arch$dist.deb.gz") { | ||||
|    $contentsindexgz = "$contentsdb/ncontentsindex$arch$dist.deb.gz"; | ||||
|    $mtime = (stat("$contentsindexgz"))[9]; | ||||
|   } | ||||
|   else { | ||||
|       $contentsindexgz = "$contentsdb/ncontentsindex$arch$dist.deb.gz"; | ||||
|   } | ||||
| 
 | ||||
|   my $ex; | ||||
|   my $Contents_mtime = (stat("$Contents"))[9]; | ||||
|   my $BContents = $Contents; | ||||
|   $Contents = -B $Contents || $Contents =~ m,\.(gz|Z)$, ?  | ||||
|                "$gzip -dc $Contents|" : "cat $Contents|"; | ||||
|   if (defined $mtime) {   | ||||
|    if ($mtime == $Contents_mtime) { | ||||
|      print "Same Contents files, won't compress\n"; | ||||
|      exit if !$commands->{"ndb"}; | ||||
|      $ex = "stop"; | ||||
|    } | ||||
|    else { | ||||
|       unlink($contentsindexgz); | ||||
|    } | ||||
|   } | ||||
|   if (!defined $ex) { | ||||
|     print "Copying new Contents\n"; | ||||
|     #system $copy, $BContents, $contentsindexgz; | ||||
| 
 | ||||
|     # changed for >= 0.2.9 | ||||
|     # changed again >= 0.3.4    | ||||
|     open(CONTENTS, "$Contents") or die "where is it?\n"; | ||||
|     open(CONTENTSDB,">$contentsindex"); | ||||
|     while (<CONTENTS>) {                                                         | ||||
|        ##if (/^FILE\s*LOCATION$/) {                                            | ||||
|           ##while (<CONTENTS>) {                                                | ||||
|              s,^(\./)+,,;  # filter for Debians altered dir structure | ||||
|              print CONTENTSDB $_; | ||||
|           ##} | ||||
|        ##}  | ||||
|     } | ||||
|    print "Compressing Contents\n";                                             | ||||
|    # added -f just in case | ||||
|    system "$gzip", "-f", "-9", "$contentsindex"; | ||||
|    utime(time,$Contents_mtime,$contentsindexgz);  | ||||
|   } | ||||
| 
 | ||||
| } # end sub compress_contents | ||||
| 
 | ||||
| # for / files  | ||||
| sub root { | ||||
| 
 | ||||
|       if ($argument eq "/") { | ||||
|           $argument = "/."; | ||||
|        }  | ||||
| } # end sub root | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										268
									
								
								lib/MD.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								lib/MD.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,268 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::MD; | ||||
| use strict;  | ||||
| use SWIM::Conf qw(:Path $splt); | ||||
| use SWIM::DB_Library qw(:Md); | ||||
| use SWIM::Library; | ||||
| use SWIM::Global; | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(process_md); | ||||
| 
 | ||||
| # process_md used by both SWIM::DB_Init and SWIM::NDB_Init | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| Because many files and directories exist more than once, and it would be | ||||
| kind of cool to go up to a directory /usr/bin or /usr/bin/ and do a | ||||
| swim -qf and see all the packages that populate that directory... | ||||
| multi-dimensional is the way to go. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| sub process_md { | ||||
| 
 | ||||
|      print "File Database is being made\n"; | ||||
| 
 | ||||
|      my ($commands) = @_; | ||||
|      my %commands = %$commands; | ||||
|      my @ppackage; | ||||
|      my %md; | ||||
|      my @md; | ||||
|      my @mi; | ||||
|      my $thingy; | ||||
|      my @name; | ||||
|      my $count = 0; | ||||
|      my $count1 = 1; | ||||
| 
 | ||||
|      my($place) = finddb(\%commands); | ||||
|            | ||||
|      # Let's determine what architecture and distribution this person is | ||||
|      # interested in. | ||||
|      my ($arch, $dist, $not); | ||||
|      if ($commands->{"initndb"} || $commands->{"rebuildndb"}) {   | ||||
|        ($arch,$dist) = which_archdist(\%commands); | ||||
|        $not = "n"; | ||||
|      } | ||||
|      else { | ||||
|         $arch = ""; | ||||
|         $dist = ""; | ||||
|         $not = ""; | ||||
|      } | ||||
|      my $fileindex = $not . "fileindex"; | ||||
| 
 | ||||
| 
 | ||||
|      # Now we process the files made from the massive array, and create | ||||
|      # fileindex.deb or nfileindex.deb     | ||||
|      # Let's just use split, and will allow for customized line adj.     | ||||
|      # 25000 is the default | ||||
|      if ($commands->{"split_data"}) { | ||||
|       my $split = $commands->{"split_data"}; | ||||
|       system("$splt -l $split $tmp/big.debian $tmp/DEBIAN"); | ||||
|      }  | ||||
|      else { | ||||
|       # Seems like a good default | ||||
|       system("$splt -l 25000 $tmp/big.debian $tmp/DEBIAN"); | ||||
|      } | ||||
|      @ppackage = <$tmp/DEBIAN*>; | ||||
|      # It's unlikely this file will ever get too massive. | ||||
|      push(@ppackage, "$tmp/long.debian"); | ||||
|      print "  Create the database\n"; | ||||
|      foreach $thingy (@ppackage) {   | ||||
|       open(PARTS, "$thingy");  | ||||
|          while (<PARTS>) { | ||||
|              my @c; | ||||
|              @md = split(/ -> /,$_);  | ||||
|              if (defined($md[1])) {  | ||||
|               chomp $md[0]; | ||||
|               chomp $md[1]; | ||||
|               @c = split(/\s/, $md[1]);  | ||||
|              } | ||||
|              push(@mi,$md[0]); | ||||
|              push(@mi,$md[1]); | ||||
|         } # while         | ||||
|        print "    $thingy\n"; | ||||
|        print "    wait a few seconds\n"; | ||||
|        my $zing; | ||||
|        if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|          ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|          (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|         $zing = tie %md, 'DB_File',"$parent$library/$fileindex$arch$dist.deb"  | ||||
|                 or die "DB_File: $!"; | ||||
|        } | ||||
|        elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|          $zing = tie %md, 'DB_File',"$parent$base/$fileindex$arch$dist.deb"  | ||||
|                  or die "DB_File: $!"; | ||||
|        } | ||||
|        while ($count <= $#mi) { | ||||
|          $zing->put($mi[$count], $mi[$count1]);  | ||||
|          $count = $count + 2; | ||||
|          $count1 = $count1 + 2; | ||||
|        }      | ||||
|       undef $zing; | ||||
|       untie %md; | ||||
|       undef %md; | ||||
|       @mi = (); | ||||
|       @md = (); | ||||
|       $count = 0; | ||||
|       $count1 = 1; | ||||
|       close(PARTS);  | ||||
|      } # end foreach   | ||||
| 
 | ||||
|      # now we get to take into account deinstall:ok:config-files | ||||
|      # situations for an installed system. | ||||
|      if ($commands->{"initdb"} || $commands->{"rebuilddb"}) { | ||||
|        sb(\%$commands); ib(\%commands); my $yich; | ||||
|         foreach (values %sb) {  | ||||
|          my $zit; my ($nit,$yit) = (split(/\s/,$_))[0,3];  | ||||
|          if ($yit eq "deinstall:ok:config-files" || | ||||
|              $yit eq "purge:ok:config-files") {  | ||||
|           ($zit = $nit) =~ s,\+,\\\+,;  | ||||
|           if ($ib{"/."} !~ m,$zit,) { | ||||
|            if (!defined $yich) { | ||||
|              $yich = $nit; | ||||
|            }  | ||||
|            else { | ||||
|              $yich = $yich . " $nit"; | ||||
|            }  | ||||
|           } | ||||
|          }  | ||||
|         } | ||||
|         $ib{"/."} = $ib{"/."} . " $yich"; | ||||
|      } | ||||
| 
 | ||||
|      # after much experimentation it turns out that a flat text file | ||||
|      # is much faster for this particular application.  This also | ||||
|      # creates the hash database reference for -db or -i. | ||||
|      my $searchindex =  $not . "searchindex"; | ||||
|      open(FLATFILE, ">$place/$searchindex$arch$dist.deb"); | ||||
|      print "Create the powersearch flat database\n"; | ||||
|      foreach $thingy (@ppackage) {   | ||||
|       if ($thingy ne "$tmp/long.debian") { | ||||
|        open(PARTS, "$thingy");          | ||||
|           while (<PARTS>) { | ||||
|               @md = split(/ -> /,$_);  | ||||
|               if (defined($md[1])) {  | ||||
|                chomp $md[0]; | ||||
|               } | ||||
|               push(@mi,$md[0]); | ||||
|          } # while         | ||||
|        } | ||||
|        print "    $thingy\n"; | ||||
|        print "    wait a few seconds\n"; | ||||
|        while ($count <= $#mi) { | ||||
|           print FLATFILE "$mi[$count]\n"; | ||||
|           $count++; | ||||
|        }      | ||||
|       $count = 0; | ||||
|       @mi = (); | ||||
|       @md = (); | ||||
|       close(PARTS);  | ||||
|     } # end foreach   | ||||
|     close(FLATFILE); | ||||
| 
 | ||||
|      # This creates the flatfile with the directories for --powersearch | ||||
|      # --dir, which is probably a rare match in most cases.  This doesn't | ||||
|      # create a hash reference database for --db and -i because the only | ||||
|      # package which could benifit from this is base-files, but it has | ||||
|      # configuaration files, on the other hand RedHat has at least one  | ||||
|      # package without directories or files, but this is Debian. | ||||
|      my $dirindex =  $not . "dirindex"; | ||||
|      open(FLATFILE, ">$place/$dirindex$arch$dist.deb"); | ||||
|      print "Create the powersearch flat directory database\n"; | ||||
|        open(PARTS, "$ppackage[$#ppackage]");          | ||||
|           while (<PARTS>) { | ||||
|               @md = split(/ -> /,$_);  | ||||
|               if (defined($md[1])) {  | ||||
|                chomp $md[0]; | ||||
|               } | ||||
|               push(@mi,$md[0]); | ||||
|          } # while         | ||||
|        print "    $ppackage[$#ppackage]\n"; | ||||
|        while ($count <= $#mi) { | ||||
|           print FLATFILE "$mi[$count]\n"; | ||||
|           $count++; | ||||
|        }      | ||||
|       $count = 0; | ||||
|       @mi = (); | ||||
|       @md = (); | ||||
|       close(PARTS);  | ||||
|     close(FLATFILE); | ||||
| 
 | ||||
|     # compare nstatusindex*.deb to /. from nfileindex*.deb to find out if | ||||
|     # any of the packages in Packages weren't represented in the Contents | ||||
|     # file.  This is different than the earlier report which shows packages | ||||
|     # which weren't in Packages but were in Contents.  This list is kept, | ||||
|     # and used again in a future --ndb run to make the matches, if they | ||||
|     # exist. | ||||
|     if ($commands->{"initndb"} || $commands->{"rebuildndb"}) { | ||||
|        nsb(\%$commands); | ||||
|        nzing(\%commands); | ||||
|        my @fileindex = split(/\s/,$ib{"/."}); | ||||
|        my @statusindex = split(/\s/,$nsb{"/."}); | ||||
|        if ($#fileindex < $#statusindex) { | ||||
|          my $place = finddb(\%commands); | ||||
|          open(DIFF, ">$place/.packagesdiff$arch$dist.deb")  | ||||
|              or warn "couldn't create diff file\n"; | ||||
|          my %uniques; | ||||
|          @uniques{@fileindex} = (); | ||||
|          foreach (@statusindex) { | ||||
|            # no sense putting non-US or experimental in here unless this  | ||||
|            # is what is wanted. Only need to check for group non-us/* | ||||
|            if (!$commands->{"nue"}) { | ||||
|               my $name = (split(/_/,$_))[0]; | ||||
|               if (defined $nsb{$name}) { | ||||
|                next if (split(/\s/,$nsb{$name}))[1] =~ m,non-us,; | ||||
|               } | ||||
|               if ($dist eq "experimental") { | ||||
|                 next; | ||||
|               } | ||||
|            } | ||||
|            elsif ($dist eq "experimental") { | ||||
|             if (!$commands->{"nue"}) { | ||||
|               my $name = (split(/_/,$_))[0]; | ||||
|               if (defined $nsb{$name}) { | ||||
|                next if (split(/\s/,$nsb{$name}))[1] =~ m,non-us,; | ||||
|               } | ||||
|             } | ||||
|            } | ||||
|             print DIFF "$_\n" unless exists $uniques{$_}; | ||||
|          } | ||||
|         $zing->del("/."); | ||||
|         $zing->put("/.",$nsb{"/."}); | ||||
|        } | ||||
|     } # end if | ||||
| 
 | ||||
| # Will unlink transfer.deb, big.debian, long.debian. | ||||
|   unlink(<$tmp/DEBIAN*>); | ||||
|   unlink("$tmp/transfer.deb"); | ||||
|   unlink("$tmp/big.debian"); | ||||
|   unlink("$tmp/long.debian"); | ||||
| 
 | ||||
| 
 | ||||
|   #!!! | ||||
|    print "    over and out\n"; | ||||
|    print scalar(localtime), "\n"; | ||||
| 
 | ||||
| } # end sub process_md | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										1834
									
								
								lib/NDB.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1834
									
								
								lib/NDB.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										251
									
								
								lib/NDB_File.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								lib/NDB_File.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,251 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| package SWIM::NDB_File; | ||||
| use strict; | ||||
| use SWIM::DB_Library qw(ram_on); # nzing nsb | ||||
| use SWIM::Library; | ||||
| use SWIM::Global qw($argument); # %ib $zing %nsb | ||||
| use SWIM::Conf qw($pwd $tmp); | ||||
| use SWIM::Dir; | ||||
| use SWIM::Ramdisk; | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(noram ncontents_exist find_contents remove_add_nfile); | ||||
| 
 | ||||
| # This program handles updating nfileindex-arch-dists.deb | ||||
| 
 | ||||
| # This checks if the ramdisk is on, we will want to turn it off, if it is. | ||||
| sub noram { | ||||
| 
 | ||||
|    my ($commands) = @_; | ||||
|    my %commands = %$commands;   | ||||
|    my $ramdisk = ram_on(\%commands); | ||||
| 
 | ||||
|   if ($ramdisk eq "yes") { | ||||
|    my $what = "yes"; | ||||
|    $commands{"ramdiskoff"} = 1;  | ||||
|    ramdisk(\%commands); | ||||
|   } # if ramdisk | ||||
| 
 | ||||
| } # end sub nfile | ||||
| 
 | ||||
| # This will set-up the argument for ncontents if it can be found. | ||||
| sub ncontents_exist { | ||||
| 
 | ||||
|    my ($commands) = @_; | ||||
|    my %commands = %$commands; | ||||
|    my $contentsdb = finddb(\%commands); | ||||
|    my ($arch,$dist) = which_archdist(\%commands); | ||||
| 
 | ||||
| 
 | ||||
|     if (-e "$contentsdb/ncontentsindex$arch$dist.deb.gz") {  | ||||
|       if (-e "$contentsdb/ndirindex$arch$dist.deb.gz") { | ||||
|          unlink("$contentsdb/ndirindex$arch$dist.deb.gz"); | ||||
|       } | ||||
|       if (-e "$contentsdb/nsearchindex$arch$dist.deb.gz") { | ||||
|          unlink("$contentsdb/nsearchindex$arch$dist.deb.gz"); | ||||
|       } | ||||
|      return " $contentsdb/ncontentsindex$arch$dist.deb.gz|";  | ||||
|     } | ||||
|    else { | ||||
|      return "no"; | ||||
|    } | ||||
| 
 | ||||
| }  # end sub ncontents_exist | ||||
| 
 | ||||
| # Find where the new Contents is on the on the command line vs the old | ||||
| # Contents database (when the FDB argument isn't used). | ||||
| sub find_contents { | ||||
| 
 | ||||
|    my ($commands) = @_; | ||||
|    my %commands = %$commands; | ||||
| 
 | ||||
|        ############ | ||||
|        # CONTENTS # | ||||
|        ############ | ||||
|        # Figure out where Contents is | ||||
|        if ($commands->{"Contents"}) { | ||||
|         my ($Contents,$FDB); | ||||
|         for ($commands->{"Contents"}) {  | ||||
| 
 | ||||
|           ############### | ||||
|           # SITUATION 0 # | ||||
|           ############### | ||||
|           # this doesn't work to well for anything less simple than ../../ | ||||
|           if (m,^\.\./|^\.\.$,) { | ||||
|            if ($_ !~ m,/[\w-+]+/[\.\$\^\+\?\*\[\]\w-]*$,) { | ||||
|              my $dd; tr/\/// ? ($dd = tr/\///) : ($dd = 1);  | ||||
|              my @pwd =  split(m,/,,$pwd); | ||||
|              s,\.\./,,g; | ||||
|              my $tpwd = ""; | ||||
|              for (1 .. $#pwd - $dd) { | ||||
|                $_ == 1  ? ($tpwd = "/$pwd[$_]")  | ||||
|                         : (x$tpwd = $tpwd . "/$pwd[$_]"); | ||||
|              } | ||||
|             $_ ne ".." ? ($Contents = "$tpwd/$_") : ($Contents = "$tpwd/"); | ||||
|            } | ||||
|             dir(\%commands); | ||||
|             fir(\%commands); | ||||
|           } | ||||
| 
 | ||||
|           ############### | ||||
|           # SITUATION I # | ||||
|           ############### | ||||
|           elsif ( m,\/,) { | ||||
|             $Contents = $_; | ||||
|               if ($Contents =~ m,^\.\/.*,) { | ||||
|                   if ($pwd !~ m,^\/$,) { | ||||
|                     $Contents =~ m,^\.([^\.].*$),; | ||||
|                     $Contents = "$pwd$1"; | ||||
|                   } | ||||
|                   else { | ||||
|                    $Contents =~ m,^\.([^\.].*$),; | ||||
|                    $Contents = "$1"; | ||||
|                   } | ||||
|                }  | ||||
|             dir(\%commands); | ||||
|             fir(\%commands); | ||||
|           } | ||||
| 
 | ||||
|           ################ | ||||
|           # SITUATION II # | ||||
|           ################ | ||||
|           elsif ($pwd =~ m,^\/$,) { | ||||
|             $Contents = "/$_"; | ||||
|             dir(\%commands); | ||||
|             fir(\%commands); | ||||
|           } | ||||
| 
 | ||||
|           ################# | ||||
|           # SITUATION III # | ||||
|           ################# | ||||
|           else { | ||||
|             $Contents = "$pwd/$_"; | ||||
|               if ($Contents =~ m,\.$,) { | ||||
|                  $Contents =~ m,(.*)\.$,; | ||||
|                  $Contents = $1; | ||||
|                } | ||||
|             dir(\%commands); | ||||
|             fir(\%commands); | ||||
|           } | ||||
|         }  | ||||
| 
 | ||||
|     return $Contents; | ||||
| 
 | ||||
|    } # if Contents | ||||
| 
 | ||||
| } # end sub find_contents | ||||
| 
 | ||||
| # figure out --df and remove from nfileindex-arch-dists.deb  | ||||
| sub remove_add_nfile { | ||||
| 
 | ||||
|    my ($argument,$Contents,$subject,$commands) = @_; | ||||
|    my %commands = %$commands; | ||||
|    #my $contentsdb = finddb(\%commands); | ||||
|    #my ($arch,$dist) = which_archdist(\%commands); | ||||
|    ##nzing(\%commands); | ||||
| 
 | ||||
|    # the + solution | ||||
|    $argument =~ s,\+,\\\\+,g if $argument =~ m,\+,; | ||||
|    $Contents = "zgrep -E $argument\ $Contents";  | ||||
|     | ||||
|    my($dirfile,$package,@dirfile,%all,%again, | ||||
|       @package_match,@more_things,@file); | ||||
|     open(CONTENTSDB, "$Contents");  | ||||
|     while (<CONTENTSDB>) { | ||||
|     # changed for >= 0.2.9 | ||||
|     #if (/^FILE\s*LOCATION$/) {                                              | ||||
|     #while (<CONTENTSDB>) {   | ||||
|       ######## | ||||
|       # --DF # | ||||
|       ######## | ||||
|        $argument =~ s,\\\\+,\\\+,g if $argument =~ m,\+,;                        | ||||
|        if (m,$subject/$argument,) {  | ||||
|        #if (m,\b$argument\b,) { | ||||
| 
 | ||||
|          ###################### | ||||
|          #    ENDS WITH /     # | ||||
|          ###################### | ||||
|          if (m,.*/\s+\w*,) { | ||||
|            ($dirfile,$package) = split(/\s+/,$_,2); | ||||
|            if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|            my @more_things = split(/\s+/,$package); | ||||
|            $package = $more_things[$#more_things]; | ||||
|            (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|            my @dirfile = split(/\s+$backpackage/,$_); | ||||
|            $dirfile = $dirfile[0]; | ||||
|            } | ||||
|            @dirfile = split(/\//,$dirfile); $dirfile =~ s,/$,,; | ||||
|          }  | ||||
|          ###################### | ||||
|          # DOESN'T END WITH / # | ||||
|          ###################### | ||||
|          else { | ||||
|            ($dirfile,$package) = split(/\s+/,$_,2);   | ||||
|            if ($package !~ m,^[a-z0-9-]*/.*$|^[a-z0-9-]*/.*/.*$,) { | ||||
|            my @more_things = split(/\s+/,$package); | ||||
|            $package = $more_things[$#more_things]; | ||||
|            (my $backpackage = $package) =~ s,\+,\\+,g; | ||||
|            my @dirfile = split(/\s+$backpackage/,$_); | ||||
|            $dirfile = $dirfile[0]; | ||||
|            } | ||||
|            @dirfile = split(/\//,$dirfile); | ||||
|          } | ||||
|          ########################### | ||||
|          # PROCESS INTO FILES/DIRS # | ||||
|          ########################### | ||||
|          my ($count,$holder); | ||||
|          for ($count = 0; $count <= $#dirfile; $count++) { | ||||
|               if ($count == 0) { | ||||
|                 $holder = "/$dirfile[$count]"; | ||||
|                 my $again = "$dirfile[$count]"; | ||||
|                 $again{$again}++; | ||||
|                 #my $all = "/."; | ||||
|                 #$all{$all}++; | ||||
|                 #if ($all{$all} == 1) { | ||||
|                   #print FILELIST "/.\n"; | ||||
|                 #} | ||||
|                 if ($again{$again} == 1) {                  | ||||
|                   push(@file,"/$dirfile[$count]"); | ||||
|                   #print FILELIST "/$dirfile[$count]\n";  | ||||
|                 } | ||||
|               } | ||||
|               else {   | ||||
|                 $holder =  $holder . "/$dirfile[$count]"; | ||||
|                 my $again = "$holder"; | ||||
|                 $again{$again}++; | ||||
|                 if ($again{$again} == 1) { | ||||
|                   push(@file,"$holder"); | ||||
|                   #print FILELIST "$holder\n";  | ||||
|                 } | ||||
|               } | ||||
|          } # end for | ||||
|        } | ||||
|     undef @package_match; | ||||
|     #} | ||||
|     #} | ||||
|     } # while | ||||
|    close(CONTENTSDB); | ||||
|    undef @more_things; undef @dirfile; undef %again; undef %all; | ||||
|    return @file; | ||||
| 
 | ||||
| 
 | ||||
| } # end sub remove_nfile | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										2366
									
								
								lib/NDB_Init.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2366
									
								
								lib/NDB_Init.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										97
									
								
								lib/Pn_print.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								lib/Pn_print.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Pn_print; | ||||
| use strict; | ||||
| use SWIM::Global qw($argument); | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(singular); | ||||
| 
 | ||||
| 
 | ||||
| # There are times when it is good to print out the "package name_version" | ||||
| # and there are times when it is unecessary.  This sub tries to resolve | ||||
| # these situations, basically it's printme() | ||||
| sub singular { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   # for files, dirs, or groups | ||||
|   if (($commands->{"f"} || $commands->{"dir"} ||  $commands->{"g"} ||  | ||||
|       $commands->{"q"}) &&  | ||||
|       !($commands->{"i"} || $commands->{"l"} || | ||||
|       $commands->{"df"} || $commands->{"d"} || $commands->{"c"} || | ||||
|       $commands->{"scripts"} || $commands->{"preinst"} || $commands->{"postinst"} ||  | ||||
|       $commands->{"prerm"} || $commands->{"postrm"} || $commands->{"T"} || | ||||
|       $commands->{"pre_depends"} || $commands->{"depends"} ||  | ||||
|       $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|       $commands->{"provides"} || $commands->{"replaces"} || | ||||
|       $commands->{"conflicts"} || $commands->{"requires"} || | ||||
|       $commands->{"changelog"} || $commands->{"m"} || $commands->{"menu"} || | ||||
|       $commands->{"copyright"})) { | ||||
|         print "$argument\n"; | ||||
|   } | ||||
|   elsif (($commands->{"f"}  || $commands->{"dir"} ||  $commands->{"g"} || | ||||
|       $commands->{"q"}) &&  | ||||
|       $commands {"c"} && !($commands->{"i"} ||  | ||||
|       $commands->{"df"} || $commands->{"d"} || $commands->{"l"} || | ||||
|       $commands->{"scripts"} || $commands->{"preinst"} || $commands->{"postinst"} ||  | ||||
|       $commands->{"prerm"} || $commands->{"postrm"} || $commands->{"T"} && | ||||
|       $commands->{"pre_depends"} || $commands->{"depends"} ||  | ||||
|       $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|       $commands->{"provides"} || $commands->{"replaces"} || | ||||
|       $commands->{"conflicts"} || $commands->{"requires"} || | ||||
|       $commands->{"changelog"}  || $commands->{"m"} || $commands->{"menu"} || | ||||
|       $commands->{"copyright"})) { | ||||
|         print "$argument\n"; | ||||
|   } | ||||
|   elsif (($commands->{"f"}  || $commands->{"dir"} || $commands->{"g"} || | ||||
|       $commands->{"q"}) &&  | ||||
|       $commands {"c"} && $commands->{"d"} && | ||||
|       !($commands->{"i"} || $commands->{"df"} || $commands->{"l"} ||  | ||||
|       $commands->{"scripts"} || $commands->{"preinst"} || $commands->{"postinst"} ||  | ||||
|       $commands->{"prerm"} || $commands->{"postrm"} || $commands->{"T"} || | ||||
|       $commands->{"pre_depends"} || $commands->{"depends"} ||  | ||||
|       $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|       $commands->{"provides"} || $commands->{"replaces"} || | ||||
|       $commands->{"conflicts"} || $commands->{"requires"} || | ||||
|       $commands->{"changelog"}  || $commands->{"m"} || $commands->{"menu"} || | ||||
|       $commands->{"copyright"})) { | ||||
|         print "$argument\n"; | ||||
|   } | ||||
|   elsif (($commands->{"f"}  || $commands->{"dir"} ||  $commands->{"g"} || | ||||
|       $commands->{"q"}) &&  | ||||
|       $commands {"c"} && ($commands->{"d"} || | ||||
|       $commands->{"l"}) && !($commands->{"i"} || $commands->{"df"} ||  | ||||
|       $commands->{"scripts"} || $commands->{"preinst"} || $commands->{"postinst"} ||  | ||||
|       $commands->{"prerm"} || $commands->{"postrm"} || $commands->{"T"} || | ||||
|       $commands->{"pre_depends"} || $commands->{"depends"} ||  | ||||
|       $commands->{"recommends"} || $commands->{"suggests"} || | ||||
|       $commands->{"provides"} || $commands->{"replaces"} || | ||||
|       $commands->{"conflicts"} || $commands->{"requires"} || | ||||
|       $commands->{"changelog"}  || $commands->{"m"} || $commands->{"menu"} || | ||||
|       $commands->{"copyright"})) { | ||||
|         print "$argument\n"; | ||||
|   } | ||||
| 
 | ||||
| } # end sub singular | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										951
									
								
								lib/Qftp.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										951
									
								
								lib/Qftp.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,951 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Qftp; | ||||
| use strict; | ||||
| use SWIM::Conf; | ||||
| use SWIM::Global qw(@PACKAGES $argument %db); | ||||
| use SWIM::DB_Library qw(:Xyz); | ||||
| use SWIM::Deb qw(md5sumo); | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use Net::FTP; | ||||
| use SWIM::F; | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(qftp); | ||||
| 
 | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| This is the ftp client when --ftp is called with -q, --search/--ps.  The | ||||
| downloaded packages are put in the Default directory (DF) in a directory | ||||
| mirroring (in a way relative to the design of swim) the dists structure | ||||
| which is standard with Debian. This is desirable if a person wants to mirror | ||||
| parts of a remote ftp site above the | ||||
| default_directory/default_root_directory/; this also makes it easy for a | ||||
| person to make their own distribution if they want, and apt can be used to | ||||
| install the packages at a later time by temporarily placing them in | ||||
| /var/cache/apt/archives using --df2apt.  Obviously, this is nicer than using | ||||
| apt just to download the packages, but the --nz option (apt) is provided | ||||
| just in case a person is too lazed to do the -T thing, then they can do the | ||||
| --apt2df thingy to move the packages from /var/cache/apt/archives to the | ||||
| appropriate place in the DF.  Ofcourse, maybe the -T thing was what the | ||||
| person didn't want to do, or maybe the person wants to do a combination of | ||||
| both (like something in the -T apt doesn't care about), this would be an | ||||
| instance where --ftp would be more useful.  The configuration file presents | ||||
| a way to set this up so that the directory particular to the local ftpd can | ||||
| be integrated into the DF.  The DF can be given any unique named | ||||
| directories, and the permisions of the directories created above can also be | ||||
| specified. Other options to control the DF will be provided, and -h will be | ||||
| available for querying the database pertaining to the packages in the DF, | ||||
| thereby allowing manipulation of the packages in the DF.  The database will | ||||
| be made from Packages databases updated whenever the DF is called.  There | ||||
| will be two types of Packages, one pertaining to the state of the local | ||||
| system, and the other pertaining to the state of the real distribution.  | ||||
| --file, and --http will also be integrated with DF when they become | ||||
| available.   | ||||
| 
 | ||||
| IMPORTANT: Support will only be provided for not-installed databases, use a | ||||
| not-installed database which reflects the currently installed package you | ||||
| want to download in binary or source code. This is due to the fact that swim | ||||
| thinks in terms of distribution states, and your installed system may | ||||
| represent a combination of these things.  The md5sum is currently checked | ||||
| for packages, but not for source, if the md5sum data exists (not a new | ||||
| debian-revision, for instance)  the package will be checked. Whether or not | ||||
| the package is OK it will be placed in it's appropriate place if it | ||||
| downloads correctly.  If you get FAILED, examine the package and alert | ||||
| the | ||||
| community (download place, what's wrong with the package), then delete the | ||||
| package.  | ||||
| 
 | ||||
| =cut | ||||
| sub qftp { | ||||
| 
 | ||||
|  my ($arg,$commands) = @_; | ||||
|  my %commands = %$commands; | ||||
| 
 | ||||
| 
 | ||||
|     # Although the /dists/... could be found with -i, it's simpler | ||||
|     # just to use name_versionFILENAME instead.  People shouldn't | ||||
|     # edit --stdin to combine different distributions when doing --ftp, | ||||
|     # (note: ofcourse apt-cache dumpavail could be used, and  | ||||
|     # ncontentsindex could be put together from many dbs) | ||||
|     # since swim can only figure out what distribution is wanted | ||||
|     # from the default value or the one provided on the command line.   | ||||
|     # The same is true of using apt.  Whatever package is | ||||
|     # provided to --stdin is assumed to be of the specified distribution, | ||||
|     # anyways. | ||||
|     if (!$commands->{"n"}) { | ||||
|       dbi(\%commands); | ||||
|       @PACKAGES = map($db{$_},(@PACKAGES = split(/\s/,$arg))); | ||||
|     } | ||||
|     else { | ||||
|       ndb(\%commands); | ||||
|       @PACKAGES = map($db{$_},(@PACKAGES = split(/\s/,$arg)))  | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     my @LOCATION; | ||||
|     for (0 .. $#PACKAGES) { | ||||
|      if (!defined $PACKAGES[$_]) { | ||||
|        print "swim: specified package(s) not found in database\n"; | ||||
|        exit; | ||||
|      }  | ||||
|     }  | ||||
|     if (defined $db{$PACKAGES[0] . "FN"}) {   | ||||
|       @LOCATION = map($db{$_ . "FN"},@PACKAGES); | ||||
|     } | ||||
|     else { | ||||
|      print "swim: incorrect database was specified\n"; | ||||
|      exit; | ||||
|     } | ||||
| 
 | ||||
|    # might as well check for a temporary directory for downloads, if it | ||||
|    # doesn't exist create it. | ||||
|    mkdir("$default_directory/partial",$permission)  | ||||
|    if !-d "$default_directory/partial"; | ||||
|     | ||||
|    # Check if there is a sources.list specified | ||||
|    if (-e "$swim_conf/swimz.list") { | ||||
|      undef @FTP; | ||||
|      open(SOURCES,"$swim_conf/swimz.list") | ||||
|      or warn "swim: could not find swimz.list\n"; | ||||
|        while (<SOURCES>) { | ||||
|          if ($_ !~ m,#.*|^\s+,) {  | ||||
|             chomp; push(@FTP,$_); | ||||
|          } | ||||
|        } | ||||
|       if ($#FTP == -1) {  | ||||
|         print "swim: no sites specified in swimz.list, quiting\n"; | ||||
|         exit; | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|     # let's make unique sites | ||||
|     my (%site,@sites,$site); | ||||
|     foreach $site (@FTP) { | ||||
|       my @parts  = split(' ', $site); | ||||
|       $parts[1]  =~ m,^ftp:/+( (?: (?!/). ) *)(.*),sx; | ||||
|       $site{$1}++; | ||||
|       push(@sites,"$1!$site") if $site{$1} == 1; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|    foreach $site (@sites) { | ||||
| 
 | ||||
|        # will provide all kinds of options for ftp..like firewall | ||||
|         | ||||
|        my $uri; ($site, $uri) = split(/!/,$site); | ||||
|        my $ftp = Net::FTP->new($site, | ||||
|                             Debug => $debug, | ||||
|                             Timeout => $timeout,                         | ||||
|                             Passive => $passive, | ||||
|                             Firewall => $firewall, | ||||
|                             Port => $port | ||||
|                             ); | ||||
| 
 | ||||
|        ########### | ||||
|        # CONNECT # | ||||
|        ########### | ||||
|        if (defined $ftp) { | ||||
|         my $connected = $ftp->code(); | ||||
|         if ($connected == 220) { | ||||
|          print "swim: connected to $site\n"; | ||||
|         } | ||||
|        } | ||||
|        else { | ||||
|          print "swim: could not find $site\n"; | ||||
|          next; | ||||
|        } | ||||
| 
 | ||||
| 
 | ||||
|        ######### | ||||
|        # LOGIN # | ||||
|        ######### | ||||
|        $ftp->login("anonymous","swim\@the.netpedia.net"); | ||||
|        my $logged  = $ftp->code(); | ||||
|        # we are logged, but what is the time difference. | ||||
|        if ($logged == 230 || $logged == 332) { | ||||
|          print "swim: logged in to $site\n"; | ||||
|          $ftp->binary; | ||||
|        } | ||||
|        else { | ||||
|         # 530 "not logged in" will have to test this | ||||
|         $ftp->code(); | ||||
|         print "swim: not logged in to $site\n"; | ||||
|         next; | ||||
|        } | ||||
| 
 | ||||
|      # find the base to the distribution  | ||||
|      my @parts  = split(' ', $uri); | ||||
|      $parts[1]  =~ m,^ftp:/+( (?: (?!/). ) *)(.*),sx; | ||||
|      my $base = $2; | ||||
| 
 | ||||
|     # this finds the base, but it only needs to be found once, ofcourse | ||||
|     # a foreach is totally unecessary unless the site has weird symlinks. | ||||
|     my @tryme_again; my $base_count = 0; | ||||
|     foreach (@FTP) { | ||||
|       next if $base_count == 1; | ||||
| 
 | ||||
|        ############ | ||||
|        #  SETUP   # | ||||
|        ############ | ||||
|         LOCUS: foreach (@LOCATION) { | ||||
|         m,(.*)/(.*)$,; | ||||
|         my $uptopackage = $1; | ||||
|         my $packagename = $2; my $packagen = $2;  | ||||
|         $packagename =~ s,\+,\\\+,g; | ||||
|         my ($source_drd,$drd); | ||||
|         # make directories with permissions if they don't already exist | ||||
|         # and also establish standardized (swimy) debian-non-US and the | ||||
|         # appropriate symlinks | ||||
|         # if a non-US file is requested. | ||||
|         if ($uptopackage !~ /non-US/) { | ||||
|          if (!-d "$default_directory/$default_root_directory/$uptopackage") { | ||||
|           my $place = "$default_directory/$default_root_directory"; | ||||
|           my @DP = split(m,/,,$uptopackage); | ||||
|           my $placement = "/"; | ||||
|           for (0 .. $#DP) {   | ||||
|             $_ == 0 ? ($placement = "/$DP[$_]")  | ||||
|                     : ($placement = $placement . "/" . $DP[$_]); | ||||
|             mkdir("$place$placement",$permission);  | ||||
|                  # will fix this later | ||||
|                  # or warn "swim: could not create dists directory\n"; | ||||
|                  # Ofcourse there is even a better fix. | ||||
|           } | ||||
|          } | ||||
|         } | ||||
|         #################### | ||||
|         # ################ # | ||||
|         # # NON-US FILES # # | ||||
|         # ################ # | ||||
|         #################### | ||||
|         else { | ||||
|          (my $above_drd = $uptopackage) =~ s,dists,,; | ||||
|          $above_drd =~ s,non-US/,,; | ||||
|          $source_drd = (split(m,/,,$above_drd))[1];     | ||||
|          ($drd = $default_root_directory) =~ s,/debian,,; | ||||
|          if (!-e "$default_directory$drd/debian-non-US$above_drd") { | ||||
|           my $place = "$default_directory"; | ||||
|           my $create = "$drd/debian-non-US$above_drd";  | ||||
|           my @DP = split(m,/,,$create); | ||||
|           my $placement = "/"; | ||||
|           for (0 .. $#DP) {   | ||||
|             $_ == 0 ? ($placement = "/$DP[$_]")  | ||||
|                     : ($placement = $placement . "/" . $DP[$_]); | ||||
|             mkdir("$place$placement",$permission)  | ||||
|                  or warn "swim: could not create debian-non-US directory\n"; | ||||
|           } | ||||
|           if (!-d "$default_directory$drd/debian-non-US/$source_drd/source") { | ||||
|           my $place = "$default_directory"; | ||||
|           my $create = "$drd/debian-non-US/$source_drd/source";  | ||||
|           my @DP = split(m,/,,$create); | ||||
|           my $placement = "/"; | ||||
|           for (0 .. $#DP) {   | ||||
|             $_ == 0 ? ($placement = "/$DP[$_]")  | ||||
|                     : ($placement = $placement . "/" . $DP[$_]); | ||||
|             mkdir("$place$placement",$permission)  | ||||
|                  or warn "swim: could not create debian-non-US directory\n"; | ||||
|           } | ||||
|           }  | ||||
|   | ||||
|          $place = "$default_directory$drd/debian-non-US"; | ||||
|          my $disty = (split(m,/,))[1]; $create = "/dists/$disty"; | ||||
|          undef @DP; | ||||
|           @DP = split(m,/,,$create); | ||||
|           for (0 .. $#DP) {   | ||||
|             $_ == 0 ? ($placement = "/$DP[$_]")  | ||||
|                     : ($placement = $placement . "/" . $DP[$_]); | ||||
|             mkdir("$place$placement",$permission)  | ||||
|                  or warn "swim: could not create debian-non-US directory\n"; | ||||
|           } | ||||
| 
 | ||||
|          # make the symlinks | ||||
|          chdir("$place$placement"); | ||||
|          symlink("../../$disty","non-US"); | ||||
|          symlink("../../$disty/source","source"); | ||||
| 
 | ||||
|          $place = "$default_directory$drd/debian"; $create = "/dists/$disty"; | ||||
|          undef @DP; | ||||
|           @DP = split(m,/,,$create); | ||||
|           for (0 .. $#DP) {   | ||||
|             $_ == 0 ? ($placement = "/$DP[$_]")  | ||||
|                     : ($placement = $placement . "/" . $DP[$_]); | ||||
|             mkdir("$place$placement",$permission)  | ||||
|                  or warn "swim: could not create debian-non-US directory\n"; | ||||
|           } | ||||
|          chdir("$place$placement"); | ||||
| 
 | ||||
|          # make more symlinks | ||||
|          symlink | ||||
|          ("../../../debian-non-US/dists/$disty/non-US","non-US"); | ||||
|          } # if non-US dir !-e | ||||
|         } # end non-us | ||||
| 
 | ||||
|   | ||||
|         ####### | ||||
|         # GET # | ||||
|         ####### | ||||
|         my $file;  | ||||
|          ($packagen = $packagename) =~ s,\\\+,\+,g; | ||||
|          my $localfile = | ||||
|         "$default_directory/partial/$packagen"; | ||||
|          my $home = | ||||
|         "$default_directory/$default_root_directory/$_"; | ||||
|          my $size = $ftp->size("$base/$_"); | ||||
|          my $rmtime = $ftp->mdtm("$base/$_"); | ||||
|          my $file_exist = $ftp->code(); | ||||
|          ######################### | ||||
|          # CHECK DEBIAN-REVISION # | ||||
|          ######################### | ||||
|          # the way this is set up, it is assumed that something exists for | ||||
|          # the -(debian-revision). | ||||
|          if ($file_exist == 550) { | ||||
|            print "swim: $packagen does not exist on the server\n";  | ||||
|            print "swim: checking to see if the debian-revision has changed\n"; | ||||
|            $packagename =~ m,^(.*)-[\dA-Za-z\.\+]+\.deb$,; | ||||
|            my $matcher = $1; | ||||
|            $_ =~ m,^(.*)/$matcher[-\da-zA-Z\.\+]+\.deb$,; | ||||
|            my $otherthing = $1; | ||||
|            my $REVISIONCHANGE = $ftp->ls("$base/$uptopackage"); | ||||
|            my $singfile; | ||||
|            foreach (@{$REVISIONCHANGE}) { | ||||
|              m,^.*/($matcher[-\dA-Za-z\.\+]+\.deb)$,            | ||||
|                 ? ($singfile = $1)   | ||||
|                 : ($singfile = $_); | ||||
|               if ($singfile =~ /^$matcher/) { | ||||
|                   $file = $singfile; | ||||
|               } | ||||
|             } | ||||
|            my $checkfile; | ||||
|            defined $file | ||||
|             ? ($checkfile = $otherthing . "/$file") | ||||
|             : ($checkfile = "NOFILE");           | ||||
|            $size = $ftp->size("$base/$checkfile"); | ||||
|            $rmtime = $ftp->mdtm("$base/$checkfile"); | ||||
|            $file_exist = $ftp->code(); | ||||
|            print "swim: could not find $packagen debian-revision\n" | ||||
|            if $file_exist == 550; | ||||
|            push(@tryme_again,$_) if $file_exist == 550; | ||||
|            next if $file_exist == 550; | ||||
|            $localfile =~ s,$matcher[-\dA-Za-z\.\+]*\.deb$,$file,; | ||||
|            $home =  | ||||
|            "$default_directory/$default_root_directory/$uptopackage/$file"; | ||||
|            $packagename = $file; $file = $otherthing . "/$file"; | ||||
|          } # END DEBIAN-REVISION | ||||
|          else {$file = $_; } | ||||
|          my ($lsize,$lmtime); | ||||
| 
 | ||||
| 
 | ||||
|          ######################## | ||||
|          # SAME PACKAGE LOCALLY # | ||||
|          ######################## | ||||
|          $packagename =~ m,(^[A-Za-z\d\+-\\+]*)_([\\+A-Za-z\d\+\.:]*) | ||||
|                              [-]?[\dA-Za-z\.\+]*\.deb$,x;  | ||||
|          my $spackage = $1; my $upstream_revision = $2; | ||||
|          $spackage =~ s,\+,\\\+,g; | ||||
|          if (-e $home) { | ||||
|            ($lsize,$lmtime) = (stat($home))[7,9]; | ||||
|          }  | ||||
|          # If the upstream-revision has changed and | ||||
|          # a local package with the same name exists, we want to delete it. | ||||
|          else { | ||||
|            opendir(DF,"$default_directory/$default_root_directory/$uptopackage"); | ||||
|            my $grepthing = "^" . $spackage . "_"; | ||||
|            #my $grepthing = $spackage . "_" . $upstream_revision; | ||||
|            foreach (sort grep(/$grepthing/, readdir(DF))) { | ||||
|              m,(.*)_([\dA-Za-z\+\.:]+)[-]?[\dA-Za-z\+\.]*\.deb$,; | ||||
|              my $lupstream_revision = $2; | ||||
|              if ($lupstream_revision eq $upstream_revision) {                | ||||
|                print "swim: $_ with different debian-revision exists\n"; | ||||
|                $_ = ""; | ||||
| 
 | ||||
|                ########## | ||||
|                # SOURCE # | ||||
|                ##########          | ||||
|                if ($commands->{"source"} || $commands->{"source_only"}) { | ||||
|                  my (@SOURCE,$upstream_change);  | ||||
|                  my ($matcher,$local_source,$remote_source,$base) = | ||||
|                  source_calc($base,$uptopackage,$packagename,$drd,$source_drd); | ||||
|                  my $REVISIONCHANGE = $ftp->ls("$base/$remote_source"); | ||||
|                  my $singfile; | ||||
|                  foreach (@{$REVISIONCHANGE}) { | ||||
|                    m,^.*/($matcher.*)$,            | ||||
|                     ? ($singfile = $1)   | ||||
|                     : ($singfile = $_); | ||||
|                    if ($singfile =~ /^$matcher/) { | ||||
|                      $file = $singfile; | ||||
|                      push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                    } | ||||
|                  } | ||||
|                  if (!defined @SOURCE) { | ||||
|                   print "swim: checking for upstream-revsion change\n"; | ||||
|                   ($matcher) =  (split(/_/,$matcher))[0]; | ||||
|                    foreach (@{$REVISIONCHANGE}) { | ||||
|                      m,^.*/($matcher.*)$,            | ||||
|                         ? ($singfile = $1)   | ||||
|                         : ($singfile = $_); | ||||
|                       if ($singfile =~ /^$matcher/) { | ||||
|                           $file = $singfile; | ||||
|                           push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                       } | ||||
|                    } | ||||
|                   $upstream_change = "yes" if defined @SOURCE; | ||||
|                  } | ||||
|                  foreach (@SOURCE) { | ||||
|                   m,.*/(.*)$,; $packagename = $1; | ||||
|                   $lmtime = (stat("$local_source/$packagename"))[9]; | ||||
|                   -e "$local_source/$packagename" | ||||
|                    ? ($lmtime = (stat("$local_source/$packagename"))[9]) | ||||
|                    : ($lmtime = -1); | ||||
|                   $size = $ftp->size("$_"); | ||||
|                   $rmtime = $ftp->mdtm("$_"); | ||||
|                   $file_exist = $ftp->code(); | ||||
|                   if ($lmtime != $rmtime) { | ||||
|                    if (!$commands->{"diff"}) { | ||||
|                       $localfile = "$default_directory/partial/$packagename"; | ||||
|                       !defined $upstream_change | ||||
|                        ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                        : print "swim: downloading upstream-revision $packagename ($size bytes)\n"; | ||||
|                       get($ftp,"$_",$localfile); | ||||
|                       my $complete = $ftp->code();          | ||||
|                       $lsize = (stat($localfile))[7]; | ||||
|                       if ($lsize == $size && $complete == 226 &&  | ||||
|                           $lmtime != $rmtime) { | ||||
|                       print "swim: successful retrieval of $packagename\n";  | ||||
|                       rename("$localfile","$local_source/$packagename") | ||||
|                       or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                      } | ||||
|                      else { | ||||
|                       print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                      } | ||||
|                    }  | ||||
|                    else { | ||||
|                     if (m,diff\.gz,) { | ||||
|                      $localfile = "$default_directory/partial/$packagename"; | ||||
|                      !defined $upstream_change | ||||
|                      ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                      : print "swim: downloading upstream-revision $packagename ($size bytes)\n"; | ||||
|                      get($ftp,"$_",$localfile); | ||||
|                      my $complete = $ftp->code();          | ||||
|                      $lsize = (stat($localfile))[7]; | ||||
|                      if ($lsize == $size && $complete == 226 &&  | ||||
|                          $lmtime != $rmtime) { | ||||
|                       print "swim: successful retrieval of $packagename\n";  | ||||
|                       rename("$localfile","$local_source/$packagename") | ||||
|                       or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                      } | ||||
|                      else { | ||||
|                       print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                      } | ||||
|                    } | ||||
|                   } | ||||
|                    utime(time,$rmtime,"$local_source/$packagename"); | ||||
|                    $_ = ""; | ||||
|                   } | ||||
|                   else { | ||||
|                     print "swim: $packagename already exists\n" | ||||
|                   } | ||||
|                  }  | ||||
|                } # source | ||||
|                next LOCUS; | ||||
|              } | ||||
|              elsif  ($lupstream_revision ne $upstream_revision) { | ||||
|               if (!$commands->{"source_only"}) { | ||||
|                print "swim: replacing $_ with a different upstream-revision\n"; | ||||
|                unlink | ||||
|                ("$default_directory/$default_root_directory/$uptopackage/$_"); | ||||
|               }  | ||||
|                print "swim: $_ exists with a different upstream-revision\n"; | ||||
|              } | ||||
|            } | ||||
|            closedir(DF);  | ||||
|          }  | ||||
| 
 | ||||
|          ################## | ||||
|          # EXISTS LOCALLY # | ||||
|          ##################  | ||||
|          # got here but localtime was greater. | ||||
|          if (defined $rmtime && defined $lmtime) { | ||||
|           # ofcourse if the file does exist locally and has the same name | ||||
|           # and version, and this exists, something strange is going on. | ||||
|           if ($lmtime < $rmtime) { | ||||
|            print "swim: downloading $packagen, strange......... | ||||
| same upstream version exists in the same package locally\n";  | ||||
|            get($ftp,"$base/$file",$localfile); | ||||
|            my $complete = $ftp->code();           | ||||
|            $argument = $localfile;  | ||||
|            $commands{"md5sum"} = 1;  | ||||
|            md5sumo(\%commands) if $complete == 226;         | ||||
|            ($packagen = $packagename) =~ s,\\\+,\+,g; | ||||
|            print "swim: successful retrieval of $packagen\n"                | ||||
|            if $complete == 226; | ||||
|            $_ = "" if $complete == 226; | ||||
|            utime(time,$rmtime,$localfile); | ||||
|           } | ||||
|           elsif ($lmtime == $rmtime) { | ||||
|            $_ = ""; | ||||
|            ($packagen = $packagename) =~ s,\\\+,\+,g; | ||||
|            print "swim: $packagen already exists\n"; | ||||
|            ########## | ||||
|            # SOURCE # | ||||
|            ##########          | ||||
|             if ($commands->{"source"} || $commands->{"source_only"}) { | ||||
|              my (@SOURCE,$upstream_change);  | ||||
|              my ($matcher,$local_source,$remote_source,$base) = | ||||
|              source_calc($base,$uptopackage,$packagename,$drd,$source_drd); | ||||
|              my $REVISIONCHANGE = $ftp->ls("$base/$remote_source"); | ||||
|              my $singfile; | ||||
|              foreach (@{$REVISIONCHANGE}) { | ||||
|                m,^.*/($matcher.*)$,            | ||||
|                   ? ($singfile = $1)   | ||||
|                   : ($singfile = $_); | ||||
|                 if ($singfile =~ /^$matcher/) { | ||||
|                     $file = $singfile; | ||||
|                     push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                 } | ||||
|              } | ||||
|              if (!defined @SOURCE) { | ||||
|               print "swim: checking for upstream-revsion change\n"; | ||||
|               ($matcher) =  (split(/_/,$matcher))[0]; | ||||
|                foreach (@{$REVISIONCHANGE}) { | ||||
|                  m,^.*/($matcher.*)$,            | ||||
|                     ? ($singfile = $1)   | ||||
|                     : ($singfile = $_); | ||||
|                   if ($singfile =~ /^$matcher/) { | ||||
|                       $file = $singfile; | ||||
|                       push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                   } | ||||
|                } | ||||
|               $upstream_change = "yes" if defined @SOURCE; | ||||
|              } | ||||
|              foreach (@SOURCE) { | ||||
|               m,.*/(.*)$,; $packagename = $1; | ||||
|               -e "$local_source/$packagename" | ||||
|                ? ($lmtime = (stat("$local_source/$packagename"))[9]) | ||||
|                : ($lmtime = -1); | ||||
|               $size = $ftp->size("$_"); | ||||
|               $rmtime = $ftp->mdtm("$_"); | ||||
|               $file_exist = $ftp->code(); | ||||
|               if ($lmtime != $rmtime) { | ||||
|                if (!$commands->{"diff"}) { | ||||
|                  $localfile = "$default_directory/partial/$packagename"; | ||||
|                   !defined $upstream_change | ||||
|                    ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                    : print "swim: downloading upstream-revision $packagename ($size bytes)\n";  | ||||
|                  get($ftp,"$_",$localfile); | ||||
|                  my $complete = $ftp->code();          | ||||
|                  $lsize = (stat($localfile))[7]; | ||||
|                  if ($lsize == $size && $complete == 226 && $lmtime != $rmtime) { | ||||
|                   print "swim: successful retrieval of $packagename\n";  | ||||
|                   rename("$localfile","$local_source/$packagename") | ||||
|                   or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                  } | ||||
|                  else { | ||||
|                   print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                  } | ||||
|                }  | ||||
|                else { | ||||
|                 if (m,diff\.gz,) { | ||||
|                  $localfile = "$default_directory/partial/$packagename"; | ||||
|                   !defined $upstream_change | ||||
|                    ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                    : print "swim: downloading upstream-revision $packagename ($size bytes)\n";  | ||||
|                  get($ftp,"$_",$localfile); | ||||
|                  my $complete = $ftp->code();          | ||||
|                  $lsize = (stat($localfile))[7]; | ||||
|                  if ($lsize == $size && $complete == 226 && $lmtime != $rmtime) { | ||||
|                   print "swim: successful retrieval of $packagename\n";  | ||||
|                   rename("$localfile","$local_source/$packagename") | ||||
|                   or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                  } | ||||
|                  else { | ||||
|                   print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                  } | ||||
|                 } | ||||
|                } | ||||
|                utime(time,$rmtime,"$local_source/$packagename"); | ||||
|                $_ = ""; | ||||
|               } | ||||
|               else { | ||||
|                 print "swim: $packagename already exists\n" | ||||
|               } | ||||
|              }  | ||||
|             } # source | ||||
|           } | ||||
|          } | ||||
|          ######################################################### | ||||
|          # DOESN'T EXIST LOCALLY OR DIFFERENT UPSTREAM-REVISION # | ||||
|          ######################################################### | ||||
|          else { | ||||
|           ######################## | ||||
|           # BINARY AND/OR SOURCE # | ||||
|           ######################## | ||||
|           if (!$commands->{"source_only"}) {  | ||||
|             print "swim: downloading $packagen ($size bytes)\n";  | ||||
|             my $upstream_change; | ||||
|             get($ftp,"$base/$file",$localfile); | ||||
|             my $complete = $ftp->code();          | ||||
|             $lsize = (stat($localfile))[7]; | ||||
|             if ($lsize == $size && $complete == 226) { | ||||
|              $argument = $localfile;  | ||||
|              $commands{"md5sum"} = 1; md5sumo(\%commands); | ||||
|              ($packagen = $packagename) =~ s,\\\+,\+,g; | ||||
|              print "swim: successful retrieval of $packagen\n";                | ||||
|              rename("$localfile","$home") | ||||
|              or system "$mv", "$localfile", "$home"; | ||||
|              utime(time,$rmtime,"$home"); | ||||
|             } | ||||
|             else { | ||||
|              print "swim: unsuccessful retrieval of $file\n";                | ||||
|             } | ||||
|             $_ = ""; | ||||
|             ########## | ||||
|             # SOURCE # | ||||
|             ########## | ||||
|             if ($commands->{"source"}) { | ||||
|              my (@SOURCE,$upstream_change);  | ||||
|              my ($matcher,$local_source,$remote_source,$base) = | ||||
|              source_calc($base,$uptopackage,$packagename,$drd,$source_drd); | ||||
|              my $REVISIONCHANGE = $ftp->ls("$base/$remote_source"); | ||||
|              my $singfile; | ||||
|              foreach (@{$REVISIONCHANGE}) { | ||||
|                m,^.*/($matcher.*)$,            | ||||
|                   ? ($singfile = $1)   | ||||
|                   : ($singfile = $_); | ||||
|                 if ($singfile =~ /^$matcher/) { | ||||
|                     $file = $singfile; | ||||
|                     push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                 } | ||||
|              } | ||||
|              if (!defined @SOURCE) { | ||||
|               print "swim: checking for upstream-revsion change\n"; | ||||
|               ($matcher) =  (split(/_/,$matcher))[0]; | ||||
|                foreach (@{$REVISIONCHANGE}) { | ||||
|                  m,^.*/($matcher.*)$,            | ||||
|                     ? ($singfile = $1)   | ||||
|                     : ($singfile = $_); | ||||
|                   if ($singfile =~ /^$matcher/) { | ||||
|                       $file = $singfile; | ||||
|                       push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                   } | ||||
|                } | ||||
|               $upstream_change = "yes" if defined @SOURCE; | ||||
|              } | ||||
|              foreach (@SOURCE) { | ||||
|               m,.*/(.*)$,; $packagename = $1; | ||||
|               -e "$local_source/$packagename" | ||||
|                ? ($lmtime = (stat("$local_source/$packagename"))[9]) | ||||
|                : ($lmtime = -1); | ||||
|               $size = $ftp->size("$_"); | ||||
|               $rmtime = $ftp->mdtm("$_"); | ||||
|               $file_exist = $ftp->code(); | ||||
|               if ($lmtime != $rmtime) { | ||||
|                if (!$commands->{"diff"}) { | ||||
|                  $localfile = "$default_directory/partial/$packagename"; | ||||
|                   !defined $upstream_change | ||||
|                    ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                    : print "swim: downloading upstream-revision $packagename ($size bytes)\n"; | ||||
|                  get($ftp,"$_",$localfile); | ||||
|                  my $complete = $ftp->code();          | ||||
|                  $lsize = (stat($localfile))[7]; | ||||
|                  if ($lsize == $size && $complete == 226 && $lmtime != $rmtime) { | ||||
|                   print "swim: successful retrieval of $packagename\n";  | ||||
|                   rename("$localfile","$local_source/$packagename") | ||||
|                   or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                  } | ||||
|                  else { | ||||
|                   print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                  } | ||||
|                }  | ||||
|                else { | ||||
|                 if (m,diff\.gz,) { | ||||
|                  $localfile = "$default_directory/partial/$packagename"; | ||||
|                  !defined $upstream_change | ||||
|                   ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                   : print "swim: downloading upstream-revision $packagename ($size bytes)\n";  | ||||
|                  get($ftp,"$_",$localfile); | ||||
|                  my $complete = $ftp->code();          | ||||
|                  $lsize = (stat($localfile))[7]; | ||||
|                  if ($lsize == $size && $complete == 226 && $lmtime != $rmtime) { | ||||
|                   print "swim: successful retrieval of $packagename\n";  | ||||
|                   rename("$localfile","$local_source/$packagename") | ||||
|                   or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                  } | ||||
|                  else { | ||||
|                   print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                  } | ||||
|                 } | ||||
|                } | ||||
|                utime(time,$rmtime,"$local_source/$packagename"); | ||||
|                $_ = ""; | ||||
|               } | ||||
|               else { | ||||
|                 print "swim: $packagename already exists\n" | ||||
|               } | ||||
|              }  | ||||
|             } # source | ||||
|           } | ||||
|           ############### | ||||
|           # SOURCE-ONLY # | ||||
|           ############### | ||||
|           else { | ||||
|              my (@SOURCE,$upstream_change);  | ||||
|              my ($matcher,$local_source,$remote_source,$base) = | ||||
|              source_calc($base,$uptopackage,$packagename,$drd,$source_drd); | ||||
|              my $REVISIONCHANGE = $ftp->ls("$base/$remote_source"); | ||||
|              my $singfile; | ||||
|              foreach (@{$REVISIONCHANGE}) { | ||||
|                m,^.*/($matcher.*)$,            | ||||
|                   ? ($singfile = $1)   | ||||
|                   : ($singfile = $_); | ||||
|                 if ($singfile =~ /^$matcher/) { | ||||
|                     $file = $singfile; | ||||
|                     push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                 } | ||||
|              } | ||||
|              if (!defined @SOURCE) { | ||||
|               print "swim: checking for upstream-revsion change\n"; | ||||
|               ($matcher) =  (split(/_/,$matcher))[0]; | ||||
|                foreach (@{$REVISIONCHANGE}) { | ||||
|                  m,^.*/($matcher.*)$,            | ||||
|                     ? ($singfile = $1)   | ||||
|                     : ($singfile = $_); | ||||
|                   if ($singfile =~ /^$matcher/) { | ||||
|                       $file = $singfile; | ||||
|                       push(@SOURCE,"$base/$remote_source/$singfile"); | ||||
|                   } | ||||
|                } | ||||
|               $upstream_change = "yes" if defined @SOURCE; | ||||
|              } | ||||
|              foreach (@SOURCE) { | ||||
|               m,.*/(.*)$,; $packagename = $1; | ||||
|               -e "$local_source/$packagename" | ||||
|                ? ($lmtime = (stat("$local_source/$packagename"))[9]) | ||||
|                : ($lmtime = -1); | ||||
|               $size = $ftp->size("$_"); | ||||
|               $rmtime = $ftp->mdtm("$_"); | ||||
|               $file_exist = $ftp->code(); | ||||
|               if ($lmtime != $rmtime) { | ||||
|                if (!$commands->{"diff"}) { | ||||
|                  $localfile = "$default_directory/partial/$packagename"; | ||||
|                   !defined $upstream_change | ||||
|                    ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                    : print "swim: downloading upstream-revision $packagename ($size bytes)\n";  | ||||
|                  get($ftp,"$_",$localfile); | ||||
|                  my $complete = $ftp->code();          | ||||
|                  $lsize = (stat($localfile))[7]; | ||||
|                  if ($lsize == $size && $complete == 226 && $lmtime != $rmtime) { | ||||
|                   print "swim: successful retrieval of $packagename\n";  | ||||
|                   rename("$localfile","$local_source/$packagename") | ||||
|                   or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                  } | ||||
|                  else { | ||||
|                   print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                  } | ||||
|                }  | ||||
|                else { | ||||
|                 if (m,diff\.gz,) { | ||||
|                  $localfile = "$default_directory/partial/$packagename"; | ||||
|                  !defined $upstream_change | ||||
|                   ? print "swim: downloading $packagename ($size bytes)\n" | ||||
|                   : print "swim: downloading upstream-revision $packagename ($size bytes)\n";  | ||||
|                  get($ftp,"$_",$localfile); | ||||
|                  my $complete = $ftp->code();          | ||||
|                  $lsize = (stat($localfile))[7]; | ||||
|                  if ($lsize == $size && $complete == 226 && $lmtime != $rmtime) { | ||||
|                   print "swim: successful retrieval of $packagename\n";  | ||||
|                   rename("$localfile","$local_source/$packagename") | ||||
|                   or system "$mv","$localfile","$local_source/$packagename"; | ||||
|                  } | ||||
|                  else { | ||||
|                   print "swim: unsuccessful retrieval of $packagename\n";    | ||||
|                  } | ||||
|                 } | ||||
|                } | ||||
|                utime(time,$rmtime,"$local_source/$packagename"); | ||||
|                $_ = ""; | ||||
|               } | ||||
|               else { | ||||
|                 print "swim: $packagename already exists\n" | ||||
|               } | ||||
|              }  | ||||
|           } # source-only | ||||
|          } | ||||
|        }  | ||||
|     $base_count++; | ||||
|     } # foreach FTP | ||||
|        undef @LOCATION; | ||||
|        @LOCATION = @tryme_again;         | ||||
|      $ftp->quit() if !defined @LOCATION; | ||||
|      my $good_bye = $ftp->code(); | ||||
|      print "swim: logged out\n" if $good_bye == 221; | ||||
|      undef @sites if !defined @LOCATION;   | ||||
| 
 | ||||
|    } # foreach sites | ||||
|     untie %db; | ||||
| 
 | ||||
| } # end sub qftp | ||||
| 
 | ||||
| 
 | ||||
| # figure out the source stuff, make appropriate directories for sections | ||||
| # which aren't non-US | ||||
| sub source_calc { | ||||
| 
 | ||||
|             my($base,$uptopackage,$packagename,$drd,$source_drd) = @_; | ||||
| 
 | ||||
| 
 | ||||
|             # if source is empty in %db we can use the package name, need | ||||
|             # to watch for experimental | ||||
|             my ($remote_source,$local_source,@SOURCE); | ||||
|              # NON-US | ||||
|              if ($uptopackage =~ /non-US/) { | ||||
|               $local_source = | ||||
|               "$default_directory$drd/debian-non-US/$source_drd/source"; | ||||
|               $uptopackage =~ m,(.*)/.*$,; $remote_source = $1; | ||||
|               $remote_source = "$remote_source/source"; | ||||
|               # for safety's sake and because most sites don't have | ||||
|               # /pub/debian/dists/unstable/non-US/source except for a  | ||||
|               # site made with swim, convert debian to debian-non-US and | ||||
|               # hope everything is standard. | ||||
|               if ($base !~ /debian-non-US/) { | ||||
|                $base =~ s/debian/debian-non-US/; | ||||
|               } | ||||
|              } | ||||
|              # EVERYTHING ELSE  | ||||
|              else { | ||||
|               $uptopackage =~ m,(.*)/(.*)$,;  | ||||
|               my $subject = $2; $1 =~ m,(.*)/.*$,; $local_source = $1; | ||||
|               #$remote_source =~  m,(.*)/.*$,; $remote_source = $1; | ||||
|               $remote_source = $local_source; | ||||
|               $local_source = "$remote_source/source/$subject"; | ||||
|               $remote_source = $local_source; | ||||
|               $local_source =  | ||||
|               "$default_directory$default_root_directory/$local_source"; | ||||
|              }              | ||||
| 
 | ||||
|              # exciting matcher realities..if it isn't non-US than the | ||||
|              # %db needs to be searched for anything found in Source:, | ||||
|              # if it is defined, then vola, herein this section lays the | ||||
|              # source, otherwise it's probably in the section which pertains | ||||
|              # to the package being queried..we hope.  Epochs aren't used  | ||||
|              # fortunately they aren't in package_versionFN, but they can | ||||
|              # be in the Source: area so they need to be removed. | ||||
|              $packagename =~ m,(^[A-Za-z\d\+-\\+]*_[\\+A-Za-z\d\+\.:]*) | ||||
|                                [-]?[\dA-Za-z\.\+]*\.deb$,x; | ||||
| 
 | ||||
|              # everything, but revision | ||||
|              my $matcher = $1;                | ||||
|              $matcher =~ m,^(.*)_(.*)$,; my $mat = $1; | ||||
|              if (defined $db{$mat}) { | ||||
|                 $mat = $db{$mat}; $mat = $db{$mat};                | ||||
|                 if ($mat =~ m,Installed-Size:\s\d+\s+Source:\s(.*),){ | ||||
|                   $matcher = $1; | ||||
|                   ########################################## | ||||
|                   # DIFFERENT VERSION AND DIFFERENT SOURCE # | ||||
|                   ########################################## | ||||
|                   if ($matcher =~ m,[\(\)], ) { | ||||
|                    $matcher =~ /:/   | ||||
|                     ? $matcher =~ m,^(.*) | ||||
|                                  \s\([\d]?[:]? | ||||
|                                  ([A-Za-z0-9\+\.]+) | ||||
|                                  [-]?[\dA-Za-z\+\.]*\)$,x | ||||
|                     : $matcher =~ m,^(.*) | ||||
|                                  \s\( | ||||
|                                  ([A-Za-z0-9\+\.]+) | ||||
|                                  [-]?[\dA-Za-z\+\.]*\)$,x; | ||||
|                      | ||||
|                      my $mat2 = $1;  my $mat2_ver = $2; | ||||
|                      $matcher = $mat2 . "_" . $mat2_ver; | ||||
|                      if (defined $db{$mat2}) {                | ||||
|                        $matcher = $mat2 . "_" . $mat2_ver; | ||||
|                        # time to change the $remote_source and $local_source | ||||
|                        if ($uptopackage !~ /non-US/) { | ||||
|                          my $change = $db{$mat2};   | ||||
|                          $change = $db{$change ."FN"};  | ||||
|                          $change =~ m,(.*)/(.*)$,; | ||||
|                          $uptopackage = $1; $uptopackage =~ m,(.*)/(.*)$,;  | ||||
|                          my $subject = $2; | ||||
|                          $1 =~ m,(.*)/.*$,; $local_source = $1; | ||||
|                          $local_source = "$local_source/source/$subject"; | ||||
|                          $remote_source = $local_source; | ||||
|                          $local_source = | ||||
|                          "$default_directory$default_root_directory/$local_source"; | ||||
|                        } | ||||
|                      } | ||||
|                   } | ||||
|                   ##################################### | ||||
|                   # SAME VERSION AND DIFFERENT SOURCE # | ||||
|                   ##################################### | ||||
|                   else { | ||||
|                       if (defined $db{$matcher}) { | ||||
|                        # time to change the | ||||
|                        # $remote_source and $local_source | ||||
|                        if ($uptopackage !~ /non-US/) { | ||||
|                          my $change = $db{$matcher};   | ||||
|                          $change = $db{$change ."FN"};  | ||||
|                          $change =~ m,(.*)/(.*)$,; | ||||
|                          $uptopackage = $1; $uptopackage =~ m,(.*)/(.*)$,;  | ||||
|                          my $subject = $2; | ||||
|                          $1 =~ m,(.*)/.*$,; $local_source = $1; | ||||
|                          $local_source = "$local_source/source/$subject"; | ||||
|                          $remote_source = $local_source; | ||||
|                          $local_source = | ||||
|                          "$default_directory$default_root_directory/$local_source"; | ||||
|                        } | ||||
|                       } | ||||
|                   } | ||||
|                 } # Source: found | ||||
|              } # should be defined | ||||
| 
 | ||||
| 
 | ||||
|              # time to make direcorties if $local_source isn't defined | ||||
|              # non-US already made, if source if already made, just the  | ||||
|              # subject above needs to be made | ||||
|              if (!-e $local_source) { | ||||
|                my $place; | ||||
|                my @LS = split(m,/,,$local_source); | ||||
|                for (1 .. $#LS - 2) { | ||||
|                  $_ == 1 ? ($place = "/$LS[$_]")  | ||||
|                          : ($place = $place . "/" . $LS[$_]); | ||||
|                }  | ||||
|                my $create = "$LS[$#LS -1]/$LS[$#LS]";  | ||||
|                if (-d "$place/$LS[$#LS - 1]") { | ||||
|                  mkdir("$place/$create",$permission)  | ||||
|                       or warn "swim: could not create source directory\n"; | ||||
|                } | ||||
|                else {  | ||||
|                 my @DP = split(m,/,,$create); | ||||
|                 my $placement = "/"; | ||||
|                 for (0 .. $#DP) {   | ||||
|                   $_ == 0 ? ($placement = "/$DP[$_]")  | ||||
|                           : ($placement = $placement . "/" . $DP[$_]); | ||||
|                   mkdir("$place$placement",$permission)  | ||||
|                        or warn "swim: could not create source directory\n"; | ||||
|                 } | ||||
|                } | ||||
|              } | ||||
|              | ||||
|              return($matcher,$local_source,$remote_source,$base);  | ||||
| 
 | ||||
| } # end source_calc | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										180
									
								
								lib/Ramdisk.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								lib/Ramdisk.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,180 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Ramdisk;   | ||||
| use strict; | ||||
| use SWIM::Conf; | ||||
| use SWIM::Library; | ||||
| use vars qw(@ISA @EXPORT); | ||||
| 
 | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(ramdisk); | ||||
| 
 | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| make access a lot faster for contentsindex.deb.gz, alternatively  | ||||
| searchindex.deb & file/dirindex. Ramdisks don't work well for  | ||||
| everything like the creation of a database.  The goal is to | ||||
| automatically determine the size of the disk based on the files  | ||||
| put into it (which will all be compressed)  This also has a residual  | ||||
| effect, so when the ramdisk is umounted stuff still stays in | ||||
| the memory.  | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| sub ramdisk { | ||||
| 
 | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
| 
 | ||||
|   # lot's of thing can be put into the ramdisk,  ncontentsindex being the | ||||
|   # most important, but flat search files, too.  --ramdiskon -n would be | ||||
|   # the most important application.   | ||||
|   my $size = 0;   | ||||
|   my (@storage,@files); | ||||
|   my $count = 0; | ||||
|   my %commands = %$commands;  | ||||
|   my $where = finddb(\%commands); | ||||
|   my ($arch,$dist) = which_archdist(\%commands); | ||||
|   my $not = "n" if defined $arch; | ||||
|      $not = "" if !$commands->{"n"}; | ||||
|      $arch = "" if !$commands->{"n"}; | ||||
|      $dist = "" if !$commands->{"n"}; | ||||
|   my $contentsindex  = "contentsindex"; | ||||
|   my $searchindex = "searchindex"; | ||||
|   my $dirindex = "dirindex"; | ||||
| 
 | ||||
|  if ($commands->{"ramdiskon"}) { | ||||
| 
 | ||||
|    my  $rambo =  "$cat /proc/mounts|"; | ||||
|    open(RAM, "$rambo");  | ||||
|     while (<RAM>) { | ||||
|       if (/ram/) { | ||||
|         my($device,$mount) = split(/\s/,$_,2); | ||||
|           if ($mount =~ /dramdisk/) { | ||||
|             print "swim: use --ramdiskoff\n"; | ||||
|             exit; | ||||
|           } | ||||
|         $storage[$count] = $device; | ||||
|         $count++; | ||||
|       } | ||||
|     } | ||||
|     close(RAM); | ||||
| 
 | ||||
|   if (-e "$where/$not$contentsindex$arch$dist.deb.gz" && | ||||
|       -B "$where/$not$contentsindex$arch$dist.deb.gz") {  | ||||
|          $size = (stat("$where/$not$contentsindex$arch$dist.deb.gz"))[7]; | ||||
|           push(@files,"$where/$not$contentsindex$arch$dist.deb.gz"); | ||||
|   } | ||||
|    | ||||
|   if ($commands->{"searchfile"}) { | ||||
|     # stat caused some weirdisms based on the boolean logic | ||||
|     #if (-e "$where/$not$searchindex$arch$dist.deb" && | ||||
|     #    -e "$where/$not$dirindex$arch$dist.deb") { | ||||
|         # compress the monsters  | ||||
|         if (!-e "$where/$not$dirindex$arch$dist.deb.gz") { | ||||
|           print "swim: please wait while dirindex.deb is compressed\n"; | ||||
|         if (-e "$where/$not$dirindex$arch$dist.deb") { | ||||
|         system "$gzip -c9 $where/$not$dirindex$arch$dist.deb > $where/$not$dirindex$arch$dist.deb.gz"; | ||||
|         } | ||||
|         } | ||||
|         if (!-e "$where/$not$searchindex$arch$dist.deb.gz") {         | ||||
|           print "swim: please wait while searchindex.deb is compressed\n"; | ||||
|         if (-e "$where/$not$searchindex$arch$dist.deb") { | ||||
|         system "$gzip -c9 $where/$not$searchindex$arch$dist.deb > $where/$not$searchindex$arch$dist.deb.gz"; | ||||
|         } | ||||
|         } | ||||
|         push(@files,"$where/$not$dirindex$arch$dist.deb.gz"); | ||||
|         push(@files,"$where/$not$searchindex$arch$dist.deb.gz"); | ||||
|         my $size1 = (stat("$where/$not$searchindex$arch$dist.deb.gz"))[7]; | ||||
|         my $size2 = (stat("$where/$not$dirindex$arch$dist.deb.gz"))[7]; | ||||
|         if (defined $size) { | ||||
|           $size = $size + $size1 + $size2; | ||||
|         } | ||||
|         else { | ||||
|           $size = $size1 + $size2; | ||||
|        } | ||||
|     #} | ||||
|   } | ||||
|        | ||||
|  # it will be assumed that ext2 is used, and hopefully there isn't a mount | ||||
|  # of the exact same name..hence dramdisk should be unusual | ||||
|   my $number; | ||||
|   if (defined @storage) { | ||||
|     @storage = sort {$a cmp $b} @storage; | ||||
|     $storage[$#storage] =~ s/\D//g; | ||||
|     $number = $storage[$#storage] + 1; | ||||
|   } | ||||
|   else { | ||||
|     $number = 0; | ||||
|   } | ||||
| 
 | ||||
|     # the size will be the sizes added together/1024 + (.15 of the total) | ||||
|     if (-e "$where/dramdisk") { | ||||
|       if (!-d "$where/dramdisk") { | ||||
|         print "swim: --ramdiskon requires dir dramdisk, but a file named dramdisk already exists\n"; | ||||
|         exit; | ||||
|       } | ||||
|     } | ||||
|     elsif (!-d "$where/dramdisk") { | ||||
|        mkdir("$where/dramdisk",0666); | ||||
|     } | ||||
| 
 | ||||
|     my $increase = $size * 0.15; | ||||
|     $size = $increase + $size; | ||||
|     $size = $size/1024; | ||||
|     $size = sprintf("%.f",$size); | ||||
|     if ($size > 0) { | ||||
|      system "$mke2fs", "-m0", "/dev/ram$number", "$size"; | ||||
|      system "$mount", "-t", "ext2", "/dev/ram$number", "$where/dramdisk"; | ||||
|       foreach (@files) { | ||||
|        system "$copy", "$_", "$where/dramdisk"; | ||||
|       }  | ||||
|     } | ||||
|   } # if on | ||||
|   else { | ||||
| 
 | ||||
|    my  $rambo =  "$cat /proc/mounts|"; | ||||
|    open(RAM, "$rambo");  | ||||
|     while (<RAM>) { | ||||
|       if (/ram/) { | ||||
|         my($device,$mount) = split(/\s/,$_,2); | ||||
|           if ($mount =~ /dramdisk/) { | ||||
|           system "$umount", "$device"; | ||||
|           exit; | ||||
|           } | ||||
|         $storage[$count] = $device; | ||||
|         $count++; | ||||
|       } | ||||
|     } | ||||
|     close(RAM); | ||||
| 
 | ||||
| 
 | ||||
|  } # if off | ||||
|   | ||||
|  exit; | ||||
| 
 | ||||
| } # end sub ramdisk | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										470
									
								
								lib/Safex.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										470
									
								
								lib/Safex.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,470 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Safex; | ||||
| use strict; | ||||
| use Term::ReadLine; | ||||
| use SWIM::Conf qw($apt_get $dpkg $tmp $HISTORY); | ||||
| use SWIM::Global qw(@PACKAGES $argument $aptor_group %db); | ||||
| use SWIM::DB_Library qw(:Xyz); | ||||
| use SWIM::Library;   | ||||
| use vars qw(@ISA @EXPORT %EXPORT_TAGS);    | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(safex); | ||||
| 
 | ||||
| 
 | ||||
| # when x is called | ||||
| sub safex { | ||||
| 
 | ||||
|  my ($commands) = @_; | ||||
|  my %commands = %$commands; | ||||
| 
 | ||||
|  if ($commands->{"x"} || $commands->{"ftp"} || $commands->{"source"} || | ||||
|      $commands->{"source_only"} || $commands->{"remove"} || $commands->{"r"} || | ||||
|      $commands->{"purge"}) { | ||||
|   | ||||
|    | ||||
|    if (!defined @PACKAGES) { | ||||
|      if ($commands->{"search"} || $commands->{"ps"} || $commands->{"research"} | ||||
|          || $commands->{"refinesearch"}) { | ||||
|        @PACKAGES = "NOPACKAGES"; | ||||
|      } | ||||
|      else { | ||||
|         @PACKAGES = @ARGV; | ||||
|      } | ||||
|    } | ||||
|   | ||||
|    #print "PACKAGES @PACKAGES $argument\n"; | ||||
| 
 | ||||
|    my ($aptor,$arg); | ||||
|    if (defined $argument) { | ||||
|     if ($argument =~ /_/) { | ||||
|      $argument =~ m,(.*)_.*,;  | ||||
|      $aptor = $1; | ||||
|     } | ||||
|     else { | ||||
|       if (($argument =~ m,/, && ($commands->{"y"} || $commands->{"z"} || | ||||
|            $commands->{"ftp"} || $commands->{"nz"})) || defined $aptor_group || | ||||
|            $commands->{"ftp"} || $commands->{"purge"} || $commands->{"remove"} || | ||||
|            $commands->{"r"}) { | ||||
|        if ($PACKAGES[$#PACKAGES] =~ /_/) { | ||||
|          $PACKAGES[$#PACKAGES] =~ m,(.*)_.*,;  | ||||
|          $aptor = $1; | ||||
|        } | ||||
|        else { | ||||
|          $aptor = $PACKAGES[$#PACKAGES]; | ||||
|        } | ||||
|       } | ||||
|       else {  | ||||
|        $aptor = $argument;     | ||||
|       } | ||||
|     } | ||||
|    } | ||||
|    else { | ||||
|       if ($commands->{"y"} || $commands->{"z"} || $commands->{"ftp"} || | ||||
|           $commands->{"nz"} || $commands->{"purge"} || $commands->{"remove"} || | ||||
|           $commands->{"r"}) { | ||||
|        if ($PACKAGES[$#PACKAGES] =~ /_/) { | ||||
|          $PACKAGES[$#PACKAGES] =~ m,(.*)_.*,;  | ||||
|          $aptor = $1; | ||||
|        } | ||||
|        else { | ||||
|          $aptor = $PACKAGES[$#PACKAGES]; | ||||
|        } | ||||
|       } | ||||
|    } | ||||
|    | ||||
|    if ($PACKAGES[$#PACKAGES] =~ m,/,) { | ||||
|     $PACKAGES[$#PACKAGES] =~ m,.*/(.*)$,; | ||||
|     $arg = $1; | ||||
|     foreach (@PACKAGES) { | ||||
|       $_  =~ m,.*/(.*)$,; | ||||
|       shift @PACKAGES; | ||||
|       push(@PACKAGES,$1); | ||||
|     } | ||||
|    } | ||||
|    else { | ||||
|     if ($PACKAGES[$#PACKAGES] =~ /_/) { | ||||
|      $PACKAGES[$#PACKAGES] =~ m,(.*)_.*,;  | ||||
|      $arg = $1; | ||||
|      foreach (0 .. $#PACKAGES) { | ||||
|        if ($PACKAGES[$_] =~ /_/) { | ||||
|         $PACKAGES[$_]  =~ m,^(.*)_.*$,; | ||||
|         $PACKAGES[$_] = $1;  | ||||
|        } | ||||
|        else { | ||||
|         $PACKAGES[$_] = $PACKAGES[$_]; | ||||
|        } | ||||
|      } | ||||
|     } | ||||
|     else { | ||||
|      $arg = $PACKAGES[$#PACKAGES]; | ||||
|      foreach (0 .. $#PACKAGES) { | ||||
|        if ($PACKAGES[$_] =~ /_/) { | ||||
|         $PACKAGES[$_]  =~ m,^(.*)_.*$,; | ||||
|         $PACKAGES[$_] = $1;  | ||||
|        } | ||||
|        else { | ||||
|         $PACKAGES[$_] = $PACKAGES[$_]; | ||||
|        } | ||||
|      } | ||||
|     } | ||||
|    }   | ||||
| 
 | ||||
|    $aptor = "DEFINEDONE" if !defined $aptor; | ||||
|    if (($aptor eq  $arg) || ($commands->{"search"} || | ||||
|         $commands->{"ps"} || $commands->{"research"} || | ||||
|         $commands->{"refinesearch"} || $aptor eq "/.") &&  | ||||
|         $PACKAGES[0] ne "NOPACKAGES") { | ||||
|      xyz(\%commands); | ||||
|    } | ||||
|  } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| # swim provides a great interface to apt.  The trick is to not actually | ||||
| # run apt-get until all the arguments are stored in an array.  This is | ||||
| # done easily for xy and for for xyz which provides virtual installation | ||||
| # and querying completion after --db && --ndb updates.  Obviously, the | ||||
| # package virtually installed needs to be the same architecture as the | ||||
| # machine running, since this is how apt works, but the databases can be | ||||
| # in any specified directory.  This function also provides an interface for | ||||
| # ftp, as well as dpkg's --remove & --purge. | ||||
| sub xyz { | ||||
| 
 | ||||
|   my ($commands) = @_; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   if (!$commands->{"ftp"}) { | ||||
|    if (!defined $apt_get) { | ||||
|      print "swim: configure swimrc\n"; | ||||
|      exit; | ||||
|    } | ||||
|   }    | ||||
| 
 | ||||
|   # error correcting   | ||||
|   if ($commands->{"ftp"} && ($commands->{"r"} || $commands->{"remove"} || | ||||
|       $commands->{"purge"})) { | ||||
|     print "swim: --ftp cannot be used with ";   | ||||
|     print "-r " if defined $commands->{"r"}; | ||||
|     print "--remove " if defined $commands->{"remove"}; | ||||
|     print "--purge " if defined $commands->{"purge"}; | ||||
|     print "\n"; | ||||
|     exit; | ||||
|   } | ||||
|   if (($commands->{"r"} || $commands->{"remove"}) && $commands->{"purge"}) { | ||||
|     print "swim: "; | ||||
|     print "-r " if defined $commands->{"r"}; | ||||
|     print "--remove " if defined $commands->{"remove"}; | ||||
|     print "--purge " if defined $commands->{"purge"}; | ||||
|     print "cannot be used together\n"; | ||||
|     exit; | ||||
|   } | ||||
|   if (($commands->{"y"} || $commands->{"z"} || $commands->{"x"} || | ||||
|        $commands->{"nz"}) && ($commands->{"ftp"} || $commands->{"purge"})) { | ||||
|     print "swim: -"; | ||||
|     print "x" if $commands->{"x"}; | ||||
|     print "y" if $commands->{"y"}; | ||||
|     print "z" if $commands->{"z"}; | ||||
|     print " --nz" if $commands->{"nz"}; | ||||
|     print " cannot be used with "; | ||||
|     print "--purge " if defined $commands->{"purge"}; | ||||
|     print "--ftp " if defined $commands->{"ftp"}; | ||||
|     print "\n"; | ||||
|     exit; | ||||
|   } | ||||
|   if (($commands->{"source"} && $commands->{"source_only"})) { | ||||
|     print "swim: --source and --source_only cannot be used together\n"; | ||||
|     exit; | ||||
|   } | ||||
|   if (($commands->{"source"} || $commands->{"source_only"}) && | ||||
|        !$commands->{"ftp"}) { | ||||
|     print "swim: --"; | ||||
|     print "source" if $commands->{"source"}; | ||||
|     print "source_only" if $commands->{"source_only"}; | ||||
|     print " cannot be used without --ftp\n"; | ||||
|     exit; | ||||
|   }   | ||||
|   if (($commands->{"y"} || $commands->{"z"} || $commands->{"nz"}) && | ||||
|        !$commands->{"x"}) { | ||||
|     print "swim: requires -x option\n"; | ||||
|     exit; | ||||
|   } | ||||
| 
 | ||||
|   if ($commands->{"x"}) { | ||||
|    # There's no sense in doing this if the wrong architecture is called. | ||||
|    if (defined $dpkg) { | ||||
|     system "$dpkg --print-installation-architecture > $tmp/arch.deb"; | ||||
|     open(ARCH, "$tmp/arch.deb") or warn "couldn't find arch\n"; | ||||
|     my @arch = <ARCH>; chomp $arch[0]; | ||||
|     my($arch,$dist) = which_archdist(\%commands); $arch =~ m,^-(.*),; | ||||
|     if ($1 ne $arch[0]) { | ||||
|        print "swim: apt uses the $arch[0] architecture\n"; | ||||
|        exit;    | ||||
|     } | ||||
|    } | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   ############### | ||||
|   # SAFETY MODE # | ||||
|   ############### | ||||
|   if ((($commands->{"x"} || ($commands->{"x"} && $commands->{"y"})) ||  | ||||
|       ($commands->{"x"} && ($commands->{"r"} || $commands->{"remove"}) || | ||||
|       ($commands->{"x"} && $commands->{"y"} && ($commands->{"r"} || | ||||
|       $commands->{"remove"})))) &&  | ||||
|       !($commands->{"z"} || $commands->{"nz"})) { | ||||
|     my $arg; | ||||
|     my $count = 0; | ||||
|     foreach (@PACKAGES) { | ||||
|     if ($count == 0) {   | ||||
|        $arg = "$_"; | ||||
|      } | ||||
|      else { | ||||
|        $arg = $arg . " " . "$_"; | ||||
|      }   | ||||
|       $count++; | ||||
|     } | ||||
|     ######### | ||||
|     # STDIN # | ||||
|     ######### | ||||
|     if ($commands->{"stdin"}) { | ||||
|      my $term = Term::ReadLine->new("Simple Shell"); | ||||
|      my @HISTORY = history(\%commands); | ||||
|      $term->addhistory(@HISTORY); | ||||
|      my @history; push(@history,"$arg"); | ||||
|      print "swim: type exit to finish --stdin\n"; | ||||
|      my $termcount = 0; | ||||
|      while ($termcount < 1 ) { | ||||
|        $_ = $term->readline('swim: ',"$arg"); | ||||
|        push (@history,$_); | ||||
|        $termcount++; | ||||
|      } do { $_ = $term->readline('swim: ');  | ||||
|             push (@history,$_); | ||||
|            } while  $_ ne "exit"; | ||||
|       $arg = $history[$#history - 1]; | ||||
|       if ($arg ne $HISTORY[$#HISTORY]) { | ||||
|         if ($arg =~ m,^[^\w],) { | ||||
|           $arg =~ s,^\s+(\w+),$1,; | ||||
|         } | ||||
|          history_print($arg,\%commands); | ||||
|       } | ||||
|     }  | ||||
|     !($commands->{"r"} || $commands{"remove"}) ? | ||||
|       system "$apt_get install -qs $arg" : | ||||
|       system "$apt_get remove -qs $arg"; | ||||
|   } | ||||
|   ##################### | ||||
|   # INSTALLATION MODE # | ||||
|   ##################### | ||||
|   # provides optional --stdin to change packages to be installed  | ||||
|   # from the command line | ||||
|   else { | ||||
|     my $arg; | ||||
|     my $count = 0; | ||||
|     foreach (@PACKAGES) { | ||||
|      if ($count == 0) {   | ||||
|        $arg = "$_"; | ||||
|      } | ||||
|      else { | ||||
|        $arg = $arg . " " . "$_"; | ||||
|      }   | ||||
|       $count++; | ||||
|     } | ||||
|     ######### | ||||
|     # STDIN # | ||||
|     ######### | ||||
|     if ($commands->{"stdin"}) { | ||||
|      my $term = Term::ReadLine->new("Simple Shell"); | ||||
|      my @HISTORY = history(\%commands); | ||||
|      $term->addhistory(@HISTORY); | ||||
|      my @history; push(@history,"$arg"); | ||||
|      print "swim: type exit to finish --stdin\n"; | ||||
|      my $termcount = 0; | ||||
|      while ($termcount < 1 ) { | ||||
|        $_ = $term->readline('swim: ',"$arg"); | ||||
|        push (@history,$_); | ||||
|        $termcount++; | ||||
|      } do { $_ = $term->readline('swim: ');  | ||||
|             push (@history,$_); | ||||
|            } while  $_ ne "exit"; | ||||
|       $arg = $history[$#history - 1]; | ||||
|       if ("$arg" ne "$HISTORY[$#HISTORY]") { | ||||
|         if ($arg =~ m,^[^\w],) { | ||||
|           $arg =~ s,^\s+(\w+),$1,; | ||||
|         } | ||||
|          history_print($arg,\%commands); | ||||
|       } | ||||
|     }  | ||||
|     ####### | ||||
|     # XYZ # | ||||
|     ####### | ||||
|     if (!($commands->{"ftp"} || $commands->{"purge"})) { | ||||
|      if (!$commands->{"y"}) { | ||||
|       if (!$commands->{"nz"}) { | ||||
|        !($commands->{"r"} || $commands{"remove"}) ? | ||||
|          system "$apt_get install $arg" : | ||||
|          system "$apt_get remove $arg"; | ||||
|       } | ||||
|       else { | ||||
|        !($commands->{"r"} || $commands{"remove"}) ? | ||||
|          system "$apt_get -d install $arg" : | ||||
|          system "$apt_get  remove $arg"; | ||||
|       }  | ||||
|      } | ||||
|      else { | ||||
|       if (!$commands->{"nz"}) { | ||||
|        !($commands->{"r"} || $commands{"remove"}) ? | ||||
|          system "$apt_get install -y $arg" : | ||||
|          system "$apt_get remove -y $arg"; | ||||
|       } | ||||
|       else { | ||||
|        # not that the y does anything | ||||
|        !($commands->{"r"} || $commands{"remove"}) ? | ||||
|          system "$apt_get install -y -d $arg" : | ||||
|          system "$apt_get remove -y $arg"; | ||||
|       } | ||||
|      } | ||||
|     } | ||||
|     ####### | ||||
|     # FTP # | ||||
|     ####### | ||||
|     elsif ($commands->{"ftp"}) { | ||||
|       require SWIM::Qftp; | ||||
|       SWIM::Qftp->import(qw(qftp)); | ||||
|       qftp($arg,\%commands); | ||||
|     } | ||||
|    | ||||
|     ################## | ||||
|     # PURGE & REMOVE # | ||||
|     ################## | ||||
|     elsif ($commands->{"purge"} || $commands->{"remove"} || $commands->{"r"}) {         | ||||
|       purge($arg,\%commands); | ||||
|     } | ||||
| 
 | ||||
|     # this is a good time to return the versions, too, as well as | ||||
|     # including any NEW packages from --db and --ndb.  We'll assume $arg | ||||
|     # from qftp will never be too large | ||||
|     if (!$commands->{"n"}) { | ||||
|       dbi(\%commands); | ||||
|       @PACKAGES = map($db{$_},(@PACKAGES = split(/\s/,$arg))); | ||||
|     } | ||||
|     else { | ||||
|       ndb(\%commands); | ||||
|       @PACKAGES = map($db{$_},(@PACKAGES = split(/\s/,$arg))); | ||||
|     } | ||||
|     untie %db; | ||||
|   }  | ||||
| 
 | ||||
| } # end sub xyz | ||||
| 
 | ||||
| 
 | ||||
| # Remove (keep configuration files) or purge everything for each package. | ||||
| sub purge { | ||||
| 
 | ||||
|  my ($arg,$commands) = @_; | ||||
| 
 | ||||
|     if (!$commands->{"n"}) { | ||||
|      if ($commands->{"purge"}) { | ||||
|        system "$dpkg --purge $arg";   | ||||
| 
 | ||||
|      } | ||||
|      elsif ($commands->{"remove"} || $commands->{"r"}) { | ||||
|         system "$dpkg -r $arg";   | ||||
|      } | ||||
|     } | ||||
|     else { | ||||
|       print "swim: "; | ||||
|       print "-r " if defined $commands->{"r"}; | ||||
|       print "--remove " if defined $commands->{"remove"}; | ||||
|       print "--purge " if defined $commands->{"purge"}; | ||||
|       print "can only be used with installed packages\n"; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } # end sub purge | ||||
| 
 | ||||
| 
 | ||||
| # find the history file and return proper output | ||||
| sub history { | ||||
| 
 | ||||
|     my($commands) = @_; | ||||
|     my %commands = %$commands; | ||||
| 
 | ||||
|     my($arch,$dist) = which_archdist(\%commands); | ||||
|     my($place) = finddb(\%commands); | ||||
|     my $swim_history; | ||||
|     if ($commands->{"n"}) { | ||||
|      $swim_history = "$place/.nswim$arch$dist" . "_history"; | ||||
|     } | ||||
|     else { | ||||
|      $swim_history = "$place/.swim" . "_history"; | ||||
|     } | ||||
|     open(HISTORY,"$swim_history") or exit; | ||||
|     my (@HISTORY,$line); | ||||
|     while (<HISTORY>) { | ||||
|      chomp; | ||||
|      foreach (split(/\s/,$_)) { | ||||
|        if (!defined $line) { | ||||
|          $line =  (split(/_/,$_))[0]; | ||||
|        } | ||||
|        else { | ||||
|          $line = $line . " " . (split(/_/,$_))[0]; | ||||
|        } | ||||
|      } | ||||
|       push(@HISTORY,$line); undef $line; | ||||
|     } | ||||
| 
 | ||||
|     return @HISTORY; | ||||
|   | ||||
| } # end sub history | ||||
| 
 | ||||
| # append history if it has changed | ||||
| sub history_print { | ||||
| 
 | ||||
|     my($arg,$commands) = @_; | ||||
|     my %commands = %$commands; | ||||
|     my($arch,$dist) = which_archdist(\%commands); | ||||
|     my($place) = finddb(\%commands); | ||||
|     my $swim_history; | ||||
|     if ($commands->{"n"}) { | ||||
|      $swim_history = "$place/.nswim$arch$dist" . "_history"; | ||||
|     } | ||||
|     else { | ||||
|      $swim_history = "$place/.swim" . "_history"; | ||||
|     } | ||||
|    open(HISTORY,"$swim_history") or exit; | ||||
|    my @HISTORY = <HISTORY>; | ||||
|    close(HISTORY); | ||||
|    if ($#HISTORY < $HISTORY - 1) { | ||||
|      push(@HISTORY,"$arg\n"); | ||||
|    } | ||||
|    else { | ||||
|     shift(@HISTORY); | ||||
|     push(@HISTORY,"$arg\n"); | ||||
|    }  | ||||
|     open(HISTORY,">$swim_history") or exit; | ||||
|     print HISTORY @HISTORY; | ||||
| 
 | ||||
|   | ||||
| } # end sub history_print | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										850
									
								
								lib/Search.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										850
									
								
								lib/Search.pm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,850 @@ | ||||
| #    Package administration and research tool for Debian | ||||
| #    Copyright (C) 1999-2000 Jonathan D. Rosenbaum | ||||
| 
 | ||||
| #    This program is free software; you can redistribute it and/or modify | ||||
| #    it under the terms of the GNU General Public License as published by | ||||
| #    the Free Software Foundation; either version 2 of the License, or | ||||
| #    (at your option) any later version. | ||||
| 
 | ||||
| #    This program is distributed in the hope that it will be useful, | ||||
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| #    GNU General Public License for more details. | ||||
| 
 | ||||
| #    You should have received a copy of the GNU General Public License | ||||
| #    along with this program; if not, write to the Free Software | ||||
| #    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| 
 | ||||
| package SWIM::Search; | ||||
| use vars qw(@ISA @EXPORT); | ||||
| use strict; | ||||
| use SWIM::Global; | ||||
| use SWIM::Conf; | ||||
| use SWIM::DB_Library qw(:Search); | ||||
| use SWIM::Library; | ||||
| use Exporter; | ||||
| @ISA = qw(Exporter); | ||||
| @EXPORT = qw(search); | ||||
| 
 | ||||
| 
 | ||||
| # search() and searchdf() = mm --search, --ps --refinesearch --research | ||||
| 
 | ||||
| =pod | ||||
| 
 | ||||
| This searches for keyword(s) amongst the descriptions, and then | ||||
| shows the packages which match, a little more sophisticated than | ||||
| swim -qait | grep <keyword>, besides you can use perl regexping | ||||
| notation when you do your search.  By default the description is | ||||
| automatically presented, but a list of package names which match is kept | ||||
| which can then be queried using -S in the normal fashion, until the | ||||
| next search. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| sub search { | ||||
| 
 | ||||
|   my ($search_mem,$commands,$num,$argv) = @_; | ||||
| 
 | ||||
|   $argument = "/."; | ||||
|   my %commands = %$commands; | ||||
| 
 | ||||
|   my %morethanone; | ||||
|   my $keyword = $commands->{"search"}; | ||||
|    if ($commands->{"search"}) { | ||||
|      $keyword = $commands->{"search"}; | ||||
|    } | ||||
|    elsif ($commands->{"research"}) { | ||||
|      $keyword = $commands->{"research"}; | ||||
|    } | ||||
|    elsif ($commands->{"refinesearch"}) { | ||||
|      $keyword = $commands->{"refinesearch"}; | ||||
|    } | ||||
|    elsif ($commands->{"powersearch"} || $commands->{"ps"}) { | ||||
|      if ($commands->{"powersearch"}) { | ||||
|        $keyword = $commands->{"powersearch"}; | ||||
|      } | ||||
|      if ($commands->{"ps"}) { | ||||
|        $keyword = $commands->{"ps"}; | ||||
|      } | ||||
|    }   | ||||
|   my $count = 0; | ||||
|    | ||||
|   my ($search_file, $search_dir); | ||||
|   if (!$commands->{"n"}) { | ||||
|      ib(\%commands); | ||||
|      dbi(\%commands); | ||||
|      if ($commands->{"ps"} || $commands->{"powersearch"}) {  | ||||
|        ($search_file,$search_dir) =  searchdf(\%commands); | ||||
|        if (-B $search_file && -B $search_dir) { | ||||
|           $search_file = "$gzip -dc $search_file|"; | ||||
|           $search_dir = "$gzip -dc $search_dir|"; | ||||
|        } | ||||
|      }  | ||||
|   } | ||||
|   ##### | ||||
|   # N # | ||||
|   ##### | ||||
|   else { | ||||
|     my $return = nib(\%commands); | ||||
|      if (!defined $return) { | ||||
|         untie %ib; | ||||
|         nsb(\%commands); | ||||
|        $ib{"/."} = $nsb{"/."}; | ||||
|      } | ||||
|      ndb(\%commands); | ||||
|      if ($commands->{"ps"} || $commands->{"powersearch"}) {  | ||||
|        ($search_file,$search_dir) =  searchdf(\%commands); | ||||
|        if (!-e $search_file || !-e $search_dir) { | ||||
|          delete $commands{"ps"} if defined $commands->{"ps"}; | ||||
|          delete $commands{"powersearch"} if defined $commands->{"powersearch"}; | ||||
|        } | ||||
|        if (-B $search_file && -B $search_dir) { | ||||
|           $search_file = "$gzip -dc $search_file|"; | ||||
|           $search_dir = "$gzip -dc $search_dir|"; | ||||
|        } | ||||
|      } | ||||
|   }  | ||||
| 
 | ||||
|  ########## | ||||
|  #        # | ||||
|  # SEARCH # | ||||
|  #        # | ||||
|  ##########  | ||||
|  # Here starts --search & optionally -g | ||||
|  my ($line,@HISTORY); | ||||
|  if ($commands->{"search"}) { | ||||
|    my @stuff; | ||||
|    if ($commands->{"g"}) { | ||||
|    # check for some errors | ||||
|    if ($commands->{"a"} || $commands->{"f"} || $commands->{"dir"}) { | ||||
|      print "swim: one type of query/verify may be performed at a time\n"; | ||||
|      exit; | ||||
|    } | ||||
|    # extract the packages related to the group. | ||||
|    if (!$commands->{"n"}) { | ||||
|       gb(\%commands); | ||||
|    } | ||||
|    else { | ||||
|       ngb(\%commands) | ||||
|    } | ||||
|       if ($#ARGV != -1) { | ||||
|          foreach (@ARGV) { | ||||
|            $argument = $_; | ||||
|            if (defined $gb{$argument}) { | ||||
|              @stuff = split(/\s/, $gb{$argument}); | ||||
|            } | ||||
|            else { | ||||
|              print "group $argument does not contain any packages\n"; | ||||
|            } | ||||
|           } | ||||
|        } | ||||
|        else { | ||||
|          print "swim: no arguments given for query\n"; | ||||
|        } | ||||
|   untie %gb; | ||||
|   } # if ($commands->{"g"}) | ||||
| 
 | ||||
|   # not yet for -g | ||||
|   if ($commands->{"search"} && !$commands->{"g"}) { | ||||
|    if (defined $argument) { | ||||
|     if ($ib{"$argument"}){ | ||||
|           foreach (split(/\s/, $ib{"$argument"})) { | ||||
|            if ($keyword =~ /\/i$/) { | ||||
|             $keyword =~ m,(.*)\/i$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$_} =~ /$1/i) { | ||||
|                print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$_); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|                $count++;               | ||||
|              }  | ||||
|             } | ||||
|            }  | ||||
|            elsif ($keyword =~ /\/m$/) { | ||||
|             $keyword =~ m,(.*)\/m$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$_} =~ /$1/m ) { | ||||
|               print "$db{$_}\n" if !$commands->{"no"}; | ||||
|               push(@PACKAGES,$_); | ||||
|               if (!defined $line) { | ||||
|                $line =  (split(/_/,$_))[0]; | ||||
|               } | ||||
|               else { | ||||
|                $line = $line . " " . (split(/_/,$_))[0]; | ||||
|               } | ||||
|               $count++;               | ||||
|              }  | ||||
|             } | ||||
|            } | ||||
|            elsif ($keyword =~ /\/.[im]$/) { | ||||
|             $keyword =~ m,(.*)\/.[im]$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$_} =~ /$1/im ) { | ||||
|               print "$db{$_}\n" if !$commands->{"no"}; | ||||
|               push(@PACKAGES,$_); | ||||
|               if (!defined $line) { | ||||
|                $line =  (split(/_/,$_))[0]; | ||||
|               } | ||||
|               else { | ||||
|                $line = $line . " " . (split(/_/,$_))[0]; | ||||
|               } | ||||
|               $count++;               | ||||
|              }  | ||||
|             } | ||||
|            } | ||||
|            else { | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$_} =~ /$keyword/) { | ||||
|                print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$_); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|                $count++; | ||||
|              } | ||||
|             }  | ||||
|            } | ||||
|           } | ||||
|     print "swim: found $count package(s)\n";  | ||||
|     #exit; | ||||
|     } | ||||
|     if (!defined $line) { | ||||
|       $line = ""; | ||||
|     } | ||||
|     else { | ||||
|       $line = "$line\n"; | ||||
|     } | ||||
|     history($line,$search_mem); | ||||
|    } | ||||
|   } | ||||
| 
 | ||||
|   # ok -g | ||||
|   elsif ($commands->{"search"} && $commands->{"g"}) { | ||||
|    if (defined @stuff) { | ||||
|     #unlink("$search_mem"); | ||||
|     foreach (@stuff) { | ||||
|        $argument = $_; | ||||
|        version(\%commands); | ||||
|        # if we just did a group search we don't want to append it to | ||||
|        # the .search.deb file.        | ||||
|            if ($keyword =~ /\/i$/) { | ||||
|             $keyword =~ m,(.*)\/i$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$argument} =~ /$1/i) { | ||||
|                print "$db{$argument}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$argument); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|                $count++;               | ||||
|              }  | ||||
|             } | ||||
|            }  | ||||
|            elsif ($keyword =~ /\/m$/) { | ||||
|             $keyword =~ m,(.*)\/m$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$argument} =~ /$1/m ) { | ||||
|               print "$db{$argument}\n" if !$commands->{"no"}; | ||||
|               push(@PACKAGES,$argument); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|               $count++;               | ||||
|              }  | ||||
|             } | ||||
|            } | ||||
|            elsif ($keyword =~ /\/.[im]$/) { | ||||
|             $keyword =~ m,(.*)\/.[im]$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$argument} =~ /$1/im ) { | ||||
|               print "$db{$argument}\n" if !$commands->{"no"}; | ||||
|               push(@PACKAGES,$argument); | ||||
|               if (!defined $line) { | ||||
|                $line =  (split(/_/,$_))[0]; | ||||
|               } | ||||
|               else { | ||||
|                $line = $line . " " . (split(/_/,$_))[0]; | ||||
|               } | ||||
|               $count++;               | ||||
|              }  | ||||
|             } | ||||
|            } | ||||
|            else { | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$argument} =~ /$keyword/) { | ||||
|                print "$db{$argument}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$argument); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|                $count++; | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|     } | ||||
|     print "swim: found $count package(s)\n";  | ||||
|     if (!defined $line) { | ||||
|       $line = ""; | ||||
|     } | ||||
|     else { | ||||
|       $line = "$line\n"; | ||||
|     } | ||||
|     history($line,$search_mem); | ||||
|    } | ||||
|   } | ||||
|  exit if !($commands->{"stdin"} || $commands->{"x"} || $commands->{"y"} || | ||||
|            $commands->{"z"} || $commands->{"ftp"}); | ||||
|  } | ||||
| 
 | ||||
|  ############################# | ||||
|  #                           # | ||||
|  # RESEARCH  || REFINESEARCH # | ||||
|  #                           # | ||||
|  #############################   | ||||
|  # research time or refining time | ||||
|  if ($commands->{"research"} || $commands{"refinesearch"}) { | ||||
|     if ($commands->{"g"}) { | ||||
|       print "swim: use -g only with a new search\n"; | ||||
|       exit; | ||||
|     } | ||||
|           foreach (@$argv) { | ||||
|            if ($keyword =~ /\/i$/) { | ||||
|             $keyword =~ m,(.*)\/i$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$db{$_}} =~ /$1/i) { | ||||
|                print "$db{$db{$_}}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$_); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|                $count++;               | ||||
|              }  | ||||
|             } | ||||
|            }  | ||||
|            elsif ($keyword =~ /\/m$/) { | ||||
|             $keyword =~ m,(.*)\/m$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$db{$_}} =~ /$1/m ) { | ||||
|               print "$db{$db{$_}}\n" if !$commands->{"no"}; | ||||
|               push(@PACKAGES,$_); | ||||
|               if (!defined $line) { | ||||
|                $line =  (split(/_/,$_))[0]; | ||||
|               } | ||||
|               else { | ||||
|                $line = $line . " " . (split(/_/,$_))[0]; | ||||
|               } | ||||
|               $count++;               | ||||
|              }   | ||||
|             } | ||||
|            } | ||||
|            elsif ($keyword =~ /\/.[im]$/) { | ||||
|             $keyword =~ m,(.*)\/.[im]$,; | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$db{$_}} =~ /$1/im ) { | ||||
|               print "$db{$db{$_}}\n" if !$commands->{"no"}; | ||||
|               push(@PACKAGES,$_); | ||||
|               if (!defined $line) { | ||||
|                $line =  (split(/_/,$_))[0]; | ||||
|               } | ||||
|               else { | ||||
|                $line = $line . " " . (split(/_/,$_))[0]; | ||||
|               } | ||||
|               $count++;               | ||||
|              }  | ||||
|             } | ||||
|            } | ||||
|            else { | ||||
|             if (defined $db{$_}) { | ||||
|              if ($db{$db{$_}} =~ /$keyword/) { | ||||
|                print "$db{$db{$_}}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$_); | ||||
|               if (!defined $line) { | ||||
|                $line =  (split(/_/,$_))[0]; | ||||
|               } | ||||
|               else { | ||||
|                $line = $line . " " . (split(/_/,$_))[0]; | ||||
|               } | ||||
|                $count++; | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|           } | ||||
|     print "swim: found $count package(s)\n";  | ||||
|     if (!defined $line) { | ||||
|       $line = ""; | ||||
|     } | ||||
|     else { | ||||
|       $line = "$line\n"; | ||||
|     } | ||||
|     # refine the search | ||||
|     if ($commands->{"refinesearch"}) { | ||||
|       open(HISTORY, "$search_mem") || exit; | ||||
|       my @HISTORY = reverse <HISTORY>; | ||||
|       close(HISTORY); | ||||
|       $HISTORY[$num - 1] = $line; | ||||
|       open(HISTORY, ">$search_mem") || exit; | ||||
|       print HISTORY reverse @HISTORY; | ||||
|       close(HISTORY); | ||||
|     }   | ||||
|     exit if !($commands->{"stdin"} || $commands->{"x"} || | ||||
|               $commands->{"y"} || $commands->{"z"} || $commands->{"ftp"}); | ||||
|  } | ||||
| 
 | ||||
| 
 | ||||
|  ################ | ||||
|  #              # | ||||
|  # POWERSEARCH  # | ||||
|  #              # | ||||
|  ################   | ||||
|  # powersearch with no -g option since this searchs all files. | ||||
|  if (($commands->{"powersearch"} || $commands->{"ps"}) && !$commands->{"g"}) { | ||||
|           open(FLATFILE, "$search_file");             | ||||
|           while (<FLATFILE>) { | ||||
|             chomp $_; | ||||
|            if ($keyword =~ /\/i$/) { | ||||
|             $keyword =~ m,(.*)\/i$,; | ||||
|             if ($_ =~ /$1/i) { | ||||
|              if (defined $ib{$_}) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   print  "$db{$ib{$_}}\n" if !$commands->{"no"}; | ||||
|                   push(@PACKAGES,$ib{$_}); | ||||
|                   if (!defined $line) { | ||||
|                    $line =  (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                   else { | ||||
|                    $line = $line . " " . (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                $count++; | ||||
|                } | ||||
|              } | ||||
|             }  | ||||
|            }  | ||||
|            elsif ($keyword =~ /\/m$/) { | ||||
|             $keyword =~ m,(.*)\/m$,; | ||||
|             if ($_ =~ /$1/m ) { | ||||
|              if (defined $ib{$_}) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   print  "$db{$ib{$_}}\n" if !$commands->{"no"}; | ||||
|                   push(@PACKAGES,$ib{$_}); | ||||
|                   if (!defined $line) { | ||||
|                    $line =  (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                   else { | ||||
|                    $line = $line . " " . (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                $count++; | ||||
|                } | ||||
|              } | ||||
|             }  | ||||
|            } | ||||
|            elsif ($keyword =~ /\/.[im]$/) { | ||||
|             $keyword =~ m,(.*)\/.[im]$,; | ||||
|             if ($_ =~ /$1/im ) { | ||||
|              if (defined $ib{$_}) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   print  "$db{$ib{$_}}\n" if !$commands->{"no"}; | ||||
|                   push(@PACKAGES,$ib{$_}); | ||||
|                   if (!defined $line) { | ||||
|                    $line =  (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                   else { | ||||
|                    $line = $line . " " . (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                $count++; | ||||
|                } | ||||
|              } | ||||
|             }  | ||||
|            } | ||||
|            else { | ||||
|             if ($_ =~ /$keyword/) { | ||||
|              if (defined $ib{$_}) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   # ofcourse this won't work if a dir filters through. | ||||
|                   # hummm. | ||||
|                   #print "HUMM  DIR $_ ", $ib{$_}, "\n";  | ||||
|                   print  "$db{$ib{$_}}\n" if !$commands->{"no"}; | ||||
|                   push(@PACKAGES,$ib{$_}); | ||||
|                   if (!defined $line) { | ||||
|                    $line =  (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                   else { | ||||
|                    $line = $line . " " . (split(/_/,$ib{$_}))[0]; | ||||
|                   } | ||||
|                $count++; | ||||
|                } | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|           } # while (<FLATFILE>)   | ||||
|     close(FLATFILE); | ||||
| 
 | ||||
|    ####### | ||||
|    # DIR # | ||||
|    ####### | ||||
|    # Somebody wants to do a rare --dir search, but this is done by default | ||||
|    # for the n* because often enough more than one package shares one | ||||
|    # file. | ||||
|    if ($commands->{"dir"} || $commands{"n"}) { | ||||
|           open(FLATFILE, "$search_dir"); | ||||
|           while (<FLATFILE>) { | ||||
|             chomp $_; | ||||
|            if ($keyword =~ /\/i$/) { | ||||
|             $keyword =~ m,(.*)\/i$,; | ||||
|             if ($_ =~ /$1/i) { | ||||
|              if (defined $ib{$_}) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   my @dir = split(/\s/,$ib{$_}); | ||||
|                   foreach (@dir) { | ||||
|                    $morethanone{$_}++; | ||||
|                    if (defined $morethanone{$_}) { | ||||
|                     if ($morethanone{$_} == 1) { | ||||
|                        print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                        push(@PACKAGES,$_); | ||||
|                        if (!defined $line) { | ||||
|                         $line =  (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        else { | ||||
|                         $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        $count++; | ||||
|                     } | ||||
|                    }  | ||||
|                   } | ||||
|                } | ||||
|              } | ||||
|             }  | ||||
|            }  | ||||
|            elsif ($keyword =~ /\/m$/) { | ||||
|             $keyword =~ m,(.*)\/m$,; | ||||
|             if ($_ =~ /$1/m ) { | ||||
|              if (defined $ib{$_}) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   my @dir = split(/\s/,$ib{$_}); | ||||
|                   foreach (@dir) { | ||||
|                    $morethanone{$_}++; | ||||
|                    if (defined $morethanone{$_}) { | ||||
|                     if ($morethanone{$_} == 1) { | ||||
|                        print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                        push(@PACKAGES,$_); | ||||
|                        if (!defined $line) { | ||||
|                         $line =  (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        else { | ||||
|                         $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        $count++; | ||||
|                     } | ||||
|                    }  | ||||
|                   } | ||||
|                } | ||||
|              } | ||||
|             }  | ||||
|            } | ||||
|            elsif ($keyword =~ /\/.[im]$/) { | ||||
|             $keyword =~ m,(.*)\/.[im]$,; | ||||
|             if ($_ =~ /$1/im ) { | ||||
|              if (defined $ib{$_}) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   my @dir = split(/\s/,$ib{$_}); | ||||
|                   foreach (@dir) { | ||||
|                    $morethanone{$_}++; | ||||
|                    if (defined $morethanone{$_}) { | ||||
|                     if ($morethanone{$_} == 1) { | ||||
|                        print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                        push(@PACKAGES,$_); | ||||
|                        if (!defined $line) { | ||||
|                         $line =  (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        else { | ||||
|                         $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        $count++; | ||||
|                     } | ||||
|                    }  | ||||
|                   } | ||||
|                } | ||||
|              } | ||||
|             }  | ||||
|            } | ||||
|            else { | ||||
|             if ($_ =~ /$keyword/) { | ||||
|              if (defined $ib{$_}) { | ||||
|                   #my @dir = split(/\s/,$ib{$_}); | ||||
|                   #foreach (@dir) { | ||||
|                 $morethanone{$ib{$_}}++; | ||||
|                if ($morethanone{$ib{$_}} == 1) {  | ||||
|                   my @dir = split(/\s/,$ib{$_}); | ||||
|                   foreach (@dir) { | ||||
|                    $morethanone{$_}++; | ||||
|                    if (defined $morethanone{$_}) { | ||||
|                     if ($morethanone{$_} == 1) { | ||||
|                        print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                        push(@PACKAGES,$_); | ||||
|                        if (!defined $line) { | ||||
|                         $line =  (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        else { | ||||
|                         $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                        } | ||||
|                        $count++; | ||||
|                     } | ||||
|                    }  | ||||
|                   } | ||||
|                } | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|           } # while (<FLATFILE>)   | ||||
|     close(FLATFILE); | ||||
|     } | ||||
| 
 | ||||
|    ################# | ||||
|    # NORMAL SEARCH # | ||||
|    ################# | ||||
|    # now we can do a normal search for the powersearch | ||||
|    if (defined $argument) { | ||||
|     if ($ib{"$argument"}){ | ||||
|           foreach (split(/\s/, $ib{$argument})) { | ||||
|            if ($keyword =~ /\/i$/) { | ||||
|             $morethanone{$_}++; | ||||
|             if ($morethanone{$_} == 1) {  | ||||
|              $keyword =~ m,(.*)\/i$,; | ||||
|              if (defined $db{$_}) { | ||||
|               if ($db{$_} =~ /$1/i) { | ||||
|                 print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                 push(@PACKAGES,$_); | ||||
|                 if (!defined $line) { | ||||
|                  $line =  (split(/_/,$_))[0]; | ||||
|                 } | ||||
|                 else { | ||||
|                  $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                 } | ||||
|                 $count++;               | ||||
|               }  | ||||
|              } | ||||
|             } | ||||
|            }  | ||||
|            elsif ($keyword =~ /\/m$/) { | ||||
|             $morethanone{$_}++; | ||||
|             if ($morethanone{$_} == 1) {  | ||||
|              $keyword =~ m,(.*)\/m$,; | ||||
|              if (defined $db{$_}) { | ||||
|               if ($db{$_} =~ /$1/m ) { | ||||
|                print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$_); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|                $count++;               | ||||
|               }  | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|            elsif ($keyword =~ /\/.[im]$/) { | ||||
|             $morethanone{$_}++; | ||||
|             if ($morethanone{$_} == 1) {  | ||||
|              $keyword =~ m,(.*)\/.[im]$,; | ||||
|              if (defined $db{$_}) { | ||||
|               if ($db{$_} =~ /$1/im ) { | ||||
|                print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                push(@PACKAGES,$_); | ||||
|                if (!defined $line) { | ||||
|                 $line =  (split(/_/,$_))[0]; | ||||
|                } | ||||
|                else { | ||||
|                 $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                } | ||||
|                $count++;               | ||||
|               }  | ||||
|              } | ||||
|             } | ||||
|            } | ||||
|            else { | ||||
|              $morethanone{$_}++; | ||||
|              if ($morethanone{$_} == 1) {  | ||||
|               if (defined $db{$_}) { | ||||
|                if ($db{$_} =~ /$keyword/) { | ||||
|                  print "$db{$_}\n" if !$commands->{"no"}; | ||||
|                  push(@PACKAGES,$_); | ||||
|                  if (!defined $line) { | ||||
|                   $line =  (split(/_/,$_))[0]; | ||||
|                  } | ||||
|                  else { | ||||
|                   $line = $line . " " . (split(/_/,$_))[0]; | ||||
|                  } | ||||
|                $count++;               | ||||
|                } | ||||
|               } | ||||
|              } | ||||
|            } | ||||
|           } | ||||
|     print "swim: found $count package(s)\n";  | ||||
|     if (!defined $line) { | ||||
|       $line = ""; | ||||
|     } | ||||
|     else { | ||||
|       $line = "$line\n"; | ||||
|     } | ||||
|     history($line,$search_mem); | ||||
|     #exit if !($commands->{"stdin"} || $commands->{"x"} || | ||||
|     #          $commands->{"y"} || $commands->{"z"} || $commands->{"ftp"}); | ||||
|     } | ||||
|   } | ||||
|  } | ||||
| 
 | ||||
|   untie %ib; | ||||
|   untie %db; | ||||
| 
 | ||||
| 
 | ||||
| } # end sub search | ||||
| 
 | ||||
| # for finding the search flatfiles | ||||
| sub searchdf { | ||||
| 
 | ||||
|  my ($commands) = @_; | ||||
| 
 | ||||
|  my($sfile,$sdir); | ||||
|  if (!$commands->{"n"}) { | ||||
|   my ($ramdisk) = ram_on(); | ||||
|   if ($ramdisk eq 1) { | ||||
|    if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|       ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|       (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $sfile = "$parent$library/searchindex.deb"; | ||||
|      $sdir = "$parent$library/dirindex.deb"; | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|    elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|      $sfile = "$parent$base/searchindex.deb"; | ||||
|      $sdir = "$parent$base/dirindex.deb"; | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|   } | ||||
|   elsif ($ramdisk eq "yes") { | ||||
|    if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|       ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|       (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $sfile = "$parent$library/dramdisk/searchindex.deb.gz"; | ||||
|      $sdir = "$parent$library/dramdisk/dirindex.deb.gz"; | ||||
|      if (!-e $sdir && !-e $sfile) { | ||||
|        print "swim: found wrong database(s), use --ramdiskoff\n"; | ||||
|        exit; | ||||
|      } | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|    elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|      $sfile = "$parent$base/dramdisk/searchindex.deb.gz"; | ||||
|      $sdir = "$parent$base/dramdisk/dirindex.deb.gz"; | ||||
|      if (!-e $sdir && !-e $sfile) { | ||||
|        print "swim: found wrong database(s), use --ramdiskoff\n"; | ||||
|        exit; | ||||
|      } | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|   } | ||||
|  } | ||||
|  else { | ||||
|   my ($ramdisk) = ram_on(); | ||||
|   my($arch,$dist) = which_archdist(\%commands); | ||||
|   if ($ramdisk eq 1) { | ||||
|    if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|       ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|       (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $sfile = "$parent$library/nsearchindex$arch$dist.deb"; | ||||
|      $sdir = "$parent$library/ndirindex$arch$dist.deb"; | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|    elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|      $sfile = "$parent$base/nsearchindex$arch$dist.deb"; | ||||
|      $sdir = "$parent$base/ndirindex$arch$dist.deb"; | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|   } | ||||
|   elsif ($ramdisk eq "yes") { | ||||
|    if (($commands->{"dbpath"} && $commands->{"root"}) || | ||||
|       ($commands->{"dbpath"} && !$commands->{"root"}) || | ||||
|       (!$commands->{"dbpath"} && !$commands->{"root"})) { | ||||
|      $sfile = "$parent$library/dramdisk/nsearchindex$arch$dist.deb.gz"; | ||||
|      $sdir = "$parent$library/dramdisk/ndirindex$arch$dist.deb.gz"; | ||||
|      if (!-e $sdir && !-e $sfile) { | ||||
|       print "swim: found wrong database(s), use --ramdiskoff\n"; | ||||
|        exit; | ||||
|      } | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|    elsif  (!$commands->{"dbpath"} && $commands->{"root"}) { | ||||
|      $sfile = "$parent$base/dramdisk/nsearchindex$arch$dist.deb.gz"; | ||||
|      $sdir = "$parent$base/dramdisk/ndirindex$arch$dist.deb.gz"; | ||||
|      if (!-e $sdir && !-e $sfile) { | ||||
|        print "swim: found wrong database(s), use --ramdiskoff\n"; | ||||
|        exit; | ||||
|      } | ||||
|      return ($sfile,$sdir); | ||||
|    } | ||||
|   } | ||||
|  } | ||||
| 
 | ||||
| } # end sub searchdf | ||||
| 
 | ||||
| # print the search out to the right spot on the HISTORY | ||||
| # this is just shift and push | ||||
| sub history { | ||||
| 
 | ||||
|   my($line,$file) = @_; | ||||
|   my @HISTORY; | ||||
| 
 | ||||
|   if (-e "$file") { | ||||
|    open(HISTORY,"$file"); | ||||
|    @HISTORY = <HISTORY>; | ||||
|    close(HISTORY); | ||||
|    if ($#HISTORY < $HISTORY - 1) { | ||||
|      push(@HISTORY,$line); | ||||
|    }   | ||||
|    else { | ||||
|     shift(@HISTORY); | ||||
|     push(@HISTORY,$line); | ||||
|    } | ||||
|   } | ||||
|   else { | ||||
|    @HISTORY = $line; | ||||
|   } | ||||
| 
 | ||||
|   open(HISTORY,">$file") or exit; | ||||
|     print HISTORY @HISTORY; | ||||
|   close(HISTORY); | ||||
| 
 | ||||
| } # end sub history | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
							
								
								
									
										49
									
								
								swim.html/ch-aptprep.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								swim.html/ch-aptprep.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| <html><head> | ||||
| <title>swim - PREPARING YOUR INSTALLATION FOR APT | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 8<br> | ||||
| PREPARING YOUR INSTALLATION FOR APT | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| <pre>usage: swim --audit | ||||
|        swim --status | ||||
|        swim -C</pre> | ||||
| <P> | ||||
| 
 | ||||
| If you are using <strong>apt</strong> with <strong>swim</strong>, and this | ||||
| is the first time you are using it with your installation, check your live | ||||
| installation with this major mode. This is a call to <strong>dpkg -C | ||||
| (--audit)</strong>, and will show any packages which are not properly | ||||
| configured or installed. If you get any output, make corrections. The goal | ||||
| is to get absolutely no output whatsoever because it is under these | ||||
| conditions that apt will work properly. See the <A href="ch-query.html#s-vrrm">REMOVING AN INSTALLED PACKAGE - VIRTUAL OPTIONS  | ||||
| , section 9.8</A> with  | ||||
| <strong>-q</strong> to remove the offending packages. You may have to | ||||
| remove the package by hand under unusual situations like when it is not | ||||
| just dependencies (see <code>-T</code>) between packages keeping the package | ||||
| from being removed perhaps due to a broken script (see | ||||
| <code>--scripts</code>). In an extreme case you could manually remove the | ||||
| entry for this package from the <em>/var/lib/dpkg/status</em> database, | ||||
| and hunt down and remove all the files associated with the package with | ||||
| <strong>swim's -l</strong> option. When you are done if you still want | ||||
| some of the packages you removed, use <strong>apt</strong> to reinstall | ||||
| them with <strong>swim's -xyz</strong> option. Also, <strong>apt</strong> | ||||
| provides its own built-in method to clean up your system, and will provide | ||||
| instructions, but you still may have to do some of the cleaning yourself | ||||
| as discussed above. | ||||
| 
 | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-query.html">next</A>; <A href="ch-notinstalled.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										158
									
								
								swim.html/ch-commandline.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								swim.html/ch-commandline.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,158 @@ | ||||
| <html><head> | ||||
| <title>swim - COMMAND LINE OPTION SYNTAX | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 2<br> | ||||
| COMMAND LINE OPTION SYNTAX | ||||
| 
 | ||||
| </h1> | ||||
|  When you press ``<strong>swim</strong> | ||||
| <<strong>enter</strong>>`` you will see a listing of command line | ||||
| options in a particular syntax.  This is to help you understand under what | ||||
| context to use the options.  When you enter the options on the command | ||||
| line, the brackets, parentheses, braces, diamonds, and question marks are | ||||
| not actually used. | ||||
| <P> | ||||
|   | ||||
| 
 | ||||
| <strong>Major Mode Option</strong> | ||||
| <P> | ||||
| 
 | ||||
| All command line options for <strong>swim</strong> always start with a | ||||
| <strong>major mode option</strong>, except for ``swim <enter>`` | ||||
| which will show the whole listing of options. A major mode option is | ||||
| surrounded in braces <strong>{ major mode option }</strong>. In the case | ||||
| of {--search} there are the alternative major mode options | ||||
| {--refinesearch} and {--research}, but because --search needs to be used | ||||
| first before either of these two options, --refinesearch and --research | ||||
| are surrounded in parentheses ().  | ||||
| <P> | ||||
| 
 | ||||
| Note: Through the other chapters of this manual <strong>{}</strong> is | ||||
| assumed for the <strong>major modes</strong> in the | ||||
| <strong>usage:</strong> section shown at the beginning of every chapter.  | ||||
| <P> | ||||
| 
 | ||||
| Let's take a closer look at this situation: | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <code>{--search ? (--research || --refinesearch)<pattern(s)>}</code> | ||||
| <P> | ||||
|  `<strong>||</strong>' or `<strong>|</strong>' are used to indicate | ||||
| `<strong>or</strong>', `<strong>?</strong>' indicates | ||||
| `<strong>optional</strong>', <diamond> indicates an | ||||
| <strong>argument</strong> (a required argument - see Arguments below), | ||||
| (parenthesis) means `if used, must be used after the | ||||
| previous required option was used'. Note: for readability | ||||
| <code>--research</code> and -<code>-refinesearch</code> are not surrounded in | ||||
| <code>{}</code>.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>Normal Options</strong> | ||||
| <P> | ||||
| 
 | ||||
| Options to the major mode options are enclosed in brackets <strong>[ | ||||
| option to major mode ]</strong>.  <code>swim [-n]</code> | ||||
| <<code>enter</code>> (assume enter from here on out), for instance, | ||||
| will show all the command line options without using the pager. The pager | ||||
| which swim uses can be set in <em>swimrc</em> (see <em>swimrc(8)</em>). | ||||
| ``<code>swim {--help} [-n]</code>'' will provide brief explanations of all of | ||||
| swim's options without using the pager. In this case the major mode option | ||||
| <strong>{--help}</strong>, and the option <strong>[-n]</strong> were used. | ||||
| <P> | ||||
| 
 | ||||
| <strong>Dashes</strong> | ||||
| <P> | ||||
| 
 | ||||
| Options which have a single dash can be combined with other single dashed | ||||
| options <strong>(-qaint)</strong>. Double dashed options need to be | ||||
| entered by themselves <strong>(--help --nopager)</strong>, many double | ||||
| dashed options have an alternative single dash option <strong>(-n for | ||||
| --nopager)</strong>.  The meaning of options is related to the major | ||||
| mode they are being used with. <strong>[-n]</strong> means no pager | ||||
| when called with <strong>{--help}</strong>, but it's a reference to the | ||||
| not-installed databases when used with <strong>{-q --query}</strong>, | ||||
| fortunately most options do not have double meanings. | ||||
| <P> | ||||
| 
 | ||||
| <strong>Arguments</strong> | ||||
| <P> | ||||
| 
 | ||||
| Many options require an argument. Arguments are enclose in diamonds <  | ||||
| <strong>argument</strong> >. An argument to an option may also be | ||||
| optional in which case a question mark ``<strong>?</strong>'' will be | ||||
| placed between the option and the argument.  <strong>[-l ?  | ||||
| <[--df]>]</strong> illustrates such a situation. | ||||
| <strong>[-l]</strong> shows a file listings, and optionally the option | ||||
| <strong>[--df]</strong> can be use with <strong>[-l]</strong> to show an | ||||
| expanded listing.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>[--dbpath</strong> <<strong>dir>]</strong> requires an | ||||
| argument, this time the argument would not be another option, but rather | ||||
| it is a directory.  | ||||
| <P> | ||||
| 
 | ||||
| Rule: When an option is an argument to another option it can be written | ||||
| anywhere, but when a non-option is an argument | ||||
| <<strong>dir</strong>> <strong>(notice no brackets)</strong> it has | ||||
| to be placed directly after the option.  Sometimes, there may be | ||||
| alternative arguments divided with ``<strong>|</strong>''.  | ||||
| <<strong>argument1|argument2</strong>>  means use argument1 or | ||||
| argument2, but not both. | ||||
| <P> | ||||
| 
 | ||||
| Based on what we now know, let's compare this situation to the | ||||
| <strong>{--search}</strong> situation shown above:  | ||||
| <P> | ||||
| 
 | ||||
| <code>[--ftp ? --source | --source_only ? <[--diff]>]</code> | ||||
| <P> | ||||
|    | ||||
| 
 | ||||
| In this case <strong>--source</strong> or alternatively | ||||
| <strong>--source_only</strong> can be optionally used along with | ||||
| <strong>--ftp</strong> because they aren't in parentheses | ||||
| <strong>()</strong> (also notice: | was used instead of ||, but means the | ||||
| same thing ``or'').  <strong>--diff</strong> can optionally be provided as | ||||
| an argument to either <strong>--source</strong> or | ||||
| <strong>--source_only</strong>. For readability --source and --source_only | ||||
| weren't enclosed in brackets. | ||||
| <P> | ||||
| 
 | ||||
| <strong>Global Arguments</strong> | ||||
| <P> | ||||
| 
 | ||||
| A <strong>global argument</strong> can be typed anywhere on the command | ||||
| line, and can be an option or text. If global arguments | ||||
| exist they are placed last after the list of normal | ||||
| options that can be used with a major mode | ||||
| option.  | ||||
| <P> | ||||
| 
 | ||||
| [targets | -S] and [targets|APT|DF] are | ||||
| examples.  {-q}, {--initndb}, and | ||||
| {--rebuildndb} all use global arguments.   | ||||
| <P> | ||||
| 
 | ||||
| <strong>Minor Mode Options</strong> | ||||
| <P> | ||||
| 
 | ||||
| {-q --query} will generally use zero or more | ||||
| minor mode options [-afpgn --dir], with | ||||
| one exception (see <A href="ch-query.html">QUERYING THE INSTALLED AND NOT-INSTALLED DATABASES | ||||
| , chapter 9</A>).  | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-version.html">next</A>; <A href="ch-description.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										32
									
								
								swim.html/ch-description.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								swim.html/ch-description.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| <html><head> | ||||
| <title>swim - DESCRIPTION | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 1<br> | ||||
| DESCRIPTION | ||||
| 
 | ||||
| </h1> | ||||
|   | ||||
| 
 | ||||
| <strong>swim</strong> is a powerful <em>package administration</em> | ||||
| and <em>research tool</em> for both an <em>installed Debian | ||||
| distribution</em>, and/or <em>not-installed virtual Debian | ||||
| distribution(s)</em> allowing querying of software packages with a variety | ||||
| of package information options, and powerful searches. Virtual options | ||||
| which include ftp, installation, and package removal capabilities can be | ||||
| seamlessly combined with querying or searches. <strong>swim</strong> can | ||||
| be used on computer systems which either have, or do not have a Debian | ||||
| distribution installed. | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-commandline.html">next</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										37
									
								
								swim.html/ch-history.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								swim.html/ch-history.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | ||||
| <html><head> | ||||
| <title>swim - HISTORY | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 4<br> | ||||
| HISTORY | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| <pre> | ||||
| usage: swim --history | ||||
|        swim -h | ||||
| 
 | ||||
| options: [--arch <architecture>] [--dists <distribution>] | ||||
|          [--n] [--dbpath <dir>] [--root <dir>] | ||||
| </pre> | ||||
| <P> | ||||
| 
 | ||||
| This shows a shell-like history of searches and the most recent --stdin | ||||
| edit. History is numbered with the most recent action being 1, and the | ||||
| earlier actions being of a higher number until the maximum amount of lines | ||||
| set in the HISTORY variable in <code>swimrc(5)</code>.  A separate history is | ||||
| kept for each architecture-distribution.  | ||||
| 
 | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-makinginst.html">next</A>; <A href="ch-version.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										330
									
								
								swim.html/ch-important.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								swim.html/ch-important.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,330 @@ | ||||
| <html><head> | ||||
| <title>swim - IMPORTANT DEBIAN DATABASES FOR NOT-INSTALLED | ||||
| DATABASES | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 6<br> | ||||
| IMPORTANT DEBIAN DATABASES FOR NOT-INSTALLED | ||||
| DATABASES | ||||
| 
 | ||||
| </h1> | ||||
| <hr> | ||||
| <h2><A name="s-downimportant"> | ||||
| 6.1 A. downloading the important databases with --ftp. | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <pre>usage: swim --ftp | ||||
| 
 | ||||
| options: --Contents <DF|directory> | ||||
|          --Packages <DF|directory>  | ||||
|          [--dists <distribution>] [--arch <architecture>] | ||||
|          [--onec] [--Release_only]</pre> | ||||
| <hr> | ||||
| <h2><A name="s6.2"> | ||||
| 6.2 OVERVIEW | ||||
| 
 | ||||
| </A></h2> | ||||
|  <strong>swim</strong> provides a method so that all information about | ||||
| an existing Debian distribution is quickly accessible through databases. | ||||
| Debian already provides flat file databases for all its distributions. One | ||||
| database called ``<em>Contents-(architecture)</em>'' provides a complete | ||||
| listing of all the files associated with each package, the other much more | ||||
| important database called ``<em>Packages</em>'' provides everything from | ||||
| the Package's description, to all the dependencies for that package. The | ||||
| Packages database is a crucial database for other important Debian | ||||
| administrative tools like <strong>dpkg</strong> and <strong>apt</strong>. | ||||
| <hr> | ||||
| <h2><A name="s-dd"> | ||||
| 6.3 DISTRIBUTION DEFINED | ||||
| 
 | ||||
| </A></h2> | ||||
| Debian Distributions choose a name which reflect the development state of | ||||
| that distribution. The distribution named ``<em>unstable</em>'' is where | ||||
| the majority of the development processing occurs, after <em>unstable</em> | ||||
| has reached a certain level of maturity, it's copied over to a new | ||||
| distribution called ``<em>frozen</em>'' which is tested extensively before | ||||
| becoming the new ``<em>stable</em>'' distribution. The <em>frozen | ||||
| distribution</em> retains the <em>Release version number</em> of the | ||||
| <em>unstable distribution</em>, and the <em>unstable distribution</em> | ||||
| receives a new <em>Release version number</em>. Eventually, | ||||
| <em>frozen</em> becomes <em>stable</em>, and at this point both | ||||
| <em>frozen</em>, and the older <em>stable distribution</em> are removed. | ||||
| Code names are associated with the <em>Release Version number</em> given | ||||
| for each of the distributions. This is much better for mirroring Debian | ||||
| sites. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>swim</strong> was designed to ignore these code names, and instead | ||||
| shows the user the <em>Release version number</em> associated with the | ||||
| distribution. Swim users must always use the real distribution name, or | ||||
| swim will not work properly. This is a nice feature because it allows user | ||||
| to make decisions related to the management of their databases, and makes | ||||
| research much more easier. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| The other Debian distribution which swim recognizes is | ||||
| <em>experimental</em>. This distribution <em>does not have any Release | ||||
| version number</em>, and contains packages which are considered risky | ||||
| because of their development level. | ||||
| 
 | ||||
| 
 | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s6.4"> | ||||
| 6.4 SECTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
|  Each Debian distribution has sections related to the relationship of | ||||
| each of the packages to the <em>Debian's Policy Manual</em>. In | ||||
| ``<em>main</em>'' there are packages which have a correct relationship | ||||
| with these Policies. Packages in ``<em>contrib</em>'' comply with the | ||||
| <em>DFSG</em> (<em>Debian Free Software Guidelines</em> found in the | ||||
| <em>Debian Policy Manual</em>) but have various limitations like requiring | ||||
| a package which is found in non-free, or is not in the Debian archive. | ||||
| Packages in ``<em>non-free</em>'' do not comply with the <em>DFSG</em> but | ||||
| are electronically distributable across international borders. The | ||||
| ``<em>non-us</em>'' section is found outside of the United States and | ||||
| exists for packages which have export restrictions.  | ||||
| 
 | ||||
| 
 | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s6.5"> | ||||
| 6.5 ARCHITECTURES | ||||
| 
 | ||||
| </A></h2> | ||||
|  Distributions also have architecture specific sections since not all | ||||
| packages compiled for one architecture can run on all other | ||||
| archictectures, however, there are a large percentage of packages which do | ||||
| run on all architectures. The architectures are <em>alpha</em>, | ||||
| <em>arm</em>, <em>i386</em>, <em>m68k</em>, <em>powerpc</em>, | ||||
| <em>sparc</em>, and more recently <em>hurd-i386</em> which represents | ||||
| packages for the hurd GNU kernel for the i386 architecture. | ||||
| 
 | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s6.6"> | ||||
| 6.6 SWIMZ.LIST | ||||
| 
 | ||||
| </A></h2> | ||||
|  <strong>--ftp</strong> uses a file called <em>swimz.list</em> which | ||||
| has the same type of format (see format below) as the | ||||
| <em>sources.list(5)</em> which <strong>apt</strong> uses. There are some | ||||
| differences. The <strong>first difference</strong> mentioned above (see | ||||
| <A href="#s-dd">DISTRIBUTION DEFINED | ||||
| , section 6.3</A>) requires that the distribution names never should be the | ||||
| code names for the <em>Release version</em>.  <strong>Secondly</strong>, | ||||
| <strong>apt</strong> only retrieves databases specific to one | ||||
| archictecture, normally the one you are running <strong>apt</strong> on. | ||||
| With <strong>swim</strong> though you can fetch databases for any, or | ||||
| every architecture by adding the architecture to ``deb'' with a hyphen | ||||
| (deb-hurd-i386). If deb has no architecture appended it is assumed that | ||||
| the architecture you want is the same as the system you are running | ||||
| <strong>swim</strong> on.  <strong>Thirdly</strong>, at this time | ||||
| <strong>swim</strong> only supports the ftp method.  | ||||
| <strong>Fourthly</strong>, you can change <em>swimz.list</em> as often as | ||||
| you want without worrying about databases being removed so that that the | ||||
| <em>swimz.list</em> and the downloaded databases match. This would occur | ||||
| with <strong>apt's</strong> <em>sources.list(5)</em> if you removed a | ||||
| site. <strong>Fifthly</strong>, databases are kept in a compressed state.  | ||||
| <strong>Sixthly</strong> because the list is used for both Contents and | ||||
| Packages, more flexibility is provided by only allowing the default | ||||
| distribution/archictecture or distribution/architecture provided on the | ||||
| commandline to be downloaded.  | ||||
| <P> | ||||
| 
 | ||||
| 
 | ||||
| For <strong>apt</strong> users: If you are using <strong>apt</strong>, and | ||||
| <strong>swim</strong> together it is a good strategy to use the real | ||||
| distribution name in the <em>sources list(8)</em>, and to have an exact | ||||
| copy of the <em>sources.list(5)</em> ftp sites in the <em>swimz.list</em>.  | ||||
| Packages databases specific to the architecture <strong>apt</strong> is | ||||
| using can be retrieved using <strong>swim --apt --update</strong> (this | ||||
| also will keep track of the Release version), and then | ||||
| <strong>swim</strong> can be used to fetch the architecture specific | ||||
| <em>Contents database</em> as shown below.  It should also be of interest | ||||
| to note that Packages downloaded by either swim or apt can be used | ||||
| interchangeably by using 'cp -a' and 'gzip -d' or 'gzip -9'. | ||||
| <P> | ||||
| 
 | ||||
| Here is a brief outline of the format required by <em>swimz.list</em>.   | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>deb uri distribution [section ...  ]</strong> | ||||
| <P> | ||||
| 
 | ||||
| <strong>deb</strong> - represents a standard Debian distribution. And is | ||||
| simply written as deb or with the architecture appended | ||||
| (<strong>deb</strong> or <strong>deb-alpha</strong>).  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>uri</strong> - Universal Resource Identifier is exactly how you | ||||
| would enter an address into a web browser. This address is the base of a | ||||
| Debian distribution, generally this is right before the directory called | ||||
| ``<em>dists</em>''. So if <em>dists</em> is found in | ||||
| <em>/stuff/pub/debian/dists</em>, and the site is | ||||
| <strong>somewhere.com</strong> then the uri would be | ||||
| <em>ftp://somewhere.com/stuff/pub/debian</em>. | ||||
| <P> | ||||
| 
 | ||||
| <strong>distribution</strong> - This can be <em>unstable</em>, | ||||
| <em>frozen</em>, <em>stable</em>, <em>experimental</em>. Distribution can | ||||
| also be a path which must end with a slash like | ||||
| <em>unstable/binary-i386/</em>. This is used when there is no section as | ||||
| in the experimental distribution or in sites which do not have symlinks to | ||||
| the non-us section. No section would be mentioned in this situation. | ||||
|  <P> | ||||
| <strong>section</strong> - <em>main</em>, <em>contrib</em>, | ||||
| <em>non-free</em>, <em>non-US</em> (write it this way). | ||||
| 
 | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s6.7"> | ||||
| 6.7 SWIMZ.LIST EXAMPLES | ||||
| 
 | ||||
| </A></h2> | ||||
| Examples (each on one line): | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>deb-alpha ftp://somewhere.com/stuff/pub/debian unstable main contrib non-US</strong> | ||||
| <P> | ||||
| 
 | ||||
| This will fetch the alpha databases from somewhere.com for the unstable | ||||
| distribution for the main, contrib and non-US sections. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| Note: In these next two examples you can not append any architecture to deb | ||||
| with a hyphen.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>deb ftp://somewhere.com/stuff/pub/debian project/experimental/</strong> | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| This will fetch the experimental database, but there is not a | ||||
| Contents-(architecture) database for this distribution. Notice that it ends | ||||
| with a slash. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>deb ftp://somewhere.com/stuff/pub/debian-non-US stable/binary-i386/</strong> | ||||
| <P> | ||||
| 
 | ||||
| This will fetch the i386 databases for the stable distribution for non-us, | ||||
| 
 | ||||
| <hr> | ||||
| <h2><A name="s-ftp"> | ||||
| 6.8 FTP OR APT? | ||||
| 
 | ||||
| </A></h2> | ||||
|  How you use major mode <strong>--ftp</strong> depends on your goals.  | ||||
| Even if you are using <strong>apt</strong>, you may be interested in | ||||
| keeping tabs on different architectures. In this case you would have to | ||||
| download the <em>Packages databases</em> specific to these architectures.  | ||||
| If you are only interested in the architecture which <strong>apt</strong> | ||||
| is interested in, then you only need to use <strong>--ftp</strong> to | ||||
| fetch the <em>Contents database(s)</em>. But, because it isn't a | ||||
| requirement to set up a virtual filesystem, you are not required to fetch | ||||
| the Contents database. The <strong>advantages</strong> of fetching the | ||||
| Contents database is determined by the method you choose to make the | ||||
| database (see <A href="ch-notinstalled.html">MAKING NOT-INSTALLED DATABASES | ||||
| , chapter 7</A>). These advantages include the | ||||
| ability to <em>view a listing of the files and directories</em> associated | ||||
| with a package, the ability to <em>query files and directories</em> to | ||||
| find out which packages relate to them, and the ability to perform a | ||||
| <em>powersearch</em> on all the files and directories to find the | ||||
| associated packages.  | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s6.9"> | ||||
| 6.9 OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
| <strong>Remember:</strong>  If you want to download a different | ||||
| distribution/architecture other than the default specified in your | ||||
| configuration file, you must specify this on the commandline.  | ||||
| <P> | ||||
|  <strong>--Packages</strong> determines where you want the Packages | ||||
| database as well as the Release data put when they are downloaded. The | ||||
| <strong>DF argument</strong> implies that the databases will be put in | ||||
| your default directory (see <code>swimrc(5)).</code> These databases can later | ||||
| be located by the major modes <strong>--initndb and --rebuildndb</strong> | ||||
| just by using <strong>DF</strong> as an argument. Alternatively, these | ||||
| databases can be put in any directory you choose by providing a | ||||
| <strong>directory as an argument</strong>.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--Contents</strong> determines where you want the | ||||
| <em>Content-(architecture)</em> <code>database(s)</code> put. (see | ||||
| --Packages).  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--onec</strong> will download only one Contents-arch per  | ||||
| distribution/architecture specified on the commandline or by default. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--Release_only</strong> will download only the Release data for | ||||
| the <em>swimz.list</em> or particular <em>Package(s)</em> mentioned on the | ||||
| command line. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--dists</strong> will only find the distribution which corresponds | ||||
| to the argument provided this option. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--arch</strong> will only find the architecture which corresponds | ||||
| to the argument provided this option.  The different architecture needs to | ||||
| be specified in swimz.list with a hyphen and the architecture appended to | ||||
| deb (deb-(arch)).  | ||||
| <hr> | ||||
| <h2><A name="s6.10"> | ||||
| 6.10 B. downloading the important databases with apt, and maintenance | ||||
| options. | ||||
| 
 | ||||
| </A></h2> | ||||
| usage: <strong>swim --apt</strong>  | ||||
| <P> | ||||
| 
 | ||||
| options: <strong>[--update] [--clean] [--autoclean] [--check]</strong> | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| Please read <A href="#s-downimportant">A. downloading the important databases with --ftp. | ||||
| , section 6.1</A> for more information. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--update</strong> calls <strong>apt</strong> to download the | ||||
| Packages databases. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--clean</strong> is a call to an <strong>apt</strong> option to | ||||
| remove any packages stored in <strong>apt's</strong> storage area for | ||||
| downloaded packages. The default for this storage area is | ||||
| <em>/var/cache/apt/arhives</em> | ||||
| <P> | ||||
| 
 | ||||
| <strong>--autoclean</strong> will only clean out packages which are not | ||||
| found in apt's cache. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--check</strong> tests and updates apt's cache. | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-notinstalled.html">next</A>; <A href="ch-makinginst.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										180
									
								
								swim.html/ch-makinginst.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								swim.html/ch-makinginst.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,180 @@ | ||||
| <html><head> | ||||
| <title>swim - MAKING INSTALLED SYSTEM DATABASES | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 5<br> | ||||
| MAKING INSTALLED SYSTEM DATABASES | ||||
| 
 | ||||
| </h1> | ||||
|   | ||||
| <hr> | ||||
| <h2><A name="s-initdb"> | ||||
| 5.1 Initial database making, and Rebuilding for an | ||||
| Installed system. | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <pre> | ||||
| usage: swim --initdb        | ||||
|        swim --rebuilddb | ||||
| 
 | ||||
| options:  [--dbpath <dir>] [--root <dir>] [--lowmem]   | ||||
|           [--split_data <lines>] | ||||
| 
 | ||||
| </pre> | ||||
| <P> | ||||
| 
 | ||||
| An <em>installed Debian distribution</em> is one in which packages are | ||||
| installed using <strong>dpkg</strong> or some front-end to | ||||
| <strong>dpkg</strong> like <strong>apt</strong> or | ||||
| <strong>dselect</strong>;  <strong>swim</strong> supports installation | ||||
| through <strong>apt</strong>. These major modes are for a computer with an | ||||
| <em>installed Debian distribution</em> and make the databases which allow | ||||
| querying and searching capabilities for the installed distribution. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--initdb</strong> is run when the databases do not exist yet, | ||||
| <strong>--rebuilddb</strong> is run if the databases have become corrupt, | ||||
| or you want to rebuild the databases instead of updating them.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--dbpath</strong> can be specified as an alternative location for | ||||
| where the databases will be made. The default location is | ||||
| ``<em>/var/lib/dpkg</em>''. An argument like ``<em>/otherstuff</em>'' | ||||
| could be provided, and then the databases would be made here instead.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--root</strong> allows a database to be made for a Debian distribution installed on a | ||||
| different partition. If the distribution is mounted on | ||||
| <em>/New_Debian</em>, ``<em>/New_Debian</em>'' would be the argument to root. The databases would be made for the | ||||
| Debian distribution installed on the ``<em>/New_Debian</em>'' partition.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--dbpath</strong> and <strong>--root</strong> can be used | ||||
| together. Given the previous two examples, the databases would be made on | ||||
| ``<em>/New_Debian/otherstuff</em>'', assuming | ||||
| ``<em>/New_Debian/otherstuff</em>'' actually existed.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--lowmem</strong> uses a method which uses a small amount of | ||||
| memory to make the databases. By default <strong>--initdb</strong> and | ||||
| <strong>--rebuilddb</strong> use a method which fully takes advantage of | ||||
| memory, this is a good thing, because it means the databases are made in a | ||||
| quicker manner. On a computer with a K6-200 CPU, 64MB of memory, and 1500 | ||||
| installed packages, the databases can be made in 4.5 minutes using the | ||||
| default method, and 11 minutes using the low memory method. The high | ||||
| memory method is the default because in general the size of a distribution | ||||
| is related to how much resources a computer has, and probably a large | ||||
| installation is unusual. If you get an ``out of memory'' when you use the | ||||
| default method, or if your system is overloaded to begin with, the | ||||
| <strong>--lowmem method</strong> is the prefered way. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--split_data</strong> determines the size of the files in the | ||||
| temporary directory used to contruct the database. The default is 25000 | ||||
| lines per file. If you are using the <strong>--lowmem method</strong> you | ||||
| may want to provide a different argument to <strong>--split_data</strong>, | ||||
| like ``<strong>--split_data 10000</strong>''. This is a subject of | ||||
| experimentation.  | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s5.2"> | ||||
| 5.2 UPDATING | ||||
| 
 | ||||
| </A></h2> | ||||
| usage: <strong>swim --db</strong> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| options: <strong>[--dbpath</strong> <<strong>dir</strong>><strong>] | ||||
| [--root</strong> <<strong>dir</strong>><strong>] [--check]</strong> | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--db</strong> allows you to update the databases by hand when | ||||
| packages have been removed, added, or changed. swim will automatically run | ||||
| <strong>--db</strong> under certain conditions.  | ||||
| <P> | ||||
| <strong>--check</strong> prints out the changes to STDERR, and the | ||||
| total to STDOUT without proceeding with the update. | ||||
| <P> | ||||
| 
 | ||||
| See <A href="#s-initdb">Initial database making, and Rebuilding for an | ||||
| Installed system. | ||||
| , section 5.1</A> for options <strong>--dbpath</strong> and | ||||
| <strong>--root</strong>. | ||||
| 
 | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s-searchy"> | ||||
| 5.3 REBUILDING THE SEARCH | ||||
| 
 | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| usage:  <strong>swim --rebuildflatdb</strong> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| options: <strong>[--dbpath</strong> <<strong>dir</strong>><strong>] | ||||
| [--root</strong> <<strong>dir</strong>><strong>]</strong> | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| swim makes the flat databases <em>searchindex.deb</em> and | ||||
| <em>dirindex.deb</em> for doing <em>powersearches</em>. Instead of | ||||
| rebuilding these databases everytime <strong>--db</strong> is run, new | ||||
| information is just appended to these databases, and old information is | ||||
| kept. Generally, this is not a problem because only files and directories | ||||
| which the other databases actually know something about will be refered | ||||
| to. But in a situation where a file has changed into a directory, the | ||||
| <em>powersearch</em> may not work properly, because the old file name | ||||
| remains in <em>searchindex.deb</em>, and the new directory name is now in | ||||
| <em>dirindex.deb</em> directory. In general, it takes a lot of changes to | ||||
| the installed system before it is really becomes necessary to rebuild the | ||||
| flat databases. This process takes less than a minute on a K6-200 with | ||||
| 1500 packages. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| See <A href="#s-initdb">Initial database making, and Rebuilding for an | ||||
| Installed system. | ||||
| , section 5.1</A> for options <strong>--dbpath</strong> and | ||||
| <strong>--root</strong>. | ||||
| <hr> | ||||
| <h2><A name="s5.4"> | ||||
| 5.4 FILES | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| Databases which are made: | ||||
| <P> | ||||
| 
 | ||||
| <pre> packages.deb | ||||
|  fileindex.deb | ||||
|  statusindex.deb | ||||
|  groupindex.deb | ||||
|  searchindex.deb | ||||
|  dirindex.deb</pre> | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-important.html">next</A>; <A href="ch-history.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										230
									
								
								swim.html/ch-notinstalled.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								swim.html/ch-notinstalled.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,230 @@ | ||||
| <html><head> | ||||
| <title>swim - MAKING NOT-INSTALLED DATABASES | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 7<br> | ||||
| MAKING NOT-INSTALLED DATABASES | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| <pre> | ||||
| usage:  swim --initndb | ||||
|         swim --ndb | ||||
|         swim --rebuildndb | ||||
| 
 | ||||
| options: [--Contents <target|FDBtarget|DF|FDBDF>] | ||||
|          [--main] [--contrib] [--non-free] [--non-us] | ||||
|          [--arch <architecture>]  [--dists <distribution>]  | ||||
|          [--dbpath <dir>] [--root <dir>] [--alt] | ||||
|          [--split_data <lines>] [-v] [--cron]  | ||||
|          [targets|APT|DF] | ||||
| </pre> | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s7.1"> | ||||
| 7.1 OVERVIEW | ||||
| 
 | ||||
| </A></h2> | ||||
| The <strong>not-installed database</strong> provides swim with many capabilities like the searching, and querying of | ||||
| packages which do not actually exist on the live filesystem, as well as the | ||||
| ability to seamlessly install packages while searching or quering, or the | ||||
| ability to fetch the packages source code. The <em>virtual filesystem</em> is optional, but it is highly recommended. These two major mode options set | ||||
| up these databases, after determining the level of interaction which you | ||||
| want.  | ||||
| <P> | ||||
| 
 | ||||
| Whenever <strong>swim</strong> makes databases it thinks only in terms of | ||||
| one distribution and one architecture. This keeps things logical.  | ||||
| <strong>swim</strong> does have the ability to take Packages files with | ||||
| multiple architectures, and distributions, and to extract information for | ||||
| one distribution and one archictecture to make its databases. This could | ||||
| provide interesting information from dumps from <strong>apt</strong> | ||||
| (<code>apt-cache dumpavail</code>). | ||||
| <P> | ||||
| 
 | ||||
| <strong>--initndb</strong> creates the initial not-installed databases for | ||||
| a particular architecture and distribution, and | ||||
| <strong>--rebuildndb</strong> remakes the not-installed databases for that | ||||
| same architecure and distribution. If not otherwise specified | ||||
| <strong>swim</strong> <em>will use the values</em> it finds in | ||||
| <em>swimrc</em> to determine what architecture and distribution you want | ||||
| to use to make <strong>swim's</strong> databases. Otherwise... | ||||
| 
 | ||||
| <hr> | ||||
| <h2><A name="s7.2"> | ||||
| 7.2 OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
|  <strong>--arch</strong> allows an argument to override the | ||||
| <strong>architecture</strong> found in <em>swimrc</em>.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--dists</strong> allows an argument to override the | ||||
| <strong>distribution</strong> found in <em>swimrc</em>.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--alt</strong> is used for a distribution with a Debian archival | ||||
| structure, but which has a different name.  This allows for alternative | ||||
| distributions.  | ||||
| <P> | ||||
| 
 | ||||
| When <strong>APT</strong> or <strong>DF</strong> are provided as arguments | ||||
| (see below), by default the <em>Packages</em> which pertain to the | ||||
| sections found in <em>swimrc</em> will be shown. If you only want certain | ||||
| sections you may specify them on the command line. If you are not using | ||||
| <strong>APT</strong> or <strong>DF</strong>, it is a good idea to make | ||||
| sure that either the sections found in <em>swimrc</em> or the sections you | ||||
| put on the command line match the <em>Packages</em> you a targetting | ||||
| because this is much more effecient. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--main</strong> will override the sections found in | ||||
| <em>swimrc</em>, and will use this section. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--contrib</strong> will override the sections found in | ||||
| <em>swimrc</em>, and will use this section | ||||
| <P> | ||||
| 
 | ||||
| <strong>--non-free</strong> will override the sections found in | ||||
| <em>swimrc</em>, and will use this section | ||||
| <P> | ||||
| 
 | ||||
| <strong>--non-us</strong> will override the sections found in | ||||
| <em>swimrc</em>, and will use this section | ||||
| <P> | ||||
| 
 | ||||
| Global arguments <strong>targets|APT|DF</strong> must be used with either | ||||
| of these two major modes to find the <em>Packages</em> databases. targets | ||||
| can be a full path to one or a set of <em>Packages</em>.  | ||||
| <strong>APT</strong> will use the <em>Packages</em> found in | ||||
| <em>/var/state/apt/lists</em>, and <strong>DF</strong> will use the | ||||
| Packages found in the default directory for <strong>swim</strong> (see | ||||
| <code>--ftp</code>). If you use either <strong>APT</strong> or | ||||
| <strong>DF</strong> you will be given an <strong>interface</strong> which | ||||
| allows you to choose one <em>Packages</em> database for each section you | ||||
| would like to use from the various sites.  This <strong>interface</strong> | ||||
| shows the <strong>site</strong>, <strong>date</strong>, | ||||
| <strong>size</strong> and <strong>Release version</strong> for each | ||||
| <em>Packages</em>. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--cron</strong> allows you to override the | ||||
| <strong>interface</strong> produced when <strong>APT</strong> or | ||||
| <strong>DF</strong> is provided as an argument. This is useful if you want | ||||
| to automate the database making process.  <strong>--cron</strong> will | ||||
| choose the newest <code>database(s),</code> if cron notices that the Release | ||||
| version has changed, cron will not proceed, but will provide a warning | ||||
| instead. This allows you to make the appropriate changes and choices. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--Contents</strong> can be give one of four arguments:   | ||||
| <P> | ||||
| 
 | ||||
| <strong>1).</strong> If you have a <em>Contents-(architecture)</em> | ||||
| database in a target location you know about you may provide a path to the | ||||
| location. The <em>Contents</em> database can be compressed. | ||||
| <P> | ||||
| 
 | ||||
| <strong>2).</strong> If you prepend the path with the letters | ||||
| <strong>FDB</strong> (meaning flat database) when the databases for swim | ||||
| are made, instead of using the Contents database to make:  | ||||
| 
 | ||||
| <pre>  | ||||
|  nfileindex-arch-dists.deb | ||||
|  nsearchindex-arch-dists.deb  | ||||
|  ndirindex-arch-dists.deb</pre> | ||||
| <P> | ||||
| 
 | ||||
| Only the <em>ncontentsindex-arch-dists.deb.gz</em> database will be made | ||||
| which allows the ability to view file/dir listing for not-installed | ||||
| packages, but does not provide the virtual file system or powersearch | ||||
| capabilities which the other databases would have provided. | ||||
| <P> | ||||
| 
 | ||||
| <strong>3).</strong> The argument <strong>DF</strong> may be used if you | ||||
| have used <strong>--ftp</strong> with the <strong>DF</strong> argument to | ||||
| the option <strong>--Contents</strong> (see <code>--ftp</code>). In this case | ||||
| it is assumed you are also using global arguments <strong>DF</strong> or | ||||
| <strong>APT</strong> for the Packages databases. This will give you an  | ||||
| <strong>interface</strong> (if --cron isn't used) allowing you to choose | ||||
| one <em>Contents</em> database for the particular distribution you want to | ||||
| make the databases for. | ||||
| <P> | ||||
| 
 | ||||
| <strong>4).</strong> <strong>FDB</strong> does the same exact thing with | ||||
| <strong>DF</strong> as it does with the before mentioned | ||||
| <strong>FDBtarget</strong>, and provides the <strong>interface</strong>.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>-v</strong> will only work if you have dpkg installed. It allows | ||||
| swim to verify <strong>swim's</strong> own built-in version comparison | ||||
| function with <strong>dpkg's version comparison function</strong>. This is | ||||
| good for debugging purposes, and produces a report called | ||||
| <em>.version_compare</em> in the same location that | ||||
| <strong>swim's</strong> databases are made. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--split_data</strong> is only advantageous if | ||||
| <strong>--Contents</strong> is being used. See <strong>--initdb</strong> | ||||
| for more information about the <strong>--split_data</strong> option.  | ||||
| <P> | ||||
| 
 | ||||
| See <A href="ch-makinginst.html#s-initdb">Initial database making, and Rebuilding for an | ||||
| Installed system. | ||||
| , section 5.1</A> for options <code>--dbpath</code> and <code>--root</code>. | ||||
| <hr> | ||||
| <h2><A name="s7.3"> | ||||
| 7.3 UPDATING | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <code>--ndb</code> has the same options as --initndb and --rebuildndb except | ||||
| for --split_data.  It also has a new option <code>--nue</code> which will | ||||
| never have to be used unless the experimental distribution or non-us | ||||
| section are found in Contents (which presently isn't the case).  | ||||
| <code>--check</code> prints out the changes to STDERR, and the total to STDOUT | ||||
| without proceeding with the update.  <code>--status_only</code> can be used | ||||
| after a new package has been installed to update the status, after which | ||||
| -qni and -qi will correlate properly. | ||||
| <hr> | ||||
| <h2><A name="s7.4"> | ||||
| 7.4 REBUILDING THE SEARCH | ||||
| 
 | ||||
| </A></h2> | ||||
| <code>--rebuildflatndb</code> serves the same purpose as --rebuildflatdb.  See | ||||
| <A href="ch-makinginst.html#s-searchy">REBUILDING THE SEARCH | ||||
| 
 | ||||
| , section 5.3</A> | ||||
| <hr> | ||||
| <h2><A name="s7.5"> | ||||
| 7.5 FILES | ||||
| 
 | ||||
| </A></h2> | ||||
| Databases and reports which are made (arch = architecture dists = | ||||
| distribution):  | ||||
| <P> | ||||
| 
 | ||||
| <pre>  | ||||
|  npackages-arch-dists.deb | ||||
|  nfileindex-arch-dists.deb requires <--Contents> | ||||
|  nstatusindex-arch-dists.deb | ||||
|  ngroupindex-arch-dists.deb | ||||
|  nsearchindex-arch-dists.deb | ||||
|  ndirindex-arch-dists.deb | ||||
|  .packagesdiff-arch-dists.deb requires <--Contents></pre> | ||||
| <P> | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-aptprep.html">next</A>; <A href="ch-important.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										672
									
								
								swim.html/ch-query.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										672
									
								
								swim.html/ch-query.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,672 @@ | ||||
| <html><head> | ||||
| <title>swim - QUERYING THE INSTALLED AND NOT-INSTALLED DATABASES | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 9<br> | ||||
| QUERYING THE INSTALLED AND NOT-INSTALLED DATABASES | ||||
| 
 | ||||
| </h1> | ||||
| <pre>usage: swim -q [-fpgn --dir] [targets | -S] | ||||
|        swim --query [-fpgn --dir] [targets | -S] | ||||
|        swim -qa || swim --query -a </pre> | ||||
| <P> | ||||
| 
 | ||||
| <pre>options: [--total -t] [-i] [-l ? <[--df]>] [-d] [-c] | ||||
|          [--scripts] [--preinst] [--postinst] [--prerm]  | ||||
|          [--postrm] [-v] [--dbpath <dir>] [--menu -m]  | ||||
|          [--shlibs] [-T] [--pre_depends] [--depends]  | ||||
|          [--recommends] [--suggests] [--conflicts]  | ||||
|          [--replaces] [--provides] [--md5sum] [--root <dir>]  | ||||
|          [--copyright] [--changelog] [--allgroups]  | ||||
|          [--arch <architecture>] [--dists <distribution>]  | ||||
|          [--ftp ? --source | --source_only ? <[--diff]>]  | ||||
|          [--stdin] [--extract] <ALL|archive|PWD!archive>] | ||||
|          [-xyrz --remove ? <[--nz]>] [--purge] [--apt2df]  | ||||
|          [--df2apt] </pre><P> | ||||
| 
 | ||||
| global arguments: <strong>[targets | -S ? <\d{1,}>]</strong> | ||||
| <P> | ||||
| 
 | ||||
| Quering almost always involves using <strong>-q or --query</strong> with | ||||
| zero or one or a combination of the <strong>minor mode options</strong> | ||||
| (package specification options), and one or more (only one for | ||||
| <code>-g</code>) targets specific to the minor mode, or the results of a | ||||
| search (<code>-S</code>).  [<code>-S</code> can be provided a numerical argument | ||||
| pertaining to the past history.]  This can be combined with one or more | ||||
| options. The one exception is ``<strong>swim -q --allgroups</strong>''.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--query or -q</strong> can be used by itself or with | ||||
| <strong>-n</strong> to query known package names or package names with | ||||
| versions. ``<strong>swim -q test1 test2_0.3-1</strong>'' would produce the | ||||
| output: | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <pre>test1_1.0-2 | ||||
| test2_0.3-1</pre> | ||||
| <hr> | ||||
| <h2><A name="s-mm"> | ||||
| 9.1 MINOR MODES | ||||
| 
 | ||||
| </A></h2> | ||||
|  <strong>-n</strong> is the minor mode option to access the | ||||
| <em>not-installed system</em>, it can be combined with the minor mode | ||||
| options <strong>-a</strong>, <strong>-g</strong>, <strong>-f</strong>, or | ||||
| it can be used by itself.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-a</strong> allows <em>every package</em> on an installed or | ||||
| not-installed (<strong>-n</strong>) system to be queried. ``<strong>swim | ||||
| -qan</strong>'' will show all the package names with versions for the | ||||
| not-installed system | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-f</strong> allows <em>files or directories</em> to be queried, | ||||
| when used without any options the package name with version is shown.  | ||||
| <strong>--dir</strong> will only query directories, this is useful if you | ||||
| are not sure whether what you are quering is a directory or a file. When a | ||||
| directory is queried, swim shows all packages which exist below the | ||||
| queried directory.  ``<strong>swim -qf /</strong>'' is exactly the same as | ||||
| ``<strong>swim -qa</strong>''. Hint: ``<strong>swim -qf .</strong>'' and | ||||
| ``<strong>swim -qf *</strong>'' are quite different, the first shows all | ||||
| packages which exist below the current directory, and the second will show | ||||
| the package which each file in the current directory comes from.  | ||||
| <P> | ||||
|   | ||||
| <strong>-g</strong> will query a <em>group</em> (also called a section, | ||||
| see <A href="#s-section">SECTION AND PRIORITY  | ||||
| , subsection 9.5.3</A>)) of packages. Groups represent subjects which | ||||
| packages with similiar characteristics are catagorized by. To view all the | ||||
| groups found in an installed or not-installed system use ``<strong>swim -q | ||||
| --allgroups</strong>'' or ``<strong>swim -qn --allgroups</strong>''.  | ||||
| ``<strong>swim -qg hamradio</strong>'' or ``<strong>swim -qng | ||||
| hamradio</strong>'' shows all the package names for the hamradio group.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>-p</strong> is used to query a <em>Debian package</em>, these | ||||
| packages are distinguished by their ``deb'' ending, but swim can | ||||
| tell whether a file is a debian package even without the ending. Called | ||||
| without any options the package name with version will be shown.  | ||||
| <hr> | ||||
| <h2><A name="s-specdata"> | ||||
| 9.2 SPECIFYING THE DATABASES TO USE | ||||
| 
 | ||||
| </A></h2> | ||||
|  <strong>--dists</strong> will use the databases for the argument | ||||
| given, otherwise the databases pertaining to the value found in swimrc | ||||
| will be used.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--arch</strong> will use the databases for the argument given, | ||||
| otherwise the databases pertaining to the value found in swimrc will be | ||||
| used.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| Example: <strong>swim -qat --arch hurd-i386 --dists unstable</strong> | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| Assuming these databases exist this will show all packages and their | ||||
| versions for the unstable distribution and architecture hurd-i386 even if | ||||
| the values in <em>swimrc</em> are i386 and stable. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| see <A href="ch-important.html#s-downimportant">A. downloading the important databases with --ftp. | ||||
| , section 6.1</A> and <A href="ch-notinstalled.html">MAKING NOT-INSTALLED DATABASES | ||||
| , chapter 7</A> for more | ||||
| information about the databases.  | ||||
| 
 | ||||
| <hr> | ||||
| <h2><A name="s9.3"> | ||||
| 9.3 OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
|  <strong>--total or -t</strong> are <em>used to override the output | ||||
| suppressor</em>. The output suppressor will not show output if a certain | ||||
| number of packages is exceeded, instead it will show the number of | ||||
| packages you are querying. This is useful for two reasons, first, knowing | ||||
| the number of packages you are quering can be very informative, second, it | ||||
| gives you a chance to add to the command line a pipe to a pager, ex: | ||||
| ``<strong>swim -qat | less</strong>''. You can set the number that the | ||||
| output suppressor works at as high or low as you want in the | ||||
| <em>swimrc(8)</em> file. By design the <strong>-t</strong> option will | ||||
| have to be used if the <strong>-i</strong> option is used and more than | ||||
| one package is being queried. This option can also be used to alter the | ||||
| output of the various script options (--scripts, --preinst, --postinst, | ||||
| --prerm, and --postrm).  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-i</strong> provides <em>information</em> about each package being | ||||
| queried. The format differs slightly for the installed packages versus the | ||||
| not-installed packages. see <A href="#s-format">FORMAT | ||||
| , section 9.5</A>: | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-l</strong> provides a listing of the files associated with a | ||||
| package. If the option <strong>--df</strong> is provided as an argument, | ||||
| all the directories associated with package will be shown. It is important | ||||
| to remember that many packages provide directories which become important | ||||
| to them after they are installed, so the option <strong>--df</strong> | ||||
| often provides necessary information which <strong>-l</strong> called by | ||||
| itself would have not. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-d</strong> shows the documentation which the package provides | ||||
| found in <em>/usr/doc/*</em>, <em>/usr/man/*</em>, <em>/usr/info/*</em>.  | ||||
| Other documentation which the package may provide in a non-standard | ||||
| location will not be shown. <strong>-d</strong> takes precedence over | ||||
| <strong>-l</strong>, so if <strong>-l</strong> is used on the command line | ||||
| with <strong>-d</strong>, only the output for <strong>-d</strong> will be | ||||
| shown.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-v</strong> is a special option which works only with the minor | ||||
| mode <strong>-p</strong>. It can be used with <strong>-l</strong>, | ||||
| <strong>--df</strong>, <strong>-d</strong>, to show the packages files | ||||
| and/or directories in long format (<code>ls - | ||||
| l</code>).  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-c</strong> will show the configuration files packages use. If the | ||||
| package does not have a configuration file then nothing will be shown. The | ||||
| output will show the file and its path indented one space with the | ||||
| <strong>MD5 checksum</strong>. This will not work with | ||||
| <strong>-n</strong>. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--scripts</strong> shows all scripts associated with a package | ||||
| with the name of the script presented before each script in this way | ||||
| <strong>#####scriptname######</strong>. If the scripts are called | ||||
| individually by using the script options <strong>--preinst</strong>, | ||||
| <strong>--postinst</strong>, <strong>--prerm</strong>, or | ||||
| <strong>--postrm</strong> no title is shown, this is nice for writing to a | ||||
| file. If <strong>-t</strong> is used with the individual script options a | ||||
| title will be shown, this makes sense because normally only individual | ||||
| packages would be queried to write a script to a file, and | ||||
| <strong>-t</strong> wouldn't be used in this situation. Scripts are the | ||||
| soul of Debianized packages allowing packages to be installed, configured, | ||||
| and removed seamlessly and cleanly under all kinds of conditions. These | ||||
| options do no work with <strong>-n</strong>.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--menu or -m</strong> is used to view menufiles which belong to | ||||
| various packages. If the package does not have a menufile nothing will be | ||||
| shown. This option can be useful in troubleshooting a menu entry which | ||||
| does not seem to work, or in finding out where the menu entry is.  | ||||
| <em>Joost Witteveen's Debian menu system</em> is a centralized program | ||||
| which interacts with all kinds of menus.  <em>Please read the | ||||
| documentation</em> ``<strong>swim -qd menu</strong>'' which comes with the | ||||
| menu package to find out more. This will not work with | ||||
| <strong>-n</strong>.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--shlibs</strong> shows a list of shared libraries certain | ||||
| packages supply. The <em>Debian Packaging Manual</em> (packaging-manual) | ||||
| provides detailed information about the format of a shlibs file. This will | ||||
| not work with <strong>-n</strong>.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--md5sum</strong> checks <strong>MD5 checksums</strong>. It can be | ||||
| used with <strong>-l</strong>, <strong>-d</strong>, <strong>-c</strong>, | ||||
| or <strong>-p</strong>. If there are checksums available the md5sum result | ||||
| will be either <strong>OK</strong>, <strong>FAILED</strong>, or | ||||
| <strong>MISSING</strong>.  <strong>MISSING</strong> means that although a | ||||
| checksum exists, the file can not be found. The result is put after the | ||||
| file and its path and the <strong>MD5 checksum</strong> or the package | ||||
| name and version and the <strong>MD5 checksum</strong>.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--copyright</strong> does a case insensitive search for copy or | ||||
| license in the <em>/usr/doc/packagename</em> directory. This should show | ||||
| how the package relates to <em>Debian's Policy Manual</em>. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--changelog</strong> searches for any files in | ||||
| <em>/usr/doc/packagename</em> which look like changelogs. Debian packages | ||||
| always have a <em>Maintainer's</em> changelog for the package. There may | ||||
| be a separate changelog kept by the author of the program. | ||||
| <hr> | ||||
| <h2><A name="s9.4"> | ||||
| 9.4 PACKAGE RELATIONSHIPS | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>-T</strong> shows all the package relationships of packages.  | ||||
| Individual package relationships can be viewed using | ||||
| <strong>--pre_depends</strong>, <strong>--depends</strong>, | ||||
| <strong>--recommends</strong>, <strong>--suggests</strong>, | ||||
| <strong>--replaces</strong>, <strong>--conflicts</strong> or | ||||
| <strong>--provides</strong>. Package relationships are the spirit of | ||||
| Debian packages, here is a quick overview briefly reiterating what can be | ||||
| found in the <em>Debian Packaging Manual</em>.  <em>Package | ||||
| Maintainers</em> set these relationships in control file fields of the | ||||
| same name. | ||||
| <P> | ||||
| 
 | ||||
| <strong>Dependencies</strong> | ||||
| 
 | ||||
|  <em>Pre-depends</em> - means that the pre-depended package or packages | ||||
| must be installed before the queried package can be installed.  Most | ||||
| packages which have pre-dependencies are usually essential and required | ||||
| packages. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <em>Depends</em> - declares an absolute dependency to another package or | ||||
| packages either <em>real or virtual</em>. The queried package cannot | ||||
| function without this other package. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <em>Recommends</em> - declares a strong, but not absolute dependency to | ||||
| another package or packages either <em>real or virtual</em>. You would | ||||
| usually find the recommended package together with the queried package in | ||||
| a normal installation. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <em>Suggests</em> - can be one or more packages either <em>real or | ||||
| virtual</em> which would be useful to the queried package, but are not | ||||
| necessary.  | ||||
| 
 | ||||
| 
 | ||||
| <strong>Alternative Packages</strong> | ||||
| <P> | ||||
| 
 | ||||
| <em>Conflicts</em> - is a package or packages either <em>real or | ||||
| virtual</em> which would cause problems with the queried package, and | ||||
| would not be allowed to be installed while the queried package was | ||||
| installed.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>Overwriting files and Replacing Packages</strong> | ||||
| <P> | ||||
| 
 | ||||
| <em>Replaces</em> - allows the queried package to replace another package | ||||
| or packages by overwriting their files, after which the previous package | ||||
| would be considered to have disappeared. Essentially this allows the | ||||
| queried package to take over the package or packages. In a situation where | ||||
| there was a Conflict between the queried package and these packages this | ||||
| field would help determine which packages should be removed.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>Virtual Packages</strong>  | ||||
| <P> | ||||
| 
 | ||||
| <em>Provides</em> - declares a virtual package which may be mentioned in | ||||
| <em>Depends</em>, <em>Recommends</em>, <em>Suggests</em>, or | ||||
| <em>Conflicts</em>.  <em>Virtual packages</em> allow one or more packages | ||||
| to share the same name of another package, which means if the queried | ||||
| package has a reference to a virtual package in one of the before | ||||
| mentioned package relationship fields, then whatever packages provide the | ||||
| virtual package are also being listed.  | ||||
|  <hr> | ||||
| <h2><A name="s-format"> | ||||
| 9.5 FORMAT | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>1). Installed system</strong> | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <pre> Package: name                        Status: hold ok installed | ||||
|  Version: 1.1-1                       Essential: no | ||||
|  Section: namers                      Priority: extra | ||||
|  Installed-Size: 10                   Source: generatename (2.0-1) | ||||
|  Maintainer: name <name@name.org> | ||||
|  Description: hostname maker | ||||
|   A nice way to figure out a hostname nobody | ||||
|   else has.</pre> | ||||
| <P> | ||||
| 
 | ||||
| <strong>2) Not-installed system</strong> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <pre> Package: name                        Status: r> hold ok installed (1.1-1) | ||||
|  Version: 1.1-2                       Essential: no | ||||
|  Section: names                       Priority: extra | ||||
|  Installed-Size: 11                   Source: generatename (2.0-1) | ||||
|  Size: 43000                          Architecture: i386 | ||||
|  Distribution: experimental | ||||
|  Maintainer: name <name@name.org> | ||||
|  Description: hostname maker | ||||
|   A nice way to figure out a hostname nobody | ||||
|   else has.</pre> | ||||
| <P> | ||||
| 
 | ||||
| There are several things to point out. The difference between the two | ||||
| outputs relates to the addition of the Distribution, Size, and | ||||
| Architecture fields for the not-installed query. Installed-Size is how | ||||
| many kilobytes the package will occupy when it is unpacked, whereas Size | ||||
| is the size in bytes of the package.  | ||||
| <hr> | ||||
| <h3><A name="s9.5.1"> | ||||
| 9.5.1 STATUS FIELD  | ||||
| 
 | ||||
| </A></h3> | ||||
|   | ||||
| 
 | ||||
| The Status field provides the installation status of the package, this | ||||
| holds true for the not-installed query as well. In a sense, the | ||||
| not-installed database isn't always not-installed. If the not-installed | ||||
| package is actually already installed, and the version numbers are exactly | ||||
| the same, then the status will be the same for either query. If the | ||||
| not-installed package is not installed then the status will be | ||||
| ``not-installed''. In cases where the not-installed package is already | ||||
| installed, swim uses it's comparison function to figure out whether it is | ||||
| a newer of older package which is installed. In the above example, swim | ||||
| realizes the same package is installed, and only the debian-revision has | ||||
| changed, hence the only difference is that the revision number is greater | ||||
| ``r>'' for the not-installed package. When only the debian-revision has | ||||
| changed it can safely be assumed that the author (creator, programmer) of | ||||
| the same program has not made any changes to the same program, but the | ||||
| Debian maintainer has made a change to an aspect of the package like a | ||||
| change in the script the package uses to properly install. You may have | ||||
| also noticed that the status field shows the version number of the | ||||
| installed package enclosed in parenthesis. | ||||
| <hr> | ||||
| <h3><A name="s9.5.2"> | ||||
| 9.5.2 SOURCE FIELD | ||||
| 
 | ||||
| </A></h3> | ||||
| 
 | ||||
| The Source field is present in these examples, but the Source field will | ||||
| not always be present for packages. In cases where the name of the source | ||||
| package is the same as the the name found in the Package field, and the | ||||
| version number of the source package is also the same as found in the | ||||
| Version field, then there will be no Source field. In the above examples | ||||
| there is a Source field. In this case name was probably one of many | ||||
| packages generated from the source package called generatename. In this | ||||
| particular example generatename also has its own unique version number | ||||
| 2.0-1 enclosed in parentheses, if no version number had been mentioned | ||||
| then the source package would have the same version number as found in the | ||||
| Version field. | ||||
| <hr> | ||||
| <h3><A name="s-section"> | ||||
| 9.5.3 SECTION AND PRIORITY  | ||||
| 
 | ||||
| </A></h3> | ||||
| 
 | ||||
| Section shows the subject which a package is categorized with (see | ||||
| <code>-g</code>). Priority shows how important the package is to have | ||||
| installed. In the case of the not-installed databases the information for | ||||
| these fields is almost always available from the Packages databases, but | ||||
| this is not always the case for Debian packages. For packages which do no | ||||
| provide this information swim will do its best to fill in the blanks from | ||||
| information found in the installed and not-installed databases. If proper | ||||
| information can not be found it will be indicated as ``unavailable'' or | ||||
| ``unknown.'' Unavailable would indicate that information about the package | ||||
| exists, but it is from a different version (includes debian-revision), and | ||||
| no information exists for this version. Unknown means no similiar package | ||||
| exists, and there is absolutely no information about this package in the | ||||
| databases. | ||||
| <P> | ||||
| 
 | ||||
| When a Debian package is queried using the <strong>-p</strong> | ||||
| option you will get output like the first example shows, the status field | ||||
| is also calculated.  | ||||
| <hr> | ||||
| <h2><A name="s-vrftp"> | ||||
| 9.6 FTP - VIRTUAL OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| For ftp capabilities swim uses the <em>swimz.list</em> to determine which | ||||
| sites it will check for the requested packages. The first site which fills | ||||
| the request will be used, otherwise <strong>swim</strong> will go through | ||||
| all the sites avoiding repeats, and if no sites can fill the request, | ||||
| <strong>swim</strong> will either quit or proceed on to check for another | ||||
| request. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--ftp</strong> allows the queried package, its source package, or | ||||
| just the source package diff to be downloaded while being queried. This is | ||||
| refered to as virtual downloading because the quering and the downloading | ||||
| are seamless as though the package already exists locally. This has to be | ||||
| used with the option <strong>-n</strong> because packages which which are | ||||
| not part of the not-installed database are considered to already have been | ||||
| downloaded. Packages which are already installed can be downloaded or | ||||
| their source retrieved by setting up a database which corresponds to these | ||||
| packages; if the installed packages belong to the stable distribution, | ||||
| set-up the not-installed stable databases.  | ||||
| <P> | ||||
| 
 | ||||
| Packages or source code are placed in an area below the default directory | ||||
| mirroring the remote directory they were downloaded from after their size | ||||
| and modification times are checked for correct values. This area is called | ||||
| the <strong>DF</strong> directory, and although this directory mirrors | ||||
| remote directories, it is not an exact mirror, but specific to the | ||||
| requirements of swim because code names for Release versions are not taken | ||||
| into account. For real mirroring capabilities there exist many excellent | ||||
| programs. If a package has a <strong>MD5 checksum</strong>, | ||||
| <strong>--md5sum</strong> will automatically be run and the value shown. | ||||
| Regardless of whether or not the md5sum check is <strong>OK</strong> or | ||||
| not, the package will still be put in the <strong>DF</strong> directory to | ||||
| allow the package to be looked at, so watch the output from | ||||
| <strong>--ftp</strong> to check for <strong>FAILED md5sums</strong>. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| Packages or source code packages will not be downloaded again if they are | ||||
| found in the <strong>DF</strong> directory unless their | ||||
| <em>upstream-version</em> has changed in the not-installed database, if | ||||
| the packages are not in the DF directory and the remote | ||||
| <em>upstream-version</em> is different than the not-installed | ||||
| <em>upstream-version</em> then the packages will not be downloaded until | ||||
| the not-installed database is updated or rebuilt to reflect the version | ||||
| change. Changes in the package's <em>upstream-version</em> indicates that | ||||
| the <code>author(s)</code> of the program have made changes to the computer | ||||
| code for the program contained in the package or the source code package. | ||||
| On the other hand, swim will check for a <em>debian-revision</em> change | ||||
| at the remote site if the package can not immediately be found. If the | ||||
| package's <em>debian-revision</em> has changed and the package does not | ||||
| exist locally in the <strong>DF</strong> directory, it will be downloaded. | ||||
| This is a nice feature, especially for the unstable distribution, because | ||||
| it tends to extend the time needed before the not-installed database has | ||||
| to be updated or rebuilt to match the changes at remote sites. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--source</strong> is used with <strong>--ftp</strong> to download | ||||
| the source code package. <strong>--source_only</strong> will download the | ||||
| source code package without the deb package.  <em>Source packages consist | ||||
| of three files</em>.  The <em>source control file</em> which ends in | ||||
| ``dsc'', the <em>original source archive</em> which is a compressed tar | ||||
| file, and the <em>unified context diff</em> showing the changes necessary | ||||
| to make the original source into Debian source. The diff can be downloaded | ||||
| by itself if <strong>--diff</strong> is provided as an argument to | ||||
| <strong>--source or --source_only</strong>. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| For <strong>apt</strong> users: <strong>apt</strong> allows packages to be | ||||
| downloaded, but if more than one package is required for the package | ||||
| relationships to be proper, <strong>apt</strong> will download all these | ||||
| packages.  <strong>--ftp</strong> allows specific packages to be | ||||
| downloaded, packages from other architectures, and source packages to be | ||||
| downloaded, here lies the advantage of this option over using <strong>-xyz | ||||
| --nz</strong> (see below). If a particular package has been dowloaded into | ||||
| the <strong>DF</strong> directory and it is needed by <strong>apt</strong> | ||||
| for installation, simply copy or move the package from the | ||||
| <strong>DF</strong> directory to <em>/var/cache/apt/archives</em> before | ||||
| running <strong>apt</strong>, and the package will not be downloaded by | ||||
| <strong>apt</strong> again; future versions of <strong>swim</strong> will | ||||
| have an option to automatically accomplish this (see <code>--df2apt</code>). | ||||
| <hr> | ||||
| <h2><A name="s-vrapt"> | ||||
| 9.7 APT - VIRTUAL OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| apt-get(8) is a nice package relationship checker from the | ||||
| <strong>apt</strong> package which figures out what needs to be done to | ||||
| properly install a package or packages when one or more package names are | ||||
| provided to it.  <strong>apt-get</strong> will get all packages which are | ||||
| needed using a variety of methods, and then <strong>apt-get</strong> | ||||
| interacts with <strong>dpkg</strong> in a way which allows for a | ||||
| successful installation. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>-xyrz, --remove, and --nz</strong> can be used if | ||||
| <strong>apt-get</strong> from the <strong>apt</strong> package is | ||||
| installed. These options allow for what is refered to as virtual | ||||
| installation/removal. It is prudent to always test what will happen by | ||||
| using the <strong>-x</strong> option alone before actually proceeding with | ||||
| the installation with the <strong>-z</strong> option.  <strong>-x</strong> | ||||
| will actually simulate what would happen in an installation, showing which | ||||
| and how many packages will be changed, which and how many new packages | ||||
| will need to be installed, which and how many packages will need to be | ||||
| removed, any conflicts, and what needs to be configured. | ||||
| <strong>-y</strong> will automatically answer yes to any prompts | ||||
| <strong>apt-get</strong> may produce allowing <strong>apt-get</strong> to | ||||
| run non-interactively.  <strong>-z</strong> as mentioned before actually | ||||
| proceeds with the installation using <strong>dpkg</strong> after the | ||||
| <strong>apt-get</strong> gets the packages.  You can append a minus sign | ||||
| to a package name to cause it to be removed.  <strong>--nz</strong> when | ||||
| used as an optional argument with <strong>-xz or -xyz</strong> will only | ||||
| download the packages into <em>/var/cache/apt/archives</em> or into | ||||
| whatever directory you configured for holding archives for | ||||
| <strong>apt</strong>. | ||||
| <P> | ||||
| 
 | ||||
| <strong>IMPORTANT</strong>:  <strong>apt</strong> makes it so easy to make | ||||
| changes to your installation that it is highly recommended to do your | ||||
| research with swim first. This can be done by checking package | ||||
| relationships, file/dir listings, comparing the not-installed package to | ||||
| an installed package if such exists, checking <strong>--md5sum</strong> | ||||
| and <strong>-c</strong> for the installed package, and checking the Source | ||||
| field by running a <strong>--search</strong> (see <A href="ch-search.html">SEARCHING | ||||
| , chapter 11</A>) to | ||||
| check to see how the source package has been split into binary packages | ||||
| for the not-installed package versus an installed package if such exists.  | ||||
| Ofcourse, there are many other things you could look at, and you can | ||||
| always do your research after the fact. Presently <strong>--db</strong> is | ||||
| run only by hand, so you can check the old state after an installation if | ||||
| you have not already run <strong>--db</strong>, yourself.  | ||||
| <hr> | ||||
| <h2><A name="s-vrrm"> | ||||
| 9.8 REMOVING AN INSTALLED PACKAGE - VIRTUAL OPTIONS  | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>--purge</strong> uses <strong>dpkg</strong> to remove an installed | ||||
| package or packages and the configuration files as shown with | ||||
| ``<strong>swim -qc packagename</strong>''. | ||||
| <P> | ||||
| 
 | ||||
| <strong>-r or --remove</strong> removes an installed package or packages | ||||
| with <strong>apt</strong>, but not the configuration files as shown with | ||||
| ``<strong>swim -qc packagename</strong>''.  You may also append a plus | ||||
| sign to a package name to cause it to be installed.  This option is used | ||||
| with -x or -x(y)z.  | ||||
| <hr> | ||||
| <h2><A name="s9.9"> | ||||
| 9.9 STDIN - VIRTUAL OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>--stdin</strong> works with either <strong>--ftp</strong>, | ||||
| <strong>-x</strong>, <strong>-xyz</strong>, <strong>-xz</strong>, | ||||
| <strong>--purge</strong>, <strong>-r</strong>, or | ||||
| <strong>--remove</strong>.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--stdin</strong> provides the <em>readline capabilities</em> | ||||
| commonly found in shells allowing you to edit what is on the command line. | ||||
| You can edit the command line, press enter and then recall the history, | ||||
| and make more changes, or <em>type in exit to process the changed or | ||||
| unchanged command line</em>. To find out more about what readline commands | ||||
| your shell supports please read the man pages which apply to your shell. | ||||
| Information for the bash shell can be found in <code>bash(1)</code> under the | ||||
| title ``<strong>Readline Command Names</strong>''. | ||||
| <P> | ||||
| 
 | ||||
| Example: ``<strong>swim -qgnx --stdin hamradio</strong>'' will list all | ||||
| the packages from the not-installed hamradio group on the command line, | ||||
| this list can be edited then submitted to <strong>apt-get</strong> for a | ||||
| simulated installation. Another instance of <strong>swim</strong> can be | ||||
| run at the same time, perhaps ``<strong>swim -qinTg hamradio</strong>'' to | ||||
| help in making editing decisions for <strong>--stdin</strong>. | ||||
| <hr> | ||||
| <h2><A name="s9.10"> | ||||
| 9.10 PACKAGE MANIPULATION - VIRTUAL OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>--extract</strong> only works with the <strong>minor mode | ||||
| -p</strong> to extract parts or all of a Debian package. If the | ||||
| <strong>argument ALL</strong> is provided then <em>everything found in the | ||||
| package will be extracted</em> below the current directory in the exact | ||||
| directories found in the package.  A particular <em>file may be extracted | ||||
| in its exact location</em> below the current directory by <em>entering the | ||||
| exact path for the file</em> as shown by ``<strong>swim -qpl</strong>'' or | ||||
| ``<strong>swim -qpd</strong>'' as the argument.  Alternativily, a <em>file | ||||
| may be extracted in the current directory</em> regardless of its proper | ||||
| location by <em>prepending PWD\!  before the path</em> shown by | ||||
| ``<strong>swim -qpl</strong>'' or ``<strong>swim -qpd</strong>''. Notice | ||||
| the backslash before the exclamation point, this is because shells | ||||
| consider ! a special character, so it has to be backslashed so that the | ||||
| shell knows that it is not such a special character. Example:  | ||||
| ``<strong>swim -qpi --extract PWD\!usr/bin/name --scripts | ||||
| name_1.1-2.deb</strong>'' will extract the binary name in the current | ||||
| directory from the name package, show information for the name package, | ||||
| and show any scripts for the name package.  | ||||
| <hr> | ||||
| <h2><A name="s-dblocus"> | ||||
| 9.11 DATABASE LOCATIONS | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>--dbpath</strong> can be specified as an alternative location for | ||||
| where the databases would be found. The default location is | ||||
| ``<em>/var/lib/dpkg</em>''. An argument like ``<em>/otherstuff</em>'' can | ||||
| be provided, and then the databases would be found here instead.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--root</strong> allows a database to be found for a Debian | ||||
| distribution installed on a different partition. If the distribution is | ||||
| mounted on <em>/New_Debian</em>, ``<em>/New_Debian</em>'' would be the | ||||
| argument to root. The databases would be found for the Debian distribution | ||||
| installed on the ``<em>/New_Debian</em>'' partition.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--dbpath and --root</strong> can be used together. Given the | ||||
| previous two examples, the databases would be found on | ||||
| ``<em>/New_Debian/otherstuff</em>'', assuming | ||||
| ``<em>/New_Debian/otherstuff</em>'' actually existed.  | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch10.html">next</A>; <A href="ch-aptprep.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										82
									
								
								swim.html/ch-ramdisk.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								swim.html/ch-ramdisk.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | ||||
| <html><head> | ||||
| <title>swim - RAMDISK | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 12<br> | ||||
| RAMDISK | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| <pre>usage: swim --ramdiskon | ||||
|        swim --ramdiskoff | ||||
| 
 | ||||
| options: [-n] [--searchfile] [--arch <architecture>]  | ||||
|          [--dists <distribution>] [--dbpath] [--root] | ||||
|   | ||||
|          no options for --ramdiskoff | ||||
| </pre> | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s12.1"> | ||||
| 12.1 OVERVIEW | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| A ramdisk can be mounted below the default path or the specified path for | ||||
| the databases in the dramdisk directory. The ramdisk is used to speed up | ||||
| powersearchs and/or file/dir listings for packages from the not-installed | ||||
| system. Also, this is useful if a computer system is heavily loaded with | ||||
| other processes using the memory, and the ramdisk tends to persist even | ||||
| after being unmounted. Modern kernels usually are built with support for | ||||
| ramdisks. If these options do not work the kernel will need to be compiled | ||||
| to support ramdisks by answering yes to RAM disk support. Perhaps the best | ||||
| <em>README</em> showing how to configure and compile a kernel comes with | ||||
| the <em>kernel sources</em> in the main directory. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--ramdiskon</strong> allows a ramdisk to be created and mounted.  | ||||
| If called with <strong>-n</strong> (not-installed databases)  | ||||
| <em>ncontents-arch-dists.deb.gz</em> will automatically be written to the | ||||
| mounted ramdisk. This provides faster file/dir listing capabilities when | ||||
| using <strong>-l</strong>, <strong>--df</strong>, or <strong>-d</strong> | ||||
| when querying the not-installed system. Faster powersearch capabilities | ||||
| are available through the option <strong>--searchfile</strong>. If the | ||||
| search databases are not already compressed, they will now be compressed, | ||||
| this usually only needs to be done once or until the databases are updated | ||||
| or rebuilt again. The search databases will then be written to the mounted | ||||
| ramdisk. An installed system only writes the search databases to the | ||||
| mounted ramdisk, so always use --searchfile when specifying installed | ||||
| system databases.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--ramdiskoff</strong> is used to unmount the ramdisk. The | ||||
| not-installed databases and the installed databases can not be | ||||
| simultaneously provided by a mounted ramdisk, use | ||||
| <strong>--ramdiskoff</strong> first, then <strong>--ramdiskon</strong> to | ||||
| install the other databases of choice.  This also pertains to different | ||||
| distributions and/or architectures.  | ||||
| <P> | ||||
| 
 | ||||
| 
 | ||||
| See the section ``<A href="ch-query.html#s-specdata">SPECIFYING THE DATABASES TO USE | ||||
| , section 9.2</A>'' for | ||||
| options <strong>--arch</strong>, <strong>-dists</strong>.  | ||||
| <P> | ||||
| 
 | ||||
| See the section ``<A href="ch-query.html#s-dblocus">DATABASE LOCATIONS | ||||
| , section 9.11</A>'' for options | ||||
| <strong>--dbpath</strong> and <strong>--root</strong>.  | ||||
| 
 | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch13.html">next</A>; <A href="ch-search.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										191
									
								
								swim.html/ch-search.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								swim.html/ch-search.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,191 @@ | ||||
| <html><head> | ||||
| <title>swim - SEARCHING | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 11<br> | ||||
| SEARCHING | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| <pre>usage: swim --search ? (--research || --refinesearch) <pattern(s)> | ||||
|        swim --powersearch ? (--research || --refinesearch) <pattern(s)>  | ||||
|        swim --ps ? (--research || --refinesearch) <pattern(s)>  | ||||
| 
 | ||||
| options: [-g] [-n] [--dbpath <dir>] [--root <dir>] [--no] | ||||
|          [--arch <architecture>] [--dists <distribution> | ||||
|          [--ftp ? --source | --source_only <[--diff]>]  | ||||
|          [-xyrz --remove ? <[--nz]>] [--stdin] [--apt2df] | ||||
|          [--no] [--df2apt] [--purge] [<\d{1,}>] | ||||
|   | ||||
|          [--dir] and no [-g]for --powersearch or --ps | ||||
| </pre> | ||||
| 
 | ||||
| <P> | ||||
| <hr> | ||||
| <h2><A name="s11.1"> | ||||
| 11.1 OVERVIEW | ||||
| 
 | ||||
| </A></h2> | ||||
|   | ||||
| 
 | ||||
| <strong>swim</strong> provides two major types of searches. A search with | ||||
| <strong>--search</strong> <em>searches package information</em> (see <A href="ch-query.html#s-format">FORMAT | ||||
| , section 9.5</A>), and a search with <strong>--powersearch or --ps</strong> | ||||
| <em>searches package information, and all files and/or directories | ||||
| associated with each package</em>.  | ||||
| <P> | ||||
| 
 | ||||
| The results of either of these searches can be <em>narrowed down</em> by | ||||
| running a test search with <strong>--research</strong> (this step can be | ||||
| skipped) and/or setting the results in stone with | ||||
| <strong>--refinesearch</strong>. <strong>--search</strong> can be | ||||
| <em>narrowed down</em> initially by specifying a particular | ||||
| <em>group</em>, and <strong>--powersearch</strong> can be | ||||
| <em>expanded</em> initially by specifying that <em>directories</em> be | ||||
| searched as well as files. Both searches can <em>use the same virtual | ||||
| options</em> which the major mode <strong>-q or --query</strong> use.  | ||||
| Generally, it is preferable to run a search, and then to provide the | ||||
| results of a search (<strong>using -S</strong>) as an argument to | ||||
| <strong>-q or --query</strong>; this allows the results of a search to be | ||||
| queried. Every time a search is run the results are appended to the | ||||
| history, past searches can be refined or researched by providing the | ||||
| numerical argument pertaining to the history. \d{1,} is simply Perl | ||||
| notation meaning a number with one of more digits. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <em>Perl regexps</em> (see <code>perlre(1p))</code> can be used to define the | ||||
| pattern (string)  provided as an argument to a search. Do not surround a | ||||
| pattern in slashes, a slash is only used after all patterns and before the | ||||
| <em>modifiers i and/or m</em> (swim supports these two modifiers). To | ||||
| search for more than one pattern, patterns are separated with <em>bars | ||||
| (|)</em>. Patterns may include <em>quatifiers, and metacharacters</em>, | ||||
| also found in <code>egrep(1).</code> | ||||
| <P> | ||||
| 
 | ||||
| If a search finds any packages which match the search, the package | ||||
| information will be displayed as the package is found. The package will | ||||
| only be shown once regardless of how many times it is found while the | ||||
| search progresses. When the search is over the number of packages found is | ||||
| shown.  | ||||
| <P> | ||||
| 
 | ||||
| <strong>--search</strong> provides a search of package information. This | ||||
| is similiar to grepping ``<strong>swim -qait</strong>'' or ``<strong>swim | ||||
| -qaint</strong>'', but it is significantly faster. A search can be | ||||
| performed on a particular group by using <strong>-g</strong> with a group | ||||
| as an argument | ||||
| <P> | ||||
| 
 | ||||
| <strong>--powersearch</strong> is somewhat similiar to ``<strong>dpkg | ||||
| --search</strong>'' which searches all files and directories on an | ||||
| installed system, but it combines <strong>--search</strong> with the file | ||||
| and/or directory search, and can also be performed on a not-installed | ||||
| system. A <em>powersearch</em> is significantly faster than the search | ||||
| which <strong>dpkg</strong> provides (even more so when ``<code>swim | ||||
| --ramdiskon --searchfile</code>'' is used) and even more importantly | ||||
| provides a logical output of the search (like ``<code>swim -qi | ||||
| packagename</code>''). By default a search of all directories is not | ||||
| performed because usually this is redundant except in rare cases. To | ||||
| enable a search of all directories use the <strong>--dir</strong> option.  | ||||
| <hr> | ||||
| <h2><A name="s11.2"> | ||||
| 11.2 NARROWING A PREVIOUS SEARCH | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>--research</strong> allows the results of a previous search to be | ||||
| researched without making the new results permanent. | ||||
| <P> | ||||
| 
 | ||||
| <strong>--refinesearch</strong> allows the results of a previous search to | ||||
| be researched while making the | ||||
| new results permanent. | ||||
| <P> | ||||
| 
 | ||||
| <strong>\d{1,}</strong> is a numerical argument to refine or research a | ||||
| past search from the history. | ||||
| <hr> | ||||
| <h2><A name="s11.3"> | ||||
| 11.3 MINOR MODES | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>-n</strong> allows the not-installed databases to be searched.  | ||||
| These databases will not exist if the not-installed databases were made | ||||
| with the FDB argument (see <code>--initndb</code>).  | ||||
| <P> | ||||
| 
 | ||||
| <strong>-g</strong> (see -g above and <A href="ch-query.html#s-mm">MINOR MODES | ||||
| , section 9.1</A>). | ||||
| <hr> | ||||
| <h2><A name="s11.4"> | ||||
| 11.4 OTHER OPTIONS | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>--no</strong> prevents normal output from a search, but does show | ||||
| how many packages were found.  | ||||
| <P> | ||||
| 
 | ||||
| See the section ``<A href="ch-query.html#s-specdata">SPECIFYING THE DATABASES TO USE | ||||
| , section 9.2</A>'' for options | ||||
| <strong>--arch</strong>, <strong>-dists</strong>. | ||||
| <P> | ||||
| 
 | ||||
| See the section ``<A href="ch-query.html#s-vrftp">FTP - VIRTUAL OPTIONS | ||||
| , section 9.6</A>'' for | ||||
| <strong>--ftp</strong>, <strong>--source</strong>, | ||||
| <strong>--source_only</strong>, <strong>--diff</strong>, | ||||
| <P> | ||||
| 
 | ||||
| See the section ``<A href="ch-query.html#s-vrapt">APT - VIRTUAL OPTIONS | ||||
| , section 9.7</A>'' for | ||||
| <strong>-xyz</strong>, <strong>--nz</strong>, <strong>--stdin</strong>, | ||||
| <P> | ||||
| 
 | ||||
| See the section ``<A href="ch-query.html#s-vrrm">REMOVING AN INSTALLED PACKAGE - VIRTUAL OPTIONS  | ||||
| , section 9.8</A>'' for | ||||
| <strong>--purge</strong>, <strong>--remove</strong>, <strong>-r</strong>. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| See the section ``<A href="ch-query.html#s-dblocus">DATABASE LOCATIONS | ||||
| , section 9.11</A>'' for options | ||||
| <strong>--dbpath</strong> and <strong>--root</strong>. | ||||
| 
 | ||||
| <hr> | ||||
| <h2><A name="s11.5"> | ||||
| 11.5 EXAMPLES | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| <strong>swim -gn hamradio --search "radio network/i" --dbpath | ||||
| /test --arch alpha</strong> | ||||
| <P> | ||||
| 
 | ||||
| will search the alpha architecture not-installed system databases in the | ||||
| /test directory for all package information from the hamradio group using | ||||
| the case insensitive pattern ``radio network''. | ||||
| <P> | ||||
| 
 | ||||
| <strong>swim --powersearch dpkg -xn</strong> | ||||
| <P> | ||||
| 
 | ||||
| will search the not-installed system databases for all package information | ||||
| and all files using the case sensitive pattern dpkg, after which apt-get | ||||
| will run a simulation of what would happen if it got and installed these | ||||
| packages. | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-ramdisk.html">next</A>; <A href="ch10.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										23
									
								
								swim.html/ch-seealso.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								swim.html/ch-seealso.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| <html><head> | ||||
| <title>swim - SEE ALSO | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 14<br> | ||||
| SEE ALSO | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| <code>swimrc(5),</code> apt-get(8), sources.list(5), <code>dpkg(8)</code> | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch15.html">next</A>; <A href="ch13.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										26
									
								
								swim.html/ch-version.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								swim.html/ch-version.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| <html><head> | ||||
| <title>swim - VERSION | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 3<br> | ||||
| VERSION | ||||
| 
 | ||||
| </h1> | ||||
| usage: <strong>swim --version</strong> | ||||
| <P> | ||||
| 
 | ||||
| This shows the version for the swim program. | ||||
| 
 | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-history.html">next</A>; <A href="ch-commandline.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										64
									
								
								swim.html/ch10.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								swim.html/ch10.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| <html><head> | ||||
| <title>swim - UPGRADING WITH APT | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 10<br> | ||||
| UPGRADING WITH APT | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| usage: <strong>swim --apt</strong> | ||||
| <P> | ||||
| 
 | ||||
| options: <strong>[-xyz] [--upgrade] [--dist_upgrade]</strong> | ||||
| <P> | ||||
| 
 | ||||
| <strong>apt-get</strong> provides powerful methods to change an | ||||
| installion. When these methods are called using <strong>--apt</strong>, | ||||
| <strong>swim</strong> will not allow you to proceed until you are | ||||
| absolutely sure this is what you want to do. Before using these methods do | ||||
| a ``<strong>swim --apt --update</strong>'' so that | ||||
| <strong>apt-get</strong> knows the newest versions of available packages. | ||||
| This major mode requires a combination of <strong>-x</strong>, | ||||
| <strong>-xz</strong> or <strong>-xyz</strong> to be used along with either | ||||
| <strong>--upgrade</strong> or <strong>--dist_upgrade</strong>.  | ||||
| <strong>-x</strong> used alone will simulate what would happen if | ||||
| <strong>-xz or -xyz</strong> were used (also see <code>-xyz</code> above). | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--upgrade</strong> is somewhat similiar to doing ``<strong>swim | ||||
| -qatxz</strong>'' except that it is a more intelligent method because | ||||
| <strong>apt</strong> does some behind the scene calculations in regards to | ||||
| package relationships, in fact the ``<strong>swim -qatxz</strong>'' | ||||
| approach will provide totally different results, or maybe these were the | ||||
| results you really wanted. ``<strong>swim --apt --upgrade -xz</strong>'' | ||||
| is the prefered, proper, and built-in way provided by | ||||
| <strong>apt-get</strong> to install the newest versions for all packages | ||||
| installed on your system.  This method will not install any newer versions | ||||
| of packages which would change the install status of other packages. Note: | ||||
| It is not recommended to combine the query option <strong>-a</strong> with | ||||
| <strong>-xz or -xyz</strong>, but combining the query option | ||||
| <strong>-a</strong> just with <strong>-x</strong> can be educational.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--dist_upgrade</strong> combines an <strong>--upgrade</strong> | ||||
| with the installation of packages which are not installed. This method | ||||
| carefully examines dependencies, and resolves conflicts, and given these | ||||
| factors it will upgrade the most important packages before considering the | ||||
| installation of less important packages. Less important packages will be | ||||
| installed only if there are not any conflicts. | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-search.html">next</A>; <A href="ch-query.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										29
									
								
								swim.html/ch12.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								swim.html/ch12.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| <html><head> | ||||
| <title>swim - FILES | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 12<br> | ||||
| FILES | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
|  Configuration files:  | ||||
| <P> | ||||
| 
 | ||||
| <pre> | ||||
|  swimz.list | ||||
|  swimrc | ||||
| </pre> | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-seealso.html">next</A>; <A href="ch-ramdisk.html">back</A>. | ||||
| <br> | ||||
| <address>12 March 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										29
									
								
								swim.html/ch13.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								swim.html/ch13.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| <html><head> | ||||
| <title>swim - FILES | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 13<br> | ||||
| FILES | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
|  Configuration files:  | ||||
| <P> | ||||
| 
 | ||||
| <pre> | ||||
|  swimz.list | ||||
|  swimrc | ||||
| </pre> | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-seealso.html">next</A>; <A href="ch-ramdisk.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										20
									
								
								swim.html/ch15.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								swim.html/ch15.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| <html><head> | ||||
| <title>swim - BUGS</title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 15<br> | ||||
| BUGS | ||||
| </h1> | ||||
| Send directly to mttrader@access.mountain.net. | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-seealso.html">back</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										64
									
								
								swim.html/ch9.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								swim.html/ch9.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| <html><head> | ||||
| <title>swim - UPGRADING WITH APT | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swim - chapter 9<br> | ||||
| UPGRADING WITH APT | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| usage: <strong>swim --apt</strong> | ||||
| <P> | ||||
| 
 | ||||
| options: <strong>[-xyz] [--upgrade] [--dist_upgrade]</strong> | ||||
| <P> | ||||
| 
 | ||||
| <strong>apt-get</strong> provides powerful methods to change an | ||||
| installion. When these methods are called using <strong>--apt</strong>, | ||||
| <strong>swim</strong> will not allow you to proceed until you are | ||||
| absolutely sure this is what you want to do. Before using these methods do | ||||
| a ``<strong>swim --apt --update</strong>'' so that | ||||
| <strong>apt-get</strong> knows the newest versions of available packages. | ||||
| This major mode requires a combination of <strong>-x</strong>, | ||||
| <strong>-xz</strong> or <strong>-xyz</strong> to be used along with either | ||||
| <strong>--upgrade</strong> or <strong>--dist_upgrade</strong>.  | ||||
| <strong>-x</strong> used alone will simulate what would happen if | ||||
| <strong>-xz or -xyz</strong> were used (also see <code>-xyz</code> above). | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--upgrade</strong> is somewhat similiar to doing ``<strong>swim | ||||
| -qatxz</strong>'' except that it is a more intelligent method because | ||||
| <strong>apt</strong> does some behind the scene calculations in regards to | ||||
| package relationships, in fact the ``<strong>swim -qatxz</strong>'' | ||||
| approach will provide totally different results, or maybe these were the | ||||
| results you really wanted. ``<strong>swim --apt --upgrade -xz</strong>'' | ||||
| is the prefered, proper, and built-in way provided by | ||||
| <strong>apt-get</strong> to install the newest versions for all packages | ||||
| installed on your system.  This method will not install any newer versions | ||||
| of packages which would change the install status of other packages. Note: | ||||
| It is not recommended to combine the query option <strong>-a</strong> with | ||||
| <strong>-xz or -xyz</strong>, but combining the query option | ||||
| <strong>-a</strong> just with <strong>-x</strong> can be educational.  | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>--dist_upgrade</strong> combines an <strong>--upgrade</strong> | ||||
| with the installation of packages which are not installed. This method | ||||
| carefully examines dependencies, and resolves conflicts, and given these | ||||
| factors it will upgrade the most important packages before considering the | ||||
| installation of less important packages. Less important packages will be | ||||
| installed only if there are not any conflicts. | ||||
| <hr> | ||||
| swim | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-search.html">next</A>; <A href="ch-query.html">back</A>. | ||||
| <br> | ||||
| <address>12 March 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										162
									
								
								swim.html/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								swim.html/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,162 @@ | ||||
| <html><head> | ||||
| <title>swim</title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1>swim</h1> | ||||
| 
 | ||||
| <h2><A name="toc"> | ||||
| 0.1 Table of contents | ||||
| </A></h2> | ||||
| <ul> | ||||
| <li><A href="ch-description.html">1 DESCRIPTION | ||||
| </A> | ||||
| <li><A href="ch-commandline.html">2 COMMAND LINE OPTION SYNTAX | ||||
| </A> | ||||
| <li><A href="ch-version.html">3 VERSION | ||||
| </A> | ||||
| <li><A href="ch-history.html">4 HISTORY | ||||
| </A> | ||||
| <li><A href="ch-makinginst.html">5 MAKING INSTALLED SYSTEM DATABASES | ||||
| </A> | ||||
| <ul> | ||||
| <li><A href="ch-makinginst.html#s-initdb">5.1</A> Initial database making, and Rebuilding for an | ||||
| Installed system. | ||||
| 
 | ||||
| <li><A href="ch-makinginst.html#s5.2">5.2</A> UPDATING | ||||
| 
 | ||||
| <li><A href="ch-makinginst.html#s-searchy">5.3</A> REBUILDING THE SEARCH | ||||
| 
 | ||||
| 
 | ||||
| <li><A href="ch-makinginst.html#s5.4">5.4</A> FILES | ||||
| 
 | ||||
| </ul> | ||||
| <li><A href="ch-important.html">6 IMPORTANT DEBIAN DATABASES FOR NOT-INSTALLED | ||||
| DATABASES | ||||
| </A> | ||||
| <ul> | ||||
| <li><A href="ch-important.html#s-downimportant">6.1</A> A. downloading the important databases with --ftp. | ||||
| 
 | ||||
| <li><A href="ch-important.html#s6.2">6.2</A> OVERVIEW | ||||
| 
 | ||||
| <li><A href="ch-important.html#s-dd">6.3</A> DISTRIBUTION DEFINED | ||||
| 
 | ||||
| <li><A href="ch-important.html#s6.4">6.4</A> SECTIONS | ||||
| 
 | ||||
| <li><A href="ch-important.html#s6.5">6.5</A> ARCHITECTURES | ||||
| 
 | ||||
| <li><A href="ch-important.html#s6.6">6.6</A> SWIMZ.LIST | ||||
| 
 | ||||
| <li><A href="ch-important.html#s6.7">6.7</A> SWIMZ.LIST EXAMPLES | ||||
| 
 | ||||
| <li><A href="ch-important.html#s-ftp">6.8</A> FTP OR APT? | ||||
| 
 | ||||
| <li><A href="ch-important.html#s6.9">6.9</A> OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-important.html#s6.10">6.10</A> B. downloading the important databases with apt, and maintenance | ||||
| options. | ||||
| 
 | ||||
| </ul> | ||||
| <li><A href="ch-notinstalled.html">7 MAKING NOT-INSTALLED DATABASES | ||||
| </A> | ||||
| <ul> | ||||
| <li><A href="ch-notinstalled.html#s7.1">7.1</A> OVERVIEW | ||||
| 
 | ||||
| <li><A href="ch-notinstalled.html#s7.2">7.2</A> OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-notinstalled.html#s7.3">7.3</A> UPDATING | ||||
| 
 | ||||
| <li><A href="ch-notinstalled.html#s7.4">7.4</A> REBUILDING THE SEARCH | ||||
| 
 | ||||
| <li><A href="ch-notinstalled.html#s7.5">7.5</A> FILES | ||||
| 
 | ||||
| </ul> | ||||
| <li><A href="ch-aptprep.html">8 PREPARING YOUR INSTALLATION FOR APT | ||||
| </A> | ||||
| <li><A href="ch-query.html">9 QUERYING THE INSTALLED AND NOT-INSTALLED DATABASES | ||||
| </A> | ||||
| <ul> | ||||
| <li><A href="ch-query.html#s-mm">9.1</A> MINOR MODES | ||||
| 
 | ||||
| <li><A href="ch-query.html#s-specdata">9.2</A> SPECIFYING THE DATABASES TO USE | ||||
| 
 | ||||
| <li><A href="ch-query.html#s9.3">9.3</A> OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-query.html#s9.4">9.4</A> PACKAGE RELATIONSHIPS | ||||
| 
 | ||||
| <li><A href="ch-query.html#s-format">9.5</A> FORMAT | ||||
| 
 | ||||
| <li><A href="ch-query.html#s-vrftp">9.6</A> FTP - VIRTUAL OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-query.html#s-vrapt">9.7</A> APT - VIRTUAL OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-query.html#s-vrrm">9.8</A> REMOVING AN INSTALLED PACKAGE - VIRTUAL OPTIONS  | ||||
| 
 | ||||
| <li><A href="ch-query.html#s9.9">9.9</A> STDIN - VIRTUAL OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-query.html#s9.10">9.10</A> PACKAGE MANIPULATION - VIRTUAL OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-query.html#s-dblocus">9.11</A> DATABASE LOCATIONS | ||||
| 
 | ||||
| </ul> | ||||
| <li><A href="ch10.html">10 UPGRADING WITH APT | ||||
| </A> | ||||
| <li><A href="ch-search.html">11 SEARCHING | ||||
| </A> | ||||
| <ul> | ||||
| <li><A href="ch-search.html#s11.1">11.1</A> OVERVIEW | ||||
| 
 | ||||
| <li><A href="ch-search.html#s11.2">11.2</A> NARROWING A PREVIOUS SEARCH | ||||
| 
 | ||||
| <li><A href="ch-search.html#s11.3">11.3</A> MINOR MODES | ||||
| 
 | ||||
| <li><A href="ch-search.html#s11.4">11.4</A> OTHER OPTIONS | ||||
| 
 | ||||
| <li><A href="ch-search.html#s11.5">11.5</A> EXAMPLES | ||||
| 
 | ||||
| </ul> | ||||
| <li><A href="ch-ramdisk.html">12 RAMDISK | ||||
| </A> | ||||
| <ul> | ||||
| <li><A href="ch-ramdisk.html#s12.1">12.1</A> OVERVIEW | ||||
| 
 | ||||
| </ul> | ||||
| <li><A href="ch13.html">13 FILES | ||||
| </A> | ||||
| <li><A href="ch-seealso.html">14 SEE ALSO | ||||
| </A> | ||||
| <li><A href="ch15.html">15 BUGS</A> | ||||
| </ul> | ||||
| <hr><h2><A name="copyright">0.2 Copyright</A></h2> | ||||
|                                                        | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         <P> | ||||
|                                                                       | ||||
|           SWIM, including this manual, is free software; you           | ||||
|           may redistribute it and/or modify it under the terms of the            | ||||
|           GNU General Public License as published by the Free Software           | ||||
|           Foundation; either version 2, or (at your option) any later            | ||||
|           version.                                                               | ||||
|         <P> | ||||
|                                                                       | ||||
|           This is distributed in the hope that it will be useful, but            | ||||
|           <em>without any warranty</em>; without even the implied                | ||||
|           warranty of merchantability or fitness for a particular                | ||||
|           purpose.  See the GNU General Public License for more                  | ||||
|           details.                                                               | ||||
|         <P> | ||||
|                                                                       | ||||
|           You should have received a copy of the GNU General Public              | ||||
|           License with the <kbd>swim</kbd> source as the file                       | ||||
|           <code>COPYING</code>.  If not, write to the Free Software                  | ||||
|           Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.              | ||||
|         <hr> | ||||
| swim | ||||
| - <A href="#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="#toc">Contents</A>. | ||||
| <br> | ||||
| <address>15 June 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										755
									
								
								swim_by_example.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										755
									
								
								swim_by_example.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,755 @@ | ||||
| <html> | ||||
| <head><title>swim by example</title></head> | ||||
| <body  text="#000000" bgcolor="#FFFFe0" link="#0000EF" vlink="#51188E" | ||||
| alink="#FF0000"> | ||||
| </p> | ||||
| 
 | ||||
| <br> | ||||
| <h2 align=center>The Swift, Wise, and Intuitive package Manager.</h2> | ||||
| <br> | ||||
| <p> | ||||
| We run a search for case-insensitive matches for the word "quake." | ||||
| Because we don't know how many matches the search will find, the | ||||
| descriptions of all packages found are supressed with "--no."  Note: "-n" | ||||
| pertains to the not-installed (uninstalled) distribution.   | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -n --search quake/i --no | ||||
| swim: found 17 package(s) | ||||
| </pre> | ||||
| 
 | ||||
| <p>swim keeps a history for all searches. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -hn | ||||
|     5  dpsclient-demos dgs dgs-dev freefont gs-aladdin gs-aladdin-manual | ||||
| gs-aladdin-manual-de gsfonts-other xpacman abc2ps efax ghostview gnome-gv | ||||
| gs gsfonts gsfonts-x11 gv hatman libroxen-tex pacman ppd-gs pstotext | ||||
| python-imaging svgalib1-altdev svgalibg1-dev tex4ht type1inst yorick | ||||
|     4  lsof-2.2 | ||||
|     3  libwine-dev | ||||
|     2  libwine libwine-dev libwings-dev | ||||
|     1  gtkpak pak qstat quake-lib quake2 quake2-bin quake2-ctf quake2-dm | ||||
| xqf quake-3dfx quake-ggi quake-gl quake-lib-stub quake-sdl quake-server | ||||
| quake-svga quake-x11 | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We can access any part of the history which we want.  The first command looks at the | ||||
| information pertaining to the package.  The second command shows a listing of the packages | ||||
| found for "quake."  Note:  When no numbers are specified for "-S", the number 1 is assumed.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qnSi 3 | ||||
| Package: libwine-dev                 Status: install ok installed | ||||
| Version: 0.0.20000109-1              Essential: no | ||||
| Section: otherosfs                   Priority: optional | ||||
| Installed-Size: 3680                 Source: wine | ||||
| Size: 729818                         Architecture: i386 | ||||
| Distribution: unstable | ||||
| Maintainer: Andrew D. Lenharth <andrewl@debian.org> | ||||
| Description: Windows Emulator (Development files) | ||||
|  This is an ALPHA release of Wine, the MS-Windows emulator.  This is | ||||
|  still a developers release and many applications may still not work. | ||||
|  . | ||||
|  This package consists of the C header files. | ||||
|  . | ||||
|  Wine is often updated. | ||||
| 
 | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qnS   | ||||
| gtkpak_0.2-1 | ||||
| pak_0.2-1 | ||||
| qstat_2.3e-1 | ||||
| quake-lib_1.06-9 | ||||
| quake2_3.20-5 | ||||
| quake2-bin_3.20-1 | ||||
| quake2-ctf_1.50-1 | ||||
| quake2-dm_3.13-1 | ||||
| xqf_0.8.99-1 | ||||
| quake-3dfx_0.0.9-1 | ||||
| quake-ggi_0.0.9-1 | ||||
| quake-gl_0.0.9-1 | ||||
| quake-lib-stub_1.9-1 | ||||
| quake-sdl_0.0.9-1 | ||||
| quake-server_0.0.9-1 | ||||
| quake-svga_0.0.9-1 | ||||
| quake-x11_0.0.9-1 | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| After looking at the descriptions for the packages found through the "quake" search we decide | ||||
| to narrow down the search to "tools."  Notes:  We could have done this for any part of the | ||||
| history by specifying a number.  "--research" will not write the changes to the history, | ||||
| "--refinesearch"  will write the changes to the history.  The qstat package is installed, but  | ||||
| there is a newer version. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -n --research tool | ||||
| Package: gtkpak                      Status: not-installed | ||||
| Version: 0.2-1                       Essential: no | ||||
| Section: games                       Priority: optional | ||||
| Installed-Size: 105                  Source: pak | ||||
| Size: 32182                          Architecture: i386 | ||||
| Distribution: unstable | ||||
| Maintainer: Joseph Carter <knghtbrd@debian.org> | ||||
| Description: GTK program for manipulating pak archives | ||||
|  gtkpak is a nifty GTK tool for manipulating the pak archives used by Quake, | ||||
|  Quake 2, and QuakeWorld.  It can view, extract, create, and append pak | ||||
|  archives.  pak contains basic command-line utilities that can do much of | ||||
|  what gtkpak does without X or GTK, but gtkpak is easier to work with by | ||||
|  far.  Installing both won't hurt anything. | ||||
| 
 | ||||
| Package: pak                         Status: not-installed | ||||
| Version: 0.2-1                       Essential: no | ||||
| Section: games                       Priority: optional | ||||
| Installed-Size: 110 | ||||
| Size: 37412                          Architecture: i386 | ||||
| Distribution: unstable | ||||
| Maintainer: Joseph Carter <knghtbrd@debian.org> | ||||
| Description: command-line tools for pak archives | ||||
|  This package contains pakx and pakc, a couple of tools for working with the | ||||
|  pak archives used by Quake, Quake 2, and QuakeWorld.  pakc can create and | ||||
|  add files to archives, pakx can list and extract files from them.  gtkpak | ||||
|  is a bit fancier but then again it requires X and GTK. | ||||
| 
 | ||||
| Package: qstat                       Status: > hold ok installed (2.0b-1) | ||||
| Version: 2.3e-1                      Essential: no | ||||
| Section: games                       Priority: optional | ||||
| Installed-Size: 236 | ||||
| Size: 68652                          Architecture: i386 | ||||
| Distribution: unstable | ||||
| Maintainer: Michael Alan Dorman <mdorman@debian.org> | ||||
| Description: Command-line tool for querying quake (and other) servers | ||||
|  Qstat provides a simple interface for querying servers for a number | ||||
|  of games, including but not limited to quake, quakeworld, quake2, | ||||
|  quake3arena, unreal tournament, kingpin and others. | ||||
| 
 | ||||
| swim: found 3 package(s) | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -n --refinesearch tool --no | ||||
| swim: found 3 package(s) | ||||
| </pre> | ||||
| 
 | ||||
| <p>This is what 1 now looks like in the history: | ||||
| <pre> | ||||
|     1  gtkpak pak qstat | ||||
| </pre> | ||||
| 
 | ||||
| <p>If apt is installed it is possible to find out how other packages will | ||||
| be installed.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qxnS | ||||
| gtkpak_0.2-1 | ||||
| pak_0.2-1 | ||||
| qstat_2.3e-1 | ||||
| Reading Package Lists... | ||||
| Building Dependency Tree... | ||||
| The following packages will be REMOVED: | ||||
|   xqf  | ||||
| The following NEW packages will be installed: | ||||
|   gtkpak pak  | ||||
| The following held packages will be changed: | ||||
|   qstat xqf  | ||||
| 1 packages upgraded, 2 newly installed, 1 to remove and 1065 not upgraded. | ||||
| Inst gtkpak | ||||
| Remv xqf | ||||
| Inst qstat | ||||
| Inst pak | ||||
| Conf gtkpak | ||||
| Conf qstat | ||||
| Conf pak | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| Oh no, xqf is going to be removed!  Let's make sure that this isn't a | ||||
| package we want removed, but since we noticed a newer version of this | ||||
| package is included in the unstable distribution, let's find out what's | ||||
| going on here!  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qnxi xqf | ||||
| Package: xqf                         Status: > hold ok installed (0.5-1) | ||||
| Version: 0.8.99-1                    Essential: no | ||||
| Section: games                       Priority: optional | ||||
| Installed-Size: 182 | ||||
| Size: 80426                          Architecture: i386 | ||||
| Distribution: unstable | ||||
| Maintainer: Michael Alan Dorman <mdorman@debian.org> | ||||
| Description: X-based Quake Server Browser | ||||
|  XQF allows one to browse and choose quake servers to play on. | ||||
| Reading Package Lists... | ||||
| Building Dependency Tree... | ||||
| Some packages could not be installed. This may mean that you have | ||||
| requested an impossible situation or if you are using the unstable | ||||
| distribution that some required packages have not yet been created | ||||
| or been moved out of Incoming. | ||||
| 
 | ||||
| Since you only requested a single operation it is extremely likely that | ||||
| the package is simply not installable and a bug report against | ||||
| that package should be filed. | ||||
| The following information may help to resolve the situation: | ||||
| 
 | ||||
| Sorry, but the following packages have unmet dependencies: | ||||
|   xqf: Conflicts: qstat (< 2.1z-2.1a-0.1) but 2.0b-1 is to be installed | ||||
| E: Sorry, broken packages | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qnT qstat | ||||
| qstat_2.3e-1 | ||||
| Depends: libc6 (>= 2.1.2) | ||||
| Conflicts: xqf (<< 0.9.2-1) | ||||
| </pre> | ||||
| 
 | ||||
| <p> As seen above, the reason why xqf has to be removed is due to a | ||||
| dependency in qstat which the packager (Michael Alan Dorman | ||||
| <mdorman@debian.org>) will have to resolve by uploading a newer version of | ||||
| xqf to the distribution.  Sometimes necessary packages are still in | ||||
| Debian's Incoming directory at the ftp site, and not in the distribution, | ||||
| so we may want to check there first.  If this isn't the case we will send | ||||
| a bug report to Debian's Bug Tracking System pointing out that there needs | ||||
| to be a newer version of xqf.  In the meantime we have decided that we | ||||
| only want gtkpak and pak.  We will use swim's editing capabilities to take | ||||
| gstat off the list.  Notes:  Another possibility for the bug shown above | ||||
| is that apt's cache needs to be updated to reflect the changes in Debain's | ||||
| distribution by using "swim --apt --update."  When the history is edited | ||||
| with "--stdin"  the history makes a new entry reflecting the change.  The | ||||
| full history is accessible from "--stdin."  Anybody can send a bug to | ||||
| Debian's Bug Tracking System. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qxznS --stdin  | ||||
| swim: type exit to finish --stdin | ||||
| swim: gtkpak pak       | ||||
| swim: exit | ||||
| Reading Package Lists... Done | ||||
| Building Dependency Tree... Done | ||||
| The following NEW packages will be installed: | ||||
|   gtkpak pak  | ||||
| 0 packages upgraded, 2 newly installed, 0 to remove and 1067 not upgraded. | ||||
| Need to get 69.6kB of archives. After unpacking 220kB will be used. | ||||
| Get:1 ftp://ftp.debian.org unstable/main gtkpak 0.2-1 [32.2kB] | ||||
| Get:2 ftp://ftp.debian.org unstable/main pak 0.2-1 [37.4kB]                     | ||||
| Fetched 69.6kB in 1m15s (922B/s)                                                | ||||
| Selecting previously deselected package gtkpak. | ||||
| (Reading database ... 106015 files and directories currently installed.) | ||||
| Unpacking gtkpak (from .../archives/gtkpak_0.2-1_i386.deb) ... | ||||
| Selecting previously deselected package pak. | ||||
| Unpacking pak (from .../archives/pak_0.2-1_i386.deb) ... | ||||
| Setting up gtkpak (0.2-1) ... | ||||
| 
 | ||||
| Setting up pak (0.2-1) ... | ||||
| gtkpak_0.2-1 | ||||
| pak_0.2-1 | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| If we don't have apt we can still download these packages, and their sources.  Here is another | ||||
| way to do the same thing we did above without using apt.  Notes:  This time we saved some | ||||
| typing by doing "--stdin" with "--research."  We specified "--source" with "--ftp"  to get the | ||||
| sources as well as the packages, or we could have just gotten the sources by themselves by | ||||
| specifying "--source_only" with "--ftp."  Changes made while in "--stdin" are written to the | ||||
| history.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -n --search quake/i --no | ||||
| swim: found 17 package(s) | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -n --research tool --no --stdin --ftp --source | ||||
| swim: found 3 package(s) | ||||
| swim: type exit to finish --stdin | ||||
| swim: gtkpak pak       | ||||
| swim: exit | ||||
| swim: connected to ftp.debian.org | ||||
| swim: logged in to ftp.debian.org | ||||
| swim: downloading gtkpak_0.2-1.deb (32182 bytes) | ||||
| gtkpak_0.2-1  49823b28c9599dbf94e290e28e695bc2  OK | ||||
| swim: successful retrieval of gtkpak_0.2-1.deb | ||||
| swim: downloading pak_0.2-1.diff.gz (2623 bytes) | ||||
| swim: successful retrieval of pak_0.2-1.diff.gz | ||||
| swim: downloading pak_0.2-1.dsc (825 bytes) | ||||
| swim: successful retrieval of pak_0.2-1.dsc | ||||
| swim: downloading pak_0.2.orig.tar.gz (26972 bytes) | ||||
| swim: successful retrieval of pak_0.2.orig.tar.gz | ||||
| swim: downloading pak_0.2-1.deb (37412 bytes) | ||||
| pak_0.2-1  55842f97f80c5c37415a93a7f0709171  OK | ||||
| swim: successful retrieval of pak_0.2-1.deb | ||||
| swim: pak_0.2-1.diff.gz already exists | ||||
| swim: pak_0.2-1.dsc already exists | ||||
| swim: pak_0.2.orig.tar.gz already exists | ||||
| swim: logged out | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We notice that the sources only had to be downloaded once.  Looking at the packages' | ||||
| information we notice both packages share the same sources as indicated in the "Source" field.  | ||||
| The field is absent for the pak package because the source name is exactly the same as the | ||||
| package's name, but for the gtkpak package this isn't the case, so the "Source" field is | ||||
| present. | ||||
| 
 | ||||
| <p> | ||||
| We can find the packages and the sources in their proper location on our local archive mirror.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ ls ~/.swim/pub/debian/dists/unstable/main/source/games | ||||
| pak_0.2-1.diff.gz  pak_0.2-1.dsc  pak_0.2.orig.tar.gz | ||||
| linuxalive:/home/swim/SWIMANIA$ ls ~/.swim/pub/debian/dists/unstable/main/binary-i386/games/ | ||||
| gtkpak_0.2-1.deb  pak_0.2-1.deb | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We can go examine the packages.  It is useful to check out the changelog and the copyright. | ||||
| This is the initial release for this program.  Note: "-v" will show the files in long format | ||||
| (ls -l), "--df" show the directories as well as the files. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ cd ~/.swim/pub/debian/dists/unstable/main/binary-i386/games/ | ||||
| linuxalive:~/.swim/pub/debian/dists/unstable/main/binary-i386/games$ swim -qpl --copyright --changelog gtkpak_0.2-1.deb  | ||||
| #####copyright for gtkpak_0.2-1.deb##### | ||||
| 
 | ||||
| taken from the README: | ||||
| 
 | ||||
| (c) Michael Vance, 1999 | ||||
|     briareos@lokigames.com | ||||
|     mkv102@psu.edu | ||||
| 
 | ||||
| 0. Intro | ||||
| 
 | ||||
| gtkpak is a PAK file viewer for Gtk+. What are PAK files? A PAK file is used | ||||
| in id software games such as Quake and Quake 2, and their spin-offs. Just | ||||
| imagine collapsing an entire directory scheme into a big wad of files, and | ||||
| there you have a PAK file. | ||||
| 
 | ||||
| The three binaries are built around the interface provided in pakfile.h, | ||||
| which is a C++ class that allows access to the contents of a PAKFile, including | ||||
| searching and extracting from an already existing PAK file, to add files and | ||||
| then writing a new PAK file. The three binaries are then just front-ends | ||||
| to this functionality, in one way or another. | ||||
| 
 | ||||
| While it's tempting to make the classes provided in pakfile.h into a shared | ||||
| library, it's probably unnecessary. But it does make one tingly, eh? | ||||
| 
 | ||||
| And all this is GPL'ed, of course. See the file COPYING for license details. | ||||
| 
 | ||||
| 
 | ||||
| #####changelog.Debian.gz for gtkpak_0.2-1.deb##### | ||||
| 
 | ||||
| pak (0.2-1) unstable; urgency=low | ||||
| 
 | ||||
|   * Initial Release. | ||||
| 
 | ||||
|  -- Joseph Carter <knghtbrd@debian.org>  Thu,  8 Jul 1999 17:35:38 -0700 | ||||
| 
 | ||||
| Local variables: | ||||
| mode: debian-changelog | ||||
| End: | ||||
| 
 | ||||
| usr/bin/gtkpak | ||||
| usr/share/man/man6/gtkpak.6.gz | ||||
| usr/doc/gtkpak/README | ||||
| usr/doc/gtkpak/copyright | ||||
| usr/doc/gtkpak/examples/pak0.pak | ||||
| usr/doc/gtkpak/changelog.Debian.gz | ||||
| usr/lib/menu/gtkpak | ||||
| </pre> | ||||
| 
 | ||||
| <p>Let's see if there is a menu entry, and check the MD5 checksum.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:~/.swim/pub/debian/dists/unstable/main/binary-i386/games$ swim -qpm gtkpak_0.2-1.deb --md5sum | ||||
| #####menu for gtkpak_0.2-1.deb(gtkpak)##### | ||||
| ?package(gtkpak):needs=X11 section=Games/Adventure\ | ||||
|   title="GtkPak" hints=Quake command="/usr/bin/gtkpak" | ||||
| 
 | ||||
| gtkpak_0.2-1  49823b28c9599dbf94e290e28e695bc2  OK | ||||
| </pre> | ||||
| 
 | ||||
| <p>It would be interesting to look at the man page for gtkpak. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:~/.swim/pub/debian/dists/unstable/main/binary-i386/games$ swim -qpd gtkpak_0.2-1.deb  | ||||
| gtkpak_0.2-1 | ||||
| 
 | ||||
| usr/share/man/man6/gtkpak.6.gz | ||||
| usr/doc/gtkpak/README | ||||
| usr/doc/gtkpak/copyright | ||||
| usr/doc/gtkpak/examples/pak0.pak | ||||
| usr/doc/gtkpak/changelog.Debian.gz | ||||
| 
 | ||||
| linuxalive:~/.swim/pub/debian/dists/unstable/main/binary-i386/games$ swim -qp gtkpak_0.2-1.deb --extract PWD\!usr/share/man/man6/gtkpak.6.gz | ||||
| gtkpak_0.2-1 | ||||
| 
 | ||||
| 
 | ||||
| swim: gtkpak.6.gz has been extracted | ||||
| linuxalive:~/.swim/pub/debian/dists/unstable/main/binary-i386/games$ ls | ||||
| gtkpak.6.gz  gtkpak_0.2-1.deb  pak_0.2-1.deb | ||||
| linuxalive:~/.swim/pub/debian/dists/unstable/main/binary-i386/games$ zcat gtkpak.6.gz | nroff -man | less | ||||
| "man page for gtkpak will be visible" | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We could also extract the whole archive onto our system.  Note:  First, we checked to make | ||||
| sure we wouldn't copy over any files from other installed packages. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:~/.swim/pub/debian/dists/unstable/main/binary-i386/games/test$ cd / | ||||
| linuxalive:/$ swim -qp ~/.swim/pub/debian/dists/unstable/main/binary-i386/games/gtkpak_0.2-1.deb --extract ALL | ||||
| gtkpak_0.2-1 | ||||
| 
 | ||||
| 
 | ||||
| swim: gtkpak_0.2-1.deb has been extracted | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| If we have installed the packages with apt, we can check to see what kind of changes have been | ||||
| made to our system.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim --db --check | ||||
| checking for new, changed, and removed packages | ||||
| NEW gtkpak | ||||
| NEW pak | ||||
| 
 | ||||
|        TOTAL | ||||
|        ----- | ||||
| NEW 2 | ||||
| GONE 0 | ||||
| CHANGED 0 | ||||
| CHANGED STATUS 0 | ||||
| </pre> | ||||
| 
 | ||||
| <p>At this point the database for our installation hasn't been updated. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -q pak  | ||||
| package pak is not installed | ||||
| linuxalive:/home/swim/SWIMANIA$  | ||||
| 
 | ||||
| To update the database we will issue "--db" without "--check." | ||||
| 
 | ||||
| linuxalive:/home/swim/SWIMANIA$ swim --db         | ||||
| checking for new, changed, and removed packages | ||||
| NEW gtkpak | ||||
| NEW pak | ||||
| 
 | ||||
|        TOTAL | ||||
|        ----- | ||||
| NEW 2 | ||||
| GONE 0 | ||||
| CHANGED 0 | ||||
| CHANGED STATUS 0 | ||||
| 
 | ||||
| 
 | ||||
| N|C|CS 2 | ||||
| #2 N|C pak.list | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -q pak | ||||
| pak_0.2-1 | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We can check to see if the uninstalled distribution had any changes.  Notes: The results below | ||||
| indicate the changes found in the new Package databases that have been downloaded by updating | ||||
| apt; if we don't have apt then swim's major mode "--ftp" can be used with "DF."  With "--ndb"  | ||||
| use APT to indicate apt sources, or DF to indicate Package databases gotten directly through | ||||
| swim's "--ftp".  If we originally made the uninstalled distribution with an uninstalled | ||||
| filesystem by using "--Contents DF" then to update the uninstalled distribution "--Contents | ||||
| DF" should be used again; this isn't necessary when running a check.  To rebuild | ||||
| (--rebuildndb), update (--ndb), or check a distribution other than the default one, use | ||||
| "--dists stable", "--dists frozen" or "--dists unstable."  The newest Packages can | ||||
| automatically be picked by using "--cron." | ||||
| 
 | ||||
| <p> | ||||
| A little blurb:  Although not Debian approved or sanctioned, we find the unstable distribution | ||||
| acceptably stable in relation to certain well-known commercial distributions despite | ||||
| infrequent packaging bugs like the one shown in the xqf example above.  The Debian | ||||
| distribution adheres to a self-imposed level of quality found in no other distribution in the | ||||
| world.  Usually, unstable undergoes many changes so there isn't a time advantage over updating | ||||
| DF versus rebuilding DF, but this process is easier on system resources.  On the other hand, | ||||
| updating FDBDF (no uninstalled filesystem) is faster.  | ||||
| 
 | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim --apt --update; swim --ftp --Contents DF --onec; | ||||
| "output not shown" | ||||
| linuxalive:/home/swim/SWIMANIA$ swim --ndb --check APT 2> changes-today | ||||
| ###         Site                     Date              Size (bytes)  Release | ||||
| 
 | ||||
|                                      CONTRIB | ||||
|   1     ftp.debian.org       Mon Jan 17 17:57:57 2000    112774        2.2 | ||||
| 
 | ||||
|                                      NON-FREE | ||||
|   1     ftp.debian.org       Sun Jan 16 17:26:23 2000    279821        2.2 | ||||
| 
 | ||||
|                                        MAIN | ||||
|   1     ftp.debian.org       Mon Jan 17 17:57:12 2000    3048732       2.2 | ||||
| 
 | ||||
| swim: for CONTRIB, which ### do you want?: 1 | ||||
| swim: for NON-FREE, which ### do you want?: 1 | ||||
| swim: for MAIN, which ### do you want?: 1 | ||||
| checking for new, changed, and removed packages | ||||
| 
 | ||||
|        TOTAL | ||||
|        ----- | ||||
| NEW 12 | ||||
| GONE 16 | ||||
| CHANGED 54 | ||||
| CHANGED REVISION 162 | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We can view all the changes because we stored them in a file.  We can use swim to look at all | ||||
| the changed packages except for the new ones which will be visible once we rebuild or update.  | ||||
| By looking at this file we are provided a view of the inner workings of Debian development.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ cat changed-today | less | ||||
| CHANGED-REVISION gnujsp | ||||
| CHANGED iraf | ||||
| CHANGED iraf-common | ||||
| CHANGED iraf-ibin | ||||
| CHANGED iraf-noaobin | ||||
| CHANGED-REVISION jserv | ||||
| CHANGED-REVISION mailcrypt | ||||
| CHANGED plugger | ||||
| CHANGED-REVISION sarien | ||||
| NEW webrt | ||||
| "part of output not shown" | ||||
| GONE tinytable-zope | ||||
| GONE tip | ||||
| </pre> | ||||
| 
 | ||||
| <p> We decide to update with "--ndb" rather than to rebuild with | ||||
| "--rebuildndb."  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim --ndb APT --Contents DF --cron 2> changed-today | ||||
| checking for new, changed, and removed packages | ||||
| 
 | ||||
|        TOTAL | ||||
|        ----- | ||||
| NEW 12 | ||||
| GONE 16 | ||||
| CHANGED 54 | ||||
| CHANGED REVISION 162 | ||||
| G|C|CR 232 | ||||
| #232 VIRTUAL G|C|CR zicq.list                                         | ||||
| Copying new Contents | ||||
| Compressing Contents | ||||
| N|C|CR 228 | ||||
| #228 VIRTUAL N|C|CR zicq.list                                          | ||||
| #22 NO-C zope-siteaccess.list                         | ||||
| Appending search databases | ||||
| Updating status | ||||
| 
 | ||||
| Sun Jan 23 14:59:04 2000  to  Sun Jan 23 16:39:23 2000 | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We were wondering whether it was time to update gv, but we found out that there was only a | ||||
| debian-revision change "r>" which means that the source code hasn't changed.  There is no need | ||||
| to update right now.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/usr/lib/perl5/SWIM$ which gv | ||||
| /usr/X11R6/bin/gv | ||||
| linuxalive:/usr/lib/perl5/SWIM$ cd /usr/X11R6/bin | ||||
| linuxalive:/usr/X11R6/bin$ swim -qf gv | ||||
| gv_1:3.5.8-7 | ||||
| linuxalive:/usr/X11R6/bin$ swim -qfni gv | ||||
| Package: gv                          Status: r> hold ok installed (1:3.5.8-7) | ||||
| Version: 1:3.5.8-15                  Essential: no | ||||
| Section: text                        Priority: optional | ||||
| Installed-Size: 477 | ||||
| Size: 224778                         Architecture: i386 | ||||
| Distribution: unstable | ||||
| Maintainer: Marco Pistore <pistore@debian.org> | ||||
| Description: A PostScript and PDF viewer for X using 3d Athena Widgets | ||||
|  `gv' is a comfortable viewer of PostScript and PDF files for the X | ||||
|  Window System. | ||||
|  . | ||||
|  It uses the `ghostscript' PostScript(tm) interpreter and is based | ||||
|  on the classic X front-end for `gs', `ghostview'. It is more | ||||
|  comfortable and more powerful than `ghostview'. | ||||
|  . | ||||
|  Some features as e.g. PDF files or anti-aliasing are only supported | ||||
|  if a recent ghostscript (4.0 or later) is installed.  With | ||||
|  anti-aliasing turned on, the text is very crisp and readable, with no | ||||
|  `stepping' on the slants at all. | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| While we were in this directory we decided to do a little research.  It is interesting to note | ||||
| that for the installed system there are 14 files which don't belong to any packages. There | ||||
| could be a variety of reasons for this (maybe we are slobs); this is good stuff to know.  | ||||
| Notes:  To see the total list just add "-t" to the existing command-line options.  There is a | ||||
| big difference in using "." and "*",  "." is the same as saying "./" but it only lists the | ||||
| same package once, whereas "*" would look at all the files in the immediate directory and if | ||||
| two files belong to the same package, that package will be shown twice for each file, it also | ||||
| reports if a file doesn't belong to a package.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/usr/X11R6/bin$ swim -qf . | ||||
| use --total or -t to see all 202 packages | ||||
| linuxalive:/usr/X11R6/bin$ swim -qfn . | ||||
| use --total or -t to see all 420 packages | ||||
| linuxalive:/usr/X11R6/bin$ swim -qft * | grep "not owned" | wc -l | ||||
|      14 | ||||
| linuxalive:/usr/X11R6/bin$ swim -qfnt * | grep "not owned" | wc -l | ||||
|     162 | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We notice a file in the lib directory, and we wonder what it belongs to. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/lib$ swim -qf libthread_db-1.0.so --shlibs | ||||
| libc6_2.1.2-11 | ||||
| Shlibs: | ||||
| ld-linux 2 libc6 (>= 2.1.2) | ||||
| libBrokenLocale 1 libc6 (>= 2.1.2) | ||||
| .. everything not shown .. | ||||
| libthread_db 1 libc6 (>= 2.1.2) | ||||
| libutil 1 libc6 (>= 2.1.2) | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We want to find out what dependencies apt has. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/lib$ swim -qfnT /usr/bin/apt-get | ||||
| apt_0.3.16 | ||||
| Depends: libc6, libc6 (>= 2.1), libc6 (>= 2.1.2), libstdc++2.10 | ||||
| Suggests: dpkg-dev | ||||
| Provides: libapt-pkg2.6 | ||||
| Replaces: deity, libapt-pkg-doc (<< 0.3.7), libapt-pkg-dev (<< 0.3.7) | ||||
| Conflicts: deity | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We need a header file called w32skrnl.h.  We are in luck it's already on our system.  Notes:  | ||||
| We could have done "locate w32skrnl.h" and then done a "swim -qf", but we haven't updated our | ||||
| locatedb in months.  The package installation will be tested by apt if it exists.  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/usr/include/wine$ swim -xn --ps w32skrnl\.h | ||||
| Package: libwine-dev                 Status: install ok installed | ||||
| Version: 0.0.20000109-1              Essential: no | ||||
| Section: otherosfs                   Priority: optional | ||||
| Installed-Size: 3680                 Source: wine | ||||
| Size: 729818                         Architecture: i386 | ||||
| Distribution: unstable | ||||
| Maintainer: Andrew D. Lenharth <andrewl@debian.org> | ||||
| Description: Windows Emulator (Development files) | ||||
|  This is an ALPHA release of Wine, the MS-Windows emulator.  This is | ||||
|  still a developers release and many applications may still not work. | ||||
|  . | ||||
|  This package consists of the C header files. | ||||
|  . | ||||
|  Wine is often updated. | ||||
| 
 | ||||
| swim: found 1 package(s) | ||||
| Reading Package Lists... | ||||
| Building Dependency Tree... | ||||
| Sorry, libwine-dev is already the newest version | ||||
| 0 packages upgraded, 0 newly installed, 0 to remove and 1067 not upgraded. | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| Sometimes it is nice to know the total of what we have installed. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/usr/X11R6/bin$ swim -qa | ||||
| use --total or -t to see all 1449 packages | ||||
| linuxalive:/usr/X11R6/bin$ swim -qf / | ||||
| use --total or -t to see all 1449 packages | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qan    | ||||
| use --total or -t to see all 4525 packages | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We can check the MD5 checksum for all the configuation files on the system.  Notes:  MD5 | ||||
| checksum can be performed on "-l", "-d", "-c", or "-p."   This can only be performed on the | ||||
| installed system. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/home/swim/SWIMANIA$ swim -qact --md5sum | ||||
| a2ps_4.10.2-4 | ||||
|  /etc/a2ps.cfg  eb909349a1bb2d1f4b4adc7ab1f75e56  OK | ||||
| 
 | ||||
| acct_6.3.2-4 | ||||
|  /etc/cron.daily/acct  d5e16c7f601c3a43d88fc8ede714c6e2  OK | ||||
|  /etc/cron.monthly/acct  9ca2c358e430f94c9ae00a1ce54e6e96  OK | ||||
|  /etc/init.d/acct  2f978d8517077c77e3262d7a6096fe2f  OK | ||||
| 
 | ||||
| autolog_0.34-5 | ||||
|  /etc/autolog.conf  b6ae10782ce13c45cbe72f9308b4caa1  OK | ||||
|  /etc/cron.d/autolog  805d268ea44c645299defc1c14495282  MISSING | ||||
| 
 | ||||
| cfengine_1.4.9-2 | ||||
|  /etc/cfengine/cfengine.conf  fd79d9462e92f88aa6c563f39e3e10d5  OK | ||||
|  /etc/cron.daily/cfengine  ac6a42f3be907b50e52834ae9d41fdbd  FAILED | ||||
|  /etc/cron.weekly/cfengine  fbdd90ecf2e68a4ced6a6abbffd32f62  OK | ||||
| "rest of output not shown" | ||||
| </pre> | ||||
| 
 | ||||
| <p>We check to see what groups exist. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/usr/lib/perl5/SWIM$ swim -q --allgroups | ||||
| "output not shown" | ||||
| linuxalive:/usr/lib/perl5/SWIM$ swim -qn --allgroups | ||||
| admin                     base                      comm | ||||
| contrib/admin             contrib/devel             contrib/doc | ||||
| contrib/games             contrib/graphics          contrib/interpreters | ||||
| contrib/libs              contrib/mail              contrib/math | ||||
| contrib/misc              contrib/net               contrib/news | ||||
| "rest of output not shown" | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We happen to be hamradio enthusiasts.  Let's see what packages exist in the hamradio group. | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/usr/lib/perl5/SWIM$ swim -qng hamradio | ||||
| acfax_981011-3 | ||||
| ax25-apps_0.0.4-1 | ||||
| ax25-tools_0.0.5-1 | ||||
| colrconv_0.99.2-4 | ||||
| dgipip_0.1-2 | ||||
| gc_1.07-3 | ||||
| hamsoft_0.1.1-1 | ||||
| "rest of the output not shown" | ||||
| </pre> | ||||
| 
 | ||||
| <p> | ||||
| We edit the hamradio group package list with "--stdin."  Notes: "--stdin" needs to be | ||||
| called with either "--ftp", "-x", "-xyz", "-xz", "--purge", "-r", or "--remove" to work. This | ||||
| is a readline interface.  If we are in emacs mode (see man bash) here are some commands we can | ||||
| use to make the process easier.  | ||||
| 
 | ||||
| <p> | ||||
| Note: The key bindings may be different on your system. | ||||
| <br>Ctrl-a  =   move to the beginning of the line | ||||
| <br>Ctrl-e  =   move to the end of the line | ||||
| <br>Ctrl-w  =   erase (kill) one word backward | ||||
| <br>Esc-d   =   kill one word forward | ||||
| <br>Esc-b   =   move one word backward  | ||||
| <br>Esc-f   =   move one word forward  | ||||
| <br>Ctrl-k  =   kill forward to the end of the line  | ||||
| <br>Ctrl-y  =   retrieve (yank) last item killed | ||||
| <br>Ctrl-r  =   search backward | ||||
| <br>Esc-<   =   move to the beginning of the history | ||||
| <br>Esc->   =   move to the end of the history  | ||||
| 
 | ||||
| <pre> | ||||
| linuxalive:/usr/lib/perl5/SWIM$ swim -qng hamradio --stdin --ftp   | ||||
| swim: type exit to finish --stdin | ||||
| swim: acfax ax25-apps ax25-tools colrconv dgipip gc hamsoft icom jiffy jiffy-per | ||||
| l-tk libax25 libax25-dev logconv morse nec node p10cfgd pileup predict rspfd sccw twclock twcw | ||||
| twlog unixcw wwl wxd xconvers xnecview z8530-utils z8530-utils2 | ||||
| </pre>  | ||||
| 
 | ||||
| <p> | ||||
| We are finding new ways to swim everyday;  we often solve problems in minutes which used | ||||
| to take an hour or more to solve. If you find a novel use for swim, please tell us, and we | ||||
| will add it to these examples.  | ||||
| 
 | ||||
| </body>                        | ||||
| </html> | ||||
| 
 | ||||
							
								
								
									
										29
									
								
								swimrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								swimrc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| # Read QUICKSTART in /usr/doc/swim for important information and to  | ||||
| # quickly prepare the swimrc, then read the swimrc(5) manpage for more  | ||||
| # enlightenment and configuration options like "Do you want to use apt?", | ||||
| # "How about non-us?". | ||||
| 
 | ||||
| # Which do you have on your system?  Pick dpkg if Debian, ar if non-Debian. | ||||
| #$package_tool = "/usr/bin/dpkg"; | ||||
| #$package_tool = "/usr/bin/ar"; | ||||
| 
 | ||||
| # Do you have apt installed? | ||||
| #$apt = "yes"; | ||||
| 
 | ||||
| # Pick one. | ||||
| #$architecture = "alpha"; | ||||
| #$architecture = "arm"; | ||||
| #$architecture = "hurd-i386"; | ||||
| #$architecture = "i386"; | ||||
| #$architecture = "m68k"; | ||||
| #$architecture = "powerpc"; | ||||
| #$architecture = "sparc"; | ||||
| 
 | ||||
| # Which distribution? Pick one. | ||||
| #$distribution = "stable"; | ||||
| #$distribution = "unstable"; | ||||
| #$distribution = "frozen"; | ||||
| 
 | ||||
| # Remove sections after qw that you do not want. Use non-US for non-us. | ||||
| #@user_defined_section = qw(main contrib non-free); | ||||
| 
 | ||||
							
								
								
									
										402
									
								
								swimrc.5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										402
									
								
								swimrc.5
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,402 @@ | ||||
| .rn '' }` | ||||
| ''' $RCSfile$$Revision$$Date$ | ||||
| ''' | ||||
| ''' $Log$ | ||||
| ''' | ||||
| .de Sh | ||||
| .br | ||||
| .if t .Sp | ||||
| .ne 5 | ||||
| .PP | ||||
| \fB\\$1\fR | ||||
| .PP | ||||
| .. | ||||
| .de Sp | ||||
| .if t .sp .5v | ||||
| .if n .sp | ||||
| .. | ||||
| .de Ip | ||||
| .br | ||||
| .ie \\n(.$>=3 .ne \\$3 | ||||
| .el .ne 3 | ||||
| .IP "\\$1" \\$2 | ||||
| .. | ||||
| .de Vb | ||||
| .ft CW | ||||
| .nf | ||||
| .ne \\$1 | ||||
| .. | ||||
| .de Ve | ||||
| .ft R | ||||
| 
 | ||||
| .fi | ||||
| .. | ||||
| ''' | ||||
| ''' | ||||
| '''     Set up \*(-- to give an unbreakable dash; | ||||
| '''     string Tr holds user defined translation string. | ||||
| '''     Bell System Logo is used as a dummy character. | ||||
| ''' | ||||
| .tr \(*W-|\(bv\*(Tr | ||||
| .ie n \{\ | ||||
| .ds -- \(*W- | ||||
| .ds PI pi | ||||
| .if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch | ||||
| .if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch | ||||
| .ds L" "" | ||||
| .ds R" "" | ||||
| '''   \*(M", \*(S", \*(N" and \*(T" are the equivalent of | ||||
| '''   \*(L" and \*(R", except that they are used on ".xx" lines, | ||||
| '''   such as .IP and .SH, which do another additional levels of | ||||
| '''   double-quote interpretation | ||||
| .ds M" """ | ||||
| .ds S" """ | ||||
| .ds N" """"" | ||||
| .ds T" """"" | ||||
| .ds L' ' | ||||
| .ds R' ' | ||||
| .ds M' ' | ||||
| .ds S' ' | ||||
| .ds N' ' | ||||
| .ds T' ' | ||||
| 'br\} | ||||
| .el\{\ | ||||
| .ds -- \(em\| | ||||
| .tr \*(Tr | ||||
| .ds L" `` | ||||
| .ds R" '' | ||||
| .ds M" `` | ||||
| .ds S" '' | ||||
| .ds N" `` | ||||
| .ds T" '' | ||||
| .ds L' ` | ||||
| .ds R' ' | ||||
| .ds M' ` | ||||
| .ds S' ' | ||||
| .ds N' ` | ||||
| .ds T' ' | ||||
| .ds PI \(*p | ||||
| 'br\} | ||||
| .\"	If the F register is turned on, we'll generate | ||||
| .\"	index entries out stderr for the following things: | ||||
| .\"		TH	Title  | ||||
| .\"		SH	Header | ||||
| .\"		Sh	Subsection  | ||||
| .\"		Ip	Item | ||||
| .\"		X<>	Xref  (embedded | ||||
| .\"	Of course, you have to process the output yourself | ||||
| .\"	in some meaninful fashion. | ||||
| .if \nF \{ | ||||
| .de IX | ||||
| .tm Index:\\$1\t\\n%\t"\\$2" | ||||
| .. | ||||
| .nr % 0 | ||||
| .rr F | ||||
| .\} | ||||
| .TH swimrc 5 " " "27/May/99" " " | ||||
| .UC | ||||
| .if n .hy 0 | ||||
| .if n .na | ||||
| .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' | ||||
| .de CQ          \" put $1 in typewriter font | ||||
| .ft CW | ||||
| 'if n "\c | ||||
| 'if t \\&\\$1\c | ||||
| 'if n \\&\\$1\c | ||||
| 'if n \&" | ||||
| \\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 | ||||
| '.ft R | ||||
| .. | ||||
| .\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 | ||||
| .	\" AM - accent mark definitions | ||||
| .bd B 3 | ||||
| .	\" fudge factors for nroff and troff | ||||
| .if n \{\ | ||||
| .	ds #H 0 | ||||
| .	ds #V .8m | ||||
| .	ds #F .3m | ||||
| .	ds #[ \f1 | ||||
| .	ds #] \fP | ||||
| .\} | ||||
| .if t \{\ | ||||
| .	ds #H ((1u-(\\\\n(.fu%2u))*.13m) | ||||
| .	ds #V .6m | ||||
| .	ds #F 0 | ||||
| .	ds #[ \& | ||||
| .	ds #] \& | ||||
| .\} | ||||
| .	\" simple accents for nroff and troff | ||||
| .if n \{\ | ||||
| .	ds ' \& | ||||
| .	ds ` \& | ||||
| .	ds ^ \& | ||||
| .	ds , \& | ||||
| .	ds ~ ~ | ||||
| .	ds ? ? | ||||
| .	ds ! ! | ||||
| .	ds / | ||||
| .	ds q | ||||
| .\} | ||||
| .if t \{\ | ||||
| .	ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" | ||||
| .	ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' | ||||
| .	ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' | ||||
| .	ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' | ||||
| .	ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' | ||||
| .	ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' | ||||
| .	ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' | ||||
| .	ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' | ||||
| .	ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' | ||||
| .\} | ||||
| .	\" troff and (daisy-wheel) nroff accents | ||||
| .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' | ||||
| .ds 8 \h'\*(#H'\(*b\h'-\*(#H' | ||||
| .ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] | ||||
| .ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' | ||||
| .ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' | ||||
| .ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] | ||||
| .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] | ||||
| .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' | ||||
| .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' | ||||
| .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] | ||||
| .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] | ||||
| .ds ae a\h'-(\w'a'u*4/10)'e | ||||
| .ds Ae A\h'-(\w'A'u*4/10)'E | ||||
| .ds oe o\h'-(\w'o'u*4/10)'e | ||||
| .ds Oe O\h'-(\w'O'u*4/10)'E | ||||
| .	\" corrections for vroff | ||||
| .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' | ||||
| .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' | ||||
| .	\" for low resolution devices (crt and lpr) | ||||
| .if \n(.H>23 .if \n(.V>19 \ | ||||
| \{\ | ||||
| .	ds : e | ||||
| .	ds 8 ss | ||||
| .	ds v \h'-1'\o'\(aa\(ga' | ||||
| .	ds _ \h'-1'^ | ||||
| .	ds . \h'-1'. | ||||
| .	ds 3 3 | ||||
| .	ds o a | ||||
| .	ds d- d\h'-1'\(ga | ||||
| .	ds D- D\h'-1'\(hy | ||||
| .	ds th \o'bp' | ||||
| .	ds Th \o'LP' | ||||
| .	ds ae ae | ||||
| .	ds Ae AE | ||||
| .	ds oe oe | ||||
| .	ds Oe OE | ||||
| .\} | ||||
| .rm #[ #] #H #V #F C | ||||
| .SH "NAME" | ||||
| swimrc \- swim configuration file | ||||
| .SH "DESCRIPTION" | ||||
| \fBswimrc\fR is the configuartion file for swim allowing many default values | ||||
| to be set so that they do not have to be mentioned on the command line.  | ||||
| Swimrc interacts directly with Perl allowing a wide variety of variables | ||||
| found in \fBSWIW::Conf\fR to be altered. | ||||
| .SH "USAGE" | ||||
| Values for variable can be altered for \fBswim\fR by assigning different | ||||
| values enclosed in quotes or quoted whitespace (\fIqw()\fR), and ended with a | ||||
| semi-colon. | ||||
| .PP | ||||
| .Vb 2 | ||||
| \& $variable = "value"; | ||||
| \& $variable = "qw(value1 value2 ..)"; | ||||
| .Ve | ||||
| .SH "VARIABLES" | ||||
| This is a list of variables with explanations.  The default values for | ||||
| \fBswim\fR are shown. | ||||
| .Sh "\s-1OUTPUT\s0 \s-1VARIABLE\s0 " | ||||
| $my_number can be changed to how many lines you would like \*(L"swim \-qf <>\*(R"  | ||||
| to print out, before the program asks for \f(CW-t\fR or \f(CW--total\fR.  Exception:  | ||||
| If \f(CW-i\fR is used in the query and there is more than one package then the | ||||
| total will be presented.  | ||||
| .PP | ||||
| Hint:  \f(CW-t\fR can be used with all the various \f(CW--scripts\fR family members | ||||
| to view the title of the script file regardless of this variable setting, | ||||
| and if \f(CW-t\fR has to be used, the titles will be displayed, which makes | ||||
| sense.  | ||||
| .PP | ||||
| \fB$my_number = 23;\fR | ||||
| .Sh "\s-1HISTORY\s0" | ||||
| This is a shell-like history kept in relation to searches and the most | ||||
| recent edit when \f(CW--stdin\fR is used.  | ||||
| .PP | ||||
| \fB$\s-1HISTORY\s0 = 10;\fR | ||||
| .Sh "\s-1AR\s0 or \s-1DPKG\s0?" | ||||
| Debian packages are ar archives.  If you are using a Debian Distribution | ||||
| assign \*(L"dpkg\*(R" to \f(CW$package_tool\fR, otherwise assign \*(L"ar\*(R" to \f(CW$package_tool\fR. | ||||
| .PP | ||||
| \fB$package_tool = \*(L"/usr/bin/ar\*(R";\fR | ||||
| .Sh "\s-1APT\s0" | ||||
| \fBSwim\fR does not assign a value for apt.  To use \f(CW--apt\fR and \f(CW-xyz\fR | ||||
| assign \f(CW$apt\fR the value \*(L"yes\*(R".  | ||||
| .PP | ||||
| Example: \fB$apt = \*(L"yes\*(R";\fR | ||||
| .Sh "\s-1PAGER\s0" | ||||
| less is a nice pager, unless you like more!  Pager is used for \f(CW--help\fR | ||||
| and \fBswim\fR called without any options. There is an option \f(CW--nopager\fR or | ||||
| \f(CW-n\fR.  more comes from the required package util-linux, whereas less | ||||
| comes from a standard package called less.  Values: \*(L"less\*(R", \*(L"more\*(R", or | ||||
| \*(L"most\*(R" or...  | ||||
| .PP | ||||
| \fB$\s-1ENV\s0{\s-1PAGER\s0} = \*(L"less\*(R";\fR | ||||
| .Sh "\s-1NOT\s0\-\s-1INSTALLED\s0 \s-1VARIABLES\s0 " | ||||
| Assign values for \f(CW$architecture\fR and/or \f(CW$distribution\fR to avoid having to | ||||
| use \f(CW--arch\fR and \f(CW--dists\fR everytime the not-installed databases are | ||||
| accessed with \f(CW-n\fR or made or altered. | ||||
| .PP | ||||
| Architectures are always being added so check with Debian to find a list.  | ||||
| There is \fIalpha, arm, hurd-i386 (alternative kernel to linux), i386, | ||||
| m68k, powerpc, sparc\fR.  Just use the arch found after the hyphen in the | ||||
| Contents-(arch) file. | ||||
| .PP | ||||
| \fB$architecture = \*(L"i386\*(R";\fR | ||||
| .PP | ||||
| The distribution can be either \fIstable, unstable, frozen, or experimental | ||||
| (rare)\fR.  These represent the state of development that the packages are | ||||
| under.  The unstable distribution can have lot's of changes within a very | ||||
| short time period, and frozen may or may not be available. | ||||
| .PP | ||||
| \fB$distribution = \*(L"unstable\*(R";\fR | ||||
| .PP | ||||
| Distributions are divided into sections.  These sections were called | ||||
| distributions in the version 2.4.1.0 packaging manual, because they were | ||||
| at one time separate distributions, but this has since changed.   | ||||
| .PP | ||||
| You can determine which of the sections \fImain, non-free, contrib or | ||||
| non-\s-1US\s0\fR to pull out of the Contents file if you don't want to use | ||||
| \f(CW--main\fR, \f(CW--contrib\fR, \f(CW--non-free\fR, and \f(CW--non-us\fR to selectively | ||||
| pick the sections.  | ||||
| .PP | ||||
| For efficiency, you should choose the sections which you will be pulling | ||||
| out of the Packages \fIfile\fR\|(s) being targetted.   | ||||
| .PP | ||||
| Rule: Use \*(L"non-\s-1US\s0\*(R" not \*(L"non-us\*(R". | ||||
| .PP | ||||
| \fB@user_defined_section = qw(main contrib non-free non-\s-1US\s0);\fR | ||||
| .Sh "\s-1DF\s0 \s-1LOCATION\s0" | ||||
| A little philosophy:  \fBswim\fR was developed for maximum versatility, so | ||||
| whether you are just interested in researching, and keeping tabs on the | ||||
| newest packages, or maintaining a Debian virtual distribution on a | ||||
| non-Debian distribution, or you are a using \fBswim\fR for distribution | ||||
| development, \fBswim\fR provides a way.   | ||||
| .PP | ||||
| The next two variables determine the location of the \s-1DF\s0 (default | ||||
| directory/file system) | ||||
| .PP | ||||
| The default directory keeps track of Contents and/or Packages databases | ||||
| retrieved with --ftp.  The Contents and Packages databases and Release | ||||
| file are give names specific to the distribution and architectures they | ||||
| represent using the naming convention found in apt's sources directory.  | ||||
| You also have the freedom not to use the default directory, in which case | ||||
| swim will still do the renaming and keeping track of the mtime, but you | ||||
| will have to remember where you put the files. | ||||
| .PP | ||||
| \fB$default_directory = \*(L'/root/.swim\*(R';\fR | ||||
| .PP | ||||
| The default root directory (\s-1DRD\s0) is the key to easy management of binary | ||||
| packages, source, dsc, and diff files received from --ftp, and provides an | ||||
| easy way to put together a personalized distribution. This directory can | ||||
| be a real ftp site on your computer, or put wherever else you are | ||||
| allowed to have directories.  The \s-1DRD\s0 is always placed below the value | ||||
| assigned to \f(CW$default_directory\fR.  According to the previous assignment to  | ||||
| \f(CW$default_directory\fR, if the \s-1DRD\s0 is \*(L"/pub/a/debian\*(R" then the full path | ||||
| would be \*(L"/root/.swim/pub/a/debian\*(R".  | ||||
| .PP | ||||
| Example: When a package is downloaded it will be placed in | ||||
| dists/distribution/section/architecture/subject below the \s-1DRD\s0.  | ||||
| .PP | ||||
| Rule: debian must be the final directory before dists, this is because | ||||
| other distributions are placed alongside debian, like debian-non-\s-1US\s0 or | ||||
| personal (specialized distribution). | ||||
| .PP | ||||
| \fB$default_root_directory = \*(L'/pub/debian\*(R';\fR | ||||
| .PP | ||||
| Because you may be using a real ftp site, this variable allows you to | ||||
| determine what permissions \fBswim\fR will assign for directories it creates | ||||
| below the \s-1DRD\s0.  | ||||
| .PP | ||||
| \fB$permission = \*(L'0755\*(R';\fR | ||||
| .Sh "\s-1TEMPORARY\s0 \s-1DIRECTORY\s0" | ||||
| If you want to set an alternative directory for the temporary files | ||||
| created when the databases are made, change here.  You may want to make | ||||
| \f(CW$tmp\fR a \s-1RAM\s0 disk.  See package loadlin for initrd documentation and an | ||||
| explanation for making such a disk.  There is also documentation in | ||||
| /usr/src/kernel-source.version/Documentation.  Whether this will speed | ||||
| things up is a subject of experimentation.  | ||||
| .PP | ||||
| \fB$tmp = \*(L"/tmp\*(R";\fR | ||||
| .Sh "\s-1FTP\s0" | ||||
| You can alter the Firewall, Port, Timeout, Debug and Passive | ||||
| characteristics of the ftp client as defined in \fINet::\s-1FTP\s0\fR\|(3pm) by providing | ||||
| arguments to these variables. All variables but \f(CW$timeout\fR are set to untrue | ||||
| by default.   | ||||
| .PP | ||||
| .Vb 5 | ||||
| \& $firewall = 0; (FTP firewall machine name) | ||||
| \& $port = 0;  (defaults to 23) | ||||
| \& $timeout = 120;  (120 seconds) | ||||
| \& $debug = 0;  (1 will turn on STDERR) | ||||
| \& $passive = 0; (1 will enable) | ||||
| .Ve | ||||
| .SH "OTHER VARIABLES" | ||||
| see SWIM::Conf | ||||
| .SH "FILES" | ||||
| .PP | ||||
| .Vb 2 | ||||
| \& /etc/swim/swimrc | ||||
| \& ~/.swim/swimrc | ||||
| .Ve | ||||
| .SH "SEE ALSO" | ||||
| \fIswim\fR\|(8), \fINet::FTP\fR\|(3pm) | ||||
| .SH "BUGS" | ||||
| Send directly to mttrader@access.mountain.net. | ||||
| .SH "AUTHOR" | ||||
| Jonathan D. Rosenbaum <mttrader@access.mountain.net>  | ||||
| .SH "COPYRIGHT" | ||||
| Copyright (c) 1999 Jonathan Rosenbaum. All rights reserved. This program | ||||
| is free software; you can redistribute it and/or modify it under the GPL.  | ||||
| 
 | ||||
| .rn }` '' | ||||
| .IX Title "swimrc 5" | ||||
| .IX Name "swimrc - swim configuration file" | ||||
| 
 | ||||
| .IX Header "NAME" | ||||
| 
 | ||||
| .IX Header "DESCRIPTION" | ||||
| 
 | ||||
| .IX Header "USAGE" | ||||
| 
 | ||||
| .IX Header "VARIABLES" | ||||
| 
 | ||||
| .IX Subsection "\s-1OUTPUT\s0 \s-1VARIABLE\s0 " | ||||
| 
 | ||||
| .IX Subsection "\s-1HISTORY\s0" | ||||
| 
 | ||||
| .IX Subsection "\s-1AR\s0 or \s-1DPKG\s0?" | ||||
| 
 | ||||
| .IX Subsection "\s-1APT\s0" | ||||
| 
 | ||||
| .IX Subsection "\s-1PAGER\s0" | ||||
| 
 | ||||
| .IX Subsection "\s-1NOT\s0\-\s-1INSTALLED\s0 \s-1VARIABLES\s0 " | ||||
| 
 | ||||
| .IX Subsection "\s-1DF\s0 \s-1LOCATION\s0" | ||||
| 
 | ||||
| .IX Subsection "\s-1TEMPORARY\s0 \s-1DIRECTORY\s0" | ||||
| 
 | ||||
| .IX Subsection "\s-1FTP\s0" | ||||
| 
 | ||||
| .IX Header "OTHER VARIABLES" | ||||
| 
 | ||||
| .IX Header "FILES" | ||||
| 
 | ||||
| .IX Header "SEE ALSO" | ||||
| 
 | ||||
| .IX Header "BUGS" | ||||
| 
 | ||||
| .IX Header "AUTHOR" | ||||
| 
 | ||||
| .IX Header "COPYRIGHT" | ||||
| 
 | ||||
							
								
								
									
										26
									
								
								swimrc.html/ch-description.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								swimrc.html/ch-description.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file - DESCRIPTION | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swimrc - swim configuration file - chapter 1<br> | ||||
| DESCRIPTION | ||||
| 
 | ||||
| </h1> | ||||
| 
 | ||||
| <kbd>swimrc</kbd> is the configuartion file for swim allowing many | ||||
| default values to be set so that they do not have to be mentioned on the | ||||
| command line. Swimrc interacts directly with Perl allowing a wide variety | ||||
| of variables found in <kbd>SWIW::Conf</kbd> to be altered.  | ||||
| <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-usage.html">next</A>. | ||||
| <br> | ||||
| <address>27 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										26
									
								
								swimrc.html/ch-files.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								swimrc.html/ch-files.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file - FILES                                                         | ||||
|                 </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swimrc - swim configuration file - chapter 5<br> | ||||
| FILES                                                         | ||||
|                  | ||||
| </h1> | ||||
|                                                                  | ||||
| <code> /etc/swim/swimrc</code><P> | ||||
|                                                             | ||||
| <code>~/.swim/swimrc</code> | ||||
| 
 | ||||
| <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch6.html">next</A>; <A href="ch-othervars.html">back</A>. | ||||
| <br> | ||||
| <address>27 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										23
									
								
								swimrc.html/ch-othervars.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								swimrc.html/ch-othervars.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file - OTHER VARIABLES                                               | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swimrc - swim configuration file - chapter 4<br> | ||||
| OTHER VARIABLES                                               | ||||
| 
 | ||||
| </h1> | ||||
|                                                                                  | ||||
| see SWIM::Conf    | ||||
| <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-files.html">next</A>; <A href="ch-variables.html">back</A>. | ||||
| <br> | ||||
| <address>27 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										35
									
								
								swimrc.html/ch-restrictions.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								swimrc.html/ch-restrictions.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file - RESTRICTIONS                                                  | ||||
|                        </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swimrc - swim configuration file - chapter 6<br> | ||||
| RESTRICTIONS                                                  | ||||
|                         | ||||
| </h1> | ||||
|                                                           | ||||
| Strange Situations: If the same package happens to exist in two different | ||||
| sections, <em>main and non-us</em> for example, and you make the | ||||
| databases, you will still be able to find this package in the non-us | ||||
| group, but its section and locations will be the one which main recognizes | ||||
| assuming that you use the order in the example below.  | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| Example: You just want to pull out main and contrib every time you run           | ||||
| <code>--initndb</code>, <code>--rebuildndb</code>, or <code>--ndb</code>.                    | ||||
| <P> | ||||
| <code>@user_defined_section</code> = <code>``qw(main contrib non-US)'';</code>               | ||||
| <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-files.html">back</A>. | ||||
| <br> | ||||
| <address>14 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										29
									
								
								swimrc.html/ch-usage.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								swimrc.html/ch-usage.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file - USAGE | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swimrc - swim configuration file - chapter 2<br> | ||||
| USAGE | ||||
| 
 | ||||
| </h1> | ||||
| Values for variable can be altered for <strong>swim</strong> by assigning | ||||
| different values enclosed in quotes or quoted whitespace (qw()), and ending | ||||
| with a semi-colon. <P> | ||||
| 
 | ||||
| <code> $variable = ``value'';</code><P> | ||||
| <code>$variable = ``(value1 value2 ..)'';</code> | ||||
| <P> | ||||
| <P> | ||||
| <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-variables.html">next</A>; <A href="ch-description.html">back</A>. | ||||
| <br> | ||||
| <address>27 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										284
									
								
								swimrc.html/ch-variables.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								swimrc.html/ch-variables.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,284 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file - VARIABLES | ||||
| </title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swimrc - swim configuration file - chapter 3<br> | ||||
| VARIABLES | ||||
| 
 | ||||
| </h1> | ||||
| This is a list of variables with explanations. The default values for | ||||
| <strong>swim</strong> are shown. | ||||
| 
 | ||||
| 
 | ||||
| <hr> | ||||
| <h2><A name="s3.1"> | ||||
| 3.1 OUTPUT VARIABLE  | ||||
| 
 | ||||
| </A></h2> | ||||
| <code>$my_number</code> can be changed to how many lines you would like | ||||
| ``swim -qf <>'' to print out, before the program asks for | ||||
| <code>-t</code> or <code>--total</code>. Exception: If <code>-i</code> is | ||||
| used in the query and there is more than one package then the total will | ||||
| be presented. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| Hint:  <code>-t</code> can be used with all the various | ||||
| <code>--scripts</code> family members to view the title of the script file | ||||
| regardless of this variable setting, and if <code>-t</code> has to be | ||||
| used, the titles will be displayed, which makes sense. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>$my_number = 23;</strong> | ||||
| 
 | ||||
| <hr> | ||||
| <h2><A name="s3.2"> | ||||
| 3.2 HISTORY | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| This is a shell-like history kept in relation to searches and the most | ||||
| recent edit when <code>--stdin</code> is used. | ||||
| <P> | ||||
| 
 | ||||
| <strong>$HISTORY = 10;</strong> | ||||
| 
 | ||||
| <hr> | ||||
| <h2><A name="s3.3"> | ||||
| 3.3 AR or DPKG?                                                   | ||||
|        | ||||
| </A></h2> | ||||
|                                                                            | ||||
| Debian packages are ar archives. If you are using a Debian Distribution          | ||||
| assign ``dpkg'' to $package_tool, otherwise assign ``ar'' to                     | ||||
| $package_tool.                                                                   | ||||
|                                                                           <P> | ||||
|                                                                                  | ||||
| <strong>$package_tool = "/usr/bin/ar";</strong>    | ||||
| <hr> | ||||
| <h2><A name="s3.4"> | ||||
| 3.4 APT                                                           | ||||
| 
 | ||||
| </A></h2> | ||||
|                                                                                  | ||||
| <strong>Swim</strong> does not assign a value for apt. To use                    | ||||
| <code>--apt</code> and <code>-xyz</code> assign <code>$apt</code> the                        | ||||
| value ``yes''.                                                                   | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| Example: <strong>$apt = "yes";</strong> | ||||
| <hr> | ||||
| <h2><A name="s3.5"> | ||||
| 3.5 PAGER                                                         | ||||
|       | ||||
| </A></h2> | ||||
|                                                                             | ||||
| 
 | ||||
| <strong>less</strong> is a nice pager, unless you like | ||||
| <strong>more</strong>! Pager is used for <code>--help</code> and | ||||
| <strong>swim</strong> called without any options. There is an option | ||||
| <code>--nopager</code> or <code>-n</code>. <strong>more</strong> comes from the | ||||
| required package util-linux, whereas <strong>less</strong> comes from a | ||||
| standard package called less.  Values: ``less'', ``more'', or ``most'' | ||||
| or...  | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>$ENV{PAGER} = "less";</strong> | ||||
| <hr> | ||||
| <h2><A name="s3.6"> | ||||
| 3.6 NOT-INSTALLED VARIABLES                                       | ||||
|     | ||||
| </A></h2> | ||||
|                                                                               | ||||
| Assign values for <code>$architecture</code> and/or                                  | ||||
| <code>$distribution</code> to avoid having to use <code>--arch</code> and                | ||||
| <code>--dists</code> everytime the not-installed databases are accessed              | ||||
| with <code>-n</code> or made or altered.                                             | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| Architectures are always being added so check with Debian to find a list.        | ||||
| There is <em>alpha, arm, hurd-i386 (alternative kernel to linux), i386,          | ||||
| m68k, powerpc, sparc</em>. Just use the arch found after the hyphen in the       | ||||
| Contents-(arch) file.                                                            | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>$architecture = "i386";</strong>  | ||||
| <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| The distribution can be either <em>stable, unstable, frozen, or | ||||
| experimental (rare)</em>. These represent the state of development that | ||||
| the packages are under. The unstable distribution can have lot's of | ||||
| changes within a very short time period, and frozen may or may not be | ||||
| available.  | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>$distribution = "unstable";</strong>     | ||||
| <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| Distributions are divided into sections. These sections were called              | ||||
| distributions in the version 2.4.1.0 packaging manual, because they were | ||||
| at      | ||||
| one time separate distributions, but this has since changed.                     | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| You can determine which of the sections <em>main, non-free, contrib or           | ||||
| non-US</em> to pull out of the Contents file if you don't want to use            | ||||
| <code>--main</code>, <code>--contrib</code>, <code>--non-free</code>, and                    | ||||
| <code>--non-us</code> to selectively pick the sections.                              | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| For efficiency, you should choose the sections which you will be pulling         | ||||
| out of the Packages <code>file(s)</code> being targetted.                            | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
| 
 | ||||
| 
 | ||||
| Rule: Use ``non-US'' not ``non-us''.                                             | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>@user_defined_section = qw(main contrib non-free non-US);</strong>       | ||||
|     | ||||
| <hr> | ||||
| <h2><A name="s3.7"> | ||||
| 3.7 DF LOCATION                                                   | ||||
| 
 | ||||
| </A></h2> | ||||
|                                                                                  | ||||
| A little philosophy:  <strong>swim</strong> was developed for maximum            | ||||
| versatility, so whether you are just interested in researching, and              | ||||
| keeping tabs on the newest packages, or maintaining a Debian virtual             | ||||
| distribution on a non-Debian distribution, or you are a using                    | ||||
| <strong>swim</strong> for distribution development, <strong>swim</strong>        | ||||
| provides a way.                                                                  | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| The next two variables determine the location of the DF (default                 | ||||
| directory/file system)                                                           | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| The default directory keeps track of Contents and/or Packages databases | ||||
| retrieved with --ftp. The Contents and Packages databases and Release file | ||||
| are give names specific to the distribution and architectures they | ||||
| represent using the naming convention found in apt's sources directory.  | ||||
| You also have the freedom not to use the default directory, in which case | ||||
| swim | ||||
| 
 | ||||
| will still do the renaming and keeping track of the mtime, but you will          | ||||
| have to remember where you put the files.                                        | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>$default_directory = '/root/.swim';</strong>                             | ||||
|                                                                                  | ||||
|                                                                                  | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| The default root directory (DRD) is the key to easy management of binary         | ||||
| packages, source, dsc, and diff files received from --ftp, and provides an       | ||||
| easy way to put together a personalized distribution. This directory can | ||||
| be      | ||||
| a real ftp site on your computer, or put wherever else you are allowed to        | ||||
| have directories. The DRD is always placed below the value assigned to           | ||||
| $default_directory. According to the previous assignment to                      | ||||
| $default_directory, if the DRD is ``/pub/a/debian'' then the full path           | ||||
| would be ``/root/.swim/pub/a/debian''.    | ||||
| <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| Example: When a package is downloaded it will be placed in                       | ||||
| dists/distribution/section/architecture/subject below the DRD.                   | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| Rule: debian must be the final directory before dists, this is because           | ||||
| other distributions are placed alongside debian, like debian-non-US or           | ||||
| personal (specialized distribution).                                             | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>$default_root_directory = '/pub/debian';</strong>                        | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| Because you may be using a real ftp site, this variable allows you to            | ||||
| determine what permissions <strong>swim</strong> will assign for | ||||
| directories it  | ||||
| creates below the DRD.                                                           | ||||
|                                                                                  | ||||
|                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>$permission = '0755';</strong>                                                                                                 | ||||
|                                                                                  | ||||
|      <hr> | ||||
| <h2><A name="s3.8"> | ||||
| 3.8 TEMPORARY DIRECTORY                                           | ||||
|                                                                                  | ||||
| </A></h2> | ||||
| If you want to set an alternative directory for the temporary files | ||||
| created when the databases are made, change here. You may want to make | ||||
| <code>$tmp</code> a RAM disk. See package loadlin for initrd documentation and | ||||
| an explanation for making such a disk. There is also documentation in | ||||
| /usr/src/kernel-source.version/Documentation. Whether this will speed | ||||
| things up is a subject of experimentation.  | ||||
|                                                                                                                                                                 <P> | ||||
|                                                                               | ||||
|                                                                                  | ||||
| <strong>$tmp = "/tmp";</strong>                                                                              | ||||
| <hr> | ||||
| <h2><A name="s3.9"> | ||||
| 3.9 FTP | ||||
| 
 | ||||
| </A></h2> | ||||
| 
 | ||||
| You can alter the Firewall, Port, Timeout, Debug and Passive | ||||
| characteristics of the ftp client as defined in Net::FTP(3pm) by providing | ||||
| arguments to these variables. All variables but $timeout are set to untrue | ||||
| by default.  | ||||
|   | ||||
| <pre> $firewall = 0; (FTP firewall machine name) | ||||
|  $port = 0;  (defaults to 23)    | ||||
|  $timeout = 120;  (120 seconds) | ||||
|  $debug = 0;  (1 will turn on STDERR) | ||||
|  $passive = 0; (1 will enable)</pre> | ||||
| <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-othervars.html">next</A>; <A href="ch-usage.html">back</A>. | ||||
| <br> | ||||
| <address>27 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										20
									
								
								swimrc.html/ch6.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								swimrc.html/ch6.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file - BUGS</title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1> | ||||
| swimrc - swim configuration file - chapter 6<br> | ||||
| BUGS | ||||
| </h1> | ||||
| Send directly to mttrader@access.mountain.net. | ||||
| <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="index.html#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="index.html#toc">Contents</A>; <A href="ch-files.html">back</A>. | ||||
| <br> | ||||
| <address>27 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										76
									
								
								swimrc.html/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								swimrc.html/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| <html><head> | ||||
| <title>swimrc - swim configuration file</title> | ||||
| <link rev=made href="mailto:mttrader@access.mountain.net"> | ||||
| </head><body> | ||||
| <h1>swimrc - swim configuration file</h1> | ||||
| 
 | ||||
| <h2><A name="toc"> | ||||
| 0.1 Table of contents | ||||
| </A></h2> | ||||
| <ul> | ||||
| <li><A href="ch-description.html">1 DESCRIPTION | ||||
| </A> | ||||
| <li><A href="ch-usage.html">2 USAGE | ||||
| </A> | ||||
| <li><A href="ch-variables.html">3 VARIABLES | ||||
| </A> | ||||
| <ul> | ||||
| <li><A href="ch-variables.html#s3.1">3.1</A> OUTPUT VARIABLE  | ||||
| 
 | ||||
| <li><A href="ch-variables.html#s3.2">3.2</A> HISTORY | ||||
| 
 | ||||
| <li><A href="ch-variables.html#s3.3">3.3</A> AR or DPKG?                                                   | ||||
|        | ||||
| <li><A href="ch-variables.html#s3.4">3.4</A> APT                                                           | ||||
| 
 | ||||
| <li><A href="ch-variables.html#s3.5">3.5</A> PAGER                                                         | ||||
|       | ||||
| <li><A href="ch-variables.html#s3.6">3.6</A> NOT-INSTALLED VARIABLES                                       | ||||
|     | ||||
| <li><A href="ch-variables.html#s3.7">3.7</A> DF LOCATION                                                   | ||||
| 
 | ||||
| <li><A href="ch-variables.html#s3.8">3.8</A> TEMPORARY DIRECTORY                                           | ||||
|                                                                                  | ||||
| <li><A href="ch-variables.html#s3.9">3.9</A> FTP | ||||
| 
 | ||||
| </ul> | ||||
| <li><A href="ch-othervars.html">4 OTHER VARIABLES                                               | ||||
| </A> | ||||
| <li><A href="ch-files.html">5 FILES                                                         | ||||
|                 </A> | ||||
| <li><A href="ch6.html">6 BUGS</A> | ||||
| </ul> | ||||
| <hr><h2><A name="copyright">0.2 Copyright</A></h2> | ||||
|                                                        | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         <P> | ||||
|                                                                       | ||||
|           SWIM, including this manual, is free software; you           | ||||
|           may redistribute it and/or modify it under the terms of the            | ||||
|           GNU General Public License as published by the Free Software           | ||||
|           Foundation; either version 2, or (at your option) any later            | ||||
|           version.                                                               | ||||
|         <P> | ||||
|                                                                       | ||||
|           This is distributed in the hope that it will be useful, but            | ||||
|           <em>without any warranty</em>; without even the implied                | ||||
|           warranty of merchantability or fitness for a particular                | ||||
|           purpose.  See the GNU General Public License for more                  | ||||
|           details.                                                               | ||||
|         <P> | ||||
|                                                                       | ||||
|           You should have received a copy of the GNU General Public              | ||||
|           License with the <kbd>swim</kbd> source as the file                       | ||||
|           <code>COPYING</code>.  If not, write to the Free Software                  | ||||
|           Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.              | ||||
|         <hr> | ||||
| swimrc - swim configuration file | ||||
| - <A href="#copyright">                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </A> | ||||
| <br> | ||||
| <A href="#toc">Contents</A>. | ||||
| <br> | ||||
| <address>27 May 1999<br> | ||||
| Jonathan D. Rosenbaum<A href="mailto:mttrader@access.mountain.net">mttrader@access.mountain.net</A></address> | ||||
| </body></html> | ||||
							
								
								
									
										354
									
								
								swimrc.sgml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										354
									
								
								swimrc.sgml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,354 @@ | ||||
| <!doctype debiandoc system> | ||||
|                                                                                  | ||||
| <debiandoc> | ||||
|                                                                                  | ||||
|   <book> | ||||
|                                                                                  | ||||
|     <titlepag> | ||||
|                                                                                  | ||||
|       <title>swimrc - swim configuration file</title> | ||||
|                                                                                  | ||||
|       <author> | ||||
|         <name>Jonathan D. Rosenbaum</name> | ||||
|         <email>mttrader@access.mountain.net</email> | ||||
|       </author> | ||||
|                                                                                  | ||||
|       <version><date></version>                                                  | ||||
|                                                                                  | ||||
|       <copyright>                    | ||||
| 
 | ||||
|         <copyrightsummary>                                                       | ||||
|           Copyright © 1999 Jonathan D. Rosenbaum                            | ||||
|         </copyrightsummary>                                                      | ||||
|                                                                                  | ||||
|         <p>                                                                      | ||||
|           SWIM, including this manual, is free software; you           | ||||
|           may redistribute it and/or modify it under the terms of the            | ||||
|           GNU General Public License as published by the Free Software           | ||||
|           Foundation; either version 2, or (at your option) any later            | ||||
|           version.                                                               | ||||
|         </p>           | ||||
| 
 | ||||
|         <p>                                                                      | ||||
|           This is distributed in the hope that it will be useful, but            | ||||
|           <em>without any warranty</em>; without even the implied                | ||||
|           warranty of merchantability or fitness for a particular                | ||||
|           purpose.  See the GNU General Public License for more                  | ||||
|           details.                                                               | ||||
|         </p> | ||||
| 
 | ||||
|         <p>                                                                      | ||||
|           You should have received a copy of the GNU General Public              | ||||
|           License with the <prgn>swim</prgn> source as the file                       | ||||
|           <tt>COPYING</tt>.  If not, write to the Free Software                  | ||||
|           Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.              | ||||
|         </p>                                                                     | ||||
|                                                                                  | ||||
|       </copyright>                                                               | ||||
|                                                                                  | ||||
|     </titlepag>        | ||||
| 
 | ||||
|     <toc sect> | ||||
| 
 | ||||
|     <chapt id="description">DESCRIPTION | ||||
| 
 | ||||
| <p> | ||||
| 
 | ||||
| <prgn>swimrc</prgn> is the configuartion file for swim allowing many | ||||
| default values to be set so that they do not have to be mentioned on the | ||||
| command line. Swimrc interacts directly with Perl allowing a wide variety | ||||
| of variables found in <prgn>SWIW::Conf</prgn> to be altered.  | ||||
| 
 | ||||
| <chapt id="usage">USAGE | ||||
| 
 | ||||
| <p> | ||||
| Values for variable can be altered for <STRONG>swim</STRONG> by assigning | ||||
| different values enclosed in quotes or quoted whitespace (qw()), and ending | ||||
| with a semi-colon.  | ||||
| <P> | ||||
| 
 | ||||
| <tt> $variable = ``value'';</tt> | ||||
| <p> | ||||
| <tt>$variable = ``(value1 value2 ..)'';</tt> | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <P> | ||||
| <chapt id="variables">VARIABLES | ||||
| 
 | ||||
| <p> | ||||
| This is a list of variables with explanations. The default values for | ||||
| <STRONG>swim</STRONG> are shown. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <sect>OUTPUT VARIABLE  | ||||
| 
 | ||||
| <p> | ||||
| <tt>$my_number</tt> can be changed to how many lines you would like | ||||
| ``swim -qf <>'' to print out, before the program asks for | ||||
| <tt>-t</tt> or <tt>--total</tt>. Exception: If <tt>-i</tt> is | ||||
| used in the query and there is more than one package then the total will | ||||
| be presented. | ||||
| 
 | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| Hint:  <tt>-t</tt> can be used with all the various | ||||
| <tt>--scripts</tt> family members to view the title of the script file | ||||
| regardless of this variable setting, and if <tt>-t</tt> has to be | ||||
| used, the titles will be displayed, which makes sense. | ||||
| 
 | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>$my_number = 23;</strong> | ||||
| 
 | ||||
| 
 | ||||
| <sect>HISTORY | ||||
| 
 | ||||
| <p> | ||||
| 
 | ||||
| This is a shell-like history kept in relation to searches and the most | ||||
| recent edit when <tt>--stdin</tt> is used. | ||||
| 
 | ||||
| <P> | ||||
| 
 | ||||
| <strong>$HISTORY = 10;</strong> | ||||
| 
 | ||||
| 
 | ||||
| <sect>AR or DPKG?                                                   | ||||
|        | ||||
| <p>                                                                           | ||||
| Debian packages are ar archives. If you are using a Debian Distribution          | ||||
| assign ``dpkg'' to $package_tool, otherwise assign ``ar'' to                     | ||||
| $package_tool.                                                                   | ||||
|                                                                            | ||||
| <p>                                                                                 | ||||
| <STRONG>$package_tool = "/usr/bin/ar";</STRONG>    | ||||
| 
 | ||||
| <sect>APT                                                           | ||||
| 
 | ||||
| <p>                                                                                 | ||||
| <STRONG>Swim</STRONG> does not assign a value for apt. To use                    | ||||
| <tt>--apt</tt> and <tt>-xyz</tt> assign <tt>$apt</tt> the                        | ||||
| value ``yes''.                                                                   | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| Example: <STRONG>$apt = "yes";</STRONG> | ||||
| 
 | ||||
| <sect>PAGER                                                         | ||||
|       | ||||
| <p>                                                                            | ||||
| 
 | ||||
| <strong>less</strong> is a nice pager, unless you like | ||||
| <strong>more</strong>! Pager is used for <tt>--help</tt> and | ||||
| <STRONG>swim</STRONG> called without any options. There is an option | ||||
| <tt>--nopager</tt> or <tt>-n</tt>. <strong>more</strong> comes from the | ||||
| required package util-linux, whereas <strong>less</strong> comes from a | ||||
| standard package called less.  Values: ``less'', ``more'', or ``most'' | ||||
| or...  | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>$ENV{PAGER} = "less";</STRONG> | ||||
| 
 | ||||
| <sect>NOT-INSTALLED VARIABLES                                       | ||||
|     | ||||
| <p>                                                                              | ||||
| Assign values for <tt>$architecture</tt> and/or                                  | ||||
| <tt>$distribution</tt> to avoid having to use <tt>--arch</tt> and                | ||||
| <tt>--dists</tt> everytime the not-installed databases are accessed              | ||||
| with <tt>-n</tt> or made or altered.                                             | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| Architectures are always being added so check with Debian to find a list.        | ||||
| There is <EM>alpha, arm, hurd-i386 (alternative kernel to linux), i386,          | ||||
| m68k, powerpc, sparc</EM>. Just use the arch found after the hyphen in the       | ||||
| Contents-(arch) file.                                                            | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>$architecture = "i386";</STRONG>  | ||||
| 
 | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| The distribution can be either <EM>stable, unstable, frozen, or | ||||
| experimental (rare)</EM>. These represent the state of development that | ||||
| the packages are under. The unstable distribution can have lot's of | ||||
| changes within a very short time period, and frozen may or may not be | ||||
| available.  | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>$distribution = "unstable";</STRONG>     | ||||
| 
 | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| Distributions are divided into sections. These sections were called              | ||||
| distributions in the version 2.4.1.0 packaging manual, because they were | ||||
| at      | ||||
| one time separate distributions, but this has since changed.                     | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| You can determine which of the sections <EM>main, non-free, contrib or           | ||||
| non-US</EM> to pull out of the Contents file if you don't want to use            | ||||
| <tt>--main</tt>, <tt>--contrib</tt>, <tt>--non-free</tt>, and                    | ||||
| <tt>--non-us</tt> to selectively pick the sections.                              | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| For efficiency, you should choose the sections which you will be pulling         | ||||
| out of the Packages <tt>file(s)</tt> being targetted.                            | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P> | ||||
| 
 | ||||
| 
 | ||||
| Rule: Use ``non-US'' not ``non-us''.                                             | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <p>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>@user_defined_section = qw(main contrib non-free non-US);</STRONG>       | ||||
|     | ||||
| 
 | ||||
| <sect>DF LOCATION                                                   | ||||
| 
 | ||||
| <p>                                                                                 | ||||
| A little philosophy:  <STRONG>swim</STRONG> was developed for maximum            | ||||
| versatility, so whether you are just interested in researching, and              | ||||
| keeping tabs on the newest packages, or maintaining a Debian virtual             | ||||
| distribution on a non-Debian distribution, or you are a using                    | ||||
| <STRONG>swim</STRONG> for distribution development, <STRONG>swim</STRONG>        | ||||
| provides a way.                                                                  | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| The next two variables determine the location of the DF (default                 | ||||
| directory/file system)                                                           | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| The default directory keeps track of Contents and/or Packages databases | ||||
| retrieved with --ftp. The Contents and Packages databases and Release file | ||||
| are give names specific to the distribution and architectures they | ||||
| represent using the naming convention found in apt's sources directory.  | ||||
| You also have the freedom not to use the default directory, in which case | ||||
| swim | ||||
| 
 | ||||
| will still do the renaming and keeping track of the mtime, but you will          | ||||
| have to remember where you put the files.                                        | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>$default_directory = '/root/.swim';</STRONG>                             | ||||
|                                                                                  | ||||
|                                                                                  | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| The default root directory (DRD) is the key to easy management of binary         | ||||
| packages, source, dsc, and diff files received from --ftp, and provides an       | ||||
| easy way to put together a personalized distribution. This directory can | ||||
| be      | ||||
| a real ftp site on your computer, or put wherever else you are allowed to        | ||||
| have directories. The DRD is always placed below the value assigned to           | ||||
| $default_directory. According to the previous assignment to                      | ||||
| $default_directory, if the DRD is ``/pub/a/debian'' then the full path           | ||||
| would be ``/root/.swim/pub/a/debian''.    | ||||
| 
 | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| Example: When a package is downloaded it will be placed in                       | ||||
| dists/distribution/section/architecture/subject below the DRD.                   | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| Rule: debian must be the final directory before dists, this is because           | ||||
| other distributions are placed alongside debian, like debian-non-US or           | ||||
| personal (specialized distribution).                                             | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>$default_root_directory = '/pub/debian';</STRONG>                        | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| Because you may be using a real ftp site, this variable allows you to            | ||||
| determine what permissions <STRONG>swim</STRONG> will assign for | ||||
| directories it  | ||||
| creates below the DRD.                                                           | ||||
|                                                                                  | ||||
|                                                                                  | ||||
| <P>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>$permission = '0755';</STRONG>                                                                                                 | ||||
|                                                                                  | ||||
|       | ||||
| <sect>TEMPORARY DIRECTORY                                           | ||||
|                                                                                  | ||||
| <p> | ||||
| If you want to set an alternative directory for the temporary files | ||||
| created when the databases are made, change here. You may want to make | ||||
| <tt>$tmp</tt> a RAM disk. See package loadlin for initrd documentation and | ||||
| an explanation for making such a disk. There is also documentation in | ||||
| /usr/src/kernel-source.version/Documentation. Whether this will speed | ||||
| things up is a subject of experimentation.  | ||||
|                                                                                                                                                                  | ||||
| <p>                                                                              | ||||
|                                                                                  | ||||
| <STRONG>$tmp = "/tmp";</STRONG>                                                                              | ||||
| 
 | ||||
| <sect>FTP | ||||
| 
 | ||||
| <p> | ||||
| 
 | ||||
| You can alter the Firewall, Port, Timeout, Debug and Passive | ||||
| characteristics of the ftp client as defined in Net::FTP(3pm) by providing | ||||
| arguments to these variables. All variables but $timeout are set to untrue | ||||
| by default.  | ||||
|   | ||||
| <example> | ||||
|  $firewall = 0; (FTP firewall machine name) | ||||
|  $port = 0;  (defaults to 23)    | ||||
|  $timeout = 120;  (120 seconds) | ||||
|  $debug = 0;  (1 will turn on STDERR) | ||||
|  $passive = 0; (1 will enable) | ||||
| </example> | ||||
| 
 | ||||
| <chapt id="othervars">OTHER VARIABLES                                               | ||||
| 
 | ||||
| <p>                                                                                 | ||||
| see SWIM::Conf    | ||||
| 
 | ||||
| <chapt id="files">FILES                                                         | ||||
|                  | ||||
| <p>                                                                 | ||||
| <tt> /etc/swim/swimrc</tt> | ||||
| <p>                                                            | ||||
| <tt>~/.swim/swimrc</tt> | ||||
| 
 | ||||
| 
 | ||||
| <chapt>BUGS | ||||
| <p>Send directly to mttrader@access.mountain.net. | ||||
| 
 | ||||
| </book> | ||||
|                                                                                  | ||||
| </debiandoc> | ||||
							
								
								
									
										294
									
								
								swimrc.text
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								swimrc.text
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,294 @@ | ||||
| 
 | ||||
|                      swimrc - swim configuration file | ||||
|                      -------------------------------- | ||||
|             Jonathan D. Rosenbaum<mttrader@access.mountain.net> | ||||
|                                 27 May 1999 | ||||
| 
 | ||||
| 0.1 Contents | ||||
| ------------ | ||||
| 
 | ||||
|      1.        DESCRIPTION  | ||||
| 
 | ||||
|      2.        USAGE  | ||||
| 
 | ||||
|      3.        VARIABLES  | ||||
|      3.1.      OUTPUT VARIABLE  | ||||
|      3.2.      HISTORY  | ||||
|      3.3.      AR or DPKG?  | ||||
|      3.4.      APT  | ||||
|      3.5.      PAGER  | ||||
|      3.6.      NOT-INSTALLED VARIABLES  | ||||
|      3.7.      DF LOCATION  | ||||
|      3.8.      TEMPORARY DIRECTORY  | ||||
|      3.9.      FTP  | ||||
| 
 | ||||
|      4.        OTHER VARIABLES  | ||||
| 
 | ||||
|      5.        FILES  | ||||
| 
 | ||||
|      6.        BUGS | ||||
| 
 | ||||
| 0.2 Copyright Notice | ||||
| -------------------- | ||||
| 
 | ||||
|      Copyright © 1999 Jonathan D. Rosenbaum  | ||||
| 
 | ||||
|      SWIM, including this manual, is free software; you may redistribute it | ||||
|      and/or modify it under the terms of the GNU General Public License as | ||||
|      published by the Free Software Foundation; either version 2, or (at | ||||
|      your option) any later version.  | ||||
| 
 | ||||
|      This is distributed in the hope that it will be useful, but *without | ||||
|      any warranty*; without even the implied warranty of merchantability or | ||||
|      fitness for a particular purpose. See the GNU General Public License | ||||
|      for more details.  | ||||
| 
 | ||||
|      You should have received a copy of the GNU General Public License with | ||||
|      the swim source as the file `COPYING'. If not, write to the Free | ||||
|      Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| 1. DESCRIPTION  | ||||
| --------------- | ||||
| 
 | ||||
|      swimrc is the configuartion file for swim allowing many default values | ||||
|      to be set so that they do not have to be mentioned on the command | ||||
|      line. Swimrc interacts directly with Perl allowing a wide variety of | ||||
|      variables found in SWIW::Conf to be altered.  | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| 2. USAGE  | ||||
| --------- | ||||
| 
 | ||||
|      Values for variable can be altered for *swim* by assigning different | ||||
|      values enclosed in quotes or quoted whitespace (qw()), and ending with | ||||
|      a semi-colon.  | ||||
| 
 | ||||
|      ` $variable = ``value'';' | ||||
| 
 | ||||
|      `$variable = ``(value1 value2 ..)'';'  | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| 3. VARIABLES  | ||||
| ------------- | ||||
| 
 | ||||
|      This is a list of variables with explanations. The default values for | ||||
|      *swim* are shown.  | ||||
| 
 | ||||
| 
 | ||||
| 3.1. OUTPUT VARIABLE  | ||||
| --------------------- | ||||
| 
 | ||||
|      `$my_number' can be changed to how many lines you would like ``swim | ||||
|      -qf <>'' to print out, before the program asks for `-t' or `--total'. | ||||
|      Exception: If `-i' is used in the query and there is more than one | ||||
|      package then the total will be presented.  | ||||
| 
 | ||||
|      Hint: `-t' can be used with all the various `--scripts' family members | ||||
|      to view the title of the script file regardless of this variable | ||||
|      setting, and if `-t' has to be used, the titles will be displayed, | ||||
|      which makes sense.  | ||||
| 
 | ||||
|      *$my_number = 23;*  | ||||
| 
 | ||||
| 
 | ||||
| 3.2. HISTORY  | ||||
| ------------- | ||||
| 
 | ||||
|      This is a shell-like history kept in relation to searches and the most | ||||
|      recent edit when `--stdin' is used.  | ||||
| 
 | ||||
|      *$HISTORY = 10;*  | ||||
| 
 | ||||
| 
 | ||||
| 3.3. AR or DPKG?  | ||||
| ----------------- | ||||
| 
 | ||||
|      Debian packages are ar archives. If you are using a Debian | ||||
|      Distribution assign ``dpkg'' to $package_tool, otherwise assign ``ar'' | ||||
|      to $package_tool.  | ||||
| 
 | ||||
|      *$package_tool = "/usr/bin/ar";*  | ||||
| 
 | ||||
| 
 | ||||
| 3.4. APT  | ||||
| --------- | ||||
| 
 | ||||
|      *Swim* does not assign a value for apt. To use `--apt' and `-xyz' | ||||
|      assign `$apt' the value ``yes''.  | ||||
| 
 | ||||
|      Example: *$apt = "yes";*  | ||||
| 
 | ||||
| 
 | ||||
| 3.5. PAGER  | ||||
| ----------- | ||||
| 
 | ||||
|      *less* is a nice pager, unless you like *more*! Pager is used for | ||||
|      `--help' and *swim* called without any options. There is an option | ||||
|      `--nopager' or `-n'. *more* comes from the required package | ||||
|      util-linux, whereas *less* comes from a standard package called less. | ||||
|      Values: ``less'', ``more'', or ``most'' or...  | ||||
| 
 | ||||
|      *$ENV{PAGER} = "less";*  | ||||
| 
 | ||||
| 
 | ||||
| 3.6. NOT-INSTALLED VARIABLES  | ||||
| ----------------------------- | ||||
| 
 | ||||
|      Assign values for `$architecture' and/or `$distribution' to avoid | ||||
|      having to use `--arch' and `--dists' everytime the not-installed | ||||
|      databases are accessed with `-n' or made or altered.  | ||||
| 
 | ||||
|      Architectures are always being added so check with Debian to find a | ||||
|      list. There is *alpha, arm, hurd-i386 (alternative kernel to linux), | ||||
|      i386, m68k, powerpc, sparc*. Just use the arch found after the hyphen | ||||
|      in the Contents-(arch) file.  | ||||
| 
 | ||||
|      *$architecture = "i386";*  | ||||
| 
 | ||||
|      The distribution can be either *stable, unstable, frozen, or | ||||
|      experimental (rare)*. These represent the state of development that | ||||
|      the packages are under. The unstable distribution can have lot's of | ||||
|      changes within a very short time period, and frozen may or may not be | ||||
|      available.  | ||||
| 
 | ||||
|      *$distribution = "unstable";*  | ||||
| 
 | ||||
|      Distributions are divided into sections. These sections were called | ||||
|      distributions in the version 2.4.1.0 packaging manual, because they | ||||
|      were at one time separate distributions, but this has since changed.  | ||||
| 
 | ||||
|      You can determine which of the sections *main, non-free, contrib or | ||||
|      non-US* to pull out of the Contents file if you don't want to use | ||||
|      `--main', `--contrib', `--non-free', and `--non-us' to selectively | ||||
|      pick the sections.  | ||||
| 
 | ||||
|      For efficiency, you should choose the sections which you will be | ||||
|      pulling out of the Packages `file(s)' being targetted.  | ||||
| 
 | ||||
|      Rule: Use ``non-US'' not ``non-us''.  | ||||
| 
 | ||||
|      *@user_defined_section = qw(main contrib non-free non-US);*  | ||||
| 
 | ||||
| 
 | ||||
| 3.7. DF LOCATION  | ||||
| ----------------- | ||||
| 
 | ||||
|      A little philosophy: *swim* was developed for maximum versatility, so | ||||
|      whether you are just interested in researching, and keeping tabs on | ||||
|      the newest packages, or maintaining a Debian virtual distribution on a | ||||
|      non-Debian distribution, or you are a using *swim* for distribution | ||||
|      development, *swim* provides a way.  | ||||
| 
 | ||||
|      The next two variables determine the location of the DF (default | ||||
|      directory/file system)  | ||||
| 
 | ||||
|      The default directory keeps track of Contents and/or Packages | ||||
|      databases retrieved with --ftp. The Contents and Packages databases | ||||
|      and Release file are give names specific to the distribution and | ||||
|      architectures they represent using the naming convention found in | ||||
|      apt's sources directory. You also have the freedom not to use the | ||||
|      default directory, in which case swim will still do the renaming and | ||||
|      keeping track of the mtime, but you will have to remember where you | ||||
|      put the files.  | ||||
| 
 | ||||
|      *$default_directory = '/root/.swim';*  | ||||
| 
 | ||||
|      The default root directory (DRD) is the key to easy management of | ||||
|      binary packages, source, dsc, and diff files received from --ftp, and | ||||
|      provides an easy way to put together a personalized distribution. This | ||||
|      directory can be a real ftp site on your computer, or put wherever | ||||
|      else you are allowed to have directories. The DRD is always placed | ||||
|      below the value assigned to $default_directory. According to the | ||||
|      previous assignment to $default_directory, if the DRD is | ||||
|      ``/pub/a/debian'' then the full path would be | ||||
|      ``/root/.swim/pub/a/debian''.  | ||||
| 
 | ||||
|      Example: When a package is downloaded it will be placed in | ||||
|      dists/distribution/section/architecture/subject below the DRD.  | ||||
| 
 | ||||
|      Rule: debian must be the final directory before dists, this is because | ||||
|      other distributions are placed alongside debian, like debian-non-US or | ||||
|      personal (specialized distribution).  | ||||
| 
 | ||||
|      *$default_root_directory = '/pub/debian';*  | ||||
| 
 | ||||
|      Because you may be using a real ftp site, this variable allows you to | ||||
|      determine what permissions *swim* will assign for directories it | ||||
|      creates below the DRD.  | ||||
| 
 | ||||
|      *$permission = '0755';*  | ||||
| 
 | ||||
| 
 | ||||
| 3.8. TEMPORARY DIRECTORY  | ||||
| ------------------------- | ||||
| 
 | ||||
|      If you want to set an alternative directory for the temporary files | ||||
|      created when the databases are made, change here. You may want to make | ||||
|      `$tmp' a RAM disk. See package loadlin for initrd documentation and an | ||||
|      explanation for making such a disk. There is also documentation in | ||||
|      /usr/src/kernel-source.version/Documentation. Whether this will speed | ||||
|      things up is a subject of experimentation.  | ||||
| 
 | ||||
|      *$tmp = "/tmp";*  | ||||
| 
 | ||||
| 
 | ||||
| 3.9. FTP  | ||||
| --------- | ||||
| 
 | ||||
|      You can alter the Firewall, Port, Timeout, Debug and Passive | ||||
|      characteristics of the ftp client as defined in Net::FTP(3pm) by | ||||
|      providing arguments to these variables. All variables but $timeout are | ||||
|      set to untrue by default.  | ||||
|            $firewall = 0; (FTP firewall machine name) | ||||
|            $port = 0;  (defaults to 23) | ||||
|            $timeout = 120;  (120 seconds) | ||||
|            $debug = 0;  (1 will turn on STDERR) | ||||
|            $passive = 0; (1 will enable) | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| 4. OTHER VARIABLES  | ||||
| ------------------- | ||||
| 
 | ||||
|      see SWIM::Conf  | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| 5. FILES  | ||||
| --------- | ||||
| 
 | ||||
|      ` /etc/swim/swimrc' | ||||
| 
 | ||||
|      `~/.swim/swimrc'  | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| 6. BUGS | ||||
| ------- | ||||
| 
 | ||||
|      Send directly to mttrader@access.mountain.net.  | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| 
 | ||||
|      swimrc - swim configuration file | ||||
|      Jonathan D. Rosenbaum<mttrader@access.mountain.net>        27 May 1999 | ||||
| 
 | ||||
							
								
								
									
										11
									
								
								swimz.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								swimz.list
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| # Read QUICKSTART for a quick start, and check out the SWIMZ.LIST  | ||||
| # section in swim(8) for much more information.  This list is read  | ||||
| # sequentially, so earlier entries are read before later entries  | ||||
| #  | ||||
| # Debian users: Unlike apt which only downloads Packages, swim reads this | ||||
| # list based on the specified or default distribution/architecture to | ||||
| # make handling the downloading of both the Contents and Packages files | ||||
| # easier.  Look at the Cron example in /usr/doc/swim/examples.  | ||||
| #  | ||||
| # deb ftp://ftp.debian.org/pub/debian unstable contrib non-free main | ||||
| # deb ftp://ftp.debian.org/pub/debian stable contrib non-free main | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user