diff options
Diffstat (limited to 'gnu/usr.bin/cvs/contrib')
45 files changed, 0 insertions, 13892 deletions
diff --git a/gnu/usr.bin/cvs/contrib/README b/gnu/usr.bin/cvs/contrib/README deleted file mode 100644 index e84b1761c0b18..0000000000000 --- a/gnu/usr.bin/cvs/contrib/README +++ /dev/null @@ -1,90 +0,0 @@ -$CVSid: @(#)README 1.12 94/09/25 $ - -This "contrib" directory is a place holder for code/scripts sent to -me by contributors around the world. This README file will be kept -up-to-date from release to release. BUT, I must point out that these -contributions are really, REALLY UNSUPPORTED. In fact, I probably -don't even know what they do. Nor do I guarantee to have tried them, -or ported them to work with this CVS distribution. If you have questions, -you might contact the author, but you should not necessarily expect -a reply. USE AT YOUR OWN RISK -- and all that stuff. - -Contents of this directory: - - README This file. - log A perl script suitable for including in your - $CVSROOT/CVSROOT/loginfo file for logging commit - changes. Includes the RCS revision of the change - as part of the log. - Contributed by Kevin Samborn <samborn@sunrise.com>. - pcl-cvs A directory that contains GNU Emacs lisp code which - implements a CVS-mode for emacs. - Contributed by Per Cederqvist <ceder@lysator.liu.se>. - commit_prep A perl script, to be combined with log_accum.pl, to - log_accum provide for a way to combine the individual log - messages of a multi-directory "commit" into a - single log message, and mail the result somewhere. - Can also do other checks for $Id and that you are - committing the correct revision of the file. - Read the comments carefully. - Contributed by David Hampton <hampton@cisco.com>. - mfpipe Another perl script for logging. Allows you to - pipe the log message to a file and/or send mail - to some alias. - Contributed by John Clyne <clyne@niwot.scd.ucar.edu>. - rcs-to-cvs Script to import sources that may have been under - RCS control already. - Contributed by Per Cederqvist <ceder@lysator.liu.se>. - cvscheck Identifies files added, changed, or removed in a - cvscheck.man checked out CVS tree; also notices unknown files. - Contributed by Lowell Skoog <fluke!lowell@uunet.uu.net> - cvshelp.man An introductory manual page written by Lowell Skoog - <fluke!lowell@uunet.uu.net>. It is most likely - out-of-date relative to CVS 1.3, but still may be - useful. - dirfns A shar file which contains some code that might - help your system support opendir/readdir/closedir, - if it does not already. - Copied from the C-News distribution. - rcslock A perl script that can be added to your commitinfo - file that tries to determine if your RCS file is - currently locked by someone else, as might be the - case for a binary file. - Contributed by John Rouillard <rouilj@cs.umb.edu>. - ccvs-rsh A Perl script which allows "rsh pipelines" to - be built in order to use Cyclic CVS from - behind some varieties of firewall. - cvs_acls A perl script that implements Access Control Lists - by using the "commitinfo" hook provided with the - "cvs commit" command. - Contributed by David G. Grubbs <dgg@ksr.com>. - descend A shell script that can be used to recursively - descend.man descend through a directory. In CVS 1.2, this was - very useful, since many of the commands were not - recursive. In CVS 1.3 (and later), however, most of - the commands are recursive. However, this may still - come in handy. - Contributed by Lowell Skoog <fluke!lowell@uunet.uu.net> - cln_hist A perl script to compress your - $CVSROOT/CVSROOT/history file, as it can grow quite - large after extended use. - Contributed by David G. Grubbs <dgg@ksr.com> - sccs2rcs A C-shell script that can convert (some) SCCS files - into RCS files, retaining the info contained in the - SCCS file (like dates, author, and log message). - Contributed by Ken Cox <kenstir@viewlogic.com>. - intro.doc A user's view of what you need to know to get - started with CVS. - Contributed by <Steven.Pemberton@cwi.nl>. - rcs2sccs A shell script to convert simple RCS files into - SCCS files, originally gleaned off the network - somewhere (originally by "kenc") and modified by - Jerry Jelinek <jerry@rmtc.Central.Sun.COM> and - Brian Berliner <berliner@sun.com> to increase - robustness and add support for one-level of branches. - rcs2log A shell script to create a ChangeLog-format file - given only a set of RCS files. - Contributed by Paul Eggert <eggert@twinsun.com>. - clmerge A perl script to handle merge conflicts in GNU - style ChangeLog files . - Contributed by Tom Tromey <tromey@busco.lanl.gov>. diff --git a/gnu/usr.bin/cvs/contrib/ccvs-rsh.pl b/gnu/usr.bin/cvs/contrib/ccvs-rsh.pl deleted file mode 100644 index 8cfc6743ba3bf..0000000000000 --- a/gnu/usr.bin/cvs/contrib/ccvs-rsh.pl +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/perl - -# The version of the remote shell program on some Linuxes, at least, -# misuses GNU getopt in such a way that it plucks arguments to rsh -# that look like command-line switches from anywhere in rsh's -# arguments. This is the Wrong Thing to do, and causes older versions -# of CCVS to break. - -# In addition, if we live behind a firewall and have to construct a -# "pipeline" of rshes through different machines in order to get to -# the outside world, each rshd along the way undoes the hard work CCVS -# does to put the command to be executed at the far end into a single -# argument. Sigh. - -# This script is a very minimal wrapper to rsh which makes sure that -# the commands to be executed remotely are packed into a single -# argument before we call exec(). It works on the idea of a "proxy -# chain", which is a set of machines you go through to get to the CCVS -# server machine. - -# Each host you go through before you reach the CCVS server machine -# should have a copy of this script somewhere (preferably accessible -# directly from your PATH envariable). In addition, each host you go -# through before you reach the firewall should have the CVS_PROXY_HOST -# envariable set to the next machine in the chain, and CVS_PROXY_USER -# set if necessary. - -# This really isn't as complex as it sounds. Honest. - -# Bryan O'Sullivan <bos@serpentine.com> April 1995 - -$usage = "usage: ccvs-rsh hostname [-l username] command [...]\n"; - -if ($#ARGV < 1) { - print STDERR $usage; - exit 1; -} - -# Try to pick a sane version of the remote shell command to run. This -# only understands BSD and Linux machines; if your remote shell is -# called "remsh" under some System V (e.g. HP-SUX), you should edit -# the line manually to suit yourself. - -$rsh = (-x "/usr/ucb/rsh") ? "/usr/ucb/rsh" : "/usr/bin/rsh"; - -# If you are not rshing directly to the CCVS server machine, make the -# following variable point at ccvs-rsh on the next machine in the -# proxy chain. If it's accessible through the PATH envariable, you -# can just set this to "ccvs-rsh". - -$ccvs_rsh = "ccvs-rsh"; - -# There shouldn't be any user-serviceable parts beyond this point. - -$host = $ARGV[0]; - -if ($ARGV[1] eq "-l") { - if ($#ARGV < 3) { - print STDERR $usage; - exit 1; - } - $user = $ARGV[2]; - $cbase = 3; -} else { - $cbase = 1; -} - -# You might think you shoul be able to do something like -# $command = join(' ', $ARGV[$cbase..$#ARGV]); -# to achieve the effect of the following block of code, but it doesn't -# work under Perl 4 on Linux, at least. Sigh. - -$command = $ARGV[$cbase]; -for ($cbase++; $cbase <= $#ARGV; $cbase++) { - $command .= " " . $ARGV[$cbase]; -} - -if (defined $ENV{"CVS_PROXY_HOST"}) { - $command = (defined $user) - ? "$ccvs_rsh $host -l $user $command" - : "$ccvs_rsh $host $command"; - - if (defined $ENV{"CVS_PROXY_USER"}) { - exec ($rsh, $ENV{"CVS_PROXY_HOST"}, "-l", $ENV{"CVS_PROXY_USER"}, - $command); - } else { - exec ($rsh, $ENV{"CVS_PROXY_HOST"}, $command); - } -} elsif (defined $user) { - exec ($rsh, $host, "-l", $user, $command); -} else { - if (defined $ENV{"CVS_PROXY_USER"}) { - exec ($rsh, $host, "-l", $ENV{"CVS_PROXY_USER"}, $command); - } else { - exec ($rsh, $host, $command); - } -} diff --git a/gnu/usr.bin/cvs/contrib/clmerge b/gnu/usr.bin/cvs/contrib/clmerge deleted file mode 100644 index 1a29311a9c14f..0000000000000 --- a/gnu/usr.bin/cvs/contrib/clmerge +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/local/bin/perl - -# Merge conflicted ChangeLogs -# tromey Mon Aug 15 1994 - -# Due to popular demand, I'm posting my ChangeLog auto-merge tool. Run -# this on your ChangeLog files when an update leaves them conflicted. -# The code is appended. -# -# Usage is: -# -# cl-merge [-i] file ... -# -# With -i, it works in place (backups put in a ~ file). Otherwise the -# merged ChangeLog is printed to stdout. -# -# Style comments are welcome. This is my third perl program ever. -# -# Please report any bugs to me. I wrote this yesterday, so there are no -# guarantees about its performance. I recommend checking its output -# carefully. If you do send a bug report, please includie the failing -# ChangeLog, so I can include it in my test suite. -# -# Tom -# --- -# tromey@busco.lanl.gov Member, League for Programming Freedom -# Sadism and farce are always inexplicably linked. -# -- Alexander Theroux - -# If '-i' is given, do it in-place. -if ($ARGV[0] eq '-i') { - shift (@ARGV); - $^I = '~'; -} - -$lastkey = ''; -$lastval = ''; -$conf = 0; -%conflist = (); - -$tjd = 0; - -# Simple state machine. The states: -# -# 0 Not in conflict. Just copy input to output. -# 1 Beginning an entry. Next non-blank line is key. -# 2 In entry. Entry beginner transitions to state 1. -while (<>) { - if (/^<<<</ || /^====/) { - # Start of a conflict. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - $conf = 1; - } elsif (/^>>>>/) { - # End of conflict. Output. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - foreach (reverse sort clcmp keys %conflist) { - print STDERR "doing $_" if $tjd; - print $_; - print $conflist{$_}; - } - - $lastkey = ''; - $lastval = ''; - $conf = 0; - %conflist = (); - } elsif ($conf == 1) { - # Beginning an entry. Skip empty lines. Error if not a real - # beginner. - if (/^$/) { - # Empty line; just skip at this point. - } elsif (/^[MTWFS]/) { - # Looks like the name of a day; assume opener and move to - # "in entry" state. - $lastkey = $_; - $conf = 2; - print STDERR "found $_" if $tjd; - } else { - die ("conflict crosses entry boundaries: $_"); - } - } elsif ($conf == 2) { - # In entry. Copy into variable until we see beginner line. - if (/^[MTWFS]/) { - # Entry beginner line. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - $lastkey = $_; - print STDERR "found $_" if $tjd; - $lastval = ''; - } else { - $lastval .= $_; - } - } else { - # Just copy. - print; - } -} - -%months = ('Jan', 0, - 'Feb', 1, - 'Mar', 2, - 'Apr', 3, - 'May', 4, - 'Jun', 5, - 'Jul', 6, - 'Aug', 7, - 'Sep', 8, - 'Oct', 9, - 'Nov', 10, - 'Dec', 11); - -# Compare ChangeLog time strings like <=>. -# -# 0 1 2 3 -# Thu Aug 11 13:22:42 1994 Tom Tromey (tromey@creche.colorado.edu) -# 0123456789012345678901234567890 -# -sub clcmp { - # First check year. - $r = substr ($a, 20, 4) <=> substr ($b, 20, 4); - - # Now check month. - $r = $months{$a} <=> $months{$b} if !$r; - - # Now check day. - $r = substr ($a, 8, 2) <=> substr ($b, 8, 2) if !$r; - - # Now check time (3 parts). - $r = substr ($a, 11, 2) <=> substr ($b, 11, 2) if !$r; - $r = substr ($a, 14, 2) <=> substr ($b, 14, 2) if !$r; - $r = substr ($a, 17, 2) <=> substr ($b, 17, 2) if !$r; - - $r; -} diff --git a/gnu/usr.bin/cvs/contrib/clmerge.pl b/gnu/usr.bin/cvs/contrib/clmerge.pl deleted file mode 100644 index ac813713a827f..0000000000000 --- a/gnu/usr.bin/cvs/contrib/clmerge.pl +++ /dev/null @@ -1,152 +0,0 @@ -#! xPERL_PATHx - -# Merge conflicted ChangeLogs -# tromey Mon Aug 15 1994 - -# Usage is: -# -# cl-merge [-i] file ... -# -# With -i, it works in place (backups put in a ~ file). Otherwise the -# merged ChangeLog is printed to stdout. - -# Please report any bugs to me. I wrote this yesterday, so there are no -# guarantees about its performance. I recommend checking its output -# carefully. If you do send a bug report, please include the failing -# ChangeLog, so I can include it in my test suite. -# -# Tom -# --- -# tromey@busco.lanl.gov Member, League for Programming Freedom -# Sadism and farce are always inexplicably linked. -# -- Alexander Theroux - - -# Month->number mapping. Used for sorting. -%months = ('Jan', 0, - 'Feb', 1, - 'Mar', 2, - 'Apr', 3, - 'May', 4, - 'Jun', 5, - 'Jul', 6, - 'Aug', 7, - 'Sep', 8, - 'Oct', 9, - 'Nov', 10, - 'Dec', 11); - -# If '-i' is given, do it in-place. -if ($ARGV[0] eq '-i') { - shift (@ARGV); - $^I = '~'; -} - -$lastkey = ''; -$lastval = ''; -$conf = 0; -%conflist = (); - -$tjd = 0; - -# Simple state machine. The states: -# -# 0 Not in conflict. Just copy input to output. -# 1 Beginning an entry. Next non-blank line is key. -# 2 In entry. Entry beginner transitions to state 1. -while (<>) { - if (/^<<<</ || /^====/) { - # Start of a conflict. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - $conf = 1; - } elsif (/^>>>>/) { - # End of conflict. Output. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - foreach (reverse sort clcmp keys %conflist) { - print STDERR "doing $_" if $tjd; - print $_; - print $conflist{$_}; - } - - $lastkey = ''; - $lastval = ''; - $conf = 0; - %conflist = (); - } elsif ($conf == 1) { - # Beginning an entry. Skip empty lines. Error if not a real - # beginner. - if (/^$/) { - # Empty line; just skip at this point. - } elsif (/^[MTWFS]/) { - # Looks like the name of a day; assume opener and move to - # "in entry" state. - $lastkey = $_; - $conf = 2; - print STDERR "found $_" if $tjd; - } else { - die ("conflict crosses entry boundaries: $_"); - } - } elsif ($conf == 2) { - # In entry. Copy into variable until we see beginner line. - if (/^[MTWFS]/) { - # Entry beginner line. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - $lastkey = $_; - print STDERR "found $_" if $tjd; - $lastval = ''; - } else { - $lastval .= $_; - } - } else { - # Just copy. - print; - } -} - -# Compare ChangeLog time strings like <=>. -# -# 0 1 2 3 -# Thu Aug 11 13:22:42 1994 Tom Tromey (tromey@creche.colorado.edu) -# 0123456789012345678901234567890 -# -sub clcmp { - # First check year. - $r = substr ($a, 20, 4) <=> substr ($b, 20, 4); - - # Now check month. - $r = $months{substr ($a, 4, 3)} <=> $months{substr ($b, 4, 3)} if !$r; - - # Now check day. - $r = substr ($a, 8, 2) <=> substr ($b, 8, 2) if !$r; - - # Now check time (3 parts). - $r = substr ($a, 11, 2) <=> substr ($b, 11, 2) if !$r; - $r = substr ($a, 14, 2) <=> substr ($b, 14, 2) if !$r; - $r = substr ($a, 17, 2) <=> substr ($b, 17, 2) if !$r; - - $r; -} diff --git a/gnu/usr.bin/cvs/contrib/cln_hist.pl b/gnu/usr.bin/cvs/contrib/cln_hist.pl deleted file mode 100644 index ff49d0a3e9c76..0000000000000 --- a/gnu/usr.bin/cvs/contrib/cln_hist.pl +++ /dev/null @@ -1,92 +0,0 @@ -#! xPERL_PATHx -# -*-Perl-*- -# -# $Id: cln_hist.pl,v 1.2 1995/07/10 02:01:26 kfogel Exp $ -# Contributed by David G. Grubbs <dgg@ksr.com> -# -# Clean up the history file. 10 Record types: MAR OFT WUCG -# -# WUCG records are thrown out. -# MAR records are retained. -# T records: retain only last tag with same combined tag/module. -# -# Two passes: Walk through the first time and remember the -# 1. Last Tag record with same "tag" and "module" names. -# 2. Last O record with unique user/module/directory, unless followed -# by a matching F record. -# - -$r = $ENV{"CVSROOT"}; -$c = "$r/CVSROOT"; -$h = "$c/history"; - -eval "print STDERR \$die='Unknown parameter $1\n' if !defined \$$1; \$$1=\$';" - while ($ARGV[0] =~ /^(\w+)=/ && shift(@ARGV)); -exit 255 if $die; # process any variable=value switches - -%tags = (); -%outs = (); - -# -# Move history file to safe place and re-initialize a new one. -# -rename($h, "$h.bak"); -open(XX, ">$h"); -close(XX); - -# -# Pass1 -- remember last tag and checkout. -# -open(HIST, "$h.bak"); -while (<HIST>) { - next if /^[MARWUCG]/; - - # Save whole line keyed by tag|module - if (/^T/) { - @tmp = split(/\|/, $_); - $tags{$tmp[4] . '|' . $tmp[5]} = $_; - } - # Save whole line - if (/^[OF]/) { - @tmp = split(/\|/, $_); - $outs{$tmp[1] . '|' . $tmp[2] . '|' . $tmp[5]} = $_; - } -} - -# -# Pass2 -- print out what we want to save. -# -open(SAVE, ">$h.work"); -open(HIST, "$h.bak"); -while (<HIST>) { - next if /^[FWUCG]/; - - # If whole line matches saved (i.e. "last") one, print it. - if (/^T/) { - @tmp = split(/\|/, $_); - next if $tags{$tmp[4] . '|' . $tmp[5]} ne $_; - } - # Save whole line - if (/^O/) { - @tmp = split(/\|/, $_); - next if $outs{$tmp[1] . '|' . $tmp[2] . '|' . $tmp[5]} ne $_; - } - - print SAVE $_; -} - -# -# Put back the saved stuff -# -system "cat $h >> $h.work"; - -if (-s $h) { - rename ($h, "$h.interim"); - print "history.interim has non-zero size.\n"; -} else { - unlink($h); -} - -rename ("$h.work", $h); - -exit(0); diff --git a/gnu/usr.bin/cvs/contrib/commit_prep.pl b/gnu/usr.bin/cvs/contrib/commit_prep.pl deleted file mode 100644 index 5272c0430ad3a..0000000000000 --- a/gnu/usr.bin/cvs/contrib/commit_prep.pl +++ /dev/null @@ -1,216 +0,0 @@ -#! xPERL_PATHx -# -*-Perl-*- -# -#ident "@(#)cvs/contrib:$Name: $:$Id: commit_prep.pl,v 1.2 1995/07/10 02:01:29 kfogel Exp $" -# -# Perl filter to handle pre-commit checking of files. This program -# records the last directory where commits will be taking place for -# use by the log_accum.pl script. For new files, it forces the -# existence of a RCS "Id" keyword in the first ten lines of the file. -# For existing files, it checks version number in the "Id" line to -# prevent losing changes because an old version of a file was copied -# into the direcory. -# -# Possible future enhancements: -# -# Check for cruft left by unresolved conflicts. Search for -# "^<<<<<<<$", "^-------$", and "^>>>>>>>$". -# -# Look for a copyright and automagically update it to the -# current year. [[ bad idea! -- woods ]] -# -# -# Contributed by David Hampton <hampton@cisco.com> -# -# Hacked on lots by Greg A. Woods <woods@web.net> - -# -# Configurable options -# - -# Constants (remember to protect strings from RCS keyword substitution) -# -$LAST_FILE = "/tmp/#cvs.lastdir"; # must match name in log_accum.pl -$ENTRIES = "CVS/Entries"; - -# Patterns to find $Log keywords in files -# -$LogString1 = "\\\$\\Log: .* \\\$"; -$LogString2 = "\\\$\\Log\\\$"; -$NoLog = "%s - contains an RCS \$Log keyword. It must not!\n"; - -# pattern to match an RCS Id keyword line with an existing ID -# -$IDstring = "\"@\\(#\\)[^:]*:.*\\\$\Id: .*\\\$\""; -$NoId = " -%s - Does not contain a properly formatted line with the keyword \"Id:\". - I.e. no lines match \"" . $IDstring . "\". - Please see the template files for an example.\n"; - -# pattern to match an RCS Id keyword line for a new file (i.e. un-expanded) -# -$NewId = "\"@(#)[^:]*:.*\\$\Id\\$\""; - -$NoName = " -%s - The ID line should contain only \"@(#)module/path:\$Name\$:\$\Id\$\" - for a newly created file.\n"; - -$BadName = " -%s - The file name '%s' in the ID line does not match - the actual filename.\n"; - -$BadVersion = " -%s - How dare you!!! You replaced your copy of the file '%s', - which was based upon version %s, with an %s version based - upon %s. Please move your '%s' out of the way, perform an - update to get the current version, and them merge your changes - into that file, then try the commit again.\n"; - -# -# Subroutines -# - -sub write_line { - local($filename, $line) = @_; - open(FILE, ">$filename") || die("Cannot open $filename, stopped"); - print(FILE $line, "\n"); - close(FILE); -} - -sub check_version { - local($i, $id, $rname, $version); - local($filename, $cvsversion) = @_; - - open(FILE, "<$filename") || return(0); - - @all_lines = (); - $idpos = -1; - $newidpos = -1; - for ($i = 0; <FILE>; $i++) { - chop; - push(@all_lines, $_); - if ($_ =~ /$IDstring/) { - $idpos = $i; - } - if ($_ =~ /$NewId/) { - $newidpos = $i; - } - } - - if (grep(/$LogString1/, @all_lines) || grep(/$LogString2/, @all_lines)) { - print STDERR sprintf($NoLog, $filename); - return(1); - } - - if ($debug != 0) { - print STDERR sprintf("file = %s, version = %d.\n", $filename, $cvsversion{$filename}); - } - - if ($cvsversion{$filename} == 0) { - if ($newidpos != -1 && $all_lines[$newidpos] !~ /$NewId/) { - print STDERR sprintf($NoName, $filename); - return(1); - } - return(0); - } - - if ($idpos == -1) { - print STDERR sprintf($NoId, $filename); - return(1); - } - - $line = $all_lines[$idpos]; - $pos = index($line, "Id: "); - if ($debug != 0) { - print STDERR sprintf("%d in '%s'.\n", $pos, $line); - } - ($id, $rname, $version) = split(' ', substr($line, $pos)); - if ($rname ne "$filename,v") { - print STDERR sprintf($BadName, $filename, substr($rname, 0, length($rname)-2)); - return(1); - } - if ($cvsversion{$filename} < $version) { - print STDERR sprintf($BadVersion, $filename, $filename, $cvsversion{$filename}, - "newer", $version, $filename); - return(1); - } - if ($cvsversion{$filename} > $version) { - print STDERR sprintf($BadVersion, $filename, $filename, $cvsversion{$filename}, - "older", $version, $filename); - return(1); - } - return(0); -} - -# -# Main Body -# - -$id = getpgrp(); # You *must* use a shell that does setpgrp()! - -# Check each file (except dot files) for an RCS "Id" keyword. -# -$check_id = 0; - -# Record the directory for later use by the log_accumulate stript. -# -$record_directory = 0; - -# parse command line arguments -# -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-d') { - $debug = 1; - print STDERR "Debug turned on...\n"; - } elsif ($arg eq '-c') { - $check_id = 1; - } elsif ($arg eq '-r') { - $record_directory = 1; - } else { - push(@files, $arg); - } -} - -$directory = shift @files; - -if ($debug != 0) { - print STDERR "dir - ", $directory, "\n"; - print STDERR "files - ", join(":", @files), "\n"; - print STDERR "id - ", $id, "\n"; -} - -# Suck in the CVS/Entries file -# -open(ENTRIES, $ENTRIES) || die("Cannot open $ENTRIES.\n"); -while (<ENTRIES>) { - local($filename, $version) = split('/', substr($_, 1)); - $cvsversion{$filename} = $version; -} - -# Now check each file name passed in, except for dot files. Dot files -# are considered to be administrative files by this script. -# -if ($check_id != 0) { - $failed = 0; - foreach $arg (@files) { - if (index($arg, ".") == 0) { - next; - } - $failed += &check_version($arg); - } - if ($failed) { - print STDERR "\n"; - exit(1); - } -} - -# Record this directory as the last one checked. This will be used -# by the log_accumulate script to determine when it is processing -# the final directory of a multi-directory commit. -# -if ($record_directory != 0) { - &write_line("$LAST_FILE.$id", $directory); -} -exit(0); diff --git a/gnu/usr.bin/cvs/contrib/cvs-format.el b/gnu/usr.bin/cvs/contrib/cvs-format.el deleted file mode 100644 index cdbd8423ce2a9..0000000000000 --- a/gnu/usr.bin/cvs/contrib/cvs-format.el +++ /dev/null @@ -1,81 +0,0 @@ -;; -*- lisp-interaction -*- -;; -*- emacs-lisp -*- -;; -;; -;; originally from... -;; Rich's personal .emacs file. feel free to copy. -;; -;; Last Mod Wed Feb 5 16:11:47 PST 1992, by rich@cygnus.com -;; - -;; -;; -;; This section sets constants used by c-mode for formating -;; -;; - -;; If `c-auto-newline' is non-`nil', newlines are inserted both -;;before and after braces that you insert, and after colons and semicolons. -;;Correct C indentation is done on all the lines that are made this way. - -(setq c-auto-newline nil) - - -;;*Non-nil means TAB in C mode should always reindent the current line, -;;regardless of where in the line point is when the TAB command is used. -;;It might be desirable to set this to nil for CVS, since unlike GNU -;; CVS often uses comments over to the right separated by TABs. -;; Depends some on whether you're in the habit of using TAB to -;; reindent. -;(setq c-tab-always-indent nil) - -;;; It seems to me that -;;; `M-x set-c-style BSD RET' -;;; or -;;; (set-c-style "BSD") -;;; takes care of the indentation parameters correctly. - - -;; C does not have anything analogous to particular function names for which -;;special forms of indentation are desirable. However, it has a different -;;need for customization facilities: many different styles of C indentation -;;are in common use. -;; -;; There are six variables you can set to control the style that Emacs C -;;mode will use. -;; -;;`c-indent-level' -;; Indentation of C statements within surrounding block. The surrounding -;; block's indentation is the indentation of the line on which the -;; open-brace appears. - -(setq c-indent-level 4) - -;;`c-continued-statement-offset' -;; Extra indentation given to a substatement, such as the then-clause of -;; an if or body of a while. - -(setq c-continued-statement-offset 4) - -;;`c-brace-offset' -;; Extra indentation for line if it starts with an open brace. - -(setq c-brace-offset -4) - -;;`c-brace-imaginary-offset' -;; An open brace following other text is treated as if it were this far -;; to the right of the start of its line. - -(setq c-brace-imaginary-offset 0) - -;;`c-argdecl-indent' -;; Indentation level of declarations of C function arguments. - -(setq c-argdecl-indent 4) - -;;`c-label-offset' -;; Extra indentation for line that is a label, or case or default. - -(setq c-label-offset -4) - -;;;; eof diff --git a/gnu/usr.bin/cvs/contrib/cvs_acls.pl b/gnu/usr.bin/cvs/contrib/cvs_acls.pl deleted file mode 100644 index bcb544d46f5d9..0000000000000 --- a/gnu/usr.bin/cvs/contrib/cvs_acls.pl +++ /dev/null @@ -1,143 +0,0 @@ -#! xPERL_PATHx -# -*-Perl-*- -# -# $Id: cvs_acls.pl,v 1.2 1995/07/10 02:01:33 kfogel Exp $ -# -# Access control lists for CVS. dgg@ksr.com (David G. Grubbs) -# -# CVS "commitinfo" for matching repository names, running the program it finds -# on the same line. More information is available in the CVS man pages. -# -# ==== INSTALLATION: -# -# To use this program as I intended, do the following four things: -# -# 0. Install PERL. :-) -# -# 1. Put one line, as the *only* non-comment line, in your commitinfo file: -# -# DEFAULT /usr/local/bin/cvs_acls -# -# 2. Install this file as /usr/local/bin/cvs_acls and make it executable. -# -# 3. Create a file named $CVSROOT/CVSROOT/avail. -# -# ==== FORMAT OF THE avail FILE: -# -# The avail file determines whether you may commit files. It contains lines -# read from top to bottom, keeping track of a single "bit". The "bit" -# defaults to "on". It can be turned "off" by "unavail" lines and "on" by -# "avail" lines. ==> Last one counts. -# -# Any line not beginning with "avail" or "unavail" is ignored. -# -# Lines beginning with "avail" or "unavail" are assumed to be '|'-separated -# triples: (All spaces and tabs are ignored in a line.) -# -# {avail.*,unavail.*} [| user,user,... [| repos,repos,...]] -# -# 1. String starting with "avail" or "unavail". -# 2. Optional, comma-separated list of usernames. -# 3. Optional, comma-separated list of repository pathnames. -# These are pathnames relative to $CVSROOT. They can be directories or -# filenames. A directory name allows access to all files and -# directories below it. -# -# Example: (Text from the ';;' rightward may not appear in the file.) -# -# unavail ;; Make whole repository unavailable. -# avail|dgg ;; Except for user "dgg". -# avail|fred, john|bin/ls ;; Except when "fred" or "john" commit to -# ;; the module whose repository is "bin/ls" -# -# PROGRAM LOGIC: -# -# CVS passes to @ARGV an absolute directory pathname (the repository -# appended to your $CVSROOT variable), followed by a list of filenames -# within that directory. -# -# We walk through the avail file looking for a line that matches both -# the username and repository. -# -# A username match is simply the user's name appearing in the second -# column of the avail line in a space-or-comma separate list. -# -# A repository match is either: -# - One element of the third column matches $ARGV[0], or some -# parent directory of $ARGV[0]. -# - Otherwise *all* file arguments ($ARGV[1..$#ARGV]) must be -# in the file list in one avail line. -# - In other words, using directory names in the third column of -# the avail file allows committing of any file (or group of -# files in a single commit) in the tree below that directory. -# - If individual file names are used in the third column of -# the avail file, then files must be committed individually or -# all files specified in a single commit must all appear in -# third column of a single avail line. -# - -$debug = 0; -$cvsroot = $ENV{'CVSROOT'}; -$availfile = $cvsroot . "/CVSROOT/avail"; -$myname = $ENV{"USER"} if !($myname = $ENV{"LOGNAME"}); - -eval "print STDERR \$die='Unknown parameter $1\n' if !defined \$$1; \$$1=\$';" - while ($ARGV[0] =~ /^(\w+)=/ && shift(@ARGV)); -exit 255 if $die; # process any variable=value switches - -die "Must set CVSROOT\n" if !$cvsroot; -($repos = shift) =~ s:^$cvsroot/::; -grep($_ = $repos . '/' . $_, @ARGV); - -print "$$ Repos: $repos\n","$$ ==== ",join("\n$$ ==== ",@ARGV),"\n" if $debug; - -$exit_val = 0; # Good Exit value - -$universal_off = 0; -open (AVAIL, $availfile) || exit(0); # It is ok for avail file not to exist -while (<AVAIL>) { - chop; - next if /^\s*\#/; - next if /^\s*$/; - ($flagstr, $u, $m) = split(/[\s,]*\|[\s,]*/, $_); - - # Skip anything not starting with "avail" or "unavail" and complain. - (print "Bad avail line: $_\n"), next - if ($flagstr !~ /^avail/ && $flagstr !~ /^unavail/); - - # Set which bit we are playing with. ('0' is OK == Available). - $flag = (($& eq "avail") ? 0 : 1); - - # If we find a "universal off" flag (i.e. a simple "unavail") remember it - $universal_off = 1 if ($flag && !$u && !$m); - - # $myname considered "in user list" if actually in list or is NULL - $in_user = (!$u || grep ($_ eq $myname, split(/[\s,]+/,$u))); - print "$$ \$myname($myname) in user list: $_\n" if $debug && $in_user; - - # Module matches if it is a NULL module list in the avail line. If module - # list is not null, we check every argument combination. - if (!($in_repo = !$m)) { - @tmp = split(/[\s,]+/,$m); - for $j (@tmp) { - # If the repos from avail is a parent(or equal) dir of $repos, OK - $in_repo = 1, last if ($repos eq $j || $repos =~ /^$j\//); - } - if (!$in_repo) { - $in_repo = 1; - for $j (@ARGV) { - last if !($in_repo = grep ($_ eq $j, @tmp)); - } - } - } - print "$$ \$repos($repos) in repository list: $_\n" if $debug && $in_repo; - - $exit_val = $flag if ($in_user && $in_repo); - print "$$ ==== \$exit_val = $exit_val\n$$ ==== \$flag = $flag\n" if $debug; -} -close(AVAIL); -print "$$ ==== \$exit_val = $exit_val\n" if $debug; -print "**** Access denied: Insufficient Karma ($myname|$repos)\n" if $exit_val; -print "**** Access allowed: Personal Karma exceeds Environmental Karma.\n" - if $universal_off && !$exit_val; -exit($exit_val); diff --git a/gnu/usr.bin/cvs/contrib/cvscheck b/gnu/usr.bin/cvs/contrib/cvscheck deleted file mode 100644 index 1c66688cbd347..0000000000000 --- a/gnu/usr.bin/cvs/contrib/cvscheck +++ /dev/null @@ -1,84 +0,0 @@ -#! /bin/sh -# $Id: cvscheck,v 1.2 1992/04/10 03:04:19 berliner Exp $ -# -# cvscheck - identify files added, changed, or removed -# in CVS working directory -# -# Contributed by Lowell Skoog <fluke!lowell@uunet.uu.net> -# -# This program should be run in a working directory that has been -# checked out using CVS. It identifies files that have been added, -# changed, or removed in the working directory, but not "cvs -# committed". It also determines whether the files have been "cvs -# added" or "cvs removed". For directories, it is only practical to -# determine whether they have been added. - -name=cvscheck -changes=0 - -# If we can't run CVS commands in this directory -cvs status . > /dev/null 2>&1 -if [ $? != 0 ] ; then - - # Bail out - echo "$name: there is no version here; bailing out" 1>&2 - exit 1 -fi - -# Identify files added to working directory -for file in .* * ; do - - # Skip '.' and '..' - if [ $file = '.' -o $file = '..' ] ; then - continue - fi - - # If a regular file - if [ -f $file ] ; then - if cvs status $file | grep -s '^From:[ ]*New file' ; then - echo "file added: $file - not CVS committed" - changes=`expr $changes + 1` - elif cvs status $file | grep -s '^From:[ ]*no entry for' ; then - echo "file added: $file - not CVS added, not CVS committed" - changes=`expr $changes + 1` - fi - - # Else if a directory - elif [ -d $file -a $file != CVS.adm ] ; then - - # Move into it - cd $file - - # If CVS commands don't work inside - cvs status . > /dev/null 2>&1 - if [ $? != 0 ] ; then - echo "directory added: $file - not CVS added" - changes=`expr $changes + 1` - fi - - # Move back up - cd .. - fi -done - -# Identify changed files -changedfiles=`cvs diff | egrep '^diff' | awk '{print $3}'` -for file in $changedfiles ; do - echo "file changed: $file - not CVS committed" - changes=`expr $changes + 1` -done - -# Identify files removed from working directory -removedfiles=`cvs status | egrep '^File:[ ]*no file' | awk '{print $4}'` - -# Determine whether each file has been cvs removed -for file in $removedfiles ; do - if cvs status $file | grep -s '^From:[ ]*-' ; then - echo "file removed: $file - not CVS committed" - else - echo "file removed: $file - not CVS removed, not CVS committed" - fi - changes=`expr $changes + 1` -done - -exit $changes diff --git a/gnu/usr.bin/cvs/contrib/cvscheck.man b/gnu/usr.bin/cvs/contrib/cvscheck.man deleted file mode 100644 index 61a064aeeaf79..0000000000000 --- a/gnu/usr.bin/cvs/contrib/cvscheck.man +++ /dev/null @@ -1,53 +0,0 @@ -.\" $Id: cvscheck.man,v 1.1.1.3 1995/08/28 16:20:24 jimb Exp $ -.\" Contributed by Lowell Skoog <fluke!lowell@uunet.uu.net> -.TH CVSCHECK LOCAL "4 March 1991" FLUKE -.SH NAME -cvscheck \- identify files added, changed, or removed in a CVS working -directory -.SH SYNOPSIS -.B cvscheck -.SH DESCRIPTION -This command is a housekeeping aid. It should be run in a working -directory that has been checked out using CVS. It identifies files -that have been added, changed, or removed in the working directory, but -not CVS -.BR commit ted. -It also determines whether the files have been CVS -.BR add ed -or CVS -.BR remove d. -For directories, this command determines only whether they have been -.BR add ed. -It operates in the current directory only. -.LP -This command provides information that is available using CVS -.B status -and CVS -.BR diff . -The advantage of -.B cvscheck -is that its output is very concise. It saves you the strain (and -potential error) of interpreting the output of CVS -.B status -and -.BR diff . -.LP -See -.BR cvs (local) -or -.BR cvshelp (local) -for instructions on how to add or remove a file or directory in a -CVS-controlled package. -.SH DIAGNOSTICS -The exit status is 0 if no files have been added, changed, or removed -from the current directory. Otherwise, the command returns a count of -the adds, changes, and deletes. -.SH SEE ALSO -.BR cvs (local), -.BR cvshelp (local) -.SH AUTHOR -Lowell Skoog -.br -Software Technology Group -.br -Technical Computing diff --git a/gnu/usr.bin/cvs/contrib/cvscheck.sh b/gnu/usr.bin/cvs/contrib/cvscheck.sh deleted file mode 100644 index 96dba6e1f87e4..0000000000000 --- a/gnu/usr.bin/cvs/contrib/cvscheck.sh +++ /dev/null @@ -1,84 +0,0 @@ -#! /bin/sh -# $Id: cvscheck.sh,v 1.1 1995/07/10 02:26:29 kfogel Exp $ -# -# cvscheck - identify files added, changed, or removed -# in CVS working directory -# -# Contributed by Lowell Skoog <fluke!lowell@uunet.uu.net> -# -# This program should be run in a working directory that has been -# checked out using CVS. It identifies files that have been added, -# changed, or removed in the working directory, but not "cvs -# committed". It also determines whether the files have been "cvs -# added" or "cvs removed". For directories, it is only practical to -# determine whether they have been added. - -name=cvscheck -changes=0 - -# If we can't run CVS commands in this directory -cvs status . > /dev/null 2>&1 -if [ $? != 0 ] ; then - - # Bail out - echo "$name: there is no version here; bailing out" 1>&2 - exit 1 -fi - -# Identify files added to working directory -for file in .* * ; do - - # Skip '.' and '..' - if [ $file = '.' -o $file = '..' ] ; then - continue - fi - - # If a regular file - if [ -f $file ] ; then - if cvs status $file | grep -s '^From:[ ]*New file' ; then - echo "file added: $file - not CVS committed" - changes=`expr $changes + 1` - elif cvs status $file | grep -s '^From:[ ]*no entry for' ; then - echo "file added: $file - not CVS added, not CVS committed" - changes=`expr $changes + 1` - fi - - # Else if a directory - elif [ -d $file -a $file != CVS.adm ] ; then - - # Move into it - cd $file - - # If CVS commands don't work inside - cvs status . > /dev/null 2>&1 - if [ $? != 0 ] ; then - echo "directory added: $file - not CVS added" - changes=`expr $changes + 1` - fi - - # Move back up - cd .. - fi -done - -# Identify changed files -changedfiles=`cvs diff | egrep '^diff' | awk '{print $3}'` -for file in $changedfiles ; do - echo "file changed: $file - not CVS committed" - changes=`expr $changes + 1` -done - -# Identify files removed from working directory -removedfiles=`cvs status | egrep '^File:[ ]*no file' | awk '{print $4}'` - -# Determine whether each file has been cvs removed -for file in $removedfiles ; do - if cvs status $file | grep -s '^From:[ ]*-' ; then - echo "file removed: $file - not CVS committed" - else - echo "file removed: $file - not CVS removed, not CVS committed" - fi - changes=`expr $changes + 1` -done - -exit $changes diff --git a/gnu/usr.bin/cvs/contrib/cvshelp.man b/gnu/usr.bin/cvs/contrib/cvshelp.man deleted file mode 100644 index 2cfae1f2bb8cb..0000000000000 --- a/gnu/usr.bin/cvs/contrib/cvshelp.man +++ /dev/null @@ -1,562 +0,0 @@ -.\" $Id: cvshelp.man,v 1.1.1.3 1995/08/28 16:20:28 jimb Exp $ -.\" Contributed by Lowell Skoog <fluke!lowell@uunet.uu.net> -.\" Full space in nroff; half space in troff -.de SP -.if n .sp -.if t .sp .5 -.. -.\" Start a command example -.de XS -.SP -.in +.5i -.ft B -.nf -.. -.\" End a command example -.de XE -.fi -.ft P -.in -.5i -.SP -.. -.TH CVSHELP LOCAL "17 March 1991" FLUKE -.SH NAME -cvshelp \- advice on using the Concurrent Versions System -.SH DESCRIPTION -This man page is based on experience using CVS. -It is bound to change as we gain more experience. -If you come up with better advice than is found here, -contact the Software Technology -Group and we will add it to this page. -.SS "Getting Started" -Use the following steps to prepare to use CVS: -.TP -\(bu -Take a look at the CVS manual page to see what it can do for you, and -if it fits your environment (or can possibly be made to fit your -environment). -.XS -man cvs -.XE -If things look good, continue on... -.TP -\(bu -Setup the master source repository. Choose a directory with -ample disk space available for source files. This is where the RCS -`,v' files will be stored. Say you choose -.B /src/master -as the root -of your source repository. Make the -.SB CVSROOT.adm -directory in the root of the source repository: -.XS -mkdir /src/master/CVSROOT.adm -.XE -.TP -\(bu -Populate this directory with the -.I loginfo -and -.I modules -files from the -.B "/usr/doc/local/cvs" -directory. Edit these files to reflect your local source repository -environment \- they may be quite small initially, but will grow as -sources are added to your source repository. Turn these files into -RCS controlled files: -.XS -cd /src/master/CVSROOT.adm -ci \-m'Initial loginfo file' loginfo -ci \-m'Initial modules file' modules -.XE -.TP -\(bu -Run the command: -.XS -mkmodules /src/master/CVSROOT.adm -.XE -This will build the -.BR ndbm (3) -file for the modules database. -.TP -\(bu -Remember to edit the -.I modules -file manually when sources are checked -in with -.B checkin -or CVS -.BR add . -A copy of the -.I modules -file for editing can be retrieved with the command: -.XS -cvs checkout CVSROOT.adm -.XE -.TP -\(bu -Have all users of the CVS system set the -.SM CVSROOT -environment variable appropriately to reflect the placement of your -source repository. If the above example is used, the following -commands can be placed in a -.I .login -or -.I .profile -file: -.XS -setenv CVSROOT /src/master -.XE -for csh users, and -.XS -CVSROOT=/src/master; export CVSROOT -.XE -for sh users. -.SS "Placing Locally Written Sources Under CVS Control" -Say you want to place the `whizbang' sources under -CVS control. Say further that the sources have never -been under revision control before. -.TP -\(bu -Move the source hierarchy (lock, stock, and barrel) -into the master source repository: -.XS -mv ~/whizbang $CVSROOT -.XE -.TP -\(bu -Clean out unwanted object files: -.XS -cd $CVSROOT/whizbang -make clean -.XE -.TP -\(bu -Turn every file in the hierarchy into an RCS controlled file: -.XS -descend \-f 'ci \-t/dev/null \-m"Placed under CVS control" \-nV\fR\fIx\fR\fB_\fR\fIy\fR\fB *' -.XE -In this example, the initial release tag is \fBV\fIx\fB_\fIy\fR, -representing version \fIx\fR.\fIy\fR. -.LP -You can use CVS on sources that are already under RCS control. -The following example shows how. -In this example, the source package is called `skunkworks'. -.TP -\(bu -Move the source hierarchy into the master source -repository: -.XS -mv ~/skunkworks $CVSROOT -.XE -.TP -\(bu -Clean out unwanted object files: -.XS -cd $CVSROOT/skunkworks -make clean -.XE -.TP -\(bu -Clean out unwanted working files, leaving only the RCS `,v' files: -.XS -descend \-r rcsclean -.XE -Note: If any working files have been checked out and changed, -.B rcsclean -will fail. Check in the modified working files -and run the command again. -.TP -\(bu -Get rid of -.SB RCS -subdirectories. CVS does not use them. -.XS -descend \-r \-f 'mv RCS/*,v .' -descend \-r \-f 'rmdir RCS' -.XE -.TP -\(bu -Delete any unwanted files that remain in the source hierarchy. Then -make sure all files are under RCS control: -.XS -descend \-f 'ci \-t/dev/null \-m"Placed under CVS control" \-n\fR\fItag\fR\fB *' -.XE -.I tag -is the latest symbolic revision tag that you applied to your package -(if any). Note: This command will probably generate lots of error -messages (for directories and existing RCS files) that you can -ignore. -.SS "Placing a Third-Party Source Distribution Under CVS Control" -The -.B checkin -command checks third-party sources into CVS. The -difference between third-party sources and locally -written sources is that third-party sources must be checked into a -separate branch (called the -.IR "vendor branch" ) -of the RCS tree. This makes it possible to merge local changes to -the sources with later releases from the vendor. -.TP -\(bu -Save the original distribution kit somewhere. For example, if the -master source repository is -.B /src/master -the distribution kit could be saved in -.BR /src/dist . -Organize the distribution directory so that each release -is clearly identifiable. -.TP -\(bu -Unpack the package in a scratch directory, for example -.BR ~/scratch . -.TP -\(bu -Create a repository for the package. -In this example, the package is called `Bugs-R-Us 4.3'. -.XS -mkdir $CVSROOT/bugs -.XE -.TP -\(bu -Check in the unpacked files: -.XS -cd ~/scratch -checkin \-m 'Bugs-R-Us 4.3 distribution' bugs VENDOR V4_3 -.XE -There is nothing magic about the tag `VENDOR', which is applied to -the vendor branch. You can use whatever tag you want. `VENDOR' is a -useful convention. -.TP -\(bu -Never modify vendor files before checking them in. -Check in the files -.I exactly -as you unpacked them. -If you check in locally modified files, future vendor releases may -wipe out your local changes. -.SS "Working With CVS-Controlled Sources" -To use or edit the sources, you must check out a private copy. -For the following examples, the master files are assumed to reside in -.BR "$CVSROOT/behemoth" . -The working directory is -.BR "~/work" . -See -.BR cvs (local) -for more details on the commands mentioned below. -.TP -.I "To Check Out Working Files -Use CVS -.BR checkout : -.XS -cd ~/work -cvs checkout behemoth -.XE -There is nothing magic about the working directory. CVS will check -out sources anywhere you like. Once you have a working copy of the -sources, you can compile or edit them as desired. -.TP -.I "To Display Changes You Have Made" -Use CVS -.BR diff -to display detailed changes, equivalent to -.BR rcsdiff (local). -You can also use -.BR cvscheck (local) -to list files added, changed, and removed in -the directory, but not yet -.BR commit ted. -You must be in a directory containing working files. -.TP -.I "To Display Revision Information" -Use CVS -.BR log , -which is equivalent to -.BR rlog (local). -You must be in a directory containing working files. -.TP -.I "To Update Working Files" -Use CVS -.BR update -in a directory containing working files. -This command brings your working files up -to date with changes checked into the -master repository since you last checked out or updated -your files. -.TP -.I "To Check In Your Changes" -Use CVS -.BR commit -in a directory containing working files. -This command checks your changes into the master repository. -You can specify files by name or use -.XS -cvs commit \-a -.XE -to -.B commit -all the files you have changed. -.TP -.I "To Add a File" -Add the file to the working directory. -Use CVS -.B add -to mark the file as added. -Use CVS -.B commit -to add the file to the master repository. -.TP -.I "To Remove a File" -Remove the file from the working directory. -Use CVS -.B remove -to mark the file as removed. -Use CVS -.B commit -to move the file from its current location in the master repository -to the CVS -.IR Attic -directory. -.TP -.I "To Add a Directory" -Add the directory to the working directory. -Use CVS -.B add -to add the directory to the master repository. -.TP -.I "To Remove a Directory" -.br -You shouldn't remove directories under CVS. You should instead remove -their contents and then prune them (using the -.B \-f -and -.B \-p -options) when you -.B checkout -or -.B update -your working files. -.TP -.I "To Tag a Release" -Use CVS -.B tag -to apply a symbolic tag to the latest revision of each file in the -master repository. For example: -.XS -cvs tag V2_1 behemoth -.XE -.TP -.I "To Retrieve an Exact Copy of a Previous Release" -During a CVS -.B checkout -or -.BR update , -use the -.B \-r -option to retrieve revisions associated with a symbolic tag. -Use the -.B \-f -option to ignore all RCS files that do not contain the -tag. -Use the -.B \-p -option to prune directories that wind up empty because none -of their files matched the tag. Example: -.XS -cd ~/work -cvs checkout \-r V2_1 \-f \-p behemoth -.XE -.SS "Logging Changes" -It is a good idea to keep a change log together with the -sources. As a minimum, the change log should name and describe each -tagged release. The change log should also be under CVS control and -should be tagged along with the sources. -.LP -.BR cvslog (local) -can help. This command logs -changes reported during CVS -.B commit -operations. It automatically -updates a change log file in your working directory. When you are -finished making changes, you (optionally) edit the change log file and -then commit it to the master repository. -.LP -Note: You must edit the change log to describe a new release -and -.B commit -it to the master repository -.I before -.BR tag ging -the release using CVS. Otherwise, the release description will not be -included in the tagged package. -.LP -See -.BR cvslog (local) -for more information. -.SS "Merging a Subsequent Third-Party Distribution" -The initial steps in this process are identical to placing a -third-party distribution under CVS for the first time: save the -distribution kit and unpack the package in a scratch directory. From -that point the steps diverge. -The following example considers release 5.0 of the -Bugs-R-Us package. -.TP -\(bu -Check in the sources after unpacking them: -.XS -cd ~/scratch -checkin \-m 'Bugs-R-Us 5.0 distribution' bugs VENDOR V5_0 \\ - | tee ~/WARNINGS -.XE -It is important to save the output of -.B checkin -in a file -because it lists the sources that have been locally modified. -It is best to save the file in a different directory (for example, -your home directory). Otherwise, -.B checkin -will try to check it into the master repository. -.TP -\(bu -In your usual working directory, check out a fresh copy of the -distribution that you just checked in. -.XS -cd ~/work -cvs checkout \-r VENDOR bugs -.XE -The -.B checkout -command shown above retrieves the latest revision on the vendor branch. -.TP -\(bu -See the `WARNINGS' file for a list of all locally modified -sources. -For each locally modified source, -look at the differences between -the new distribution and the latest local revision: -.XS -cvs diff \-r \fR\fILocalRev file\fR\fB -.XE -In this command, -.I LocalRev -is the latest -numeric or symbolic revision -on the RCS trunk of -.IR file . -You can use CVS -.B log -to get the revision history. -.TP -\(bu -If your local modifications to a file have been incorporated into -the vendor's distribution, then you should reset the default RCS -branch for that file to the vendor branch. CVS doesn't provide a -mechanism to do this. You have to do it by hand in the master -repository: -.XS -rcs \-bVENDOR \fR\fIfile\fR\fB,v -.XE -.TP -\(bu -If your local modifications need to be merged with the -new distribution, use CVS -.B join -to do it: -.XS -cvs join \-r VENDOR \fR\fIfile\fR\fB -.XE -The resulting file will be placed in your working directory. -Edit it to resolve any overlaps. -.TP -\(bu -Test the merged package. -.TP -\(bu -Commit all modified files to the repository: -.XS -cvs commit \-a -.XE -.TP -\(bu -Tag the repository with a new local tag. -.SS "Applying Patches to Third-Party Sources" -Patches are handled in a manner very similar to complete -third-party distributions. This example considers patches applied to -Bugs-R-Us release 5.0. -.TP -\(bu -Save the patch files together with the distribution kit -to which they apply. -The patch file names should clearly indicate the patch -level. -.TP -\(bu -In a scratch directory, check out the last `clean' vendor copy \- the -highest revision on the vendor branch with -.IR "no local changes" : -.XS -cd ~/scratch -cvs checkout \-r VENDOR bugs -.XE -.TP -\(bu -Use -.BR patch (local) -to apply the patches. You should now have an image of the -vendor's software just as though you had received a complete, -new release. -.TP -\(bu -Proceed with the steps described for merging a subsequent third-party -distribution. -.TP -\(bu -Note: When you get to the step that requires you -to check out the new distribution after you have -checked it into the vendor branch, you should move to a different -directory. Do not attempt to -.B checkout -files in the directory in -which you applied the patches. If you do, CVS will try to merge the -changes that you made during patching with the version being checked -out and things will get very confusing. Instead, -go to a different directory (like your working directory) and -check out the files there. -.SS "Advice to Third-Party Source Hackers" -As you can see from the preceding sections, merging local changes -into third-party distributions remains difficult, and probably -always will. This fact suggests some guidelines: -.TP -\(bu -Minimize local changes. -.I Never -make stylistic changes. -Change makefiles only as much as needed for installation. Avoid -overhauling anything. Pray that the vendor does the same. -.TP -\(bu -Avoid renaming files or moving them around. -.TP -\(bu -Put independent, locally written files like help documents, local -tools, or man pages in a sub-directory called `local-additions'. -Locally written files that are linked into an existing executable -should be added right in with the vendor's sources (not in a -`local-additions' directory). -If, in the future, -the vendor distributes something -equivalent to your locally written files -you can CVS -.B remove -the files from the `local-additions' directory at that time. -.SH SEE ALSO -.BR cvs (local), -.BR checkin (local), -.BR cvslog (local), -.BR cvscheck (local) -.SH AUTHOR -Lowell Skoog -.br -Software Technology Group -.br -Technical Computing diff --git a/gnu/usr.bin/cvs/contrib/descend b/gnu/usr.bin/cvs/contrib/descend deleted file mode 100644 index 999c46f4f0a8d..0000000000000 --- a/gnu/usr.bin/cvs/contrib/descend +++ /dev/null @@ -1,116 +0,0 @@ -#! /bin/sh -# $Id: descend,v 1.1 1992/04/03 05:22:52 berliner Exp $ -# -# descend - walk down a directory tree and execute a command at each node - -fullname=$0 -name=descend -usage="Usage: $name [-afqrv] command [directory ...]\n -\040\040-a\040\040All: descend into directories starting with '.'\n -\040\040-f\040\040Force: ignore errors during descent\n -\040\040-q\040\040Quiet: don't print directory names\n -\040\040-r\040\040Restricted: don't descend into RCS, CVS.adm, SCCS directories\n -\040\040-v\040\040Verbose: print command before executing it" - -# Scan for options -while getopts afqrv option; do - case $option in - a) - alldirs=$option - options=$options" "-$option - ;; - f) - force=$option - options=$options" "-$option - ;; - q) - verbose= - quiet=$option - options=$options" "-$option - ;; - r) - restricted=$option - options=$options" "-$option - ;; - v) - verbose=$option - quiet= - options=$options" "-$option - ;; - \?) - /usr/5bin/echo $usage 1>&2 - exit 1 - ;; - esac -done -shift `expr $OPTIND - 1` - -# Get command to execute -if [ $# -lt 1 ] ; then - /usr/5bin/echo $usage 1>&2 - exit 1 -else - command=$1 - shift -fi - -# If no directory specified, use '.' -if [ $# -lt 1 ] ; then - default_dir=. -fi - -# For each directory specified -for dir in $default_dir "$@" ; do - - # Spawn sub-shell so we return to starting directory afterward - (cd $dir - - # Execute specified command - if [ -z "$quiet" ] ; then - echo In directory `hostname`:`pwd` - fi - if [ -n "$verbose" ] ; then - echo $command - fi - eval "$command" || if [ -z "$force" ] ; then exit 1; fi - - # Collect dot file names if necessary - if [ -n "$alldirs" ] ; then - dotfiles=.* - else - dotfiles= - fi - - # For each file in current directory - for file in $dotfiles * ; do - - # Skip '.' and '..' - if [ "$file" = "." -o "$file" = ".." ] ; then - continue - fi - - # If a directory but not a symbolic link - if [ -d "$file" -a ! -h "$file" ] ; then - - # If not skipping this type of directory - if [ \( "$file" != "RCS" -a \ - "$file" != "SCCS" -a \ - "$file" != "CVS" -a \ - "$file" != "CVS.adm" \) \ - -o -z "$restricted" ] ; then - - # Recursively descend into it - $fullname $options "$command" "$file" \ - || if [ -z "$force" ] ; then exit 1; fi - fi - - # Else if a directory AND a symbolic link - elif [ -d "$file" -a -h "$file" ] ; then - - if [ -z "$quiet" ] ; then - echo In directory `hostname`:`pwd`/$file: symbolic link: skipping - fi - fi - done - ) || if [ -z "$force" ] ; then exit 1; fi -done diff --git a/gnu/usr.bin/cvs/contrib/descend.man b/gnu/usr.bin/cvs/contrib/descend.man deleted file mode 100644 index 5ac46f499d25b..0000000000000 --- a/gnu/usr.bin/cvs/contrib/descend.man +++ /dev/null @@ -1,115 +0,0 @@ -.\" $Id: descend.man,v 1.1.1.3 1995/08/28 16:20:31 jimb Exp $ -.TH DESCEND 1 "31 March 1992" -.SH NAME -descend \- walk directory tree and execute a command at each node -.SH SYNOPSIS -.B descend -[ -.B \-afqrv -] -.I command -[ -.I directory -\&.\|.\|. -] -.SH DESCRIPTION -.B descend -walks down a directory tree and executes a command at each node. It -is not as versatile as -.BR find (1), -but it has a simpler syntax. If no -.I directory -is specified, -.B descend -starts at the current one. -.LP -Unlike -.BR find , -.B descend -can be told to skip the special directories associated with RCS, -CVS, and SCCS. This makes -.B descend -especially handy for use with these packages. It can be used with -other commands too, of course. -.LP -.B descend -is a poor man's way to make any command recursive. Note: -.B descend -does not follow symbolic links to directories unless they are -specified on the command line. -.SH OPTIONS -.TP 15 -.B \-a -.I All. -Descend into directories that begin with '.'. -.TP -.B \-f -.I Force. -Ignore errors during descent. Normally, -.B descend -quits when an error occurs. -.TP -.B \-q -.I Quiet. -Suppress the message `In directory -.IR directory ' -that is normally printed during the descent. -.TP -.B \-r -.I Restricted. -Don't descend into the special directories -.SB RCS, -.SB CVS, -.SB CVS.adm, -and -.SB SCCS. -.TP -.B \-v -.I Verbose. -Print -.I command -before executing it. -.SH EXAMPLES -.TP 15 -.B "descend ls" -Cheap substitute for `ls -R'. -.TP 15 -.B "descend -f 'rm *' tree" -Strip `tree' of its leaves. This command descends the `tree' -directory, removing all regular files. Since -.BR rm (1) -does not remove directories, this command leaves the directory -structure of `tree' intact, but denuded. The -.B \-f -option is required to keep -.B descend -from quitting. You could use `rm \-f' instead. -.TP -.B "descend -r 'co RCS/*'" /project/src/ -Check out every RCS file under the directory -.BR "/project/src" . -.TP -.B "descend -r 'cvs diff'" -Perform CVS `diff' operation on every directory below (and including) -the current one. -.SH DIAGNOSTICS -Returns 1 if errors occur (and the -.B \-f -option is not used). Otherwise returns 0. -.SH SEE ALSO -.BR find (1), -.BR rcsintro (1), -.BR cvs (1), -.BR sccs (1) -.SH AUTHOR -Lowell Skoog -.br -Software Technology Group -.br -John Fluke Mfg. Co., Inc. -.SH BUGS -Shell metacharacters in -.I command -may have bizarre effects. In particular, compound commands -(containing ';', '[', and ']' characters) will not work. It is best -to enclose complicated commands in single quotes \(aa\ \(aa. diff --git a/gnu/usr.bin/cvs/contrib/descend.sh b/gnu/usr.bin/cvs/contrib/descend.sh deleted file mode 100644 index e6a788079416b..0000000000000 --- a/gnu/usr.bin/cvs/contrib/descend.sh +++ /dev/null @@ -1,116 +0,0 @@ -#! /bin/sh -# $Id: descend.sh,v 1.1 1995/07/10 02:26:32 kfogel Exp $ -# -# descend - walk down a directory tree and execute a command at each node - -fullname=$0 -name=descend -usage="Usage: $name [-afqrv] command [directory ...]\n -\040\040-a\040\040All: descend into directories starting with '.'\n -\040\040-f\040\040Force: ignore errors during descent\n -\040\040-q\040\040Quiet: don't print directory names\n -\040\040-r\040\040Restricted: don't descend into RCS, CVS.adm, SCCS directories\n -\040\040-v\040\040Verbose: print command before executing it" - -# Scan for options -while getopts afqrv option; do - case $option in - a) - alldirs=$option - options=$options" "-$option - ;; - f) - force=$option - options=$options" "-$option - ;; - q) - verbose= - quiet=$option - options=$options" "-$option - ;; - r) - restricted=$option - options=$options" "-$option - ;; - v) - verbose=$option - quiet= - options=$options" "-$option - ;; - \?) - /usr/5bin/echo $usage 1>&2 - exit 1 - ;; - esac -done -shift `expr $OPTIND - 1` - -# Get command to execute -if [ $# -lt 1 ] ; then - /usr/5bin/echo $usage 1>&2 - exit 1 -else - command=$1 - shift -fi - -# If no directory specified, use '.' -if [ $# -lt 1 ] ; then - default_dir=. -fi - -# For each directory specified -for dir in $default_dir "$@" ; do - - # Spawn sub-shell so we return to starting directory afterward - (cd $dir - - # Execute specified command - if [ -z "$quiet" ] ; then - echo In directory `hostname`:`pwd` - fi - if [ -n "$verbose" ] ; then - echo $command - fi - eval "$command" || if [ -z "$force" ] ; then exit 1; fi - - # Collect dot file names if necessary - if [ -n "$alldirs" ] ; then - dotfiles=.* - else - dotfiles= - fi - - # For each file in current directory - for file in $dotfiles * ; do - - # Skip '.' and '..' - if [ "$file" = "." -o "$file" = ".." ] ; then - continue - fi - - # If a directory but not a symbolic link - if [ -d "$file" -a ! -h "$file" ] ; then - - # If not skipping this type of directory - if [ \( "$file" != "RCS" -a \ - "$file" != "SCCS" -a \ - "$file" != "CVS" -a \ - "$file" != "CVS.adm" \) \ - -o -z "$restricted" ] ; then - - # Recursively descend into it - $fullname $options "$command" "$file" \ - || if [ -z "$force" ] ; then exit 1; fi - fi - - # Else if a directory AND a symbolic link - elif [ -d "$file" -a -h "$file" ] ; then - - if [ -z "$quiet" ] ; then - echo In directory `hostname`:`pwd`/$file: symbolic link: skipping - fi - fi - done - ) || if [ -z "$force" ] ; then exit 1; fi -done diff --git a/gnu/usr.bin/cvs/contrib/dirfns b/gnu/usr.bin/cvs/contrib/dirfns deleted file mode 100644 index 8324c4198e35b..0000000000000 --- a/gnu/usr.bin/cvs/contrib/dirfns +++ /dev/null @@ -1,481 +0,0 @@ -echo 'directory.3': -sed 's/^X//' >'directory.3' <<'!' -X.TH DIRECTORY 3 imported -X.DA 9 Oct 1985 -X.SH NAME -Xopendir, readdir, telldir, seekdir, rewinddir, closedir \- high-level directory operations -X.SH SYNOPSIS -X.B #include <sys/types.h> -X.br -X.B #include <ndir.h> -X.PP -X.SM -X.B DIR -X.B *opendir(filename) -X.br -X.B char *filename; -X.PP -X.SM -X.B struct direct -X.B *readdir(dirp) -X.br -X.B DIR *dirp; -X.PP -X.SM -X.B long -X.B telldir(dirp) -X.br -X.B DIR *dirp; -X.PP -X.SM -X.B seekdir(dirp, loc) -X.br -X.B DIR *dirp; -X.br -X.B long loc; -X.PP -X.SM -X.B rewinddir(dirp) -X.br -X.B DIR *dirp; -X.PP -X.SM -X.B closedir(dirp) -X.br -X.B DIR *dirp; -X.SH DESCRIPTION -XThis library provides high-level primitives for directory scanning, -Xsimilar to those available for 4.2BSD's (very different) directory system. -X.\"The purpose of this library is to simulate -X.\"the new flexible length directory names of 4.2bsd UNIX -X.\"on top of the old directory structure of v7. -XIt incidentally provides easy portability to and from 4.2BSD (insofar -Xas such portability is not compromised by other 4.2/VAX dependencies). -X.\"It allows programs to be converted immediately -X.\"to the new directory access interface, -X.\"so that they need only be relinked -X.\"when moved to 4.2bsd. -X.\"It is obtained with the loader option -X.\".BR \-lndir . -X.PP -X.I Opendir -Xopens the directory named by -X.I filename -Xand associates a -X.I directory stream -Xwith it. -X.I Opendir -Xreturns a pointer to be used to identify the -X.I directory stream -Xin subsequent operations. -XThe pointer -X.SM -X.B NULL -Xis returned if -X.I filename -Xcannot be accessed or is not a directory. -X.PP -X.I Readdir -Xreturns a pointer to the next directory entry. -XIt returns -X.B NULL -Xupon reaching the end of the directory or detecting -Xan invalid -X.I seekdir -Xoperation. -X.PP -X.I Telldir -Xreturns the current location associated with the named -X.I directory stream. -X.PP -X.I Seekdir -Xsets the position of the next -X.I readdir -Xoperation on the -X.I directory stream. -XThe new position reverts to the one associated with the -X.I directory stream -Xwhen the -X.I telldir -Xoperation was performed. -XValues returned by -X.I telldir -Xare good only for the lifetime of the DIR pointer from -Xwhich they are derived. -XIf the directory is closed and then reopened, -Xthe -X.I telldir -Xvalue may be invalidated -Xdue to undetected directory compaction in 4.2BSD. -XIt is safe to use a previous -X.I telldir -Xvalue immediately after a call to -X.I opendir -Xand before any calls to -X.I readdir. -X.PP -X.I Rewinddir -Xresets the position of the named -X.I directory stream -Xto the beginning of the directory. -X.PP -X.I Closedir -Xcauses the named -X.I directory stream -Xto be closed, -Xand the structure associated with the DIR pointer to be freed. -X.PP -XA -X.I direct -Xstructure is as follows: -X.PP -X.RS -X.nf -Xstruct direct { -X /* unsigned */ long d_ino; /* inode number of entry */ -X unsigned short d_reclen; /* length of this record */ -X unsigned short d_namlen; /* length of string in d_name */ -X char d_name[MAXNAMLEN + 1]; /* name must be no longer than this */ -X}; -X.fi -X.RE -X.PP -XThe -X.I d_reclen -Xfield is meaningless in non-4.2BSD systems and should be ignored. -XThe use of a -X.I long -Xfor -X.I d_ino -Xis also a 4.2BSDism; -X.I ino_t -X(see -X.IR types (5)) -Xshould be used elsewhere. -XThe macro -X.I DIRSIZ(dp) -Xgives the minimum memory size needed to hold the -X.I direct -Xvalue pointed to by -X.IR dp , -Xwith the minimum necessary allocation for -X.IR d_name . -X.PP -XThe preferred way to search the current directory for entry ``name'' is: -X.PP -X.RS -X.nf -X len = strlen(name); -X dirp = opendir("."); -X if (dirp == NULL) { -X fprintf(stderr, "%s: can't read directory .\\n", argv[0]); -X return NOT_FOUND; -X } -X while ((dp = readdir(dirp)) != NULL) -X if (dp->d_namlen == len && strcmp(dp->d_name, name) == 0) { -X closedir(dirp); -X return FOUND; -X } -X closedir(dirp); -X return NOT_FOUND; -X.RE -X.\".SH LINKING -X.\"This library is accessed by specifying ``-lndir'' as the -X.\"last argument to the compile line, e.g.: -X.\".PP -X.\" cc -I/usr/include/ndir -o prog prog.c -lndir -X.SH "SEE ALSO" -Xopen(2), -Xclose(2), -Xread(2), -Xlseek(2) -X.SH HISTORY -XWritten by -XKirk McKusick at Berkeley (ucbvax!mckusick). -XMiscellaneous bug fixes from elsewhere. -XThe size of the data structure has been decreased to avoid excessive -Xspace waste under V7 (where filenames are 14 characters at most). -XFor obscure historical reasons, the include file is also available -Xas -X.IR <ndir/sys/dir.h> . -XThe Berkeley version lived in a separate library (\fI\-lndir\fR), -Xwhereas ours is -Xpart of the C library, although the separate library is retained to -Xmaximize compatibility. -X.PP -XThis manual page has been substantially rewritten to be informative in -Xthe absence of a 4.2BSD manual. -X.SH BUGS -XThe -X.I DIRSIZ -Xmacro actually wastes a bit of space due to some padding requirements -Xthat are an artifact of 4.2BSD. -X.PP -XThe returned value of -X.I readdir -Xpoints to a static area that will be overwritten by subsequent calls. -X.PP -XThere are some unfortunate name conflicts with the \fIreal\fR V7 -Xdirectory structure definitions. -! -echo 'dir.h': -sed 's/^X//' >'dir.h' <<'!' -X/* dir.h 4.4 82/07/25 */ -X -X/* -X * A directory consists of some number of blocks of DIRBLKSIZ -X * bytes, where DIRBLKSIZ is chosen such that it can be transferred -X * to disk in a single atomic operation (e.g. 512 bytes on most machines). -X * -X * Each DIRBLKSIZ byte block contains some number of directory entry -X * structures, which are of variable length. Each directory entry has -X * a struct direct at the front of it, containing its inode number, -X * the length of the entry, and the length of the name contained in -X * the entry. These are followed by the name padded to a 4 byte boundary -X * with null bytes. All names are guaranteed null terminated. -X * The maximum length of a name in a directory is MAXNAMLEN. -X * -X * The macro DIRSIZ(dp) gives the amount of space required to represent -X * a directory entry. Free space in a directory is represented by -X * entries which have dp->d_reclen >= DIRSIZ(dp). All DIRBLKSIZ bytes -X * in a directory block are claimed by the directory entries. This -X * usually results in the last entry in a directory having a large -X * dp->d_reclen. When entries are deleted from a directory, the -X * space is returned to the previous entry in the same directory -X * block by increasing its dp->d_reclen. If the first entry of -X * a directory block is free, then its dp->d_ino is set to 0. -X * Entries other than the first in a directory do not normally have -X * dp->d_ino set to 0. -X */ -X#define DIRBLKSIZ 512 -X#ifdef VMUNIX -X#define MAXNAMLEN 255 -X#else -X#define MAXNAMLEN 14 -X#endif -X -Xstruct direct { -X /* unsigned */ long d_ino; /* inode number of entry */ -X unsigned short d_reclen; /* length of this record */ -X unsigned short d_namlen; /* length of string in d_name */ -X char d_name[MAXNAMLEN + 1]; /* name must be no longer than this */ -X}; -X -X/* -X * The DIRSIZ macro gives the minimum record length which will hold -X * the directory entry. This requires the amount of space in struct direct -X * without the d_name field, plus enough space for the name with a terminating -X * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary. -X */ -X#undef DIRSIZ -X#define DIRSIZ(dp) \ -X ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3)) -X -X#ifndef KERNEL -X/* -X * Definitions for library routines operating on directories. -X */ -Xtypedef struct _dirdesc { -X int dd_fd; -X long dd_loc; -X long dd_size; -X char dd_buf[DIRBLKSIZ]; -X} DIR; -X#ifndef NULL -X#define NULL 0 -X#endif -Xextern DIR *opendir(); -Xextern struct direct *readdir(); -Xextern long telldir(); -X#ifdef void -Xextern void seekdir(); -Xextern void closedir(); -X#endif -X#define rewinddir(dirp) seekdir((dirp), (long)0) -X#endif KERNEL -! -echo 'makefile': -sed 's/^X//' >'makefile' <<'!' -XDIR = closedir.o opendir.o readdir.o seekdir.o telldir.o -XCFLAGS=-O -I. -Dvoid=int -XDEST=.. -X -Xall: $(DIR) -X -Xmv: $(DIR) -X mv $(DIR) $(DEST) -X -Xcpif: dir.h -X cp dir.h /usr/include/ndir.h -X -Xclean: -X rm -f *.o -! -echo 'closedir.c': -sed 's/^X//' >'closedir.c' <<'!' -Xstatic char sccsid[] = "@(#)closedir.c 4.2 3/10/82"; -X -X#include <sys/types.h> -X#include <dir.h> -X -X/* -X * close a directory. -X */ -Xvoid -Xclosedir(dirp) -X register DIR *dirp; -X{ -X close(dirp->dd_fd); -X dirp->dd_fd = -1; -X dirp->dd_loc = 0; -X free((char *)dirp); -X} -! -echo 'opendir.c': -sed 's/^X//' >'opendir.c' <<'!' -X/* Copyright (c) 1982 Regents of the University of California */ -X -Xstatic char sccsid[] = "@(#)opendir.c 4.4 11/12/82"; -X -X#include <sys/types.h> -X#include <sys/stat.h> -X#include <dir.h> -X -X/* -X * open a directory. -X */ -XDIR * -Xopendir(name) -X char *name; -X{ -X register DIR *dirp; -X register int fd; -X struct stat statbuf; -X char *malloc(); -X -X if ((fd = open(name, 0)) == -1) -X return NULL; -X if (fstat(fd, &statbuf) == -1 || !(statbuf.st_mode & S_IFDIR)) { -X close(fd); -X return NULL; -X } -X if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) { -X close (fd); -X return NULL; -X } -X dirp->dd_fd = fd; -X dirp->dd_loc = 0; -X dirp->dd_size = 0; /* so that telldir will work before readdir */ -X return dirp; -X} -! -echo 'readdir.c': -sed 's/^X//' >'readdir.c' <<'!' -X/* Copyright (c) 1982 Regents of the University of California */ -X -Xstatic char sccsid[] = "@(#)readdir.c 4.3 8/8/82"; -X -X#include <sys/types.h> -X#include <dir.h> -X -X/* -X * read an old stlye directory entry and present it as a new one -X */ -X#define ODIRSIZ 14 -X -Xstruct olddirect { -X ino_t od_ino; -X char od_name[ODIRSIZ]; -X}; -X -X/* -X * get next entry in a directory. -X */ -Xstruct direct * -Xreaddir(dirp) -X register DIR *dirp; -X{ -X register struct olddirect *dp; -X static struct direct dir; -X -X for (;;) { -X if (dirp->dd_loc == 0) { -X dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, -X DIRBLKSIZ); -X if (dirp->dd_size <= 0) { -X dirp->dd_size = 0; -X return NULL; -X } -X } -X if (dirp->dd_loc >= dirp->dd_size) { -X dirp->dd_loc = 0; -X continue; -X } -X dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); -X dirp->dd_loc += sizeof(struct olddirect); -X if (dp->od_ino == 0) -X continue; -X dir.d_ino = dp->od_ino; -X strncpy(dir.d_name, dp->od_name, ODIRSIZ); -X dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */ -X dir.d_namlen = strlen(dir.d_name); -X dir.d_reclen = DIRBLKSIZ; -X return (&dir); -X } -X} -! -echo 'seekdir.c': -sed 's/^X//' >'seekdir.c' <<'!' -Xstatic char sccsid[] = "@(#)seekdir.c 4.9 3/25/83"; -X -X#include <sys/param.h> -X#include <dir.h> -X -X/* -X * seek to an entry in a directory. -X * Only values returned by "telldir" should be passed to seekdir. -X */ -Xvoid -Xseekdir(dirp, loc) -X register DIR *dirp; -X long loc; -X{ -X long curloc, base, offset; -X struct direct *dp; -X extern long lseek(); -X -X curloc = telldir(dirp); -X if (loc == curloc) -X return; -X base = loc & ~(DIRBLKSIZ - 1); -X offset = loc & (DIRBLKSIZ - 1); -X (void) lseek(dirp->dd_fd, base, 0); -X dirp->dd_size = 0; -X dirp->dd_loc = 0; -X while (dirp->dd_loc < offset) { -X dp = readdir(dirp); -X if (dp == NULL) -X return; -X } -X} -! -echo 'telldir.c': -sed 's/^X//' >'telldir.c' <<'!' -Xstatic char sccsid[] = "@(#)telldir.c 4.1 2/21/82"; -X -X#include <sys/types.h> -X#include <dir.h> -X -X/* -X * return a pointer into a directory -X */ -Xlong -Xtelldir(dirp) -X DIR *dirp; -X{ -X long lseek(); -X -X return (lseek(dirp->dd_fd, 0L, 1) - dirp->dd_size + dirp->dd_loc); -X} -! -echo done diff --git a/gnu/usr.bin/cvs/contrib/dirfns.shar b/gnu/usr.bin/cvs/contrib/dirfns.shar deleted file mode 100644 index 8324c4198e35b..0000000000000 --- a/gnu/usr.bin/cvs/contrib/dirfns.shar +++ /dev/null @@ -1,481 +0,0 @@ -echo 'directory.3': -sed 's/^X//' >'directory.3' <<'!' -X.TH DIRECTORY 3 imported -X.DA 9 Oct 1985 -X.SH NAME -Xopendir, readdir, telldir, seekdir, rewinddir, closedir \- high-level directory operations -X.SH SYNOPSIS -X.B #include <sys/types.h> -X.br -X.B #include <ndir.h> -X.PP -X.SM -X.B DIR -X.B *opendir(filename) -X.br -X.B char *filename; -X.PP -X.SM -X.B struct direct -X.B *readdir(dirp) -X.br -X.B DIR *dirp; -X.PP -X.SM -X.B long -X.B telldir(dirp) -X.br -X.B DIR *dirp; -X.PP -X.SM -X.B seekdir(dirp, loc) -X.br -X.B DIR *dirp; -X.br -X.B long loc; -X.PP -X.SM -X.B rewinddir(dirp) -X.br -X.B DIR *dirp; -X.PP -X.SM -X.B closedir(dirp) -X.br -X.B DIR *dirp; -X.SH DESCRIPTION -XThis library provides high-level primitives for directory scanning, -Xsimilar to those available for 4.2BSD's (very different) directory system. -X.\"The purpose of this library is to simulate -X.\"the new flexible length directory names of 4.2bsd UNIX -X.\"on top of the old directory structure of v7. -XIt incidentally provides easy portability to and from 4.2BSD (insofar -Xas such portability is not compromised by other 4.2/VAX dependencies). -X.\"It allows programs to be converted immediately -X.\"to the new directory access interface, -X.\"so that they need only be relinked -X.\"when moved to 4.2bsd. -X.\"It is obtained with the loader option -X.\".BR \-lndir . -X.PP -X.I Opendir -Xopens the directory named by -X.I filename -Xand associates a -X.I directory stream -Xwith it. -X.I Opendir -Xreturns a pointer to be used to identify the -X.I directory stream -Xin subsequent operations. -XThe pointer -X.SM -X.B NULL -Xis returned if -X.I filename -Xcannot be accessed or is not a directory. -X.PP -X.I Readdir -Xreturns a pointer to the next directory entry. -XIt returns -X.B NULL -Xupon reaching the end of the directory or detecting -Xan invalid -X.I seekdir -Xoperation. -X.PP -X.I Telldir -Xreturns the current location associated with the named -X.I directory stream. -X.PP -X.I Seekdir -Xsets the position of the next -X.I readdir -Xoperation on the -X.I directory stream. -XThe new position reverts to the one associated with the -X.I directory stream -Xwhen the -X.I telldir -Xoperation was performed. -XValues returned by -X.I telldir -Xare good only for the lifetime of the DIR pointer from -Xwhich they are derived. -XIf the directory is closed and then reopened, -Xthe -X.I telldir -Xvalue may be invalidated -Xdue to undetected directory compaction in 4.2BSD. -XIt is safe to use a previous -X.I telldir -Xvalue immediately after a call to -X.I opendir -Xand before any calls to -X.I readdir. -X.PP -X.I Rewinddir -Xresets the position of the named -X.I directory stream -Xto the beginning of the directory. -X.PP -X.I Closedir -Xcauses the named -X.I directory stream -Xto be closed, -Xand the structure associated with the DIR pointer to be freed. -X.PP -XA -X.I direct -Xstructure is as follows: -X.PP -X.RS -X.nf -Xstruct direct { -X /* unsigned */ long d_ino; /* inode number of entry */ -X unsigned short d_reclen; /* length of this record */ -X unsigned short d_namlen; /* length of string in d_name */ -X char d_name[MAXNAMLEN + 1]; /* name must be no longer than this */ -X}; -X.fi -X.RE -X.PP -XThe -X.I d_reclen -Xfield is meaningless in non-4.2BSD systems and should be ignored. -XThe use of a -X.I long -Xfor -X.I d_ino -Xis also a 4.2BSDism; -X.I ino_t -X(see -X.IR types (5)) -Xshould be used elsewhere. -XThe macro -X.I DIRSIZ(dp) -Xgives the minimum memory size needed to hold the -X.I direct -Xvalue pointed to by -X.IR dp , -Xwith the minimum necessary allocation for -X.IR d_name . -X.PP -XThe preferred way to search the current directory for entry ``name'' is: -X.PP -X.RS -X.nf -X len = strlen(name); -X dirp = opendir("."); -X if (dirp == NULL) { -X fprintf(stderr, "%s: can't read directory .\\n", argv[0]); -X return NOT_FOUND; -X } -X while ((dp = readdir(dirp)) != NULL) -X if (dp->d_namlen == len && strcmp(dp->d_name, name) == 0) { -X closedir(dirp); -X return FOUND; -X } -X closedir(dirp); -X return NOT_FOUND; -X.RE -X.\".SH LINKING -X.\"This library is accessed by specifying ``-lndir'' as the -X.\"last argument to the compile line, e.g.: -X.\".PP -X.\" cc -I/usr/include/ndir -o prog prog.c -lndir -X.SH "SEE ALSO" -Xopen(2), -Xclose(2), -Xread(2), -Xlseek(2) -X.SH HISTORY -XWritten by -XKirk McKusick at Berkeley (ucbvax!mckusick). -XMiscellaneous bug fixes from elsewhere. -XThe size of the data structure has been decreased to avoid excessive -Xspace waste under V7 (where filenames are 14 characters at most). -XFor obscure historical reasons, the include file is also available -Xas -X.IR <ndir/sys/dir.h> . -XThe Berkeley version lived in a separate library (\fI\-lndir\fR), -Xwhereas ours is -Xpart of the C library, although the separate library is retained to -Xmaximize compatibility. -X.PP -XThis manual page has been substantially rewritten to be informative in -Xthe absence of a 4.2BSD manual. -X.SH BUGS -XThe -X.I DIRSIZ -Xmacro actually wastes a bit of space due to some padding requirements -Xthat are an artifact of 4.2BSD. -X.PP -XThe returned value of -X.I readdir -Xpoints to a static area that will be overwritten by subsequent calls. -X.PP -XThere are some unfortunate name conflicts with the \fIreal\fR V7 -Xdirectory structure definitions. -! -echo 'dir.h': -sed 's/^X//' >'dir.h' <<'!' -X/* dir.h 4.4 82/07/25 */ -X -X/* -X * A directory consists of some number of blocks of DIRBLKSIZ -X * bytes, where DIRBLKSIZ is chosen such that it can be transferred -X * to disk in a single atomic operation (e.g. 512 bytes on most machines). -X * -X * Each DIRBLKSIZ byte block contains some number of directory entry -X * structures, which are of variable length. Each directory entry has -X * a struct direct at the front of it, containing its inode number, -X * the length of the entry, and the length of the name contained in -X * the entry. These are followed by the name padded to a 4 byte boundary -X * with null bytes. All names are guaranteed null terminated. -X * The maximum length of a name in a directory is MAXNAMLEN. -X * -X * The macro DIRSIZ(dp) gives the amount of space required to represent -X * a directory entry. Free space in a directory is represented by -X * entries which have dp->d_reclen >= DIRSIZ(dp). All DIRBLKSIZ bytes -X * in a directory block are claimed by the directory entries. This -X * usually results in the last entry in a directory having a large -X * dp->d_reclen. When entries are deleted from a directory, the -X * space is returned to the previous entry in the same directory -X * block by increasing its dp->d_reclen. If the first entry of -X * a directory block is free, then its dp->d_ino is set to 0. -X * Entries other than the first in a directory do not normally have -X * dp->d_ino set to 0. -X */ -X#define DIRBLKSIZ 512 -X#ifdef VMUNIX -X#define MAXNAMLEN 255 -X#else -X#define MAXNAMLEN 14 -X#endif -X -Xstruct direct { -X /* unsigned */ long d_ino; /* inode number of entry */ -X unsigned short d_reclen; /* length of this record */ -X unsigned short d_namlen; /* length of string in d_name */ -X char d_name[MAXNAMLEN + 1]; /* name must be no longer than this */ -X}; -X -X/* -X * The DIRSIZ macro gives the minimum record length which will hold -X * the directory entry. This requires the amount of space in struct direct -X * without the d_name field, plus enough space for the name with a terminating -X * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary. -X */ -X#undef DIRSIZ -X#define DIRSIZ(dp) \ -X ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3)) -X -X#ifndef KERNEL -X/* -X * Definitions for library routines operating on directories. -X */ -Xtypedef struct _dirdesc { -X int dd_fd; -X long dd_loc; -X long dd_size; -X char dd_buf[DIRBLKSIZ]; -X} DIR; -X#ifndef NULL -X#define NULL 0 -X#endif -Xextern DIR *opendir(); -Xextern struct direct *readdir(); -Xextern long telldir(); -X#ifdef void -Xextern void seekdir(); -Xextern void closedir(); -X#endif -X#define rewinddir(dirp) seekdir((dirp), (long)0) -X#endif KERNEL -! -echo 'makefile': -sed 's/^X//' >'makefile' <<'!' -XDIR = closedir.o opendir.o readdir.o seekdir.o telldir.o -XCFLAGS=-O -I. -Dvoid=int -XDEST=.. -X -Xall: $(DIR) -X -Xmv: $(DIR) -X mv $(DIR) $(DEST) -X -Xcpif: dir.h -X cp dir.h /usr/include/ndir.h -X -Xclean: -X rm -f *.o -! -echo 'closedir.c': -sed 's/^X//' >'closedir.c' <<'!' -Xstatic char sccsid[] = "@(#)closedir.c 4.2 3/10/82"; -X -X#include <sys/types.h> -X#include <dir.h> -X -X/* -X * close a directory. -X */ -Xvoid -Xclosedir(dirp) -X register DIR *dirp; -X{ -X close(dirp->dd_fd); -X dirp->dd_fd = -1; -X dirp->dd_loc = 0; -X free((char *)dirp); -X} -! -echo 'opendir.c': -sed 's/^X//' >'opendir.c' <<'!' -X/* Copyright (c) 1982 Regents of the University of California */ -X -Xstatic char sccsid[] = "@(#)opendir.c 4.4 11/12/82"; -X -X#include <sys/types.h> -X#include <sys/stat.h> -X#include <dir.h> -X -X/* -X * open a directory. -X */ -XDIR * -Xopendir(name) -X char *name; -X{ -X register DIR *dirp; -X register int fd; -X struct stat statbuf; -X char *malloc(); -X -X if ((fd = open(name, 0)) == -1) -X return NULL; -X if (fstat(fd, &statbuf) == -1 || !(statbuf.st_mode & S_IFDIR)) { -X close(fd); -X return NULL; -X } -X if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) { -X close (fd); -X return NULL; -X } -X dirp->dd_fd = fd; -X dirp->dd_loc = 0; -X dirp->dd_size = 0; /* so that telldir will work before readdir */ -X return dirp; -X} -! -echo 'readdir.c': -sed 's/^X//' >'readdir.c' <<'!' -X/* Copyright (c) 1982 Regents of the University of California */ -X -Xstatic char sccsid[] = "@(#)readdir.c 4.3 8/8/82"; -X -X#include <sys/types.h> -X#include <dir.h> -X -X/* -X * read an old stlye directory entry and present it as a new one -X */ -X#define ODIRSIZ 14 -X -Xstruct olddirect { -X ino_t od_ino; -X char od_name[ODIRSIZ]; -X}; -X -X/* -X * get next entry in a directory. -X */ -Xstruct direct * -Xreaddir(dirp) -X register DIR *dirp; -X{ -X register struct olddirect *dp; -X static struct direct dir; -X -X for (;;) { -X if (dirp->dd_loc == 0) { -X dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, -X DIRBLKSIZ); -X if (dirp->dd_size <= 0) { -X dirp->dd_size = 0; -X return NULL; -X } -X } -X if (dirp->dd_loc >= dirp->dd_size) { -X dirp->dd_loc = 0; -X continue; -X } -X dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); -X dirp->dd_loc += sizeof(struct olddirect); -X if (dp->od_ino == 0) -X continue; -X dir.d_ino = dp->od_ino; -X strncpy(dir.d_name, dp->od_name, ODIRSIZ); -X dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */ -X dir.d_namlen = strlen(dir.d_name); -X dir.d_reclen = DIRBLKSIZ; -X return (&dir); -X } -X} -! -echo 'seekdir.c': -sed 's/^X//' >'seekdir.c' <<'!' -Xstatic char sccsid[] = "@(#)seekdir.c 4.9 3/25/83"; -X -X#include <sys/param.h> -X#include <dir.h> -X -X/* -X * seek to an entry in a directory. -X * Only values returned by "telldir" should be passed to seekdir. -X */ -Xvoid -Xseekdir(dirp, loc) -X register DIR *dirp; -X long loc; -X{ -X long curloc, base, offset; -X struct direct *dp; -X extern long lseek(); -X -X curloc = telldir(dirp); -X if (loc == curloc) -X return; -X base = loc & ~(DIRBLKSIZ - 1); -X offset = loc & (DIRBLKSIZ - 1); -X (void) lseek(dirp->dd_fd, base, 0); -X dirp->dd_size = 0; -X dirp->dd_loc = 0; -X while (dirp->dd_loc < offset) { -X dp = readdir(dirp); -X if (dp == NULL) -X return; -X } -X} -! -echo 'telldir.c': -sed 's/^X//' >'telldir.c' <<'!' -Xstatic char sccsid[] = "@(#)telldir.c 4.1 2/21/82"; -X -X#include <sys/types.h> -X#include <dir.h> -X -X/* -X * return a pointer into a directory -X */ -Xlong -Xtelldir(dirp) -X DIR *dirp; -X{ -X long lseek(); -X -X return (lseek(dirp->dd_fd, 0L, 1) - dirp->dd_size + dirp->dd_loc); -X} -! -echo done diff --git a/gnu/usr.bin/cvs/contrib/easy-import.perl b/gnu/usr.bin/cvs/contrib/easy-import.perl deleted file mode 100644 index 59d407a913d13..0000000000000 --- a/gnu/usr.bin/cvs/contrib/easy-import.perl +++ /dev/null @@ -1,365 +0,0 @@ -#!/usr/bin/perl -# -# Support for importing a source collection into CVS. -# Tries to prevent the user from the most common pitfalls (like creating -# new top-level repositories or second-level areas accidentally), and -# cares to do some of the `dirty' work like maintaining the modules -# database accordingly. -# -# Written by Jörg Wunsch, 95/03/07, and placed in the public domain. -# - -require "complete.pl"; -require "getopts.pl"; - - -sub scan_opts -{ - &Getopts("n"); - - $dont_do_it = "-n" if $opt_n; - - die "usage: $0 [-n] [moduledir]\n" . - " -n: don't do any commit, show only\n" - unless $#ARGV <= 0; - - $moduledir = $ARGV[0] if $#ARGV == 0; -} - -sub lsdir -{ - # find all subdirectories under @_ - # ignore all CVS entries, dot entries, and non-directories - - local($base) = @_; - local(@ls, @rv, $fname); - - opendir(DIR, $base) || die "Cannot find dir $base.\n"; - - @ls = readdir(DIR); - closedir(DIR); - - @rv = (); - - foreach $fname (@ls) { - next if $fname =~ /^CVS/ || $fname eq "Attic" - || $fname =~ /^\./ || ! -d "$base/$fname"; - @rv = (@rv, $fname); - } - - return sort(@rv); -} - - -sub contains -{ - # look if the first parameter is contained in the list following it - local($item, @list) = @_; - local($found, $i); - - $found = 0; - foreach $i (@list) { - return 1 if $i eq $item; - } - return 0; -} - - - -sub term_init -{ - # first, get some terminal attributes - - # try bold mode first - $so = `tput md`; $se = `tput me`; - - # if no bold mode available, use standout mode - if ($so eq "") { - $so = `tput so`; $se = `tput se`; - } - - # try if we can underscore - $us = `tput us`; $ue = `tput ue`; - # if we don't have it available, or same as bold/standout, disable it - if ($us eq "" || $us eq $so) { - $us = $ue = ""; - } - - # look how many columns we've got - if($ENV{'COLUMNS'} ne "") { - $columns = $ENV{'COLUMNS'}; - } elsif(-t STDIN) { # if we operate on a terminal... - local($word, $tmp); - - open(STTY, "stty -a|"); - $_ = <STTY>; # try getting the tty win structure value - close(STTY); - chop; - $columns = 0; - foreach $word (split) { - $columns = $tmp if $word eq "columns;"; # the number preceding - $tmp = $word; - } - } else { - $columns = 80; - } - # sanity - $columns = 80 unless $columns >= 5; -} - - -sub list -{ - # pretty-print a list - # imports: global variable $columns - local(@items) = @_; - local($longest,$i,$item,$cols,$width); - - # find the longest item - $longest = 0; - foreach $item (@items) { - $i = length($item); - $longest = $i if $longest < $i; - } - $width = $longest + 1; - $cols = int($columns / $width); - - $i = 0; - foreach $item (@items) { - print $item; - if(++$i == $cols) { - $i = 0; print "\n"; - } else { - print ' ' x ($width - length($item)); - } - } - print "\n" unless $i == 0; -} - -sub cvs_init -{ - # get the CVS repository(s) - - die "You need to have the \$CVSROOT variable set.\n" - unless $ENV{'CVSROOT'} ne ""; - - # get the list of available repositories - $cvsroot = $ENV{'CVSROOT'}; - @reps = &lsdir($cvsroot); -} - - -sub lsmodules -{ - # list all known CVS modules - local(@rv, $mname, $_); - - @rv = (); - - open(CVS, "cvs co -c|"); - while($_ = <CVS>) { - chop; - ($mname) = split; - next if $mname eq ""; - @rv = (@rv, $mname); - } - close(CVS); - - return @rv; -} - - -sub checktag -{ - # check a given string for tag rules - local($s) = @_; - return 0 if($s !~ /^[A-Za-z][A-Za-z0-9_]*$/); - - return 1; -} - - -&scan_opts; -&term_init; -&cvs_init; - -if(! $moduledir) { - @dirs = &lsdir("."); - print "${so}Import from which directory?${se}\n"; - @dirs = (@dirs, "."); - &list(@dirs); - $moduledir = &Complete("Which? [.]: ", @dirs); - $moduledir = "." unless $moduledir ne ""; -} - -chdir $moduledir || die "Cannot chdir to $moduledir\n"; - -print "${so}Available repositories:${se}\n"; -&list(@reps); - -# the following kludge prevents the Complete package from starting -# over with the string just selected; Complete should better provide -# some reinitialize method -$Complete'return = ""; $Complete'r = 0; - -$selected = - &Complete("Enter repository (<TAB>=complete, ^D=show): ", - @reps); - -die "\aYou cannot create new repositories with this script.\n" - unless &contains($selected, @reps); - -$rep = $selected; - -print "\n${so}Selected repository:${se} ${us}$rep${ue}\n"; - - -@areas = &lsdir("$cvsroot/$rep"); - -print "${so}Existent areas in this repository:${se}\n"; -&list(@areas); - -$Complete'return = ""; $Complete'r = 0; - -$selected = - &Complete("Enter area name (<TAB>=complete, ^D=show): ", - @areas); - -print "\a${us}Warning: this will create a new area.${ue}\n" - unless &contains($selected, @areas); - -$area = "$rep/$selected"; - -print "\n${so}[Working on:${se} ${us}$area${ue}${so}]${se}\n"; - -for(;;) { - $| = 1; - print "${so}Enter the module path:${se} $area/"; - $| = 0; - $modpath = <>; - chop $modpath; - if ($modpath eq "") { - print "\a${us}You cannot use an empty module path.${ue}\n"; - next; - } - last if ! -d "$cvsroot/$area/$modpath"; - print "\a${us}This module path does already exist; " . - "choose another one.${ue}\n"; -} - - -@newdirs = (); -$dir1 = "$cvsroot/$area"; -$dir2 = "$area"; - -@newdirs = (@newdirs, "$dir2") if ! -d $dir1; - -foreach $ele (split(/\//, $modpath)) { - $dir1 = "$dir1/$ele"; - $dir2 = "$dir2/$ele"; - @newdirs = (@newdirs, "$dir2") if ! -d $dir1; -} - -print "${so}You're going to create the following new directories:${se}\n"; - -&list(@newdirs); - -@cvsmods = &lsmodules(); - -for(;;) { - $| = 1; - print "${so}Gimme the module name:${se} "; - $| = 0; - $modname = <>; - chop $modname; - if ($modname eq "") { - print "\a${us}You cannot use an empty module name.${ue}\n"; - next; - } - last if !&contains($modname, @cvsmods); - print "\a${us}This module name does already exist; " . - "choose another one.${ue}\n"; -} - - -for(;;) { - $| = 1; - print "${so}Enter a \`vendor\' tag (e. g. the authors ID):${se} "; - $| = 0; - $vtag = <>; - chop $vtag; - last if &checktag($vtag); - print "\a${us}Valid tags must match the regexp " . - "^[A-Za-z][A-Za-z0-9_]*\$.${ue}\n"; -} - -for(;;) { - $| = 1; - print "${so}Enter a \`release\' tag (e. g. the version #):${se} "; - $| = 0; - $rtag = <>; - chop $rtag; - last if &checktag($rtag); - print "\a${us}Valid tags must match the regexp " . - "^[A-Za-z][A-Za-z0-9_]*\$.${ue}\n"; -} - - -$| = 1; -print "${so}This is your last chance to interrupt, " . - "hit <return> to go on:${se} "; -$| = 0; -<>; - -$mod = ""; -foreach $tmp (@cvsmods) { - if($tmp gt $modname) { - $mod = $tmp; - last; - } -} - -if($mod eq "") { - # we are going to append our module - $cmd = "\$\na\n"; -} else { - # we can insert it - $cmd = "/^${mod}[ \t]/\ni\n"; -} - -print "${so}Checking out the modules database...${se}\n"; -system("cvs co modules") && die "${us}failed.\n${ue}"; - -print "${so}Inserting new module...${se}\n"; -open(ED, "|ed modules/modules") || die "${us}Cannot start ed${ue}\n"; -print(ED "${cmd}${modname}" . ' ' x (16 - length($modname)) . - "$area/${modpath}\n.\nw\nq\n"); -close(ED); - -print "${so}Commiting new modules database...${se}\n"; -system("cvs $dont_do_it commit -m \" " . - "${modname} --> $area/${modpath}\" modules") - && die "Commit failed\n"; - -system("cvs $dont_do_it release -dQ modules"); - -print "${so}Importing source. Enter a commit message in the editor.${se}\n"; - -system("cvs $dont_do_it import $area/$modpath $vtag $rtag"); - -print "${so}You are done now. Go to a different directory, perform a${se}\n". - "${us}cvs co ${modname}${ue} ${so}command, and see if your new module" . - " builds ok.${se}\n"; - -if($dont_do_it) { -print <<END - - -${so}Since you did not allow to commit anything, you'll have${se} -${so}to remove the edited modules' database yourself.${se} -${so}To do this, perform a${se} -${us}cd ${moduledir}; cvs release -dQ modules${ue} -${so}command.${se} -END -; -} diff --git a/gnu/usr.bin/cvs/contrib/intro.doc b/gnu/usr.bin/cvs/contrib/intro.doc deleted file mode 100644 index a6d4ec123387c..0000000000000 --- a/gnu/usr.bin/cvs/contrib/intro.doc +++ /dev/null @@ -1,112 +0,0 @@ -Date: Tue, 16 Jun 1992 17:05:23 +0200 -From: Steven.Pemberton@cwi.nl -Message-Id: <9206161505.AA06927.steven@sijs.cwi.nl> -To: berliner@Sun.COM -Subject: cvs - -INTRODUCTION TO USING CVS - - CVS is a system that lets groups of people work simultaneously on - groups of files (for instance program sources). - - It works by holding a central 'repository' of the most recent version - of the files. You may at any time create a personal copy of these - files; if at a later date newer versions of the files are put in the - repository, you can 'update' your copy. - - You may edit your copy of the files freely. If new versions of the - files have been put in the repository in the meantime, doing an update - merges the changes in the central copy into your copy. - (It can be that when you do an update, the changes in the - central copy clash with changes you have made in your own - copy. In this case cvs warns you, and you have to resolve the - clash in your copy.) - - When you are satisfied with the changes you have made in your copy of - the files, you can 'commit' them into the central repository. - (When you do a commit, if you haven't updated to the most - recent version of the files, cvs tells you this; then you have - to first update, resolve any possible clashes, and then redo - the commit.) - -USING CVS - - Suppose that a number of repositories have been stored in - /usr/src/cvs. Whenever you use cvs, the environment variable - CVSROOT must be set to this (for some reason): - - CVSROOT=/usr/src/cvs - export CVSROOT - -TO CREATE A PERSONAL COPY OF A REPOSITORY - - Suppose you want a copy of the files in repository 'views' to be - created in your directory src. Go to the place where you want your - copy of the directory, and do a 'checkout' of the directory you - want: - - cd $HOME/src - cvs checkout views - - This creates a directory called (in this case) 'views' in the src - directory, containing a copy of the files, which you may now work - on to your heart's content. - -TO UPDATE YOUR COPY - - Use the command 'cvs update'. - - This will update your copy with any changes from the central - repository, telling you which files have been updated (their names - are displayed with a U before them), and which have been modified - by you and not yet committed (preceded by an M). You will be - warned of any files that contain clashes, the clashes will be - marked in the file surrounded by lines of the form <<<< and >>>>. - -TO COMMIT YOUR CHANGES - - Use the command 'cvs commit'. - - You will be put in an editor to make a message that describes the - changes that you have made (for future reference). Your changes - will then be added to the central copy. - -ADDING AND REMOVING FILES - - It can be that the changes you want to make involve a completely - new file, or removing an existing one. The commands to use here - are: - - cvs add <filename> - cvs remove <filename> - - You still have to do a commit after these commands. You may make - any number of new files in your copy of the repository, but they - will not be committed to the central copy unless you do a 'cvs add'. - -OTHER USEFUL COMMANDS AND HINTS - - To see the commit messages for files, and who made them, use: - - cvs log [filenames] - - To see the differences between your version and the central version: - - cvs diff [filenames] - - To give a file a new name, rename it and do an add and a remove. - - To lose your changes and go back to the version from the - repository, delete the file and do an update. - - After an update where there have been clashes, your original - version of the file is saved as .#file.version. - - All the cvs commands mentioned accept a flag '-n', that doesn't do - the action, but lets you see what would happen. For instance, you - can use 'cvs -n update' to see which files would be updated. - -MORE INFORMATION - - This is necessarily a very brief introduction. See the manual page - (man cvs) for full details. diff --git a/gnu/usr.bin/cvs/contrib/log.pl b/gnu/usr.bin/cvs/contrib/log.pl deleted file mode 100644 index 5e3bf48837769..0000000000000 --- a/gnu/usr.bin/cvs/contrib/log.pl +++ /dev/null @@ -1,169 +0,0 @@ -#! xPERL_PATHx -# -*-Perl-*- -# -#ident "$CVSid$" -# -# XXX: FIXME: handle multiple '-f logfile' arguments -# -# XXX -- I HATE Perl! This *will* be re-written in shell/awk/sed soon! -# - -# Usage: log.pl [[-m user] ...] [-s] -f logfile 'dirname file ...' -# -# -m user - for each user to receive cvs log reports -# (multiple -m's permitted) -# -s - to prevent "cvs status -v" messages -# -f logfile - for the logfile to append to (mandatory, -# but only one logfile can be specified). - -# here is what the output looks like: -# -# From: woods@kuma.domain.top -# Subject: CVS update: testmodule -# -# Date: Wednesday November 23, 1994 @ 14:15 -# Author: woods -# -# Update of /local/src-CVS/testmodule -# In directory kuma:/home/kuma/woods/work.d/testmodule -# -# Modified Files: -# test3 -# Added Files: -# test6 -# Removed Files: -# test4 -# Log Message: -# - wow, what a test -# -# (and for each file the "cvs status -v" output is appended unless -s is used) -# -# ================================================================== -# File: test3 Status: Up-to-date -# -# Working revision: 1.41 Wed Nov 23 14:15:59 1994 -# Repository revision: 1.41 /local/src-CVS/cvs/testmodule/test3,v -# Sticky Options: -ko -# -# Existing Tags: -# local-v2 (revision: 1.7) -# local-v1 (revision: 1.1.1.2) -# CVS-1_4A2 (revision: 1.1.1.2) -# local-v0 (revision: 1.2) -# CVS-1_4A1 (revision: 1.1.1.1) -# CVS (branch: 1.1.1) - -$cvsroot = $ENV{'CVSROOT'}; - -# turn off setgid -# -$) = $(; - -$dostatus = 1; - -# parse command line arguments -# -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-m') { - $users = "$users " . shift @ARGV; - } elsif ($arg eq '-f') { - ($logfile) && die "Too many '-f' args"; - $logfile = shift @ARGV; - } elsif ($arg eq '-s') { - $dostatus = 0; - } else { - ($donefiles) && die "Too many arguments!\n"; - $donefiles = 1; - @files = split(/ /, $arg); - } -} - -# the first argument is the module location relative to $CVSROOT -# -$modulepath = shift @files; - -$mailcmd = "| Mail -s 'CVS update: $modulepath'"; - -# Initialise some date and time arrays -# -@mos = (January,February,March,April,May,June,July,August,September, - October,November,December); -@days = (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); - -($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; - -# get a login name for the guy doing the commit.... -# -$login = getlogin || (getpwuid($<))[0] || "nobody"; - -# open log file for appending -# -open(OUT, ">>" . $logfile) || die "Could not open(" . $logfile . "): $!\n"; - -# send mail, if there's anyone to send to! -# -if ($users) { - $mailcmd = "$mailcmd $users"; - open(MAIL, $mailcmd) || die "Could not Exec($mailcmd): $!\n"; -} - -# print out the log Header -# -print OUT "\n"; -print OUT "****************************************\n"; -print OUT "Date:\t$days[$wday] $mos[$mon] $mday, 19$year @ $hour:" . sprintf("%02d", $min) . "\n"; -print OUT "Author:\t$login\n\n"; - -if (MAIL) { - print MAIL "\n"; - print MAIL "Date:\t$days[$wday] $mos[$mon] $mday, 19$year @ $hour:" . sprintf("%02d", $min) . "\n"; - print MAIL "Author:\t$login\n\n"; -} - -# print the stuff from logmsg that comes in on stdin to the logfile -# -open(IN, "-"); -while (<IN>) { - print OUT $_; - if (MAIL) { - print MAIL $_; - } -} -close(IN); - -print OUT "\n"; - -# after log information, do an 'cvs -Qq status -v' on each file in the arguments. -# -if ($dostatus != 0) { - while (@files) { - $file = shift @files; - if ($file eq "-") { - print OUT "[input file was '-']\n"; - if (MAIL) { - print MAIL "[input file was '-']\n"; - } - last; - } - open(RCS, "-|") || exec 'cvs', '-nQq', 'status', '-v', $file; - while (<RCS>) { - print OUT; - if (MAIL) { - print MAIL; - } - } - close(RCS); - } -} - -close(OUT); -die "Write to $logfile failed" if $?; - -close(MAIL); -die "Pipe to $mailcmd failed" if $?; - -## must exit cleanly -## -exit 0; diff --git a/gnu/usr.bin/cvs/contrib/log_accum.pl b/gnu/usr.bin/cvs/contrib/log_accum.pl deleted file mode 100644 index b47f433b56220..0000000000000 --- a/gnu/usr.bin/cvs/contrib/log_accum.pl +++ /dev/null @@ -1,496 +0,0 @@ -#! xPERL_PATHx -# -*-Perl-*- -# -# Perl filter to handle the log messages from the checkin of files in -# a directory. This script will group the lists of files by log -# message, and mail a single consolidated log message at the end of -# the commit. -# -# This file assumes a pre-commit checking program that leaves the -# names of the first and last commit directories in a temporary file. -# -# Contributed by David Hampton <hampton@cisco.com> -# -# hacked greatly by Greg A. Woods <woods@planix.com> - -# Usage: log_accum.pl [-d] [-s] [-M module] [[-m mailto] ...] [-f logfile] -# -d - turn on debugging -# -m mailto - send mail to "mailto" (multiple) -# -M modulename - set module name to "modulename" -# -f logfile - write commit messages to logfile too -# -s - *don't* run "cvs status -v" for each file - -# -# Configurable options -# - -$MAILER = "Mail"; # set this to something that takes "-s" - -# -# End user configurable options. -# - -# Constants (don't change these!) -# -$STATE_NONE = 0; -$STATE_CHANGED = 1; -$STATE_ADDED = 2; -$STATE_REMOVED = 3; -$STATE_LOG = 4; - -$LAST_FILE = "/tmp/#cvs.lastdir"; - -$CHANGED_FILE = "/tmp/#cvs.files.changed"; -$ADDED_FILE = "/tmp/#cvs.files.added"; -$REMOVED_FILE = "/tmp/#cvs.files.removed"; -$LOG_FILE = "/tmp/#cvs.files.log"; - -$FILE_PREFIX = "#cvs.files"; - -# -# Subroutines -# - -sub cleanup_tmpfiles { - local($wd, @files); - - $wd = `pwd`; - chdir("/tmp") || die("Can't chdir('/tmp')\n"); - opendir(DIR, "."); - push(@files, grep(/^$FILE_PREFIX\..*\.$id$/, readdir(DIR))); - closedir(DIR); - foreach (@files) { - unlink $_; - } - unlink $LAST_FILE . "." . $id; - - chdir($wd); -} - -sub write_logfile { - local($filename, @lines) = @_; - - open(FILE, ">$filename") || die("Cannot open log file $filename.\n"); - print FILE join("\n", @lines), "\n"; - close(FILE); -} - -sub append_to_logfile { - local($filename, @lines) = @_; - - open(FILE, ">$filename") || die("Cannot open log file $filename.\n"); - print FILE join("\n", @lines), "\n"; - close(FILE); -} - -sub format_names { - local($dir, @files) = @_; - local(@lines); - - $format = "\t%-" . sprintf("%d", length($dir)) . "s%s "; - - $lines[0] = sprintf($format, $dir, ":"); - - if ($debug) { - print STDERR "format_names(): dir = ", $dir, "; files = ", join(":", @files), ".\n"; - } - foreach $file (@files) { - if (length($lines[$#lines]) + length($file) > 65) { - $lines[++$#lines] = sprintf($format, " ", " "); - } - $lines[$#lines] .= $file . " "; - } - - @lines; -} - -sub format_lists { - local(@lines) = @_; - local(@text, @files, $lastdir); - - if ($debug) { - print STDERR "format_lists(): ", join(":", @lines), "\n"; - } - @text = (); - @files = (); - $lastdir = shift @lines; # first thing is always a directory - if ($lastdir !~ /.*\/$/) { - die("Damn, $lastdir doesn't look like a directory!\n"); - } - foreach $line (@lines) { - if ($line =~ /.*\/$/) { - push(@text, &format_names($lastdir, @files)); - $lastdir = $line; - @files = (); - } else { - push(@files, $line); - } - } - push(@text, &format_names($lastdir, @files)); - - @text; -} - -sub append_names_to_file { - local($filename, $dir, @files) = @_; - - if (@files) { - open(FILE, ">>$filename") || die("Cannot open file $filename.\n"); - print FILE $dir, "\n"; - print FILE join("\n", @files), "\n"; - close(FILE); - } -} - -sub read_line { - local($line); - local($filename) = @_; - - open(FILE, "<$filename") || die("Cannot open file $filename.\n"); - $line = <FILE>; - close(FILE); - chop($line); - $line; -} - -sub read_logfile { - local(@text); - local($filename, $leader) = @_; - - open(FILE, "<$filename"); - while (<FILE>) { - chop; - push(@text, $leader.$_); - } - close(FILE); - @text; -} - -sub build_header { - local($header); - local($sec,$min,$hour,$mday,$mon,$year) = localtime(time); - $header = sprintf("CVSROOT:\t%s\nModule name:\t%s\nChanges by:\t%s@%s\t%02d/%02d/%02d %02d:%02d:%02d", - $cvsroot, - $modulename, - $login, $hostdomain, - $year%100, $mon+1, $mday, - $hour, $min, $sec); -} - -sub mail_notification { - local($name, @text) = @_; - open(MAIL, "| $MAILER -s \"CVS Update: " . $modulename . "\" " . $name); - print MAIL join("\n", @text), "\n"; - close(MAIL); -} - -sub write_commitlog { - local($logfile, @text) = @_; - - open(FILE, ">>$logfile"); - print FILE join("\n", @text), "\n"; - close(FILE); -} - -# -# Main Body -# - -# Initialize basic variables -# -$debug = 0; -$id = getpgrp(); # note, you *must* use a shell which does setpgrp() -$state = $STATE_NONE; -$login = getlogin || (getpwuid($<))[0] || "nobody"; -chop($hostname = `hostname`); -chop($domainname = `domainname`); -$hostdomain = $hostname . $domainname; -$cvsroot = $ENV{'CVSROOT'}; -$do_status = 1; -$modulename = ""; - -# parse command line arguments (file list is seen as one arg) -# -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-d') { - $debug = 1; - print STDERR "Debug turned on...\n"; - } elsif ($arg eq '-m') { - $mailto = "$mailto " . shift @ARGV; - } elsif ($arg eq '-M') { - $modulename = shift @ARGV; - } elsif ($arg eq '-s') { - $do_status = 0; - } elsif ($arg eq '-f') { - ($commitlog) && die("Too many '-f' args\n"); - $commitlog = shift @ARGV; - } else { - ($donefiles) && die("Too many arguments! Check usage.\n"); - $donefiles = 1; - @files = split(/ /, $arg); - } -} -($mailto) || die("No -m mail recipient specified\n"); - -# for now, the first "file" is the repository directory being committed, -# relative to the $CVSROOT location -# -@path = split('/', $files[0]); - -# XXX there are some ugly assumptions in here about module names and -# XXX directories relative to the $CVSROOT location -- really should -# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since -# XXX we have to parse it backwards. -# -if ($modulename eq "") { - $modulename = $path[0]; # I.e. the module name == top-level dir -} -if ($#path == 0) { - $dir = "."; -} else { - $dir = join('/', @path); -} -$dir = $dir . "/"; - -if ($debug) { - print STDERR "module - ", $modulename, "\n"; - print STDERR "dir - ", $dir, "\n"; - print STDERR "path - ", join(":", @path), "\n"; - print STDERR "files - ", join(":", @files), "\n"; - print STDERR "id - ", $id, "\n"; -} - -# Check for a new directory first. This appears with files set as follows: -# -# files[0] - "path/name/newdir" -# files[1] - "-" -# files[2] - "New" -# files[3] - "directory" -# -if ($files[2] =~ /New/ && $files[3] =~ /directory/) { - local(@text); - - @text = (); - push(@text, &build_header()); - push(@text, ""); - push(@text, $files[0]); - push(@text, ""); - - while (<STDIN>) { - chop; # Drop the newline - push(@text, $_); - } - - &mail_notification($mailto, @text); - - exit 0; -} - -# Check for an import command. This appears with files set as follows: -# -# files[0] - "path/name" -# files[1] - "-" -# files[2] - "Imported" -# files[3] - "sources" -# -if ($files[2] =~ /Imported/ && $files[3] =~ /sources/) { - local(@text); - - @text = (); - push(@text, &build_header()); - push(@text, ""); - push(@text, $files[0]); - push(@text, ""); - - while (<STDIN>) { - chop; # Drop the newline - push(@text, $_); - } - - &mail_notification($mailto, @text); - - exit 0; -} - -# Iterate over the body of the message collecting information. -# -while (<STDIN>) { - chop; # Drop the newline - - if (/^In directory/) { - push(@log_lines, $_); - push(@log_lines, ""); - next; - } - - if (/^Modified Files/) { $state = $STATE_CHANGED; next; } - if (/^Added Files/) { $state = $STATE_ADDED; next; } - if (/^Removed Files/) { $state = $STATE_REMOVED; next; } - if (/^Log Message/) { $state = $STATE_LOG; next; } - - s/^[ \t\n]+//; # delete leading whitespace - s/[ \t\n]+$//; # delete trailing whitespace - - if ($state == $STATE_CHANGED) { push(@changed_files, split); } - if ($state == $STATE_ADDED) { push(@added_files, split); } - if ($state == $STATE_REMOVED) { push(@removed_files, split); } - if ($state == $STATE_LOG) { push(@log_lines, $_); } -} - -# Strip leading and trailing blank lines from the log message. Also -# compress multiple blank lines in the body of the message down to a -# single blank line. -# -while ($#log_lines > -1) { - last if ($log_lines[0] ne ""); - shift(@log_lines); -} -while ($#log_lines > -1) { - last if ($log_lines[$#log_lines] ne ""); - pop(@log_lines); -} -for ($i = $#log_lines; $i > 0; $i--) { - if (($log_lines[$i - 1] eq "") && ($log_lines[$i] eq "")) { - splice(@log_lines, $i, 1); - } -} - -if ($debug) { - print STDERR "Searching for log file index..."; -} -# Find an index to a log file that matches this log message -# -for ($i = 0; ; $i++) { - local(@text); - - last if (! -e "$LOG_FILE.$i.$id"); # the next available one - @text = &read_logfile("$LOG_FILE.$i.$id", ""); - last if ($#text == -1); # nothing in this file, use it - last if (join(" ", @log_lines) eq join(" ", @text)); # it's the same log message as another -} -if ($debug) { - print STDERR " found log file at $i.$id, now writing tmp files.\n"; -} - -# Spit out the information gathered in this pass. -# -&append_names_to_file("$CHANGED_FILE.$i.$id", $dir, @changed_files); -&append_names_to_file("$ADDED_FILE.$i.$id", $dir, @added_files); -&append_names_to_file("$REMOVED_FILE.$i.$id", $dir, @removed_files); -&write_logfile("$LOG_FILE.$i.$id", @log_lines); - -# Check whether this is the last directory. If not, quit. -# -if ($debug) { - print STDERR "Checking current dir against last dir.\n"; -} -$_ = &read_line("$LAST_FILE.$id"); - -if ($_ ne $cvsroot . "/" . $files[0]) { - if ($debug) { - print STDERR sprintf("Current directory %s is not last directory %s.\n", $cvsroot . "/" .$files[0], $_); - } - exit 0; -} -if ($debug) { - print STDERR sprintf("Current directory %s is last directory %s -- all commits done.\n", $files[0], $_); -} - -# -# End Of Commits! -# - -# This is it. The commits are all finished. Lump everything together -# into a single message, fire a copy off to the mailing list, and drop -# it on the end of the Changes file. -# - -# -# Produce the final compilation of the log messages -# -@text = (); -@status_txt = (); -push(@text, &build_header()); -push(@text, ""); - -for ($i = 0; ; $i++) { - last if (! -e "$LOG_FILE.$i.$id"); # we're done them all! - @lines = &read_logfile("$CHANGED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Modified files:"); - push(@text, &format_lists(@lines)); - } - @lines = &read_logfile("$ADDED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Added files:"); - push(@text, &format_lists(@lines)); - } - @lines = &read_logfile("$REMOVED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Removed files:"); - push(@text, &format_lists(@lines)); - } - if ($#text >= 0) { - push(@text, ""); - } - @lines = &read_logfile("$LOG_FILE.$i.$id", "\t"); - if ($#lines >= 0) { - push(@text, "Log message:"); - push(@text, @lines); - push(@text, ""); - } - if ($do_status) { - local(@changed_files); - - @changed_files = (); - push(@changed_files, &read_logfile("$CHANGED_FILE.$i.$id", "")); - push(@changed_files, &read_logfile("$ADDED_FILE.$i.$id", "")); - push(@changed_files, &read_logfile("$REMOVED_FILE.$i.$id", "")); - - if ($debug) { - print STDERR "main: pre-sort changed_files = ", join(":", @changed_files), ".\n"; - } - sort(@changed_files); - if ($debug) { - print STDERR "main: post-sort changed_files = ", join(":", @changed_files), ".\n"; - } - - foreach $dofile (@changed_files) { - if ($dofile =~ /\/$/) { - next; # ignore the silly "dir" entries - } - if ($debug) { - print STDERR "main(): doing 'cvs -nQq status -v $dofile'\n"; - } - open(STATUS, "-|") || exec 'cvs', '-nQq', 'status', '-v', $dofile; - while (<STATUS>) { - chop; - push(@status_txt, $_); - } - } - } -} - -# Write to the commitlog file -# -if ($commitlog) { - &write_commitlog($commitlog, @text); -} - -if ($#status_txt >= 0) { - push(@text, @status_txt); -} - -# Mailout the notification. -# -&mail_notification($mailto, @text); - -# cleanup -# -if (! $debug) { - &cleanup_tmpfiles(); -} - -exit 0; diff --git a/gnu/usr.bin/cvs/contrib/mfpipe.pl b/gnu/usr.bin/cvs/contrib/mfpipe.pl deleted file mode 100644 index bae7a7243079b..0000000000000 --- a/gnu/usr.bin/cvs/contrib/mfpipe.pl +++ /dev/null @@ -1,88 +0,0 @@ -#! xPERL_PATHx -# -*-Perl-*- -# -# From: clyne@niwot.scd.ucar.EDU (John Clyne) -# Date: Fri, 28 Feb 92 09:54:21 MST -# -# BTW, i wrote a perl script that is similar to 'nfpipe' except that in -# addition to logging to a file it provides a command line option for mailing -# change notices to a group of users. Obviously you probably wouldn't want -# to mail every change. But there may be certain directories that are commonly -# accessed by a group of users who would benefit from an email notice. -# Especially if they regularly beat on the same directory. Anyway if you -# think anyone would be interested here it is. -# -# $Id: mfpipe.pl,v 1.2 1995/07/10 02:01:57 kfogel Exp $ -# -# -# File: mfpipe -# -# Author: John Clyne -# National Center for Atmospheric Research -# PO 3000, Boulder, Colorado -# -# Date: Wed Feb 26 18:34:53 MST 1992 -# -# Description: Tee standard input to mail a list of users and to -# a file. Used by CVS logging. -# -# Usage: mfpipe [-f file] [user@host...] -# -# Environment: CVSROOT -# Path to CVS root. -# -# Files: -# -# -# Options: -f file -# Capture output to 'file' -# - -$header = "Log Message:\n"; - -$mailcmd = "| mail -s 'CVS update notice'"; -$whoami = `whoami`; -chop $whoami; -$date = `date`; -chop $date; - -$cvsroot = $ENV{'CVSROOT'}; - -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-f') { - $file = shift @ARGV; - } - else { - $users = "$users $arg"; - } -} - -if ($users) { - $mailcmd = "$mailcmd $users"; - open(MAIL, $mailcmd) || die "Execing $mail: $!\n"; -} - -if ($file) { - $logfile = "$cvsroot/LOG/$file"; - open(FILE, ">> $logfile") || die "Opening $logfile: $!\n"; -} - -print FILE "$whoami $date--------BEGIN LOG ENTRY-------------\n" if ($logfile); - -while (<>) { - print FILE $log if ($log && $logfile); - - print FILE $_ if ($logfile); - print MAIL $_ if ($users); - - $log = "log: " if ($_ eq $header); -} - -close FILE; -die "Write failed" if $?; -close MAIL; -die "Mail failed" if $?; - -exit 0; diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/ChangeLog b/gnu/usr.bin/cvs/contrib/pcl-cvs/ChangeLog deleted file mode 100644 index ac24f446af2a2..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/ChangeLog +++ /dev/null @@ -1,774 +0,0 @@ -Wed Nov 22 11:01:50 1995 Joshua Cowan <jcowan@hermit.reslife.okstate.edu> - - * pcl-cvs.el (cvs-changelog-ours-p): use `user-full-name' if - `add-log-full-name' unbound, as not every uses the stuff in - add-log.el. Same with `add-log-mailing-address'. - (cvs-changelog-entries): change to `change-log-mode' unless - already in it. - -Sun Jul 9 20:57:11 1995 Karl Fogel <kfogel@floss.cyclic.com> - - * "/bin/rmdir" as default, not "/usr/local/bin/rmdir". - -Fri Jun 16 15:24:34 1995 Jim Kingdon (kingdon@cyclic.com) - - * pcl-cvs.elc, pcl-cvs-lucid.elc: Added. - - * Makefile.in: Rename from Makefile and set srcdir. - -Thu May 18 17:10:27 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - Automatically guess CVS log entries from ChangeLog contents. - * pcl-cvs.el (cvs-mode-changelog-commit): New command. - (cvs-changelog-full-paragraphs): New variable. - (cvs-changelog-name, cvs-narrow-changelog, - cvs-changelog-paragraph, cvs-changelog-subparagraph, - cvs-changelog-entry, cvs-changelog-ours-p, cvs-relative-path, - cvs-changelog-entries, cvs-changelog-insert-entries, cvs-union, - cvs-insert-changelog-entries, cvs-edit-delete-common-indentation): - New functions. - (cvs-mode-map): Bind 'C' to cvs-mode-changelog-commit. - (cvs-mode): Mention cvs-mode-changelog-commit in docstring. - - Give the info files names ending in ".info". - * Makefile (INFOFILES, install_info): Change pcl-cvs to - pcl-cvs.info. - (pcl-cvs.info): Target renamed from pcl-cvs. - (DISTFILES): pcl-cvs removed; we handle the info files explicitly - in the dist-dir target. - (dist-dir): Depend on pcl-cvs.info. Distribute pcl-cvs.info*. - * pcl-cvs.texinfo: Change @setfilename appropriately. - * INSTALL: Updated. - * .cvsignore: Correctly ignore the info files. - - * README: Note that pcl-cvs has been tested under 19.28, and that - the "cookie" naming conflict was resolved in 19.11. - - * Makefile (pcl-cvs-lucid.elc): Changed this target from - pcl-cvs-lucid.el. That's a source file, for goodness' sake! - -Tue May 9 13:56:50 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * Change references to "Cygnus's remote CVS" to "Cyclic CVS". - -Wed May 3 13:55:27 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * pcl-cvs.el (cvs-parse-stderr): Handle colons after both - "rcsmerge" and "warning". - -Fri Apr 28 22:38:14 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * Makefile (ELFILES): Include pcl-cvs-startup.el. - (info, pcl-cvs): Call makeinfo appropriately for modern versions. - (pcl-cvs.aux): List dependency on pcl-cvs.texinfo. - (pcl-cvs.ps): New target. - (DVIPS): New variable. - (dist-dir): Renamed from dist, updated to accept DISTDIR value - passed from parent. - (DISTFILES): New varible. - (pcl-cvs.elc, pcl-cvs-lucid.elc): Add targets to elcfiles target. - -Tue Apr 25 21:33:49 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * pcl-cvs.el: (cvs-parse-stderr): Recognize "conflicts" as well as - "overlaps" before "during merge." - -Thu Feb 16 12:17:20 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * pcl-cvs.el (cvs-parse-stderr): Recognize "conflicts found in..." - messages attributed to "cvs server", as well as "cvs update". - -Sat Feb 4 01:47:01 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * pcl-cvs.el: Deal with the 'P' action, produced by remote CVS. - (cvs-parse-stdout): Treat 'P' like 'U' --- file is updated. - -Tue Jan 31 23:31:39 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * pcl-cvs.el (cvs-cvsroot-required): New variable. - (cvs-do-update): If cvs-cvsroot-required is not set, don't complain if - CVSROOT and cvs-cvsroot are both unset. - -Sun Jan 22 21:22:22 1995 Jim Blandy <jimb@totoro.bio.indiana.edu> - - * pcl-cvs.el (cvs-parse-stderr): - Some changes for Cygnus's Remote CVS. Treat - messages like "cvs server: Updating DIRECTORY" as we treat those like - "cvs update: Updating DIRECTORY". Ignore other messages starting with - "cvs server". - - * pcl-cvs.el (cvs-parse-stderr): Re-indent. - - * .cvsignore: Add ignore list for Texinfo litter. - - * Makefile (lispdir): Set appropriately for totoro. - * pcl-cvs.el (cvs-program, cvs-diff-program, cvs-rmdir-program): Same. - -Tue Jun 1 00:00:03 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Release 1.05. (This release was promised before the end of May, - but I didn't quite make it. No, I didn't fake the date above). - -Mon May 31 01:32:25 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Removed the elib sub-directory. Users must now get the Elib - library separately. - * pcl-cvs.texinfo: Document it. - - * pcl-cvs-lucid.el: A new version, supplied by Jamie Zawinsky, - added. - - * pcl-cvs Id 68: Transform RCS keywords - * Makefile (pcl-cvs-$(VER)): Remove the $ signs in most files in - the distribution. - - * pcl-cvs Id 76: Extra " in cvs-mode-add. - * pcl-cvs.el (cvs-mode-add): Don't add the extra level of quotes - around the log message, since it doesn't work with CVS. - - * pcl-cvs Id 56: '-d <CVSROOT>' support in pcl-cvs - * pcl-cvs.el (cvs-change-cvsroot): New function. - - * pcl-cvs Id 77: *cvs* isn't cleared properly - * pcl-cvs.el (cvs-do-update): Always erase the *cvs* buffer and - re-create the collection. - - * pcl-cvs.el (cvs-do-update): Set mode-line-process in the *cvs* - buffer. - * pcl-cvs.el (cvs-mode): Reset mode-line-process. - - * pcl-cvs Id 59: sort .cvsignore alphabetically! - * pcl-cvs.el (cvs-sort-ignore-file): New variable. - * pcl-cvs.el (cvs-mode-ignore): Use it. - * pcl-cvs.texinfo: Document it. - - * pcl-cvs Id 75: Require final newline. - * pcl-cvs.el (cvs-commit-buffer-require-final-newline): New - variable. - * pcl-cvs.el (cvs-edit-done): Use it. - * pcl-cvs.texinfo: Document it. - - * pcl-cvs Id 72: make clean deletes lucid-emacs.el - * dist-makefile (ELCFILES): Fixed a typo. - - * pcl-cvs Id 46: "cvs remove f" "touch f" "cvs update f" -> parse err. - * pcl-cvs.el (cvs-fileinfo->type): New type: REM-EXIST. - * pcl-cvs.el (cvs-shadow-entry-p): A REMOVED that follows a - REM-EXIST is a shadow. - * pcl-cvs.el (cvs-parse-stderr): Recognize the "should be removed - and is still there" message. - * pcl-cvs.el (cvs-pp): Recognize REM-EXIST. - * pcl-cvs.el (cvs-mode-undo-local-changes): Recognize and complain - about REM-EXIST. Defensive test added: complain about unknown types. - - * pcl-cvs.el (cvs-mode-add): Add an extra level of quotes around - the log message. This is apparently needed by RCVS. <This change - has been removed. --ceder>. - - * pcl-cvs.el (cvs-parse-stderr): Ignore output from RCVS. - -Tue Apr 27 00:48:40 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.el (cvs-startup-message): Now a defconst instead of a - defvar. - * pcl-cvs.el (cvs-mode-commit): Add a defvar for it. - - * dist-makefile (EMACS): Use $(EMACS) instead of hard-coding 'emacs'. - -Sat Apr 17 12:47:10 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Release 1.04. - - * pcl-cvs.texinfo: Updated the Contributors node. - - * pcl-cvs Id 58: Lucid GNU Emacs support - * pcl-cvs-lucid.el: New file, contributed by the people at Lucid. - * pcl-cvs.el: Autoload pcl-cvs-lucid if running in an Lucid GNU - Emacs. - * compile-all.el: (files-to-compile): Add pcl-cvs-lucid. - * dist-makefile (ELFILES, ELCFILES): Dito. - - * pcl-cvs Id 55: cvs-diff-backup swaps old and new version. - * pcl-cvs.el (cvs-diff-backup-extractor): Old version should be - first. - * pcl-cvs.el (cvs-mode-diff-backup): Call cvs-backup-diffable - correctly. - - * pcl-cvs Id 64: elib substitute - * dist-makefile (install): Warn about Elib. - * pcl-cvs.texinfo: Talk about Elib. - - * pcl-cvs Id 50: Committing the *commit* buffer twice. - * pcl-cvs.el (cvs-edit-done): Report an error if cvs-commit-list - is empty, and empty it when the commit is done. - - * pcl-cvs Id 56: '-d <CVSROOT>' support. - * pcl-cvs.el (cvs-cvsroot): New variable. - * pcl-cvs.el (cvs-do-update, all callers of cvs-execute-list): Use - it everywhere CVS is called, to override CVSROOT. - * pcl-cvs.texinfo (Customization): Document it. - -Thu Apr 1 00:34:55 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Exit status nil - from call-process means everything was successful in some Emacs - versions. - - * pcl-cvs.el (cvs-mode-map): Bind "q" to bury-buffer. - * pcl-cvs.texinfo: Document it. - -Thu Mar 11 00:05:03 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Release 1.03-Emerge (not released). - - * Makefile (pcl-cvs-$(VER)): Don't includ elib-dll-debug.el in the - distribution. (It's included as elib/dll-debug.el). - - * pcl-cvs.el (cvs-mode): Document the "e" key (cvs-mode-emerge). - -Tue Mar 9 00:02:57 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.texinfo (Emerge): New node. - - * pcl-cvs.el (cvs-kill-buffer-visiting): New function. - - * pcl-cvs.el (cvs-mode-emerge): Handle Conflict and Merged files. - - * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Handle any revision. - - * pcl-cvs.el (cvs-fileinfo-*): Store base-revision instead of - backup-file. - - * pcl-cvs.el (cvs-backup-diffable): The file is only diffable if - the backup file is readable. - - * pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-emerge instead - of cvs-mode-find-file (which is anyhow bound to "f"). - -Mon Mar 8 23:06:52 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.el (cvs-mode-emerge): New function. Currently only - handles emerge of Modified files. - - * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): New function. - -Sun Jan 24 20:07:18 1993 Per Cederqvist (ceder@lysator.liu.se) - - * elib-dll-debug.el: Moved to elib. - -Mon Jan 18 00:35:59 1993 Per Cederqvist (ceder@mauritz) - - * pcl-cvs.el (cvs-do-update): Added a probably unnecessary sit-for. - - * Release 1.03-Elib-0.05.1 (not released). - - * Elib 0.05 compatibility: - * elib-dll-debug.el, pcl-cvs-buffer.el, test-dll.el: Fix the - require strings. - * pcl-cvs.el (cvs-pp): Insert the string. - - * Release 1.03-Elib-0.05 (not released). - - * elib: New directory, containing the parts of elib that are - required for pcl-cvs. Changes to the files in that directory - that are present in Elib are documented in the ChangeLog of - Elib, not here. - * Makefile (pcl-cvs-$(VER)): Copy the new dir to the distribution. - * dist-makefile (ELFILES, ELCFILES): Don't include the Elib files. - -Fri Jan 8 02:43:49 1993 Per Cederqvist (ceder@konrad) - - * pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-find-file, like - in dired. - -Sun Jan 3 23:25:13 1993 Per Cederqvist (ceder@konrad) - - * elib-dll.el, elib-node.el, cookie.el: Moved to the elib package. - Pcl-cvs now requires elib. - -Tue Dec 29 22:06:57 1992 Per Cederqvist (ceder@konrad) - - * pcl-cvs.el: Tracked the latest (last?) rename of all functions - in cookie.el. - -Thu Sep 24 00:29:16 1992 Per Cederqvist (ceder@robert) - - * pcl-cvs.texinfo (Archives): This version is not distributed with - CVS 1.3, so don't claim that it is. - -Fri Aug 21 15:17:08 1992 Per Cederqvist (ceder@maskros) - - * pcl-cvs.el (cvs-parse-stderr): Fixed two "(set head" that should - be "(setq head". - -Thu Aug 20 05:53:58 1992 Per Cederqvist (ceder@robin) - - * cookie.el: Changes to this file is documented in the ChangeLog - of elib in the future. - -Tue Aug 18 03:30:28 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el: Don't use cookie-last-tin (which no longer exists). - - * cookie.el: Use prefix cookie:: for internal functions. - - * cookie.el: (cookie:enter-after, cookie:enter-before, - cookie:nth-cookie): Implemented. - * cookie.el: No longer define (impl). - - * cookie.el: More renames: - cookie:next-cookie -> cookie:goto-next-tin - cookie:previous-cookie -> cookie:goto-previous-tin - tin-next -> cookie:next-tin - tin-previous -> cookie:previous-tin - tin-nth -> cookie:nth-tin - tin-delete -> cookie:delete-tin - cookie:collect -> cookie:collect-cookies - cookie:tin-collect -> cookie:collect-tins - (new) -> cookie:tin-collect-cookies - (new) -> cookie:tin-collect-tins - cookie:refresh -> cookie:refresh-all - tin-invalidate-tins -> cookie:invalidate-tins - -Mon Aug 17 01:39:49 1992 Per Cederqvist (ceder@robin) - - * cookie.el (cookie:set-buffer-bind-dll-let*): New macro. Used in - many places instead of cookie:set-buffer-bind-dll. - * cookie.el (cookie:set-buffer-bind-dll): Renamed the macro - cookie:set-buffer to this. - - * pcl-cvs.el (cvs-use-temp-buffer): Set default-directory. - -Sun Aug 16 20:51:30 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-add-sub): Fixed call to cvs-add-file-update-buffer. - -Sat Aug 8 20:28:21 1992 Per Cederqvist (ceder@robin) - - * Release 1.03-Cookie-II (not released). - - * pcl-cvs.el (cvs-mode-diff-cvs): Don't care about the exit status - from ``cvs diff''. - - * pcl-cvs.el (cvs-mode): Document cvs-mode-undo-local-changes. - * pcl-cvs.el (cvs-diffable): New function. - - * pcl-cvs.el: Use the new cookie package. - * pcl-cvs.el (cvs-cookie-handle): New variable. - * pcl-cvs.el (cvs-do-update): User the new cookie:create - interface, and cookie:clear if the buffer already existed. Make - the buffer read-only. - * pcl-cvs.el (cvs-mode-next-line, cvs-mode-previous-line): New - functions (used instead of cookie:next-cookie and - cookie:previous-cookie). - - * cookie.el: Major redesign. The handle that is passed to all - cookie functions is now a new datatype, and not the buffer that - the cookies resides in. This way it is possible to have more than - one set of cookies in a buffer. Things that used to be - buffer-local variables are now fields in the handle data type. - cookie-last-tin is no longer available. - * cookie.el (cookie:create): The buffer is not cleared, nor set to - be read-only. - * cookie.el (cookie:next-cookie, cookie:previous-cookie): Since - the first argument is now a handle and not a buffer, these can no - longer be called interactively. You have to write a small wrapper - about them. - * cookie.el (cookie:buffer): New function. - -Tue Aug 4 03:02:25 1992 Per Cederqvist (ceder@robert) - - * pcl-cvs.texinfo (Bugs): Renamed "Reporting bugs and ideas" to - "Bugs" and added a table of known bugs/FAQ:s. - -Mon Aug 3 00:19:39 1992 Per Cederqvist (ceder@robert) - - * pcl-cvs.el, pcl-cvs.texinfo: Big Renaming Time! - The commands that operate in the *cvs* buffer: - cvs-add-change-log-entry-other-window -> cvs-mode-add-change-log-entry-other-window - cvs-mark-all-files -> cvs-mode-mark-all-files - cvs-revert-updated-buffers -> cvs-mode-revert-updated-buffers - cvs-undo-local-changes -> cvs-mode-undo-local-changes - cvs-unmark-up -> cvs-mode-unmark-up - cvs-acknowledge -> cvs-mode-acknowledge - cvs-unmark-all-files -> cvs-mode-unmark-all-files - cvs-add -> cvs-mode-add - cvs-diff-backup -> cvs-mode-diff-backup - cvs-commit -> cvs-mode-commit - cvs-diff-cvs -> cvs-mode-diff-cvs - cvs-find-file -> cvs-mode-find-file - cvs-update-no-prompt -> cvs-mode-update-no-prompt - cvs-ignore -> cvs-mode-ignore - cvs-log -> cvs-mode-log - cvs-mark -> cvs-mode-mark - cvs-find-file-other-window -> cvs-mode-find-file-other-window - cvs-remove-file -> cvs-mode-remove-file - cvs-status -> cvs-mode-status - cvs-remove-handled -> cvs-mode-remove-handled - cvs-unmark -> cvs-mode-unmark - - * pcl-cvs.el (cvs-cvs-diff-flags): Variable deleted. - * pcl-cvs.el (cvs-diff-cvs): Use cvs-diff-flags instead. - * pcl-cvs.texinfo (Customization): Update the doc. - - * pcl-cvs.el (cvs-diff-cvs): Handle exit status 0 (no diffs), 1 - (diffs) and other (error). - * pcl-cvs.el (cvs-execute-list): Add support for this kind of - thing. - - * Revert buffers for committed files: - * pcl-cvs.el (cvs-auto-revert-after-commit): New variable. - * pcl-cvs.texinfo (Committing changes, Customization): Document - it. - * pcl-cvs.el (cvs-after-commit-function): New function. - - * pcl-cvs.el (cvs-execute-list): Return the exit status or nil. - * pcl-cvs.el (cvs-edit-done, cvs-diff-cvs, cvs-remove-file, - cvs-undo-local-changes, cvs-add, cvs-status, cvs-log): Use the - exit status to generate an error message. - - - * pcl-cvs.el (cvs-do-update): It should be "cvs -n update -l", not - "cvs -l update -n". Put the -n and/or -l in the message that is - displayed in the *cvs* buffer during the update. - -Sat Aug 1 00:55:49 1992 Per Cederqvist (ceder@robert) - - * cookie.el (cookie-sort): New function. - - * cookie.el (cookie-clear): Rewritten. No longer clears all local - variables. - -Tue Jul 28 17:21:17 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-parse-stderr): Try to handle the output from RCS - when it is compiled without DIFF3_BIN and a conflict occurs. - - * pcl-cvs.texinfo (Getting Started): Fixed typo. - - * pcl-cvs-startup.el (cvs-update-other-window): Make the autoload - be interactive. - -Mon Jul 27 19:36:40 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-revert-updated-buffers, cvs-revert-fileinfo): - New functions. - * pcl-cvs.texinfo (Reverting your buffers): Document it. - - * pcl-cvs.el (cvs-fileinfo->full-path): New function. - * pcl-cvs.el (cvs-full-path): Use it. - - * cookie.el (cookie-map, cookie-map-reverse): Better doc- - string. Removed the unused local variable 'result'. - - * compile-all.el: Renamed elib-files to files-to-compare. - * compile-all.el (compile-pcl-cvs): Bind load-path in a let - statement instead of globally. - -Thu Jul 23 19:02:41 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-do-update): Check that CVSROOT is set. - * pcl-cvs.el (cvs-diff-cvs): Check that cvs-cvs-diff-flags is a - list. - * pcl-cvs.el (cvs-diff-backup): Check that cvs-diff-flags is a - list. - -Tue Jul 21 11:27:39 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-parse-error): Make the *cvs* buffer writeable - before trying to write the email message. Require sendmail before - trying to switch to mail-mode. - - * pcl-cvs.el (cvs-do-update): Check that cvs-program exists. - - * pcl-cvs.el (cvs-skip-line): Fixed bracketing error. - -Mon Jul 20 10:31:51 1992 Per Cederqvist (ceder@robin) - - * Release 1.03. - - * pcl-cvs.el, cookie.el: Indentation fixes. - - * Makefile (pcl-cvs-$(VER)): Include NEWS in the distribution. - - * pcl-cvs.el (cvs-rm-program): Deleted. - * pcl-cvs.el (cvs-rmdir-program, cvs-lock-file): New variables. - - * Handle lock files in a nicer way: - * pcl-cvs.el (cvs-update-filter, cvs-delete-lock, - cvs-lock-file-p): New functions. - * pcl-cvs.el (cvs-do-update, cvs-sentinel): Redirect stdout to the - temporary file, not stderr. Use cvs-update-filter. - * pcl-cvs.el (cvs-parse-update): New arguments. - * pcl-cvs.el (cvs-parse-buffer): Renamed to cvs-parse-update. - * pcl-cvs.el (cvs-stderr-file): Renamed to cvs-stdout-file. - * pcl-cvs.texinfo (Miscellaneous commands, Updating the - directory): Document cvs-delete-lock. - - * pcl-cvs.el (cvs-mode): Don't reset buffer-read-only. - - * pcl-cvs.el (cvs-find-file-other-window): Don't save-some-buffers. - -Thu Jul 16 00:19:58 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el, test-cookie-el: Use the new names from cookie.el. - - * cookie.el: Big Renaming Time! - External functions: - cookie-next -> tin-next - cookie-previous -> tin-previous - cookie-nth -> tin-nth - cookie-delete -> tin-delete - cookie-filter-tins -> tin-filter - cookie-get-selection -> tin-get-selection - cookie-start-marker -> tin-start-marker - cookie-end-marker -> tin-end-marker - cookie-invalidate-tins -> tin-invalidate-tins - cookie-collect-tins -> tin-collect - cookie-collect-cookies -> cookie-collect - Internal functions: - cookie-create-tin -> cookie-create-wrapper - cookie-tin-start-marker -> cookie-wrapper-start-marker - cookie-tin-cookie-safe -> cookie-wrapper-cookie-safe - cookie-tin-cookie -> cookie-wrapper-cookie - set-cookie-tin-start-marker -> cookie-wrapper-set-start-marker - set-cookie-tin-cookie -> cookie-wrapper-set-cookie - cookie-tin-p -> cookie-wrapper-p - cookie-create-tin-and-insert -> cookie-create-wrapper-and-insert - - * pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Signal - an appropriate error message if the *cvs* buffer is empty. - - * cookie.el (cookie-create): Make the buffer read-only. - * cookie.el (cookie-create-tin-and-insert, cookie-refresh, - cookie-delete-tin-internal, cookie-refresh-tin): Bind - buffer-read-only to nil while changing the contents of - the buffer. - - * pcl-cvs.el (cvs-byte-compile-files): New function. - * pcl-cvs.texinfo (Miscellaneous commands): Document it. - - * pcl-cvs.el (cvs-diff-ignore-marks): New variable. - * pcl-cvs.el (cvs-diff-cvs, cvs-diff-backup): Don't consider - marked files to be selected if a prefix argument is given XOR the - variable cvs-diff-ignore-marks is non-nil. - * pcl-cvs.el (cvs-get-marked): New optional argument `ignore-marks'. - * pcl-cvs.texinfo (Customization, Viewing differences): Document - this behaviour. - - * pcl-cvs.el (cvs-undo-local-changes): New function. - * pcl-cvs.texinfo (Undoing changes): Document - cvs-undo-local-changes. - * pcl-cvs.el (cvs-mode-map): cvs-unmark-all-files moved from "U" - to "ESC DEL". cvs-undo-local-changes bound to "U". - * pcl-cvs.texinfo (Marking files): Document ESC DEL. - - * pcl-cvs.el (cvs-skip-line): New arguments. All callers updated. - Now calls cvs-parse-error if a parse error occurs. - * pcl-cvs.el (cvs-parse-error): New function that creates a bug - report. - * pcl-cvs.el (cvs-parse-stderr, cvs-parse-stdout): New arguments. - The only caller (cvs-parse-buffer) updated. Call cvs-parse-error - in case of parse error. - - * pcl-cvs.el (pcl-cvs-version): New variable. - - * cookie.el (cookie-create): Kill all local variables in the buffer. - -Fri Jul 10 11:17:40 1992 Per Cederqvist (ceder@robin) - - * Release 1.03beta1. - -Thu Jul 9 03:12:00 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-update-running): New variable. - * pcl-cvs.el (cvs-do-update): Use it instead of the previous local - variable cvs-process (that no longer exists). Make sure that only - one `cvs update' runs at any given moment. - * pcl-cvs.el (cvs-sentinel): Reset cvs-update-running when the - update process exits. - - * pcl-cvs.el (cvs-update): Switch to the *cvs* buffer. - * pcl-cvs.el (cvs-update-other-window): New function. - * pcl-cvs-startup.el (cvs-update-other-window): Added a autoload - for it. - * pcl-cvs.el (cvs-do-update): Don't pop up any buffer in a window - - let cvs-update or cvs-update-other-window handle that. Also - don't kill the *cvs* buffer, but rather insert a "Running cvs..." - message into it. - * pcl-cvs.el (cvs-parse-buffer): Don't change the window - configuration. - - * pcl-cvs.el (cvs-create-fileinfo, cvs-pp, cvs-fileninfo->type): - New type for a fileinfo: MESSAGE. - - * pcl-cvs.el (cvs-cvs-buffer): Deleted the variable. Use - cvs-buffer-name instead. (I no longer have any plans to allow more - than one cvs update to run at the same time - things only get - confusing). Changed all places where cvs-cvs-buffer was used. - - * pcl-cvs.el: Take care of update programs (the -u option in the - modules file): - * pcl-cvs.el (cvs-update-prog-output-skip-regexp): New variable. - * pcl-cvs.el (cvs-parse-stdout): Skip output from the update - program (using cvs-update-prog-output-skip-regexp). - * pcl-cvs.texinfo (Future enhancements): Document that the - solution is not as good as it should be. - * pcl-cvs.texinfo (Customization): Document the variable. - -Wed Jul 8 20:29:44 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-do-update): Check that this-dir really exists - and is a directory, and that this-dir/CVS exists and is a - directory. - -Tue Jul 7 01:02:24 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.texinfo (Customization): Document TMPDIR. - - * This chunk of modifications should make it possible to run - pcl-cvs on hosts that do not line-buffer stdout (such as - DECstation). They work by diverting stdout and stderr from - `cvs update' and later sorting them together. - * pcl-cvs.el (cvs-parse-stderr): Don't fail to parse conflict - data. - * pcl-cvs.el (cvs-remove-stdout-shadows, cvs-shadow-entry-p): New - functions. - * pcl-cvs.el (cvs-parse-buffer): Use it. - * pcl-cvs.el (cvs-remove-empty-directories): New function. - * pcl-cvs.el (cvs-remove-handled, cvs-parse-buffer): Use it. - * pcl-cvs.el (cvs-get-current-dir): New argument ROOT-DIR. All - calls to cvs-get-current-dir updated. - * pcl-cvs.el (cvs-do-update): Allocate a tmp file. Use cvs-shell - (typically /bin/sh) to redirect stderr from CVS to the tmp file. - * pcl-cvs.el (cvs-sentinel): Handle the tmp file. Remove it when - it is parsed. - * pcl-cvs.el (cvs-parse-buffer): New argument STDERR-BUFFER. All - calls to cvs-parse-buffer updated. Rewritten to handle the - separation of stderr and stdout. - * pcl-cvs.el (cvs-shell, cvs-stderr-file): New variables. - * pcl-cvs.el (cvs-compare-fileinfos, cvs-parse-stderr, - cvs-parse-stdout): New functions. - - * pcl-cvs.el (cvs-parse-buffer): Some modifications for output - from RCS 5.6. - -Tue Apr 7 09:11:27 1992 Per Cederqvist (ceder@leopold) - - * Release 1.02. - - * pcl-cvs.el (cvs-diff-backup, cvs-edit-done, cvs-status): Call - save-some-buffers. - - * pcl-cvs.el (cvs-diff-backup-extractor): Fixed syntax error. - - * Makefile, README, compile-all.el, dist-makefile, pcl-cvs.el, - pcl-cvs.texinfo (XXRELEASEXX): A magic string that is substituted - for the current release number when a distribution is made. - (Release 1.01 says that it is release 1.00). - - * pcl-cvs.el (cvs-find-file): Added missing pair of parenthesis. - -Mon Mar 30 14:25:26 1992 Per Cederqvist (ceder@leopold) - - * Release 1.01. - - * pcl-cvs.el (cvs-parse-buffer): The message when waiting for a - lock has been changed. - -Sun Mar 29 05:29:57 1992 Per Cederqvist (ceder@leopold) - - * Release 1.00. - - * pcl-cvs.el (cvs-do-update, cvs-sentinel, cvs-parse-buffer): - Major rewrite of buffer and window selection and handling. - The *cvs* buffer is now killed whenever a new "cvs update" is - initiated. The -update buffer is replaced with the *cvs* - buffer when the update is completed. - -Sat Mar 28 21:03:05 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-delete-unused-temporary-buffers): Fixed it. - - * pcl-cvs.el (cvs-auto-remove-handled): New variable. - * pcl-cvs.el (cvs-edit-done): Use it. - * pcl-cvs.texinfo (Customization, Removing handled entries): - Document it. - - * pcl-cvs.el (cvs-mode): Turn of the undo feature. It really - isn't useful in a cookie buffer... - - * pcl-cvs.el (cvs-edit-done): Committing a file now looks more - like diffing a file. The window handling is better. - * pcl-cvs.el (cvs-use-temp-buffer): The &optional switch is no - longer needed. - -Mon Mar 23 00:20:33 1992 Per Cederqvist (ceder@robin) - - * Release 0.97. - - * pcl-cvs.el (default-directory): Make sure it always ends in a - slash. fileinfo->dir does NOT end in a slash, and I had forgotten - to call file-name-as-directory in various places. - - * pcl-cvs.el (cvs-diff-backup-extractor): Signal an error if a - fileinfo without backup file is given. - - * pcl-cvs.el (cvs-mode): Added documentation. - - * pcl-cvs.el (cvs-execute-list): Fix the order of files in the - same directory. - - * pcl-cvs.el (cvs-log-flags, cvs-status-flags): New variables. - * pcl-cvs.el (cvs-log, cvs-status): Use them. - * pcl-cvs.texinfo (Customization): Document them. - - * pcl-cvs.el (cvs-diff-backup): Filter non-backup-diffable files - at an earlier stage, like cvs-commit does. - - * pcl-cvs.el (cvs-diff-flags): New variable. - * pcl-cvs.el (cvs-diff-backup): Use it. - * pcl-cvs.texinfo (Customization): Document it. - - * pcl-cvs.el (cvs-execute-single-file-list): Remove &rest before - last argument. No callers needed updating. - - * pcl-cvs.el (cvs-execute-list): Remove the &rest before the last - argument (constant-args). Update all callers of cvs-execute-list - to use the new calling convention. - * pcl-cvs.el (cvs-cvs-diff-flags): Now a list of strings instead - of a string. - * pcl-cvs.texinfo (Customization): Document the change to - cvs-cvs-diff-flags. - - * Release 0.96. - - * pcl-cvs.el (cvs-cvs-diff-flags): New variable. - * pcl-cvs.el (cvs-diff-cvs): Use it. - * pcl-cvs.texinfo (Customization, Viewing differences): Document it. - - * pcl-cvs.el (cvs-use-temp-buffe): Don't switch to the temporary - buffer. Use display-buffer and set-buffer instead. This way - cvs-log, cvs-status, cvs-diff-cvs and friends don't select the - temporary buffer. The cursor will remain in the *cvs* buffer. - -Sun Mar 22 21:50:18 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Don't - prompt when reading in a directory in dired. - - * Makefile (pcl-cvs-$(VER)): Include pcl-cvs-startup.el in the - distribution. - - * dist-makefile (pcl-cvs.dvi): Don't fail even if texindex does - not exist. - - * pcl-cvs.texinfo (@setchapternewpage): Changed from 'off' to 'on'. - * pcl-cvs.texinfo (Variable index): Joined into function index. - * pcl-cvs.texinfo (Key index): add a description about the key. - * pcl-cvs.texinfo: Many other small changes. - -Wed Mar 18 01:58:38 1992 Per Cederqvist (ceder@leopold) - - * Use GNU General Public License version 2. - diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/INSTALL b/gnu/usr.bin/cvs/contrib/pcl-cvs/INSTALL deleted file mode 100644 index 76799679ac5d9..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/INSTALL +++ /dev/null @@ -1,89 +0,0 @@ -This text is copied from the TeXinfo manual for pcl-cvs. - -Installation of the pcl-cvs program -=================================== - - 1. Edit the file `Makefile' to reflect the situation at your site. - The only things you have to change is the definition of `lispdir' - and `infodir'. The elisp files will be copied to `lispdir', and - the info file to `infodir'. - - 2. Configure pcl-cvs.el - - There are a couple of paths that you have to check to make sure - that they match you system. They appear early in the file - pcl-cvs.el. - - *NOTE:* If your system is running emacs 18.57 or earlier you - MUST uncomment the line that says: - - (setq delete-exited-processes nil) - - Setting `delete-exited-processes' to `nil' works around a bug in - emacs that causes it to dump core. The bug was fixed in emacs - 18.58. - - 3. Release 1.05 and later of pcl-cvs requires parts of the Elib - library, version 0.07 or later. Elib is available via anonymous - ftp from prep.ai.mit.edu in `pub/gnu/elib-0.07.tar.z', and from - a lot of other sites that mirrors prep. Get Elib, and install - it, before proceeding. - - 4. Type `make install' in the source directory. This will - byte-compile all `.el' files and copy both the `.el' and the - `.elc' into the directory you specified in step 1. - - If you don't want to install the `.el' files but only the `.elc' - files (the byte-compiled files), you can type ``make - install_elc'' instead of ``make install''. - - If you only want to create the compiled elisp files, but don't - want to install them, you can type `make elcfiles' instead. - This is what happens if you only type `make' without parameters. - - 5. Edit the file `default.el' in your emacs lisp directory (usually - `/usr/gnu/emacs/lisp' or something similar) and enter the - contents of the file `pcl-cvs-startup.el' into it. It contains - a couple of `auto-load's that facilitates the use of pcl-cvs. - - - -Installation of the on-line manual. -=================================== - - 1. Move the info file `pcl-cvs.info' to your standard info - directory. This might be called something like - `/usr/gnu/emacs/info'. - - 2. Edit the file `dir' in the info directory and enter one line to - contain a pointer to the info file `pcl-cvs.info'. The line can, - for instance, look like this: - - * Pcl-cvs: (pcl-cvs.info). An Emacs front-end to CVS. - - -How to make the on-line manual from pcl-cvs.texinfo -=================================================== - - 1. Create the info file `pcl-cvs.info' from `pcl-cvs.texinfo' by - typing `make info'. If you don't have the program `makeinfo' you - can get it by anonymous ftp from e.g. `ftp.gnu.ai.mit.edu' as - `pub/gnu/texinfo-2.14.tar.Z' (there might be a newer version - there when you read this). - - -How to make typeset documentation from pcl-cvs.texinfo -====================================================== - - If you have TeX installed at your site, you can make a typeset -manual from `pcl-cvs.texinfo'. - - 1. Run TeX by typing ``make pcl-cvs.dvi''. You will not get the - indices unless you have the `texindex' program. - - 2. Convert the resulting device independent file `pcl-cvs.dvi' to a - form which your printer can output and print it. If you have a - postscript printer there is a program, `dvi2ps', which does. - There is also a program which comes together with TeX, `dvips', - which you can use. - diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/Makefile b/gnu/usr.bin/cvs/contrib/pcl-cvs/Makefile deleted file mode 100644 index 7f6f5b118a696..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -# @(#) Id: dist-makefile,v 1.19 1993/05/31 22:43:45 ceder Exp -# Makefile for pcl-cvs release 1.05. -# Copyright (C) 1992, 1993 Per Cederqvist -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -# This is the directory in which the ELFILES and ELCFILES will be -# installed. - -lispdir = /usr/local/lib/elisp - -# Where to install the info file. - -prefix=/usr/local -infodir = $(prefix)/info - -# Used to byte-compile files. - -EMACS=emacs - -# -# The rest of this file should not need to be modified. -# - -# Just in case... -SHELL = /bin/sh - -ELFILES = pcl-cvs.el pcl-cvs-lucid.el -ELCFILES = pcl-cvs.elc pcl-cvs-lucid.elc -INFOFILES = pcl-cvs -TEXTMPS = pcl-cvs.aux pcl-cvs.log pcl-cvs.toc pcl-cvs.dvi pcl-cvs.cp \ - pcl-cvs.fn pcl-cvs.vr pcl-cvs.tp pcl-cvs.ky pcl-cvs.pg \ - pcl-cvs.cps pcl-cvs.fns pcl-cvs.kys pcl-cvs.pgs pcl-cvs.tps \ - pcl-cvs.vrs - -INSTALL = install -INSTALL_DATA = $(INSTALL) - -elcfiles: - $(EMACS) -batch -l ./compile-all.el -f compile-pcl-cvs - -all: elcfiles info - -# Don't install the info file yet, since it requires makeinfo -# version 2.something (and version 1.something is distributed with emacs). -# -# install: install_elc install_info -install: install_elc - for i in $(ELFILES); do $(INSTALL_DATA) $$i $(lispdir)/$$i; done - -install_elc: elcfiles - for i in $(ELCFILES); do $(INSTALL_DATA) $$i $(lispdir)/$$i; done - -install_info: pcl-cvs - $(INSTALL_DATA) pcl-cvs $(infodir)/pcl-cvs - -info pcl-cvs: pcl-cvs.texinfo - makeinfo +fill-column=70 pcl-cvs.texinfo - -pcl-cvs.dvi: pcl-cvs.texinfo - tex pcl-cvs.texinfo - tex pcl-cvs.texinfo - -texindex pcl-cvs.cp pcl-cvs.fn pcl-cvs.vr pcl-cvs.tp pcl-cvs.ky \ - pcl-cvs.pg - tex pcl-cvs.texinfo - -mostlyclean clean realclean: - rm -f *~ core $(ELCFILES) $(INFOFILES) $(TEXTMPS) - -tags TAGS: - etags *.el diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/NEWS b/gnu/usr.bin/cvs/contrib/pcl-cvs/NEWS deleted file mode 100644 index 4f563ffc50198..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/NEWS +++ /dev/null @@ -1,113 +0,0 @@ -This is the NEWS file for pcl-cvs, an Elisp front-end to CVS. - -User-visible changes in pcl-cvs from 1.04 to 1.05: - -* Elib is no longer distributed with pcl-cvs. You must get Elib - separately, for instance from ftp.lysator.liu.se in pub/emacs. - -* The Lucid Emacs support works again. - -* A new function, cvs-change-cvsroot, can be used to interactively - switch between CVS repositories. - -* The mode line in the *cvs* buffer now indicates when a "cvs update" - is running. - -* The .cvsignore file is automatically sorted alphabetically (to - reduce the risk of conflicts when two people add different files - simultaneously). This behaviour can be turned off with - cvs-sort-ignore-file. - -* A trailing newline is always added in commit log messages. This - behaviour can be turned off with - cvs-commit-buffer-require-final-newline. - -* This version of pcl-cvs should work together with RCVS. I have not - tested this myself, though. - -* Plus some bug fixes. (Note that the version of cookie.el that is - distributed with pcl-cvs 1.04 contains errors that affects pcl-cvs. - You should get Elib 0.07). - - -User-visible changes in pcl-cvs from 1.03 to 1.04: - -* Support for Emerge. Hitting "e" on a file that is Modified, Merged - or in Conflict will start Emerge, an interactive file merger written - in Emacs Lisp. This requires Emerge version 4. Emerge is not - included in this package. If you can't find it anywhere else, you - can get in from ftp.lysator.liu.se in pub/emacs. This package makes - it a lot easier to resolve conflicts. - -* Emacs will now automatically revert your buffers when the CVS - commands pcl-cvs issues causes the file to change. This automatic - revert never occurs if the buffer contents did not agree with the - file prior to the command. - -* If you are running Lucid GNU Emacs, you will get some fonts and - mouse support. This was contributed from people at Lucid. - -* The variable cvs-cvsroot can be used to select the location if the - repository. You no longer need to exit Emacs, setenv CVSROOT, and - start a new Emacs if you work with multiple repositories. - -* The "q" key can be used to hide the *cvs* buffer. - -* The name of the commands in the *cvs* have changed. If it was called - cvs-foo, it will now be called cvs-mode-foo. See the ChangeLog - entry from Tue Aug 4 03:02:25 1992 for a complete list of changes. - -* The variable cvs-cvs-diff-flags is no longer used. Instead, - cvs-diff-flags is always used. - -* Plus a lot of bug fixes. - - -User-visible changes in pcl-cvs from 1.02 to 1.03: - -* Output from CVS to stdout and stderr is separated and parsed - independently. In that way pcl-cvs should work regardless of - whether stdout is buffered or line-buffered. Pcl-cvs should now - work with CVS 1.3 without modifications on hosts such as - DECstations. - -* Pcl-cvs now fully supports RCS version 5.6 as well as 5.5. - -* New functions: - - + cvs-undo-local-changes ("U") - Undo all your modifications - to a file and get the newest - version from the repository. - + cvs-update-other-window - Similar to cvs-update. - + cvs-byte-compile-files - Byte compile the selected files. - -* cvs-update now displays the *cvs* buffer, which initially contains a - small message ("Running `cvs update' in /foo/bar/gazonk/...") until - the update is ready. The *cvs* buffer no longer pops up when the - update is ready. It often failed to pop up, due to race conditions - that are very hard to solve (and I doubt that they were at all - solvable). - -* cvs-unmark-all-files is moved from "U" to "ESC DEL" to be - "compatible" with dired. - -* cvs-diff ("d") and cvs-diff-backup ("b") can be configured to work - on only the file the cursor is positioned on, and ignore any marked - files. A prefix argument toggles this. - -* Only one `cvs update' can be run at a time. (It was previously - possible to start more than one simultaneously, but pcl-cvs could - not really handle more than one.) - -* Some rudimentary support for programs that CVS runs at update (due - to the -u switch in the modules file). - -* Pcl-cvs now automatically generates a bug report if it can't parse - the output from CVS. - -* The *cvs* buffer is read-only. - -* Pcl-cvs now creates temporary files in $TMPDIR if that environment - variable is set (otherwise it uses /tmp). - ----End of file NEWS--- diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/README b/gnu/usr.bin/cvs/contrib/pcl-cvs/README deleted file mode 100644 index a9b8106613736..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/README +++ /dev/null @@ -1,29 +0,0 @@ -@(#) Id: README,v 1.14 1993/05/31 22:43:36 ceder Exp - -This is the readme file for pcl-cvs, release 1.05. - -This release of pcl-cvs requires Elib 0.07 or later. Elib is no -longer distributed with pcl-cvs, since that caused too much confusion. -You can get Elib from ftp.lysator.liu.se in pub/emacs/elib-*.tar.?. - -Pcl-cvs is a front-end to CVS version 1.3. It integrates the most -frequently used CVS commands into emacs. - -There is some configuration that needs to be done in pcl-cvs.el to get -it to work. See the instructions in file INSTALL. - -Full documentation is in pcl-cvs.texinfo. Since it requires makeinfo -version 2 or 3 a preformatted info file is also included (pcl-cvs.info). - -If you have been using a previous version of pcl-cvs (for instance -1.02 which is distributed with CVS 1.3) you should read through the -file NEWS to see what has changed. - -This release has been tested under Emacs 18.59, Emacs 19.28 and Lucid -Emacs 19.6. Emacs 19.10 unfortunately has a file named cookie.el that -collides with the cookie.el that is distributed in Elib. This -conflict was resolved in 19.11. For earlier versions, there are -instructions in Elib 0.07 for how to work around the problem. - - Per Cederqvist - (updated by Jim Blandy) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/compile-all.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/compile-all.el deleted file mode 100644 index 6563277508593..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/compile-all.el +++ /dev/null @@ -1,52 +0,0 @@ -;;;; @(#) Id: compile-all.el,v 1.11 1993/05/31 18:40:25 ceder Exp -;;;; This file byte-compiles all .el files in pcl-cvs release 1.05. -;;;; -;;;; Copyright (C) 1991 Inge Wallin -;;;; -;;;; This file was once upon a time part of Elib, but have since been -;;;; modified by Per Cederqvist. -;;;; -;;;; GNU Elib 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 1, or (at your option) -;;;; any later version. -;;;; -;;;; GNU Elib 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 GNU Emacs; see the file COPYING. If not, write to -;;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -;;;; - - -(setq files-to-compile '("pcl-cvs" "pcl-cvs-lucid")) - - -(defun compile-file-if-necessary (file) - "Compile FILE if necessary. - -This is done if FILE.el is newer than FILE.elc or if FILE.elc doesn't exist." - (let ((el-name (concat file ".el")) - (elc-name (concat file ".elc"))) - (if (or (not (file-exists-p elc-name)) - (file-newer-than-file-p el-name elc-name)) - (progn - (message (format "Byte-compiling %s..." el-name)) - (byte-compile-file el-name))))) - - -(defun compile-pcl-cvs () - "Byte-compile all uncompiled files of pcl-cvs." - - (interactive) - - ;; Be sure to have . in load-path since a number of files - ;; depend on other files and we always want the newer one even if - ;; a previous version of pcl-cvs exists. - (let ((load-path (append '(".") load-path))) - - (mapcar (function compile-file-if-necessary) - files-to-compile))) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/cookie.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/cookie.el deleted file mode 100644 index 8bd4bdff6ce05..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/cookie.el +++ /dev/null @@ -1,884 +0,0 @@ -;;; cookie.el,v 1.2 1992/04/07 20:49:12 berliner Exp -;;; cookie.el -- Utility to display cookies in buffers -;;; Copyright (C) 1991, 1992 Per Cederqvist -;;; -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 2 of the License, or -;;; (at your option) any later version. -;;; -;;; This program is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with this program; if not, write to the Free Software -;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -;;;; TO-DO: Byt namn! tin -> wrapper (eller n}got b{ttre). - -;;; Note that this file is still under development. Comments, -;;; enhancements and bug fixes are welcome. -;;; Send them to ceder@lysator.liu.se. - -(defun impl nil (error "Not yet implemented!")) - -;;; Cookie is a package that imlements a connection between an -;;; elib-dll and the contents of a buffer. Possible uses are dired -;;; (have all files in a list, and show them), buffer-list, -;;; kom-prioritize (in the LysKOM elisp client) and others. pcl-cvs.el -;;; uses cookie.el. -;;; -;;; A cookie buffer contains a header, any number of cookies, and a -;;; footer. The header and footer are constant strings that are given -;;; to cookie-create when the buffer is placed under cookie. Each cookie -;;; is displayed in the buffer by calling a user-supplied function -;;; that takes a cookie and returns a string. The string may be -;;; empty, or contain any number of lines. An extra newline is always -;;; appended unless the string is empty. -;;; -;;; Cookie does not affect the mode of the buffer in any way. It -;;; merely makes it easy to connect an underlying data representation -;;; to the buffer contents. -;;; -;;; The cookie-node data type: -;;; start-marker -;;; ;; end-marker This field is no longer present. -;;; cookie The user-supplied element. -;;; -;;; A dll of cookie-nodes are held in the buffer local variable -;;; cake-tin. -;;; -;;; A tin is an object that contains one cookie. You can get the next -;;; and previous tin. -;;; - -(require 'elib-dll) -(provide 'cookie) - -(defvar cookies nil - "A doubly linked list that contains the underlying data representation -for the contents of a cookie buffer. The package elib-dll is used to -manipulate this list.") - -(defvar cookie-pretty-printer nil - "The function that is used to pretty-print a cookie in this buffer.") - -(defvar cookie-header nil - "The tin that holds the header cookie.") - -(defvar cookie-footer nil - "The tin that holds the footer cookie.") - -(defvar cookie-last-tin nil - "The tin the cursor was positioned at, the last time the cookie -package checked the cursor position. Buffer local in all buffers -the cookie package works on. You may set this if your package -thinks it knows where the cursor will be the next time this -package is called. It can speed things up. - -It must never be set to a tin that has been deleted.") - -;;; ================================================================ -;;; Internal functions for use in the cookie package - -(put 'cookie-set-buffer 'lisp-indent-hook 1) - -(defmacro cookie-set-buffer (buffer &rest forms) - - ;; Execute FORMS with BUFFER selected as current buffer. - ;; Return value of last form in FORMS. INTERNAL USE ONLY. - - (let ((old-buffer (make-symbol "old-buffer"))) - (` (let (((, old-buffer) (current-buffer))) - (set-buffer (get-buffer-create (, buffer))) - (unwind-protect - (progn (,@ forms)) - (set-buffer (, old-buffer))))))) - - -(defmacro cookie-filter-hf (tin) - - ;; Evaluate TIN once and return it. BUT if it is - ;; equal to cookie-header or cookie-footer return nil instead. - ;; INTERNAL USE ONLY. - - (let ((tempvar (make-symbol "tin"))) - (` (let (((, tempvar) (, tin))) - (if (or (eq (, tempvar) cookie-header) - (eq (, tempvar) cookie-footer)) - nil - (, tempvar)))))) - - -;;; cookie-tin -;;; Constructor: - -(defun cookie-create-tin (start-marker - cookie) - ;; Create a tin. INTERNAL USE ONLY. - (cons 'COOKIE-TIN (vector start-marker nil cookie))) - - -;;; Selectors: - -(defun cookie-tin-start-marker (cookie-tin) - ;; Get start-marker from cookie-tin. INTERNAL USE ONLY. - (elt (cdr cookie-tin) 0)) - -;(defun cookie-tin-end-marker (cookie-tin) -; ;;Get end-marker from cookie-tin. INTERNAL USE ONLY. -; (elt (cdr cookie-tin) 1)) - -(defun cookie-tin-cookie-safe (cookie-tin) - ;; Get cookie from cookie-tin. INTERNAL USE ONLY. - ;; Returns nil if given nil as input. - ;; This is the same as cookie-tin-cookie in version 18.57 - ;; of emacs, but elt should signal an error when given nil - ;; as input (according to the info files). - (elt (cdr cookie-tin) 2)) - -(defun cookie-tin-cookie (cookie-tin) - ;; Get cookie from cookie-tin. INTERNAL USE ONLY. - (elt (cdr cookie-tin) 2)) - - -;;; Modifiers: - -(defun set-cookie-tin-start-marker (cookie-tin newval) - ;; Set start-marker in cookie-tin to NEWVAL. INTERNAL USE ONLY. - (aset (cdr cookie-tin) 0 newval)) - -;(defun set-cookie-tin-end-marker (cookie-tin newval) -; ;; Set end-marker in cookie-tin to NEWVAL. INTERNAL USE ONLY. -; (aset (cdr cookie-tin) 1 newval)) - -(defun set-cookie-tin-cookie (cookie-tin newval) - ;; Set cookie in cookie-tin to NEWVAL. INTERNAL USE ONLY. - (aset (cdr cookie-tin) 2 newval)) - - - -;;; Predicate: - -(defun cookie-tin-p (object) - ;; Return t if OBJECT is a tin. INTERNAL USE ONLY. - (eq (car-safe object) 'COOKIE-TIN)) - -;;; end of cookie-tin data type. - - -(defun cookie-create-tin-and-insert (cookie string pos) - ;; Insert STRING at POS in current buffer. Remember start - ;; position. Create a tin containing them and the COOKIE. - ;; INTERNAL USE ONLY. - - (save-excursion - (goto-char pos) - ;; Remember the position as a number so that it doesn't move - ;; when we insert the string. - (let ((start (if (markerp pos) - (marker-position pos) - pos))) - ;; Use insert-before-markers so that the marker for the - ;; next cookie is updated. - (insert-before-markers string) - (insert-before-markers ?\n) - (cookie-create-tin (copy-marker start) cookie)))) - - -(defun cookie-delete-tin-internal (tin) - ;; Delete a cookie from the buffer. INTERNAL USE ONLY. - ;; Can not be used on the footer. - (delete-region (cookie-tin-start-marker (dll-element cookies tin)) - (cookie-tin-start-marker - (dll-element cookies - (dll-next cookies tin))))) - - - -(defun cookie-refresh-tin (tin) - ;; Redisplay the cookie represented by TIN. INTERNAL USE ONLY. - ;; Can not be used on the footer. - - (save-excursion - ;; First, remove the string: - (delete-region (cookie-tin-start-marker (dll-element cookies tin)) - (1- (marker-position - (cookie-tin-start-marker - (dll-element cookies - (dll-next cookies tin)))))) - - ;; Calculate and insert the string. - - (goto-char (cookie-tin-start-marker (dll-element cookies tin))) - (insert - (funcall cookie-pretty-printer - (cookie-tin-cookie (dll-element cookies tin)))))) - - -;;; ================================================================ -;;; The public members of the cookie package - - -(defun cookie-cookie (buffer tin) - "Get the cookie from a TIN. Args: BUFFER TIN." - (cookie-set-buffer buffer - (cookie-tin-cookie (dll-element cookies tin)))) - - - - -(defun cookie-create (buffer pretty-printer &optional header footer) - - "Start to use the cookie package in BUFFER. -BUFFER may be a buffer or a buffer name. It is created if it does not exist. -Beware that the entire contents of the buffer will be erased. -PRETTY-PRINTER is a function that takes one cookie and returns a string -to be displayed in the buffer. The string may be empty. If it is not -empty a newline will be added automatically. It may span several lines. -Optional third argument HEADER is a string that will always be present -at the top of the buffer. HEADER should end with a newline. Optionaly -fourth argument FOOTER is similar, and will always be inserted at the -bottom of the buffer." - - (cookie-set-buffer buffer - - (erase-buffer) - - (make-local-variable 'cookie-last-tin) - (make-local-variable 'cookie-pretty-printer) - (make-local-variable 'cookie-header) - (make-local-variable 'cookie-footer) - (make-local-variable 'cookies) - - (setq cookie-last-tin nil) - (setq cookie-pretty-printer pretty-printer) - (setq cookies (dll-create)) - - (dll-enter-first cookies - (cookie-create-tin-and-insert - header header 0)) - (setq cookie-header (dll-nth cookies 0)) - - (dll-enter-last cookies - (cookie-create-tin-and-insert - footer footer (point-max))) - (setq cookie-footer (dll-nth cookies -1)) - - (goto-char (point-min)) - (forward-line 1))) - - -(defun cookie-set-header (buffer header) - "Change the header. Args: BUFFER HEADER." - (impl)) - - -(defun cookie-set-footer (buffer header) - "Change the footer. Args: BUFFER FOOTER." - (impl)) - - - -(defun cookie-enter-first (buffer cookie) - "Enter a COOKIE first in BUFFER. -Args: BUFFER COOKIE." - - (cookie-set-buffer buffer - - ;; It is always safe to insert an element after the first element, - ;; because the header is always present. (dll-nth cookies 0) should - ;; never return nil. - - (dll-enter-after - cookies - (dll-nth cookies 0) - (cookie-create-tin-and-insert - cookie - (funcall cookie-pretty-printer cookie) - (cookie-tin-start-marker - (dll-element cookies (dll-nth cookies 1))))))) - - - -(defun cookie-enter-last (buffer cookie) - "Enter a COOKIE last in BUFFER. -Args: BUFFER COOKIE." - - (cookie-set-buffer buffer - - ;; Remember that the header and footer are always present. There - ;; is no need to check if (dll-nth cookies -2) returns nil. - - (dll-enter-before - cookies - (dll-nth cookies -1) - (cookie-create-tin-and-insert - cookie - (funcall cookie-pretty-printer cookie) - (cookie-tin-start-marker (dll-last cookies)))))) - - -(defun cookie-enter-after (buffer node cookie) - (impl)) - - -(defun cookie-enter-before (buffer node cookie) - (impl)) - - - -(defun cookie-next (buffer tin) - "Get the next tin. Args: BUFFER TIN. -Returns nil if TIN is nil or the last cookie." - (if tin - (cookie-set-buffer buffer - (cookie-filter-hf (dll-next cookies tin))))) - - - -(defun cookie-previous (buffer tin) - "Get the previous tin. Args: BUFFER TIN. -Returns nil if TIN is nil or the first cookie." - (if tin - (cookie-set-buffer buffer - (cookie-filter-hf (dll-previous cookies tin))))) - - -(defun cookie-nth (buffer n) - - "Return the Nth tin. Args: BUFFER N. -N counts from zero. Nil is returned if there is less than N cookies. -If N is negative, return the -(N+1)th last element. -Thus, (cookie-nth dll 0) returns the first node, -and (cookie-nth dll -1) returns the last node. - -Use cookie-cookie to extract the cookie from the tin." - - (cookie-set-buffer buffer - - ;; Skip the header (or footer, if n is negative). - (if (< n 0) - (setq n (1- n)) - (setq n (1+ n))) - - (cookie-filter-hf (dll-nth cookies n)))) - - - -(defun cookie-delete (buffer tin) - "Delete a cookie. Args: BUFFER TIN." - - (cookie-set-buffer buffer - (if (eq cookie-last-tin tin) - (setq cookie-last-tin nil)) - - (cookie-delete-tin-internal tin) - (dll-delete cookies tin))) - - - -(defun cookie-delete-first (buffer) - "Delete first cookie and return it. Args: BUFFER. -Returns nil if there is no cookie left." - - (cookie-set-buffer buffer - - ;; We have to check that we do not try to delete the footer. - - (let ((tin (dll-nth cookies 1))) ;Skip the header. - (if (eq tin cookie-footer) - nil - (cookie-delete-tin-internal tin) - (cookie-tin-cookie (dll-delete cookies tin)))))) - - - -(defun cookie-delete-last (buffer) - "Delete last cookie and return it. Args: BUFFER. -Returns nil if there is no cookie left." - - (cookie-set-buffer buffer - - ;; We have to check that we do not try to delete the header. - - (let ((tin (dll-nth cookies -2))) ;Skip the footer. - (if (eq tin cookie-header) - nil - (cookie-delete-tin-internal tin) - (cookie-tin-cookie (dll-delete cookies tin)))))) - - - -(defun cookie-first (buffer) - - "Return the first cookie in BUFFER. The cookie is not removed." - - (cookie-set-buffer buffer - (let ((tin (cookie-filter-hf (dll-nth cookies -1)))) - (if tin - (cookie-tin-cookie-safe - (dll-element cookies tin)))))) - - -(defun cookie-last (buffer) - - "Return the last cookie in BUFFER. The cookie is not removed." - - (cookie-set-buffer buffer - (let ((tin (cookie-filter-hf (dll-nth cookies -2)))) - (if tin - (cookie-tin-cookie-safe - (dll-element cookies tin)))))) - - -(defun cookie-empty (buffer) - - "Return true if there are no cookies in BUFFER." - - (cookie-set-buffer buffer - (eq (dll-nth cookies 1) cookie-footer))) - - -(defun cookie-length (buffer) - - "Return number of cookies in BUFFER." - - ;; Don't count the footer and header. - - (cookie-set-buffer buffer - (- (dll-length cookies) 2))) - - -(defun cookie-all (buffer) - - "Return a list of all cookies in BUFFER." - - (cookie-set-buffer buffer - (let (result - (tin (dll-nth cookies -2))) - (while (not (eq tin cookie-header)) - (setq result (cons (cookie-tin-cookie (dll-element cookies tin)) - result)) - (setq tin (dll-previous cookies tin))) - result))) - -(defun cookie-clear (buffer) - - "Remove all cookies in buffer." - - (cookie-set-buffer buffer - (cookie-create buffer cookie-pretty-printer - (cookie-tin-cookie (dll-element cookies cookie-header)) - (cookie-tin-cookie (dll-element cookies cookie-footer))))) - - - -(defun cookie-map (map-function buffer &rest map-args) - - "Apply MAP-FUNCTION to all cookies in BUFFER. -MAP-FUNCTION is applied to the first element first. -If MAP-FUNCTION returns non-nil the cookie will be refreshed. - -Note that BUFFER will be current buffer when MAP-FUNCTION is called. - -If more than two arguments are given to cookie-map, remaining -arguments will be passed to MAP-FUNCTION." - - (cookie-set-buffer buffer - (let ((tin (dll-nth cookies 1)) - result) - - (while (not (eq tin cookie-footer)) - - (if (apply map-function - (cookie-tin-cookie (dll-element cookies tin)) - map-args) - (cookie-refresh-tin tin)) - - (setq tin (dll-next cookies tin)))))) - - - -(defun cookie-map-reverse (map-function buffer &rest map-args) - - "Apply MAP-FUNCTION to all cookies in BUFFER. -MAP-FUNCTION is applied to the last cookie first. -If MAP-FUNCTION returns non-nil the cookie will be refreshed. - -Note that BUFFER will be current buffer when MAP-FUNCTION is called. - -If more than two arguments are given to cookie-map, remaining -arguments will be passed to MAP-FUNCTION." - - (cookie-set-buffer buffer - (let ((tin (dll-nth cookies -2)) - result) - - (while (not (eq tin cookie-header)) - - (if (apply map-function - (cookie-tin-cookie (dll-element cookies tin)) - map-args) - (cookie-refresh-tin tin)) - - (setq tin (dll-previous cookies tin)))))) - - - -(defun cookie-enter-cookies (buffer cookie-list) - - "Insert all cookies in the list COOKIE-LIST last in BUFFER. -Args: BUFFER COOKIE-LIST." - - (while cookie-list - (cookie-enter-last buffer (car cookie-list)) - (setq cookie-list (cdr cookie-list)))) - - -(defun cookie-filter (buffer predicate) - - "Remove all cookies in BUFFER for which PREDICATE returns nil. -Note that BUFFER will be current-buffer when PREDICATE is called. - -The PREDICATE is called with one argument, the cookie." - - (cookie-set-buffer buffer - (let ((tin (dll-nth cookies 1)) - next) - (while (not (eq tin cookie-footer)) - (setq next (dll-next cookies tin)) - (if (funcall predicate (cookie-tin-cookie (dll-element cookies tin))) - nil - (cookie-delete-tin-internal tin) - (dll-delete cookies tin)) - (setq tin next))))) - - -(defun cookie-filter-tins (buffer predicate) - - "Remove all cookies in BUFFER for which PREDICATE returns nil. -Note that BUFFER will be current-buffer when PREDICATE is called. - -The PREDICATE is called with one argument, the tin." - - (cookie-set-buffer buffer - (let ((tin (dll-nth cookies 1)) - next) - (while (not (eq tin cookie-footer)) - (setq next (dll-next cookies tin)) - (if (funcall predicate tin) - nil - (cookie-delete-tin-internal tin) - (dll-delete cookies tin)) - (setq tin next))))) - -(defun cookie-pos-before-middle-p (pos tin1 tin2) - - "Return true if POS is in the first half of the region defined by TIN1 and -TIN2." - - (< pos (/ (+ (cookie-tin-start-marker (dll-element cookeis tin1)) - (cookie-tin-start-marker (dll-element cookeis tin2))) - 2))) - - -(defun cookie-get-selection (buffer pos &optional guess force-guess) - - "Return the tin the POS is within. -Args: BUFFER POS &optional GUESS FORCE-GUESS. -GUESS should be a tin that it is likely that POS is near. If FORCE-GUESS -is non-nil GUESS is always used as a first guess, otherwise the first -guess is the first tin, last tin, or GUESS, whichever is nearest to -pos in the BUFFER. - -If pos points within the header, the first cookie is returned. -If pos points within the footer, the last cookie is returned. -Nil is returned if there is no cookie. - -It is often good to specify cookie-last-tin as GUESS, but remember -that cookie-last-tin is buffer local in all buffers that cookie -operates on." - - (cookie-set-buffer buffer - - (cond - ; No cookies present? - ((eq (dll-nth cookies 1) (dll-nth cookies -1)) - nil) - - ; Before first cookie? - ((< pos (cookie-tin-start-marker - (dll-element cookies (dll-nth cookies 1)))) - (dll-nth cookies 1)) - - ; After last cookie? - ((>= pos (cookie-tin-start-marker (dll-last cookies))) - (dll-nth cookies -2)) - - ; We now now that pos is within a cookie. - (t - ; Make an educated guess about which of the three known - ; cookies (the first, the last, or GUESS) is nearest. - (setq - guess - (cond - (force-guess guess) - (guess - (cond - ;; Closest to first cookie? - ((cookie-pos-before-middle-p - pos guess - (dll-nth cookies 1)) - (dll-nth cookies 1)) - ;; Closest to GUESS? - ((cookie-pos-before-middle-p - pos guess - cookie-footer) - guess) - ;; Closest to last cookie. - (t (dll-previous cookies cookie-footer)))) - (t - ;; No guess given. - (cond - ;; First half? - ((cookie-pos-before-middle-p - pos (dll-nth cookies 1) - cookie-footer) - (dll-nth cookies 1)) - (t (dll-previous cookies cookie-footer)))))) - - ;; GUESS is now a "best guess". - - ;; Find the correct cookie. First determine in which direction - ;; it lies, and then move in that direction until it is found. - - (cond - ;; Is pos after the guess? - ((>= pos (cookie-tin-start-marker (dll-element cookiess guess))) - - ;; Loop until we are exactly one cookie too far down... - (while (>= pos (cookie-tin-start-marker (dll-element cookiess guess))) - (setq guess (dll-next cookies guess))) - - ;; ...and return the previous cookie. - (dll-previous cookies guess)) - - ;; Pos is before guess - (t - - (while (< pos (cookie-tin-start-marker (dll-element cookiess guess))) - (setq guess (dll-previous cookies guess))) - - guess)))))) - - -(defun cookie-start-marker (buffer tin) - - "Return start-position of a cookie in BUFFER. -Args: BUFFER TIN. -The marker that is returned should not be modified in any way, -and is only valid until the contents of the cookie buffer changes." - - (cookie-set-buffer buffer - (cookie-tin-start-marker (dll-element cookies tin)))) - - -(defun cookie-end-marker (buffer tin) - - "Return end-position of a cookie in BUFFER. -Args: BUFFER TIN. -The marker that is returned should not be modified in any way, -and is only valid until the contents of the cookie buffer changes." - - (cookie-set-buffer buffer - (cookie-tin-start-marker - (dll-element cookies (dll-next cookies tin))))) - - - -(defun cookie-refresh (buffer) - - "Refresh all cookies in BUFFER. -Cookie-pretty-printer will be called for all cookies and the new result -displayed. - -See also cookie-invalidate-tins." - - (cookie-set-buffer buffer - - (erase-buffer) - - (set-marker (cookie-tin-start-marker (dll-element cookies cookie-header)) - (point) buffer) - (insert (cookie-tin-cookie (dll-element cookies cookie-header))) - (insert "\n") - - (let ((tin (dll-nth cookies 1))) - (while (not (eq tin cookie-footer)) - - (set-marker (cookie-tin-start-marker (dll-element cookies tin)) - (point) buffer) - (insert - (funcall cookie-pretty-printer - (cookie-tin-cookie (dll-element cookies tin)))) - (insert "\n") - (setq tin (dll-next cookies tin)))) - - (set-marker (cookie-tin-start-marker (dll-element cookies cookie-footer)) - (point) buffer) - (insert (cookie-tin-cookie (dll-element cookies cookie-footer))) - (insert "\n"))) - - -(defun cookie-invalidate-tins (buffer &rest tins) - - "Refresh some cookies. -Args: BUFFER &rest TINS." - - (cookie-set-buffer buffer - - (while tins - (cookie-refresh-tin (car tins)) - (setq tins (cdr tins))))) - - -;;; Cookie movement commands. - -(defun cookie-set-goal-column (buffer goal) - "Set goal-column for BUFFER. -Args: BUFFER GOAL. -goal-column is made buffer-local." - (cookie-set-buffer buffer - (make-local-variable 'goal-column) - (setq goal-column goal))) - - -(defun cookie-previous-cookie (buffer pos arg) - "Move point to the ARGth previous cookie. -Don't move if we are at the first cookie. -ARG is the prefix argument when called interactively. -Args: BUFFER POS ARG. -Sets cookie-last-tin to the cookie we move to." - - (interactive (list (current-buffer) (point) - (prefix-numeric-value current-prefix-arg))) - - (cookie-set-buffer buffer - (setq cookie-last-tin - (cookie-get-selection buffer pos cookie-last-tin)) - - (while (and cookie-last-tin (> arg 0)) - (setq arg (1- arg)) - (setq cookie-last-tin - (dll-previous cookies cookie-last-tin))) - - ;; Never step above the first cookie. - - (if (null (cookie-filter-hf cookie-last-tin)) - (setq cookie-last-tin (dll-nth cookies 1))) - - (goto-char - (cookie-tin-start-marker - (dll-element cookies cookie-last-tin))) - - (if goal-column - (move-to-column goal-column)))) - - - -(defun cookie-next-cookie (buffer pos arg) - "Move point to the ARGth next cookie. -Don't move if we are at the last cookie. -ARG is the prefix argument when called interactively. -Args: BUFFER POS ARG. -Sets cookie-last-tin to the cookie we move to." - - (interactive (list (current-buffer) (point) - (prefix-numeric-value current-prefix-arg))) - - (cookie-set-buffer buffer - (setq cookie-last-tin - (cookie-get-selection buffer pos cookie-last-tin)) - - (while (and cookie-last-tin (> arg 0)) - (setq arg (1- arg)) - (setq cookie-last-tin - (dll-next cookies cookie-last-tin))) - - (if (null (cookie-filter-hf cookie-last-tin)) - (setq cookie-last-tin (dll-nth cookies -2))) - - (goto-char - (cookie-tin-start-marker - (dll-element cookies cookie-last-tin))) - - (if goal-column - (move-to-column goal-column)))) - - -(defun cookie-collect-tins (buffer predicate &rest predicate-args) - - "Return a list of all tins in BUFFER whose cookie PREDICATE -returns true for. -PREDICATE is a function that takes a cookie as its argument. -The tins on the returned list will appear in the same order -as in the buffer. You should not rely on in which order PREDICATE -is called. Note that BUFFER is current-buffer when PREDICATE -is called. (If you call cookie-collect with another buffer set -as current-buffer and need to access buffer-local variables -from that buffer within PREDICATE you must send them via -PREDICATE-ARGS). - -If more than two arguments are given to cookie-collect the remaining -arguments will be passed to PREDICATE. - -Use cookie-cookie to get the cookie from the tin." - - (cookie-set-buffer buffer - (let ((tin (dll-nth cookies -2)) - result) - - (while (not (eq tin cookie-header)) - - (if (apply predicate - (cookie-tin-cookie (dll-element cookies tin)) - predicate-args) - (setq result (cons tin result))) - - (setq tin (dll-previous cookies tin))) - result))) - - -(defun cookie-collect-cookies (buffer predicate &rest predicate-args) - - "Return a list of all cookies in BUFFER that PREDICATE -returns true for. -PREDICATE is a function that takes a cookie as its argument. -The cookie on the returned list will appear in the same order -as in the buffer. You should not rely on in which order PREDICATE -is called. Note that BUFFER is current-buffer when PREDICATE -is called. (If you call cookie-collect with another buffer set -as current-buffer and need to access buffer-local variables -from that buffer within PREDICATE you must send them via -PREDICATE-ARGS). - -If more than two arguments are given to cookie-collect the remaining -arguments will be passed to PREDICATE." - - (cookie-set-buffer buffer - (let ((tin (dll-nth cookies -2)) - result) - - (while (not (eq tin cookie-header)) - - (if (apply predicate - (cookie-tin-cookie (dll-element cookies tin)) - predicate-args) - (setq result (cons (cookie-tin-cookie (dll-element cookies tin)) - result))) - - (setq tin (dll-previous cookies tin))) - result))) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-dll-debug.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-dll-debug.el deleted file mode 100644 index 733ff86f46c0f..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-dll-debug.el +++ /dev/null @@ -1,298 +0,0 @@ -;;; elib-dll-debug -- A slow implementation of elib-dll for debugging. -;;; elib-dll-debug.el,v 1.2 1992/04/07 20:49:13 berliner Exp -;;; Copyright (C) 1991,1992 Per Cederqvist -;;; -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 2 of the License, or -;;; (at your option) any later version. -;;; -;;; This program is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with this program; if not, write to the Free Software -;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -;;; This is a plug-in replacement for elib-dll.el. It is dreadfully -;;; slow, but it facilitates debugging. Don't trust the comments in -;;; this file too much. -(provide 'elib-dll) - -;;; -;;; A doubly linked list consists of one cons cell which holds the tag -;;; 'DL-LIST in the car cell and the list in the cdr -;;; cell. The doubly linked list is implemented as a normal list. You -;;; should use elib-dll.el and not this package in debugged code. This -;;; package is not written for speed... -;;; - -;;; ================================================================ -;;; Internal functions for use in the doubly linked list package - -(defun dll-get-dummy-node (dll) - - ;; Return the dummy node. INTERNAL USE ONLY. - dll) - -(defun dll-list-nodes (dll) - - ;; Return a list of all nodes in DLL. INTERNAL USE ONLY. - - (cdr dll)) - -(defun dll-set-from-node-list (dll list) - - ;; Set the contents of DLL to the nodes in LIST. - ;; INTERNAL USE ONLY. - - (setcdr dll list)) - -(defun dll-get-node-before (dll node) - ;; Return the node in DLL that points to NODE. Use - ;; (dll-get-node-before some-list nil) to get the last node. - ;; INTERNAL USE ONLY. - (while (and dll (not (eq (cdr dll) node))) - (setq dll (cdr dll))) - (if (not dll) - (error "Node not on list")) - dll) - -(defmacro dll-insert-after (node element) - (let ((node-v (make-symbol "node")) - (element-v (make-symbol "element"))) - (` (let (((, node-v) (, node)) - ((, element-v) (, element))) - (setcdr (, node-v) (cons (, element-v) (cdr (, node-v)))))))) - -;;; =================================================================== -;;; The public functions which operate on doubly linked lists. - -(defmacro dll-element (dll node) - - "Get the element of a NODE in a doubly linked list DLL. -Args: DLL NODE." - - (` (car (, node)))) - - -(defun dll-create () - "Create an empty doubly linked list." - (cons 'DL-LIST nil)) - - -(defun dll-p (object) - "Return t if OBJECT is a doubly linked list, otherwise return nil." - (eq (car-safe object) 'DL-LIST)) - - -(defun dll-enter-first (dll element) - "Add an element first on a doubly linked list. -Args: DLL ELEMENT." - (setcdr dll (cons element (cdr dll)))) - - -(defun dll-enter-last (dll element) - "Add an element last on a doubly linked list. -Args: DLL ELEMENT." - (dll-insert-after (dll-get-node-before dll nil) element)) - - -(defun dll-enter-after (dll node element) - "In the doubly linked list DLL, insert a node containing ELEMENT after NODE. -Args: DLL NODE ELEMENT." - - (dll-get-node-before dll node) - (dll-insert-after node element)) - - -(defun dll-enter-before (dll node element) - "In the doubly linked list DLL, insert a node containing ELEMENT before NODE. -Args: DLL NODE ELEMENT." - - (dll-insert-after (dll-get-node-before dll node) element)) - - - -(defun dll-next (dll node) - "Return the node after NODE, or nil if NODE is the last node. -Args: DLL NODE." - - (dll-get-node-before dll node) - (cdr node)) - - -(defun dll-previous (dll node) - "Return the node before NODE, or nil if NODE is the first node. -Args: DLL NODE." - - (dll-get-node-before dll node)) - - -(defun dll-delete (dll node) - - "Delete NODE from the doubly linked list DLL. -Args: DLL NODE. Return the element of node." - - ;; This is a no-op when applied to the dummy node. This will return - ;; nil if applied to the dummy node since it always contains nil. - - (setcdr (dll-get-node-before dll node) (cdr node))) - - -(defun dll-delete-first (dll) - - "Delete the first NODE from the doubly linked list DLL. -Return the element. Args: DLL. Returns nil if the DLL was empty." - - ;; Relies on the fact that dll-delete does nothing and - ;; returns nil if given the dummy node. - - (setcdr dll (cdr (cdr dll)))) - - -(defun dll-delete-last (dll) - - "Delete the last NODE from the doubly linked list DLL. -Return the element. Args: DLL. Returns nil if the DLL was empty." - - ;; Relies on the fact that dll-delete does nothing and - ;; returns nil if given the dummy node. - - (setcdr dll (dll-get-node-before dll nil) nil)) - - -(defun dll-first (dll) - - "Return the first element on the doubly linked list DLL. -Return nil if the list is empty. The element is not removed." - - (car (cdr dll))) - - - - -(defun dll-last (dll) - - "Return the last element on the doubly linked list DLL. -Return nil if the list is empty. The element is not removed." - - (car (dll-get-node-before dll nil))) - - - -(defun dll-nth (dll n) - - "Return the Nth node from the doubly linked list DLL. - Args: DLL N -N counts from zero. If DLL is not that long, nil is returned. -If N is negative, return the -(N+1)th last element. -Thus, (dll-nth dll 0) returns the first node, -and (dll-nth dll -1) returns the last node." - - ;; Branch 0 ("follow left pointer") is used when n is negative. - ;; Branch 1 ("follow right pointer") is used otherwise. - - (if (>= n 0) - (nthcdr n (cdr dll)) - (unwind-protect - (progn (setcdr dll (nreverse (cdr dll))) - (nthcdr (- n) dll)) - (setcdr dll (nreverse (cdr dll)))))) - -(defun dll-empty (dll) - - "Return t if the doubly linked list DLL is empty, nil otherwise" - - (not (cdr dll))) - -(defun dll-length (dll) - - "Returns the number of elements in the doubly linked list DLL." - - (length (cdr dll))) - - - -(defun dll-copy (dll &optional element-copy-fnc) - - "Return a copy of the doubly linked list DLL. -If optional second argument ELEMENT-COPY-FNC is non-nil it should be -a function that takes one argument, an element, and returns a copy of it. -If ELEMENT-COPY-FNC is not given the elements are not copied." - - (if element-copy-fnc - (cons 'DL-LIST (mapcar element-copy-fnc (cdr dll))) - (copy-sequence dll))) - - -(defun dll-all (dll) - - "Return all elements on the double linked list DLL as an ordinary list." - - (cdr dll)) - - -(defun dll-clear (dll) - - "Clear the doubly linked list DLL, i.e. make it completely empty." - - (setcdr dll nil)) - - -(defun dll-map (map-function dll) - - "Apply MAP-FUNCTION to all elements in the doubly linked list DLL. -The function is applied to the first element first." - - (mapcar map-function (cdr dll))) - - -(defun dll-map-reverse (map-function dll) - - "Apply MAP-FUNCTION to all elements in the doubly linked list DLL. -The function is applied to the last element first." - - (unwind-protect - (setcdr dll (nreverse (cdr dll))) - (mapcar map-function (cdr dll)) - (setcdr dll (nreverse (cdr dll))))) - - -(defun dll-create-from-list (list) - - "Given an elisp LIST create a doubly linked list with the same elements." - - (cons 'DL-LIST list)) - - - -(defun dll-sort (dll predicate) - - "Sort the doubly linked list DLL, stably, comparing elements using PREDICATE. -Returns the sorted list. DLL is modified by side effects. -PREDICATE is called with two elements of DLL, and should return T -if the first element is \"less\" than the second." - - (setcdr dll (sort (cdr dll) predicate)) - dll) - - -(defun dll-filter (dll predicate) - - "Remove all elements in the doubly linked list DLL for which PREDICATE -return nil." - - (let* ((prev dll) - (node (cdr dll))) - - (while node - (cond - ((funcall predicate (car node)) - (setq prev node)) - (t - (setcdr prev (cdr node)))) - (setq node (cdr node))))) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-dll.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-dll.el deleted file mode 100644 index 855bd19e8ee07..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-dll.el +++ /dev/null @@ -1,386 +0,0 @@ -;;; elib-dll.el,v 1.2 1992/04/07 20:49:15 berliner Exp -;;; elib-dll.el -- Some primitives for Doubly linked lists. -;;; Copyright (C) 1991, 1992 Per Cederqvist -;;; -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 2 of the License, or -;;; (at your option) any later version. -;;; -;;; This program is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with this program; if not, write to the Free Software -;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -;;; Mail bug reports to ceder@lysator.liu.se. - -(require 'elib-node) -(provide 'elib-dll) - -;;; -;;; A doubly linked list consists of one cons cell which holds the tag -;;; 'DL-LIST in the car cell and a pointer to a dummy node in the cdr -;;; cell. The doubly linked list is implemented as a circular list -;;; with the dummy node first and last. The dummy node is recognized -;;; by comparing it to the node which the cdr of the cons cell points -;;; to. -;;; - -;;; ================================================================ -;;; Internal functions for use in the doubly linked list package - -(defun dll-get-dummy-node (dll) - - ;; Return the dummy node. INTERNAL USE ONLY. - (cdr dll)) - -(defun dll-list-nodes (dll) - - ;; Return a list of all nodes in DLL. INTERNAL USE ONLY. - - (let* ((result nil) - (dummy (dll-get-dummy-node dll)) - (node (elib-node-left dummy))) - - (while (not (eq node dummy)) - (setq result (cons node result)) - (setq node (elib-node-left node))) - - result)) - -(defun dll-set-from-node-list (dll list) - - ;; Set the contents of DLL to the nodes in LIST. - ;; INTERNAL USE ONLY. - - (dll-clear dll) - (let* ((dummy (dll-get-dummy-node dll)) - (left dummy)) - (while list - (elib-node-set-left (car list) left) - (elib-node-set-right left (car list)) - (setq left (car list)) - (setq list (cdr list))) - - (elib-node-set-right left dummy) - (elib-node-set-left dummy left))) - - -;;; =================================================================== -;;; The public functions which operate on doubly linked lists. - -(defmacro dll-element (dll node) - - "Get the element of a NODE in a doubly linked list DLL. -Args: DLL NODE." - - (` (elib-node-data (, node)))) - - -(defun dll-create () - "Create an empty doubly linked list." - (let ((dummy-node (elib-node-create nil nil nil))) - (elib-node-set-right dummy-node dummy-node) - (elib-node-set-left dummy-node dummy-node) - (cons 'DL-LIST dummy-node))) - -(defun dll-p (object) - "Return t if OBJECT is a doubly linked list, otherwise return nil." - (eq (car-safe object) 'DL-LIST)) - -(defun dll-enter-first (dll element) - "Add an element first on a doubly linked list. -Args: DLL ELEMENT." - (dll-enter-after - dll - (dll-get-dummy-node dll) - element)) - - -(defun dll-enter-last (dll element) - "Add an element last on a doubly linked list. -Args: DLL ELEMENT." - (dll-enter-before - dll - (dll-get-dummy-node dll) - element)) - - -(defun dll-enter-after (dll node element) - "In the doubly linked list DLL, insert a node containing ELEMENT after NODE. -Args: DLL NODE ELEMENT." - - (let ((new-node (elib-node-create - node (elib-node-right node) - element))) - (elib-node-set-left (elib-node-right node) new-node) - (elib-node-set-right node new-node))) - - -(defun dll-enter-before (dll node element) - "In the doubly linked list DLL, insert a node containing ELEMENT before NODE. -Args: DLL NODE ELEMENT." - - (let ((new-node (elib-node-create - (elib-node-left node) node - element))) - (elib-node-set-right (elib-node-left node) new-node) - (elib-node-set-left node new-node))) - - - -(defun dll-next (dll node) - "Return the node after NODE, or nil if NODE is the last node. -Args: DLL NODE." - - (if (eq (elib-node-right node) (dll-get-dummy-node dll)) - nil - (elib-node-right node))) - - -(defun dll-previous (dll node) - "Return the node before NODE, or nil if NODE is the first node. -Args: DLL NODE." - - (if (eq (elib-node-left node) (dll-get-dummy-node dll)) - nil - (elib-node-left node))) - - -(defun dll-delete (dll node) - - "Delete NODE from the doubly linked list DLL. -Args: DLL NODE. Return the element of node." - - ;; This is a no-op when applied to the dummy node. This will return - ;; nil if applied to the dummy node since it always contains nil. - - (elib-node-set-right (elib-node-left node) (elib-node-right node)) - (elib-node-set-left (elib-node-right node) (elib-node-left node)) - (dll-element dll node)) - - - -(defun dll-delete-first (dll) - - "Delete the first NODE from the doubly linked list DLL. -Return the element. Args: DLL. Returns nil if the DLL was empty." - - ;; Relies on the fact that dll-delete does nothing and - ;; returns nil if given the dummy node. - - (dll-delete dll (elib-node-right (dll-get-dummy-node dll)))) - - -(defun dll-delete-last (dll) - - "Delete the last NODE from the doubly linked list DLL. -Return the element. Args: DLL. Returns nil if the DLL was empty." - - ;; Relies on the fact that dll-delete does nothing and - ;; returns nil if given the dummy node. - - (dll-delete dll (elib-node-left (dll-get-dummy-node dll)))) - - -(defun dll-first (dll) - - "Return the first element on the doubly linked list DLL. -Return nil if the list is empty. The element is not removed." - - (if (eq (elib-node-right (dll-get-dummy-node dll)) - (dll-get-dummy-node dll)) - nil - (elib-node-data (elib-node-right (dll-get-dummy-node dll))))) - - - - -(defun dll-last (dll) - - "Return the last element on the doubly linked list DLL. -Return nil if the list is empty. The element is not removed." - - (if (eq (elib-node-left (dll-get-dummy-node dll)) - (dll-get-dummy-node dll)) - nil - (elib-node-data (elib-node-left (dll-get-dummy-node dll))))) - - - -(defun dll-nth (dll n) - - "Return the Nth node from the doubly linked list DLL. - Args: DLL N -N counts from zero. If DLL is not that long, nil is returned. -If N is negative, return the -(N+1)th last element. -Thus, (dll-nth dll 0) returns the first node, -and (dll-nth dll -1) returns the last node." - - ;; Branch 0 ("follow left pointer") is used when n is negative. - ;; Branch 1 ("follow right pointer") is used otherwise. - - (let* ((dummy (dll-get-dummy-node dll)) - (branch (if (< n 0) 0 1)) - (node (elib-node-branch dummy branch))) - - (if (< n 0) - (setq n (- -1 n))) - - (while (and (not (eq dummy node)) - (> n 0)) - (setq node (elib-node-branch node branch)) - (setq n (1- n))) - - (if (eq dummy node) - nil - node))) - - -(defun dll-empty (dll) - - "Return t if the doubly linked list DLL is empty, nil otherwise" - - (eq (elib-node-left (dll-get-dummy-node dll)) - (dll-get-dummy-node dll))) - -(defun dll-length (dll) - - "Returns the number of elements in the doubly linked list DLL." - - (let* ((dummy (dll-get-dummy-node dll)) - (node (elib-node-right dummy)) - (n 0)) - - (while (not (eq node dummy)) - (setq node (elib-node-right node)) - (setq n (1+ n))) - - n)) - - - -(defun dll-copy (dll &optional element-copy-fnc) - - "Return a copy of the doubly linked list DLL. -If optional second argument ELEMENT-COPY-FNC is non-nil it should be -a function that takes one argument, an element, and returns a copy of it. -If ELEMENT-COPY-FNC is not given the elements are not copied." - - (let ((result (dll-create)) - (node (dll-nth dll 0))) - (if element-copy-fnc - - ;; Copy the elements with the user-supplied function. - (while node - (dll-enter-last result - (funcall element-copy-fnc - (dll-element dll node))) - (setq node (dll-next dll node))) - - ;; Don't try to copy the elements - they might be - ;; circular lists, or anything at all... - (while node - (dll-enter-last result (dll-element dll node)) - (setq node (dll-next dll node)))) - - result)) - - - -(defun dll-all (dll) - - "Return all elements on the double linked list DLL as an ordinary list." - - (let* ((result nil) - (dummy (dll-get-dummy-node dll)) - (node (elib-node-left dummy))) - - (while (not (eq node dummy)) - (setq result (cons (dll-element dll node) result)) - (setq node (elib-node-left node))) - - result)) - - -(defun dll-clear (dll) - - "Clear the doubly linked list DLL, i.e. make it completely empty." - - (elib-node-set-left (dll-get-dummy-node dll) (dll-get-dummy-node dll)) - (elib-node-set-right (dll-get-dummy-node dll) (dll-get-dummy-node dll))) - - -(defun dll-map (map-function dll) - - "Apply MAP-FUNCTION to all elements in the doubly linked list DLL. -The function is applied to the first element first." - - (let* ((dummy (dll-get-dummy-node dll)) - (node (elib-node-right dummy))) - - (while (not (eq node dummy)) - (funcall map-function (dll-element dll node)) - (setq node (elib-node-right node))))) - - -(defun dll-map-reverse (map-function dll) - - "Apply MAP-FUNCTION to all elements in the doubly linked list DLL. -The function is applied to the last element first." - - (let* ((dummy (dll-get-dummy-node dll)) - (node (elib-node-left dummy))) - - (while (not (eq node dummy)) - (funcall map-function (dll-element dll node)) - (setq node (elib-node-left node))))) - - -(defun dll-create-from-list (list) - - "Given an elisp LIST create a doubly linked list with the same elements." - - (let ((dll (dll-create))) - (while list - (dll-enter-last dll (car list)) - (setq list (cdr list))) - dll)) - - - -(defun dll-sort (dll predicate) - - "Sort the doubly linked list DLL, stably, comparing elements using PREDICATE. -Returns the sorted list. DLL is modified by side effects. -PREDICATE is called with two elements of DLL, and should return T -if the first element is \"less\" than the second." - - (dll-set-from-node-list - dll (sort (dll-list-nodes dll) - (function (lambda (x1 x2) - (funcall predicate - (dll-element dll x1) - (dll-element dll x2)))))) - dll) - - -(defun dll-filter (dll predicate) - - "Remove all elements in the doubly linked list DLL for which PREDICATE -return nil." - - (let* ((dummy (dll-get-dummy-node dll)) - (node (elib-node-right dummy)) - next) - - (while (not (eq node dummy)) - (setq next (elib-node-right node)) - (if (funcall predicate (dll-element dll node)) - nil - (dll-delete dll node)) - (setq node next)))) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-node.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-node.el deleted file mode 100644 index 6c476a35ef3d7..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/elib-node.el +++ /dev/null @@ -1,89 +0,0 @@ -;;;; elib-node.el,v 1.2 1992/04/07 20:49:16 berliner Exp -;;;; This file implements the nodes used in binary trees and -;;;; doubly linked lists -;;;; -;;;; Copyright (C) 1991 Inge Wallin -;;;; -;;;; This file is part of the GNU Emacs lisp library, Elib. -;;;; -;;;; GNU Elib 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 1, or (at your option) -;;;; any later version. -;;;; -;;;; GNU Elib 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 GNU Emacs; see the file COPYING. If not, write to -;;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -;;;; -;;;; Author: Inge Wallin -;;;; - -;;; -;;; A node is implemented as an array with three elements, using -;;; (elt node 0) as the left pointer -;;; (elt node 1) as the right pointer -;;; (elt node 2) as the data -;;; -;;; Some types of trees, e.g. AVL trees, need bigger nodes, but -;;; as long as the first three parts are the left pointer, the -;;; right pointer and the data field, these macros can be used. -;;; - - -(provide 'elib-node) - - -(defmacro elib-node-create (left right data) - "Create a tree node from LEFT, RIGHT and DATA." - (` (vector (, left) (, right) (, data)))) - - -(defmacro elib-node-left (node) - "Return the left pointer of NODE." - (` (aref (, node) 0))) - - -(defmacro elib-node-right (node) - "Return the right pointer of NODE." - (` (aref (, node) 1))) - - -(defmacro elib-node-data (node) - "Return the data of NODE." - (` (aref (, node) 2))) - - -(defmacro elib-node-set-left (node newleft) - "Set the left pointer of NODE to NEWLEFT." - (` (aset (, node) 0 (, newleft)))) - - -(defmacro elib-node-set-right (node newright) - "Set the right pointer of NODE to NEWRIGHT." - (` (aset (, node) 1 (, newright)))) - - -(defmacro elib-node-set-data (node newdata) - "Set the data of NODE to NEWDATA." - (` (aset (, node) 2 (, newdata)))) - - - -(defmacro elib-node-branch (node branch) - "Get value of a branch of a node. -NODE is the node, and BRANCH is the branch. -0 for left pointer, 1 for right pointer and 2 for the data." - (` (aref (, node) (, branch)))) - - -(defmacro elib-node-set-branch (node branch newval) - "Set value of a branch of a node. -NODE is the node, and BRANCH is the branch. -0 for left pointer, 1 for the right pointer and 2 for the data. -NEWVAL is new value of the branch." - (` (aset (, node) (, branch) (, newval)))) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.el deleted file mode 100644 index d1f69e313d4aa..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.el +++ /dev/null @@ -1,133 +0,0 @@ -;;; Mouse and font support for PCL-CVS 1.3 running in Lucid GNU Emacs -;; @(#) Id: pcl-cvs-lucid.el,v 1.2 1993/05/31 19:37:34 ceder Exp -;; Copyright (C) 1992-1993 Free Software Foundation, Inc. - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - - -;; This simply adds a menu of the common CVS commands to the menubar and to -;; the right mouse button. Clicking right moves point, and then pops up a -;; menu from which commands can be executed. -;; -;; This could stand to be a lot more clever: for example, the "Commit Changes" -;; command should only be active on files for which there is something to -;; commit. Also, some indication of which files the command applies to -;; (especially in the presence of multiple marked files) would be nice. -;; -;; Middle-click runs find-file. - - -(require 'pcl-cvs) - -(defvar cvs-menu - '("CVS" - ["Find File" cvs-mode-find-file t] - ["Find File Other Window" cvs-mode-find-file-other-window t] - ["Interactively Merge (emerge)" cvs-mode-emerge t] - ["Diff against Repository" cvs-mode-diff-cvs t] - ["Diff against Backup Version" cvs-mode-diff-backup t] - "----" - ["Commit Changes to Repository" cvs-mode-commit t] - ["Revert File from Repository" cvs-mode-undo-local-changes t] - ["Add File to Repository" cvs-mode-add t] - ["Remove File from Repository" cvs-mode-remove-file t] - ["Ignore File" cvs-mode-ignore t] - ["Hide File" cvs-mode-acknowledge t] - ["Hide Handled Files" cvs-mode-remove-handled t] - "----" - ["Add ChangeLog Entry" cvs-mode-add-change-log-entry-other-window t] - ["Show CVS Log" cvs-mode-log t] - ["Show CVS Status" cvs-mode-status t] - "----" - ["Mark File" cvs-mode-mark t] - ["Unmark File" cvs-mode-unmark t] - ["Mark All Files" cvs-mode-mark-all-files t] - ["Unmark All Files" cvs-mode-unmark-all-files t] - "----" - ["Quit" bury-buffer t] - )) - -(defun cvs-menu (e) - (interactive "e") - (mouse-set-point e) - (beginning-of-line) - (or (looking-at "^[* ] ") (error "No CVS file line here")) - (popup-menu cvs-menu)) - -(defun cvs-mouse-find-file (e) - (interactive "e") - (mouse-set-point e) - (beginning-of-line) - (or (looking-at "^[* ] ") (error "No CVS file line here")) - (cvs-mode-find-file (point))) - -(define-key cvs-mode-map 'button3 'cvs-menu) -(define-key cvs-mode-map 'button2 'cvs-mouse-find-file) - -(make-face 'cvs-header-face) -(make-face 'cvs-filename-face) -(make-face 'cvs-status-face) - -(or (face-differs-from-default-p 'cvs-header-face) - (copy-face 'italic 'cvs-header-face)) - -(or (face-differs-from-default-p 'cvs-filename-face) - (copy-face 'bold 'cvs-filename-face)) - -(or (face-differs-from-default-p 'cvs-status-face) - (copy-face 'bold-italic 'cvs-status-face)) - - -(defun pcl-mode-motion-highlight-line (event) - (if (save-excursion - (let* ((window (event-window event)) - (buffer (and window (window-buffer window))) - (point (and buffer (event-point event)))) - (and point - (progn - (set-buffer buffer) - (goto-char point) - (beginning-of-line) - (looking-at "^[* ] "))))) - (mode-motion-highlight-line event))) - -(defconst pcl-cvs-font-lock-keywords - '(("^In directory \\(.+\\)$" 1 cvs-header-face) - ("^[* ] \\w+ +\\(ci\\)" 1 cvs-status-face) - ("^[* ] \\(Conflict\\|Merged\\)" 1 cvs-status-face) - ("^[* ] \\w+ +\\(ci +\\)?\\(.+\\)$" 2 cvs-filename-face) - ) - "Patterns to highlight in the *cvs* buffer.") - -(defun pcl-cvs-fontify () - ;; - ;; set up line highlighting - (require 'mode-motion) - (setq mode-motion-hook 'pcl-mode-motion-highlight-line) - ;; - ;; set up menubar - (if (and current-menubar (not (assoc "CVS" current-menubar))) - (progn - (set-buffer-menubar (copy-sequence current-menubar)) - (add-menu nil "CVS" (cdr cvs-menu)))) - ;; - ;; fontify mousable lines - (set (make-local-variable 'font-lock-keywords) pcl-cvs-font-lock-keywords) - (font-lock-mode 1) - ) - -(add-hook 'cvs-mode-hook 'pcl-cvs-fontify) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-startup.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-startup.el deleted file mode 100644 index f9b2de0418a4b..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-startup.el +++ /dev/null @@ -1,14 +0,0 @@ -;;; @(#) Id: pcl-cvs-startup.el,v 1.4 1993/05/31 18:40:33 ceder Exp -(autoload 'cvs-update "pcl-cvs" - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer and run cvs-mode on it. -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - t) - -(autoload 'cvs-update-other-window "pcl-cvs" - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer, display it in the other window, and run -cvs-mode on it. - -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - t) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.el deleted file mode 100644 index d9c15d5aa4841..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.el +++ /dev/null @@ -1,2493 +0,0 @@ -;;; @(#) Id: pcl-cvs.el,v 1.93 1993/05/31 22:44:00 ceder Exp -;;; pcl-cvs.el -- A Front-end to CVS 1.3 or later. Release 1.05. -;;; Copyright (C) 1991, 1992, 1993 Per Cederqvist -;;; -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 2 of the License, or -;;; (at your option) any later version. -;;; -;;; This program is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with this program; if not, write to the Free Software -;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -;;;; See below for installation instructions. -;;;; -;;;; There is an TeXinfo file that describes this package. The GNU -;;;; General Public License is included in that file. You should read -;;;; it to get the most from this package. - -;;;; Send bug reports and improvements to ceder@lysator.liu.se or -;;;; ceder@signum.se. Talk some about Signum Support here. +++FIXME - -;;; Don't try to use this with CVS 1.2 or earlier. It won't work. Get -;;; CVS 1.3. This package works together with RCS 5.6 and probably 5.5 -;;; as well. - -;;; Mail questions and bug reports to ceder@lysator.liu.se. - -(require 'cookie) -(provide 'pcl-cvs) - -;;; ------------------------------------------------------- -;;; START OF THINGS TO CHECK WHEN INSTALLING - -(defvar cvs-program "/usr/local/bin/cvs" - "*Full path to the cvs executable.") - -(defvar cvs-diff-program "/usr/local/bin/diff" - "*Full path to the diff program.") - -(defvar cvs-rmdir-program "/bin/rmdir" - "*Full path to the rmdir program. Typically /bin/rmdir.") - -;; Uncomment the following line if you are running on 18.57 or earlier. -;(setq delete-exited-processes nil) -;; Emacs version 18.57 and earlier is likely to crash if -;; delete-exited-processes is t, since the sentinel uses lots of -;; memory, and 18.57 forgets to GCPROT a variable if -;; delete-exited-processes is t. - -(defvar cvs-shell "/bin/sh" - "*Full path to a shell that can do redirection on stdout.") - -;;; END OF THINGS TO CHECK WHEN INSTALLING -;;; -------------------------------------------------------- - -(defvar cvs-cvsroot nil - "*Specifies where the (current) cvs master repository is. -Overrides the $CVSROOT variable by sending \" -d dir\" to all cvs commands. -This switch is useful if you have multiple CVS repositories.") - -(defvar cvs-cvsroot-required t - "*Specifies whether CVS needs to be told where the repository is. - -In CVS 1.3, if your CVSROOT environment variable is not set, and you -do not set the `cvs-cvsroot' lisp variable, CVS will have no idea -where to find the repository, and refuse to run. CVS 1.4 and later -store the repository path with the working directories, so most -operations don't need to be told where the repository is. - -If you work with multiple repositories with CVS 1.4, it's probably -advisable to leave your CVSROOT environment variable unset, set this -variable to nil, and let CVS figure out where the repository is for -itself.") - -(defvar cvs-stdout-file nil - "Name of the file that holds the output that CVS sends to stdout. -This variable is buffer local.") - -(defvar cvs-lock-file nil - "Full path to a lock file that CVS is waiting for (or was waiting for).") - -(defvar cvs-bakprefix ".#" - "The prefix that CVS prepends to files when rcsmerge'ing.") - -(defvar cvs-erase-input-buffer nil - "*Non-nil if input buffers should be cleared before asking for new info.") - -(defvar cvs-auto-remove-handled nil - "*Non-nil if cvs-mode-remove-handled should be called automatically. -If this is set to any non-nil value entries that does not need to be -checked in will be removed from the *cvs* buffer after every cvs-mode-commit -command.") - -(defvar cvs-sort-ignore-file t - "*Non-nil if cvs-mode-ignore should sort the .cvsignore automatically.") - -(defvar cvs-auto-revert-after-commit t - "*Non-nil if committed buffers should be automatically reverted.") - -(defconst cvs-cursor-column 14 - "Column to position cursor in in cvs-mode. -Column 0 is left-most column.") - -(defvar cvs-mode-map nil - "Keymap for the cvs mode.") - -(defvar cvs-edit-mode-map nil - "Keymap for the cvs edit mode (used when editing cvs log messages).") - -(defvar cvs-buffer-name "*cvs*" - "Name of the cvs buffer.") - -(defvar cvs-commit-prompt-buffer "*cvs-commit-message*" - "Name of buffer in which the user is prompted for a log message when -committing files.") - -(defvar cvs-commit-buffer-require-final-newline t - "*t says silently put a newline at the end of commit log messages. -Non-nil but not t says ask user whether to add a newline in each such case. -nil means don't add newlines.") - -(defvar cvs-temp-buffer-name "*cvs-tmp*" - "*Name of the cvs temporary buffer. -Output from cvs is placed here by synchronous commands.") - -(defvar cvs-diff-ignore-marks nil - "*Non-nil if cvs-diff and cvs-mode-diff-backup should ignore any marked files. -Normally they run diff on the files that are marked (with cvs-mode-mark), -or the file under the cursor if no files are marked. If this variable -is set to a non-nil value they will always run diff on the file on the -current line.") - -(defvar cvs-status-flags nil - "*List of strings to pass to ``cvs status''.") - -(defvar cvs-log-flags nil - "*List of strings to pass to ``cvs log''.") - -(defvar cvs-diff-flags nil - "*List of strings to use as flags to pass to ``diff'' and ``cvs diff''. -Used by cvs-mode-diff-cvs and cvs-mode-diff-backup. -Set this to '(\"-u\") to get a Unidiff format, or '(\"-c\") to get context diffs.") - -(defvar cvs-update-prog-output-skip-regexp "$" - "*A regexp that matches the end of the output from all cvs update programs. -That is, output from any programs that are run by CVS (by the flag -u -in the `modules' file - see cvs(5)) when `cvs update' is performed should -terminate with a line that this regexp matches. It is enough that -some part of the line is matched. - -The default (a single $) fits programs without output.") - -;; The variables below are used internally by pcl-cvs. You should -;; never change them. - -(defvar cvs-buffers-to-delete nil - "List of temporary buffers that should be discarded as soon as possible. -Due to a bug in emacs 18.57 the sentinel can't discard them reliably.") - -;; You are NOT allowed to disable this message by default. However, you -;; are encouraged to inform your users that by adding -;; (setq cvs-inhibit-copyright-message t) -;; to their .emacs they can get rid of it. Just don't add that line -;; to your default.el! -(defvar cvs-inhibit-copyright-message nil - "*Non-nil means don't display a Copyright message in the ``*cvs*'' buffer.") - -(defconst pcl-cvs-version "1.05" - "A string denoting the current release version of pcl-cvs.") - -(defconst cvs-startup-message - (if cvs-inhibit-copyright-message - "PCL-CVS release 1.05" - "PCL-CVS release 1.05. Copyright (C) 1992, 1993 Per Cederqvist -Pcl-cvs comes with absolutely no warranty; for details consult the manual. -This is free software, and you are welcome to redistribute it under certain -conditions; again, consult the TeXinfo manual for details.") - "*Startup message for CVS.") - -(defvar cvs-update-running nil - "This is set to nil when no process is running, and to -the process when a cvs update process is running.") - -(defvar cvs-cookie-handle nil - "Handle for the cookie structure that is displayed in the *cvs* buffer.") - -(defvar cvs-mode-commit nil - "Used internally by pcl-cvs.") - -;;; The cvs data structure: -;;; -;;; When the `cvs update' is ready we parse the output. Every file -;;; that is affected in some way is added as a cookie of fileinfo -;;; (as defined below). -;;; - -;;; cvs-fileinfo -;;; -;;; marked t/nil -;;; type One of -;;; UPDATED - file copied from repository -;;; MODIFIED - modified by you, unchanged in -;;; repository -;;; ADDED - added by you, not yet committed -;;; REMOVED - removed by you, not yet committed -;;; CVS-REMOVED- removed, since file no longer exists -;;; in the repository. -;;; MERGED - successful merge -;;; CONFLICT - conflict when merging -;;; REM-CONFLICT-removed in repository, changed locally. -;;; MOD-CONFLICT-removed locally, changed in repository. -;;; REM-EXIST -removed locally, but still exists. -;;; DIRCHANGE - A change of directory. -;;; UNKNOWN - An unknown file. -;;; MOVE-AWAY - A file that is in the way. -;;; REPOS-MISSING- The directory is removed from the -;;; repository. Go fetch a backup. -;;; MESSAGE - This is a special fileinfo that is used -;;; to display a text that should be in -;;; full-log. -;;; dir Directory the file resides in. Should not end with -;;; slash. -;;; file-name The file name. -;;; base-revision The revision that the working file was based on. -;;; Only valid for MERGED and CONFLICT files. -;;; cvs-diff-buffer A buffer that contains a 'cvs diff file'. -;;; backup-diff-buffer A buffer that contains a 'diff file backup-file'. -;;; full-log The output from cvs, unparsed. -;;; mod-time Modification time of file used for *-diff-buffer. -;;; handled True if this file doesn't require further action. -;;; -;;; Constructor: - -;;; cvs-fileinfo - -;;; Constructor: - -(defun cvs-create-fileinfo (type - dir - file-name - full-log) - "Create a fileinfo from all parameters. -Arguments: TYPE DIR FILE-NAME FULL-LOG. -A fileinfo has the following fields: - - marked t/nil - type One of - UPDATED - file copied from repository - MODIFIED - modified by you, unchanged in - repository - ADDED - added by you, not yet committed - REMOVED - removed by you, not yet committed - CVS-REMOVED- removed, since file no longer exists - in the repository. - MERGED - successful merge - CONFLICT - conflict when merging - REM-CONFLICT-removed in repository, but altered - locally. - MOD-CONFLICT-removed locally, changed in repository. - REM-EXIST - removed locally, but still exists. - DIRCHANGE - A change of directory. - UNKNOWN - An unknown file. - MOVE-AWAY - A file that is in the way. - REPOS-MISSING- The directory has vanished from the - repository. - MESSAGE - This is a special fileinfo that is used - to display a text that should be in - full-log. - dir Directory the file resides in. Should not end with slash. - file-name The file name. - backup-file Name of the backup file if MERGED or CONFLICT. - cvs-diff-buffer A buffer that contains a 'cvs diff file'. - backup-diff-buffer A buffer that contains a 'diff file backup-file'. - full-log The output from cvs, unparsed. - mod-time Modification time of file used for *-diff-buffer. - handled True if this file doesn't require further action." - (cons - 'CVS-FILEINFO - (vector nil nil type dir file-name nil nil nil full-log nil))) - - -;;; Selectors: - -(defun cvs-fileinfo->handled (cvs-fileinfo) - "Get the `handled' field from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 0)) - -(defun cvs-fileinfo->marked (cvs-fileinfo) - "Check if CVS-FILEINFO is marked." - (elt (cdr cvs-fileinfo) 1)) - -(defun cvs-fileinfo->type (cvs-fileinfo) - "Get type from CVS-FILEINFO. -Type is one of UPDATED, MODIFIED, ADDED, REMOVED, CVS-REMOVED, MERGED, -CONFLICT, REM-CONFLICT, MOD-CONFLICT, REM-EXIST, DIRCHANGE, UNKNOWN, MOVE-AWAY, -REPOS-MISSING or MESSAGE." - (elt (cdr cvs-fileinfo) 2)) - -(defun cvs-fileinfo->dir (cvs-fileinfo) - "Get dir from CVS-FILEINFO. -The directory name does not end with a slash. " - (elt (cdr cvs-fileinfo) 3)) - -(defun cvs-fileinfo->file-name (cvs-fileinfo) - "Get file-name from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 4)) - -(defun cvs-fileinfo->base-revision (cvs-fileinfo) - "Get the base revision from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 5)) - -(defun cvs-fileinfo->cvs-diff-buffer (cvs-fileinfo) - "Get cvs-diff-buffer from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 6)) - -(defun cvs-fileinfo->backup-diff-buffer (cvs-fileinfo) - "Get backup-diff-buffer from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 7)) - -(defun cvs-fileinfo->full-log (cvs-fileinfo) - "Get full-log from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 8)) - -(defun cvs-fileinfo->mod-time (cvs-fileinfo) - "Get mod-time from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 9)) - -;;; Modifiers: - -(defun cvs-set-fileinfo->handled (cvs-fileinfo newval) - "Set handled in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 0 newval)) - -(defun cvs-set-fileinfo->marked (cvs-fileinfo newval) - "Set marked in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 1 newval)) - -(defun cvs-set-fileinfo->type (cvs-fileinfo newval) - "Set type in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 2 newval)) - -(defun cvs-set-fileinfo->dir (cvs-fileinfo newval) - "Set dir in CVS-FILEINFO to NEWVAL. -The directory should now end with a slash." - (aset (cdr cvs-fileinfo) 3 newval)) - -(defun cvs-set-fileinfo->file-name (cvs-fileinfo newval) - "Set file-name in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 4 newval)) - -(defun cvs-set-fileinfo->base-revision (cvs-fileinfo newval) - "Set base-revision in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 5 newval)) - -(defun cvs-set-fileinfo->cvs-diff-buffer (cvs-fileinfo newval) - "Set cvs-diff-buffer in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 6 newval)) - -(defun cvs-set-fileinfo->backup-diff-buffer (cvs-fileinfo newval) - "Set backup-diff-buffer in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 7 newval)) - -(defun cvs-set-fileinfo->full-log (cvs-fileinfo newval) - "Set full-log in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 8 newval)) - -(defun cvs-set-fileinfo->mod-time (cvs-fileinfo newval) - "Set full-log in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 9 newval)) - - - -;;; Predicate: - -(defun cvs-fileinfo-p (object) - "Return t if OBJECT is a cvs-fileinfo." - (eq (car-safe object) 'CVS-FILEINFO)) - -;;;; End of types. - -(defun cvs-use-temp-buffer () - "Display a temporary buffer in another window and select it. -The selected window will not be changed. The temporary buffer will -be erased and writable." - - (let ((dir default-directory)) - (display-buffer (get-buffer-create cvs-temp-buffer-name)) - (set-buffer cvs-temp-buffer-name) - (setq buffer-read-only nil) - (setq default-directory dir) - (erase-buffer))) - -; Too complicated to handle all the cases that are generated. -; Maybe later. -;(defun cvs-examine (directory &optional local) -; "Run a 'cvs -n update' in the current working directory. -;That is, check what needs to be done, but don't change the disc. -;Feed the output to a *cvs* buffer and run cvs-mode on it. -;If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." -; (interactive (list (read-file-name "CVS Update (directory): " -; nil default-directory nil) -; current-prefix-arg)) -; (cvs-do-update directory local 'noupdate)) - -(defun cvs-update (directory &optional local) - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer and run cvs-mode on it. -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - (interactive (list (read-file-name "CVS Update (directory): " - nil default-directory nil) - current-prefix-arg)) - (cvs-do-update directory local nil) - (switch-to-buffer cvs-buffer-name)) - -(defun cvs-update-other-window (directory &optional local) - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer, display it in the other window, and run -cvs-mode on it. - -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - (interactive (list (read-file-name "CVS Update other window (directory): " - nil default-directory nil) - current-prefix-arg)) - (cvs-do-update directory local nil) - (switch-to-buffer-other-window cvs-buffer-name)) - -(defun cvs-filter (predicate list &rest extra-args) - "Apply PREDICATE to each element on LIST. -Args: PREDICATE LIST &rest EXTRA-ARGS. -Return a new list consisting of those elements that PREDICATE -returns non-nil for. - -If more than two arguments are given the remaining args are -passed to PREDICATE." - ;; Avoid recursion - this should work for LONG lists also! - (let* ((head (cons 'dummy-header nil)) - (tail head)) - (while list - (if (apply predicate (car list) extra-args) - (setq tail (setcdr tail (list (car list))))) - (setq list (cdr list))) - (cdr head))) - -(defun cvs-mode-update-no-prompt () - "Run cvs update in current directory." - (interactive) - (cvs-do-update default-directory nil nil)) - -(defun cvs-do-update (directory local dont-change-disc) - "Do a 'cvs update' in DIRECTORY. -Args: DIRECTORY LOCAL DONT-CHANGE-DISC &optional NOTTHISWINDOW. -If LOCAL is non-nil 'cvs update -l' is executed. -If DONT-CHANGE-DISC is non-nil 'cvs -n update' is executed. -Both LOCAL and DONT-CHANGE-DISC may be non-nil simultaneously. - -*Note*: DONT-CHANGE-DISC does not yet work. The parser gets confused." - (save-some-buffers) - (if (not (file-exists-p cvs-program)) - (error "%s: file not found (check setting of cvs-program)" - cvs-program)) - (if (and cvs-cvsroot-required - (not (or (getenv "CVSROOT") cvs-cvsroot))) - (error "Both cvs-cvsroot and environment variable CVSROOT unset.")) - (let* ((this-dir (file-name-as-directory (expand-file-name directory))) - (update-buffer (generate-new-buffer - (concat (file-name-nondirectory - (substring this-dir 0 -1)) - "-update"))) - (temp-name (make-temp-name - (concat (file-name-as-directory - (or (getenv "TMPDIR") "/tmp")) - "pcl-cvs."))) - (args nil)) - - ;; Check that this-dir exists and is a directory that is under CVS contr. - - (if (not (file-directory-p this-dir)) - (error "%s is not a directory." this-dir)) - (if (not (file-directory-p (concat this-dir "CVS"))) - (error "%s does not contain CVS controlled files." this-dir)) - - ;; Check that at most one `cvs update' is run at any time. - - (if (and cvs-update-running (process-status cvs-update-running) - (or (eq (process-status cvs-update-running) 'run) - (eq (process-status cvs-update-running) 'stop))) - (error "Can't run two `cvs update' simultaneously.")) - - ;; Generate "-d /master -n update -l". - (setq args (concat (if cvs-cvsroot (concat " -d " cvs-cvsroot)) - (if dont-change-disc " -n ") - " update " - (if local " -l "))) - - ;; Set up the buffer that receives the stderr output from "cvs update". - (set-buffer update-buffer) - (setq default-directory this-dir) - (make-local-variable 'cvs-stdout-file) - (setq cvs-stdout-file temp-name) - - (setq cvs-update-running - (let ((process-connection-type nil)) ; Use a pipe, not a pty. - (start-process "cvs" update-buffer cvs-shell "-c" - (concat cvs-program " " args " > " temp-name)))) - - (setq mode-line-process - (concat ": " - (symbol-name (process-status cvs-update-running)))) - (set-buffer-modified-p (buffer-modified-p)) ; Update the mode line. - (set-process-sentinel cvs-update-running 'cvs-sentinel) - (set-process-filter cvs-update-running 'cvs-update-filter) - (set-marker (process-mark cvs-update-running) (point-min)) - - (save-excursion - (set-buffer (get-buffer-create cvs-buffer-name)) - (setq buffer-read-only nil) - (erase-buffer) - (cvs-mode)) - - (setq cvs-cookie-handle - (collection-create - cvs-buffer-name 'cvs-pp - cvs-startup-message ;Se comment above cvs-startup-message. - "---------- End -----")) - - (cookie-enter-first - cvs-cookie-handle - (cvs-create-fileinfo - 'MESSAGE nil nil (concat "\n Running `cvs " args "' in " this-dir - "...\n"))) - - (save-excursion - (set-buffer cvs-buffer-name) - (setq mode-line-process - (concat ": " - (symbol-name (process-status cvs-update-running)))) - (set-buffer-modified-p (buffer-modified-p)) ; Update the mode line. - (setq buffer-read-only t)) - - ;; Work around a bug in emacs 18.57 and earlier. - (setq cvs-buffers-to-delete - (cvs-delete-unused-temporary-buffers cvs-buffers-to-delete))) - - ;; The following line is said to improve display updates on some - ;; emacses. It shouldn't be needed, but it does no harm. - (sit-for 0)) - - -(defun cvs-delete-unused-temporary-buffers (list) - "Delete all buffers on LIST that is not visible. -Return a list of all buffers that still is alive." - - (cond - ((null list) nil) - ((get-buffer-window (car list)) - (cons (car list) - (cvs-delete-unused-temporary-buffers (cdr list)))) - (t - (kill-buffer (car list)) - (cvs-delete-unused-temporary-buffers (cdr list))))) - - -(put 'cvs-mode 'mode-class 'special) - -(defun cvs-mode () - "\\<cvs-mode-map>Mode used for pcl-cvs, a frontend to CVS. - -To get the *cvs* buffer you should use ``\\[cvs-update]''. - -Full documentation is in the Texinfo file. These are the most useful commands: - -\\[cvs-mode-previous-line] Move up. \\[cvs-mode-next-line] Move down. -\\[cvs-mode-commit] Commit file. \\[cvs-mode-update-no-prompt] Reupdate directory. -\\[cvs-mode-mark] Mark file/dir. \\[cvs-mode-unmark] Unmark file/dir. -\\[cvs-mode-mark-all-files] Mark all files. \\[cvs-mode-unmark-all-files] Unmark all files. -\\[cvs-mode-find-file] Edit file/run Dired. \\[cvs-mode-find-file-other-window] Find file or run Dired in other window. -\\[cvs-mode-remove-handled] Remove processed entries. \\[cvs-mode-add-change-log-entry-other-window] Write ChangeLog in other window. -\\[cvs-mode-add] Add to repository. \\[cvs-mode-remove-file] Remove file. -\\[cvs-mode-diff-cvs] Diff between base revision. \\[cvs-mode-diff-backup] Diff backup file. -\\[cvs-mode-emerge] Run emerge on base revision/backup file. -\\[cvs-mode-acknowledge] Delete line from buffer. \\[cvs-mode-ignore] Add file to the .cvsignore file. -\\[cvs-mode-log] Run ``cvs log''. \\[cvs-mode-status] Run ``cvs status''. -\\[cvs-mode-changelog-commit] Like \\[cvs-mode-commit], but get default log text from ChangeLog. -\\[cvs-mode-undo-local-changes] Revert the last checked in version - discard your changes to the file. - -Entry to this mode runs cvs-mode-hook. -This description is updated for release 1.05 of pcl-cvs. - -All bindings: -\\{cvs-mode-map}" - (interactive) - (setq major-mode 'cvs-mode) - (setq mode-name "CVS") - (setq mode-line-process nil) - (buffer-flush-undo (current-buffer)) - (make-local-variable 'goal-column) - (setq goal-column cvs-cursor-column) - (use-local-map cvs-mode-map) - (run-hooks 'cvs-mode-hook)) - -(defun cvs-sentinel (proc msg) - "Sentinel for the cvs update process. -This is responsible for parsing the output from the cvs update when -it is finished." - (cond - ((null (buffer-name (process-buffer proc))) - ;; buffer killed - (set-process-buffer proc nil)) - ((memq (process-status proc) '(signal exit)) - (let* ((obuf (current-buffer)) - (omax (point-max)) - (opoint (point))) - ;; save-excursion isn't the right thing if - ;; process-buffer is current-buffer - (unwind-protect - (progn - (set-buffer (process-buffer proc)) - (setq mode-line-process - (concat ": " - (symbol-name (process-status proc)))) - (let* ((out-file cvs-stdout-file) - (stdout-buffer (find-file-noselect out-file))) - (cvs-parse-update stdout-buffer (process-buffer proc)) - (setq cvs-buffers-to-delete - (cons (process-buffer proc) - (cons stdout-buffer - cvs-buffers-to-delete))) - (delete-file out-file))) - (set-buffer-modified-p (buffer-modified-p)) - (setq cvs-update-running nil)) - (if (equal obuf (process-buffer proc)) - nil - (set-buffer (process-buffer proc)) - (if (< opoint omax) - (goto-char opoint)) - (set-buffer obuf)))))) - -(defun cvs-update-filter (proc string) - "Filter function for pcl-cvs. -This function gets the output that CVS sends to stderr. It inserts it -into (process-buffer proc) but it also checks if CVS is waiting for a -lock file. If so, it inserts a message cookie in the *cvs* buffer." - (let ((old-buffer (current-buffer)) - (data (match-data))) - (unwind-protect - (progn - (set-buffer (process-buffer proc)) - (save-excursion - ;; Insert the text, moving the process-marker. - (goto-char (process-mark proc)) - (insert string) - (set-marker (process-mark proc) (point)) - ;; Delete any old lock message - (if (tin-nth cvs-cookie-handle 1) - (tin-delete cvs-cookie-handle - (tin-nth cvs-cookie-handle 1))) - ;; Check if CVS is waiting for a lock. - (beginning-of-line 0) ;Move to beginning of last - ;complete line. - (cond - ((looking-at - "^cvs update: \\[..:..:..\\] waiting \ -for \\(.*\\)lock in \\(.*\\)$") - (setq cvs-lock-file (buffer-substring (match-beginning 2) - (match-end 2))) - (cookie-enter-last - cvs-cookie-handle - (cvs-create-fileinfo - 'MESSAGE nil nil - (concat "\tWaiting for " - (buffer-substring (match-beginning 1) - (match-end 1)) - "lock in " cvs-lock-file - ".\n\t (type M-x cvs-delete-lock to delete it)"))))))) - (store-match-data data) - (set-buffer old-buffer)))) - -(defun cvs-delete-lock () - "Delete the lock file that CVS is waiting for. -Note that this can be dangerous. You should only do this -if you are convinced that the process that created the lock is dead." - (interactive) - (cond - ((not (or (file-exists-p - (concat (file-name-as-directory cvs-lock-file) "#cvs.lock")) - (cvs-filter (function cvs-lock-file-p) - (directory-files cvs-lock-file)))) - (error "No lock files found.")) - ((yes-or-no-p (concat "Really delete locks in " cvs-lock-file "? ")) - ;; Re-read the directory -- the locks might have disappeared. - (let ((locks (cvs-filter (function cvs-lock-file-p) - (directory-files cvs-lock-file)))) - (while locks - (delete-file (concat (file-name-as-directory cvs-lock-file) - (car locks))) - (setq locks (cdr locks))) - (cvs-remove-directory - (concat (file-name-as-directory cvs-lock-file) "#cvs.lock")))))) - -(defun cvs-remove-directory (dir) - "Remove a directory." - (if (file-directory-p dir) - (call-process cvs-rmdir-program nil nil nil dir) - (error "Not a directory: %s" dir)) - (if (file-exists-p dir) - (error "Could not remove directory %s" dir))) - -(defun cvs-lock-file-p (file) - "Return true if FILE looks like a CVS lock file." - (or - (string-match "^#cvs.tfl.[0-9]+$" file) - (string-match "^#cvs.rfl.[0-9]+$" file) - (string-match "^#cvs.wfl.[0-9]+$" file))) - -(defun cvs-skip-line (stdout stderr regexp &optional arg) - "Like forward-line, but check that the skipped line matches REGEXP. -Args: STDOUT STDERR REGEXP &optional ARG. - -If it doesn't match REGEXP a bug report is generated and displayed. -STDOUT and STDERR is only used to do that. - -If optional ARG, a number, is given the ARGth parenthesized expression -in the REGEXP is returned as a string. -Point should be in column 1 when this function is called." - (cond - ((looking-at regexp) - (forward-line 1) - (if arg - (buffer-substring (match-beginning arg) - (match-end arg)))) - (t - (cvs-parse-error stdout stderr - (if (eq (current-buffer) stdout) 'STDOUT 'STDERR) - (point))))) - -(defun cvs-get-current-dir (root-dir dirname) - "Return current working directory, suitable for cvs-parse-update. -Args: ROOT-DIR DIRNAME. -Concatenates ROOT-DIR and DIRNAME to form an absolute path." - (if (string= "." dirname) - (substring root-dir 0 -1) - (concat root-dir dirname))) - -(defun cvs-compare-fileinfos (a b) - "Compare fileinfo A with fileinfo B and return t if A is `less'." - (cond - ;; Sort acording to directories. - ((string< (cvs-fileinfo->dir a) (cvs-fileinfo->dir b)) t) - ((not (string= (cvs-fileinfo->dir a) (cvs-fileinfo->dir b))) nil) - - ;; The DIRCHANGE entry is always first within the directory. - ((and (eq (cvs-fileinfo->type a) 'DIRCHANGE) - (not (eq (cvs-fileinfo->type b) 'DIRCHANGE))) t) - ((and (eq (cvs-fileinfo->type b) 'DIRCHANGE) - (not (eq (cvs-fileinfo->type a) 'DIRCHANGE))) nil) - ;; All files are sorted by file name. - ((string< (cvs-fileinfo->file-name a) (cvs-fileinfo->file-name b))))) - -(defun cvs-parse-error (stdout-buffer stderr-buffer err-buf pos) - "Handle a parse error when parsing the output from cvs. -Args: STDOUT-BUFFER STDERR-BUFFER ERR-BUF POS. -ERR-BUF should be 'STDOUT or 'STDERR." - (setq pos (1- pos)) - (set-buffer cvs-buffer-name) - (setq buffer-read-only nil) - (erase-buffer) - (insert "To: ceder@lysator.liu.se\n") - (insert "Subject: pcl-cvs " pcl-cvs-version " parse error.\n") - (insert "--text follows this line--\n\n") - (insert "This bug report is automatically generated by pcl-cvs\n") - (insert "because it doesn't understand some output from CVS. Below\n") - (insert "is detailed information about the error. Please send\n") - (insert "this, together with any information you think might be\n") - (insert "useful for me to fix the bug, to the address above. But\n") - (insert "please check the \"known problems\" section of the\n") - (insert "documentation first. Note that this buffer contains\n") - (insert "information that you might consider confidential. You\n") - (insert "are encouraged to read through it before sending it.\n") - (insert "\n") - (insert "Press C-c C-c to send this email.\n\n") - (insert "Please state the version of these programs you are using:\n") - (insert "RCS: \ndiff: \n\n") - - (let* ((stdout (save-excursion (set-buffer stdout-buffer) (buffer-string))) - (stderr (save-excursion (set-buffer stderr-buffer) (buffer-string))) - (errstr (if (eq err-buf 'STDOUT) stdout stderr)) - (errline-end (string-match "\n" errstr pos)) - (errline (substring errstr pos errline-end))) - (insert (format "Offending line (%d chars): >" (- errline-end pos))) - (insert errline) - (insert "<\n") - (insert "Sent to " (symbol-name err-buf) " at pos " (format "%d\n" pos)) - (insert "Emacs-version: " (emacs-version) "\n") - (insert "Pcl-cvs $" "Id:" "$" ": " "Id: pcl-cvs.el,v 1.93 1993/05/31 22:44:00 ceder Exp \n") - (insert "\n") - (insert (format "--- Contents of stdout buffer (%d chars) ---\n" - (length stdout))) - (insert stdout) - (insert "--- End of stdout buffer ---\n") - (insert (format "--- Contents of stderr buffer (%d chars) ---\n" - (length stderr))) - (insert stderr) - (insert "--- End of stderr buffer ---\n") - (insert "End of bug report.\n") - (require 'sendmail) - (mail-mode) - (error "CVS parse error - please report this bug."))) - -(defun cvs-parse-update (stdout-buffer stderr-buffer) - "Parse the output from `cvs update'. - -Args: STDOUT-BUFFER STDERR-BUFFER. - -This functions parses the from `cvs update' (which should be -separated in its stdout- and stderr-components) and prints a -pretty representation of it in the *cvs* buffer. - -Signals an error if unexpected output was detected in the buffer." - (let* ((head (cons 'dummy nil)) - (tail (cvs-parse-stderr stdout-buffer stderr-buffer - head default-directory)) - (root-dir default-directory)) - (cvs-parse-stdout stdout-buffer stderr-buffer tail root-dir) - (setq head (sort (cdr head) (function cvs-compare-fileinfos))) - - (collection-clear cvs-cookie-handle) - (collection-append-cookies cvs-cookie-handle head) - (cvs-remove-stdout-shadows) - (cvs-remove-empty-directories) - (set-buffer cvs-buffer-name) - (cvs-mode) - (goto-char (point-min)) - (tin-goto-previous cvs-cookie-handle (point-min) 1) - (setq default-directory root-dir))) - -(defun cvs-remove-stdout-shadows () - "Remove entries in the *cvs* buffer that comes from both stdout and stderr. -If there is two entries for a single file the second one should be -deleted. (Remember that sort uses a stable sort algorithm, so one can -be sure that the stderr entry is always first)." - (collection-filter-tins cvs-cookie-handle - (function - (lambda (tin) - (not (cvs-shadow-entry-p tin)))))) - -(defun cvs-shadow-entry-p (tin) - "Return non-nil if TIN is a shadow entry. -Args: TIN. -A TIN is a shadow entry if the previous tin contains the same file." - (let* ((previous-tin (tin-previous cvs-cookie-handle tin)) - (curr (tin-cookie cvs-cookie-handle tin)) - (prev (and previous-tin - (tin-cookie cvs-cookie-handle previous-tin)))) - (and - prev curr - (string= (cvs-fileinfo->file-name prev) (cvs-fileinfo->file-name curr)) - (string= (cvs-fileinfo->dir prev) (cvs-fileinfo->dir curr)) - (or - (and (eq (cvs-fileinfo->type prev) 'CONFLICT) - (eq (cvs-fileinfo->type curr) 'CONFLICT)) - (and (eq (cvs-fileinfo->type prev) 'MERGED) - (eq (cvs-fileinfo->type curr) 'MODIFIED)) - (and (eq (cvs-fileinfo->type prev) 'REM-EXIST) - (eq (cvs-fileinfo->type curr) 'REMOVED)))))) - - -(defun cvs-parse-stderr (stdout-buffer stderr-buffer head dir) - "Parse the output from CVS that is written to stderr. -Args: STDOUT-BUFFER STDERR-BUFFER HEAD DIR -STDOUT-BUFFER holds the output that cvs sent to stdout. It is only -used to create a bug report in case there is a parse error. -STDERR-BUFFER is the buffer that holds the output to parse. -HEAD is a cons-cell, the head of the list that is built. -DIR is the directory the `cvs update' was run in. - -This function returns the last cons-cell in the list that is built." - - (save-window-excursion - (set-buffer stderr-buffer) - (goto-char (point-min)) - (let ((current-dir dir) - (root-dir dir)) - - (while (< (point) (point-max)) - (cond - - ;; RCVS support (for now, we simply ignore any output from - ;; RCVS, including error messages!) - - ((looking-at "updating of .* finished$") - (forward-line 1)) - - ((looking-at "REMOTE FOLDER:.*") - (forward-line 1) - (while (and (< (point) (point-max)) (not (looking-at "phase 2.*"))) - (forward-line 1)) - (forward-line 2)) - - ((looking-at "turn on remote mode$") - (forward-line 1) - (while (and (< (point) (point-max)) (not (looking-at "phase 2.*"))) - (forward-line 1)) - (forward-line 2)) - - ((looking-at "phase 3.*") - (goto-char (point-max))) - - ;; End of RCVS stuff. - - ;; CVS is descending a subdirectory. - ;; (The "server" case is there to support Cyclic CVS.) - ((looking-at "cvs \\(update\\|server\\): Updating \\(.*\\)$") - (setq current-dir - (cvs-get-current-dir - root-dir - (buffer-substring (match-beginning 2) (match-end 2)))) - (setcdr head (list (cvs-create-fileinfo - 'DIRCHANGE current-dir - nil (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; File removed, since it is removed (by third party) in repository. - - ((or (looking-at - "cvs update: warning: \\(.*\\) is not (any longer) pertinent") - (looking-at - "cvs update: \\(.*\\) is no longer in the repository")) - - (setcdr head (list (cvs-create-fileinfo - 'CVS-REMOVED current-dir - (file-name-nondirectory - (buffer-substring (match-beginning 1) - (match-end 1))) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; File removed by you, but recreated by cvs. Ignored. - - ((looking-at "cvs update: warning: .* was lost$") - (forward-line 1)) - - ;; A file that has been created by you, but added to the cvs - ;; repository by another. - - ((looking-at "^cvs update: move away \\(.*\\); it is in the way$") - (setcdr head (list (cvs-create-fileinfo - 'MOVE-AWAY current-dir - (file-name-nondirectory - (buffer-substring (match-beginning 1) - (match-end 1))) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; Empty line. Probably inserted by mistake by user (or developer :-) - ;; Ignore. - - ((looking-at "^$") - (forward-line 1)) - - ;; Cvs waits for a lock. Ignore. - - ((looking-at - "^cvs update: \\[..:..:..\\] waiting for .*lock in ") - (forward-line 1)) - - ;; File removed in repository, but edited by you. - - ((looking-at - "cvs update: conflict: \\(.*\\) is modified but no longer \ -in the repository$") - (setcdr head (list - (cvs-create-fileinfo - 'REM-CONFLICT current-dir - (file-name-nondirectory - (buffer-substring (match-beginning 1) (match-end 1))) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ((looking-at - "cvs update: conflict: removed \\(.*\\) was modified by \ -second party") - (setcdr head - (list - (cvs-create-fileinfo - 'MOD-CONFLICT current-dir - (buffer-substring (match-beginning 1) (match-end 1)) - (buffer-substring (match-beginning 0) (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ((looking-at - "cvs update: \\(.*\\) should be removed and is still there") - (setcdr head - (list - (cvs-create-fileinfo - 'REM-EXIST current-dir - (buffer-substring (match-beginning 1) (match-end 1)) - (buffer-substring (match-beginning 0) (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ((looking-at "cvs update: in directory ") - (let ((start (point))) - (forward-line 1) - (cvs-skip-line - stdout-buffer stderr-buffer - (regexp-quote "cvs [update aborted]: there is no repository ")) - (setcdr head (list - (cvs-create-fileinfo - 'REPOS-MISSING current-dir - nil - (buffer-substring start (point))))) - (setq head (cdr head)))) - - ;; Ignore other messages from Cyclic CVS. - ((looking-at "cvs server:") - (forward-line 1)) - - (t - - ;; CVS has decided to merge someone elses changes into this - ;; document. This leads to a lot of garbage being printed. - ;; First there is two lines that contains no information - ;; that we skip (but we check that we recognize them). - - (let ((complex-start (point)) - initial-revision filename) - - (cvs-skip-line stdout-buffer stderr-buffer "^RCS file: .*$") - (setq initial-revision - (cvs-skip-line stdout-buffer stderr-buffer - "^retrieving revision \\(.*\\)$" 1)) - (cvs-skip-line stdout-buffer stderr-buffer - "^retrieving revision .*$") - - ;; Get the file name from the next line. - - (setq - filename - (cvs-skip-line - stdout-buffer stderr-buffer - "^Merging differences between [0-9.]+ and [0-9.]+ into \\(.*\\)$" - 1)) - - (cond - ;; Was it a conflict? - ((looking-at - ;; Allow both RCS 5.5 and 5.6. (5.6 prints "rcs" and " warning"). - "^\\(rcs\\)?merge:?\\( warning\\)?: \\(overlaps\\|conflicts\\) during merge$") - - ;; Yes, this is a conflict. - (cvs-skip-line - stdout-buffer stderr-buffer - "^\\(rcs\\)?merge:?\\( warning\\)?: \\(overlaps\\|conflicts\\) during merge$") - - (cvs-skip-line stdout-buffer stderr-buffer - "^cvs \\(update\\|server\\): conflicts found in ") - - (let ((fileinfo - (cvs-create-fileinfo - 'CONFLICT current-dir - filename - (buffer-substring complex-start (point))))) - - (cvs-set-fileinfo->base-revision fileinfo initial-revision) - - (setcdr head (list fileinfo)) - (setq head (cdr head)))) - - ;; Was it a conflict, and was RCS compiled without DIFF3_BIN? - - ((looking-at - ;; Allow both RCS 5.5 and 5.6. (5.6 prints "rcs" and " warning"). - "^\\(rcs\\)?merge\\( warning\\)?: overlaps or other probl\ -ems during merge$") - - ;; Yes, this is a conflict. - (cvs-skip-line - stdout-buffer stderr-buffer - "^\\(rcs\\)?merge\\( warning\\)?: overlaps .*during merge$") - - (cvs-skip-line stdout-buffer stderr-buffer - "^cvs update: could not merge ") - (cvs-skip-line stdout-buffer stderr-buffer - "^cvs update: restoring .* from backup file ") - - (let ((fileinfo - (cvs-create-fileinfo - 'CONFLICT current-dir - filename - (buffer-substring complex-start (point))))) - - (setcdr head (list fileinfo)) - (setq head (cdr head)))) - - (t - ;; Not a conflict; it must be a succesful merge. - (let ((fileinfo - (cvs-create-fileinfo - 'MERGED current-dir - filename - (buffer-substring complex-start (point))))) - (cvs-set-fileinfo->base-revision fileinfo initial-revision) - (setcdr head (list fileinfo)) - (setq head (cdr head))))))))))) - head) - - -(defun cvs-parse-stdout (stdout-buffer stderr-buffer head root-dir) - "Parse the output from CVS that is written to stdout. -Args: STDOUT-BUFFER STDERR-BUFFER HEAD ROOT-DIR -STDOUT-BUFFER is the buffer that holds the output to parse. -STDERR-BUFFER holds the output that cvs sent to stderr. It is only -used to create a bug report in case there is a parse error. - -HEAD is a cons-cell, the head of the list that is built. -ROOT-DIR is the directory the `cvs update' was run in. - -This function doesn't return anything particular." - (save-window-excursion - (set-buffer stdout-buffer) - (goto-char (point-min)) - (while (< (point) (point-max)) - (cond - - ;; M: The file is modified by the user, and untouched in the repository. - ;; A: The file is "cvs add"ed, but not "cvs ci"ed. - ;; R: The file is "cvs remove"ed, but not "cvs ci"ed. - ;; C: Conflict - ;; U, P: The file is copied from the repository. - ;; ?: Unknown file. - - - ((looking-at "\\([MARCUP?]\\) \\(.*\\)$") - (let* - ((c (char-after (match-beginning 1))) - (full-path - (concat (file-name-as-directory root-dir) - (buffer-substring (match-beginning 2) (match-end 2)))) - (fileinfo (cvs-create-fileinfo - (cond ((eq c ?M) 'MODIFIED) - ((eq c ?A) 'ADDED) - ((eq c ?R) 'REMOVED) - ((eq c ?C) 'CONFLICT) - ((eq c ?U) 'UPDATED) - ;; generated when Cyclic CVS sends a - ;; patch instead of the full file: - ((eq c ?P) 'UPDATED) - ((eq c ??) 'UNKNOWN)) - (substring (file-name-directory full-path) 0 -1) - (file-name-nondirectory full-path) - (buffer-substring (match-beginning 0) (match-end 0))))) - ;; Updated files require no further action. - (if (memq c '(?U ?P)) - (cvs-set-fileinfo->handled fileinfo t)) - - ;; Link this last on the list. - (setcdr head (list fileinfo)) - (setq head (cdr head)) - (forward-line 1))) - - ;; Executing a program because of the -u option in modules. - ((looking-at "cvs update: Executing") - ;; Skip by any output the program may generate to stdout. - ;; Note that pcl-cvs will get seriously confused if the - ;; program prints anything to stderr. - (re-search-forward cvs-update-prog-output-skip-regexp) - (forward-line 1)) - - (t (cvs-parse-error stdout-buffer stderr-buffer 'STDOUT (point))))))) - -(defun cvs-pp (fileinfo) - "Pretty print FILEINFO. Insert a printed representation in current buffer. -For use by the cookie package." - - (let ((a (cvs-fileinfo->type fileinfo)) - (s (if (cvs-fileinfo->marked fileinfo) - "*" " ")) - (f (cvs-fileinfo->file-name fileinfo)) - (ci (if (cvs-fileinfo->handled fileinfo) - " " "ci"))) - (insert - (cond - ((eq a 'UPDATED) - (format "%s Updated %s" s f)) - ((eq a 'MODIFIED) - (format "%s Modified %s %s" s ci f)) - ((eq a 'MERGED) - (format "%s Merged %s %s" s ci f)) - ((eq a 'CONFLICT) - (format "%s Conflict %s" s f)) - ((eq a 'ADDED) - (format "%s Added %s %s" s ci f)) - ((eq a 'REMOVED) - (format "%s Removed %s %s" s ci f)) - ((eq a 'UNKNOWN) - (format "%s Unknown %s" s f)) - ((eq a 'CVS-REMOVED) - (format "%s Removed from repository: %s" s f)) - ((eq a 'REM-CONFLICT) - (format "%s Conflict: Removed from repository, changed by you: %s" s f)) - ((eq a 'MOD-CONFLICT) - (format "%s Conflict: Removed by you, changed in repository: %s" s f)) - ((eq a 'REM-EXIST) - (format "%s Conflict: Removed by you, but still exists: %s" s f)) - ((eq a 'DIRCHANGE) - (format "\nIn directory %s:" - (cvs-fileinfo->dir fileinfo))) - ((eq a 'MOVE-AWAY) - (format "%s Move away %s - it is in the way" s f)) - ((eq a 'REPOS-MISSING) - (format " This repository is missing! Remove this dir manually.")) - ((eq a 'MESSAGE) - (cvs-fileinfo->full-log fileinfo)) - (t - (format "%s Internal error! %s" s f)))))) - - -;;; You can define your own keymap in .emacs. pcl-cvs.el won't overwrite it. - -(if cvs-mode-map - nil - (setq cvs-mode-map (make-keymap)) - (suppress-keymap cvs-mode-map) - (define-key cvs-mode-map " " 'cvs-mode-next-line) - (define-key cvs-mode-map "?" 'describe-mode) - (define-key cvs-mode-map "A" 'cvs-mode-add-change-log-entry-other-window) - (define-key cvs-mode-map "M" 'cvs-mode-mark-all-files) - (define-key cvs-mode-map "R" 'cvs-mode-revert-updated-buffers) - (define-key cvs-mode-map "U" 'cvs-mode-undo-local-changes) - (define-key cvs-mode-map "\C-?" 'cvs-mode-unmark-up) - (define-key cvs-mode-map "\C-k" 'cvs-mode-acknowledge) - (define-key cvs-mode-map "\C-n" 'cvs-mode-next-line) - (define-key cvs-mode-map "\C-p" 'cvs-mode-previous-line) - (define-key cvs-mode-map "\M-\C-?" 'cvs-mode-unmark-all-files) - (define-key cvs-mode-map "a" 'cvs-mode-add) - (define-key cvs-mode-map "b" 'cvs-mode-diff-backup) - (define-key cvs-mode-map "c" 'cvs-mode-commit) - (define-key cvs-mode-map "C" 'cvs-mode-changelog-commit) - (define-key cvs-mode-map "d" 'cvs-mode-diff-cvs) - (define-key cvs-mode-map "e" 'cvs-mode-emerge) - (define-key cvs-mode-map "f" 'cvs-mode-find-file) - (define-key cvs-mode-map "g" 'cvs-mode-update-no-prompt) - (define-key cvs-mode-map "i" 'cvs-mode-ignore) - (define-key cvs-mode-map "l" 'cvs-mode-log) - (define-key cvs-mode-map "m" 'cvs-mode-mark) - (define-key cvs-mode-map "n" 'cvs-mode-next-line) - (define-key cvs-mode-map "o" 'cvs-mode-find-file-other-window) - (define-key cvs-mode-map "p" 'cvs-mode-previous-line) - (define-key cvs-mode-map "q" 'bury-buffer) - (define-key cvs-mode-map "r" 'cvs-mode-remove-file) - (define-key cvs-mode-map "s" 'cvs-mode-status) - (define-key cvs-mode-map "x" 'cvs-mode-remove-handled) - (define-key cvs-mode-map "u" 'cvs-mode-unmark)) - - -(defun cvs-get-marked (&optional ignore-marks) - "Return a list of all selected tins. -If there are any marked tins, and IGNORE-MARKS is nil, return them. -Otherwise, if the cursor selects a directory, return all files in it. -Otherwise return (a list containing) the file the cursor points to, or -an empty list if it doesn't point to a file at all. - -Args: &optional IGNORE-MARKS." - - (cond - ;; Any marked cookies? - ((and (not ignore-marks) - (collection-collect-tin cvs-cookie-handle 'cvs-fileinfo->marked))) - ;; Nope. - (t - (let ((sel (tin-locate cvs-cookie-handle (point)))) - (cond - ;; If a directory is selected, all it members are returned. - ((and sel (eq (cvs-fileinfo->type - (tin-cookie cvs-cookie-handle sel)) - 'DIRCHANGE)) - (collection-collect-tin - cvs-cookie-handle 'cvs-dir-member-p - (cvs-fileinfo->dir (tin-cookie cvs-cookie-handle sel)))) - (t - (list sel))))))) - - -(defun cvs-dir-member-p (fileinfo dir) - "Return true if FILEINFO represents a file in directory DIR." - (and (not (eq (cvs-fileinfo->type fileinfo) 'DIRCHANGE)) - (string= (cvs-fileinfo->dir fileinfo) dir))) - -(defun cvs-dir-empty-p (tin) - "Return non-nil if TIN is a directory that is empty. -Args: CVS-BUF TIN." - (and (eq (cvs-fileinfo->type (tin-cookie cvs-cookie-handle tin)) 'DIRCHANGE) - (or (not (tin-next cvs-cookie-handle tin)) - (eq (cvs-fileinfo->type - (tin-cookie cvs-cookie-handle - (tin-next cvs-cookie-handle tin))) - 'DIRCHANGE)))) - -(defun cvs-mode-revert-updated-buffers () - "Revert any buffers that are UPDATED, MERGED or CONFLICT." - (interactive) - (cookie-map (function cvs-revert-fileinfo) cvs-cookie-handle)) - -(defun cvs-revert-fileinfo (fileinfo) - "Revert the buffer that holds the file in FILEINFO if it has changed, -and if the type is UPDATED, MERGED or CONFLICT." - (let* ((type (cvs-fileinfo->type fileinfo)) - (file (cvs-fileinfo->full-path fileinfo)) - (buffer (get-file-buffer file))) - ;; For a revert to happen... - (cond - ((and - ;; ...the type must be one that justifies a revert... - (or (eq type 'UPDATED) - (eq type 'MERGED) - (eq type 'CONFLICT)) - ;; ...and the user must be editing the file... - buffer) - (save-excursion - (set-buffer buffer) - (cond - ((buffer-modified-p) - (error "%s: edited since last cvs-update." - (buffer-file-name))) - ;; Go ahead and revert the file. - (t (revert-buffer 'dont-use-auto-save-file 'dont-ask)))))))) - - -(defun cvs-mode-remove-handled () - "Remove all lines that are handled. -Empty directories are removed." - (interactive) - ;; Pass one: remove files that are handled. - (collection-filter-cookies cvs-cookie-handle - (function - (lambda (fileinfo) (not (cvs-fileinfo->handled fileinfo))))) - ;; Pass two: remove empty directories. - (cvs-remove-empty-directories)) - - -(defun cvs-remove-empty-directories () - "Remove empty directories in the *cvs* buffer." - (collection-filter-tins cvs-cookie-handle - (function - (lambda (tin) - (not (cvs-dir-empty-p tin)))))) - -(defun cvs-mode-mark (pos) - "Mark a fileinfo. Args: POS. -If the fileinfo is a directory, all the contents of that directory are -marked instead. A directory can never be marked. -POS is a buffer position." - - (interactive "d") - - (let* ((tin (tin-locate cvs-cookie-handle pos)) - (sel (tin-cookie cvs-cookie-handle tin))) - - (cond - ;; Does POS point to a directory? If so, mark all files in that directory. - ((eq (cvs-fileinfo->type sel) 'DIRCHANGE) - (cookie-map - (function (lambda (f dir) - (cond - ((cvs-dir-member-p f dir) - (cvs-set-fileinfo->marked f t) - t)))) ;Tell cookie to redisplay this cookie. - cvs-cookie-handle - (cvs-fileinfo->dir sel))) - (t - (cvs-set-fileinfo->marked sel t) - (tin-invalidate cvs-cookie-handle tin) - (tin-goto-next cvs-cookie-handle pos 1))))) - - -(defun cvs-committable (tin) - "Check if the TIN is committable. -It is committable if it - a) is not handled and - b) is either MODIFIED, ADDED, REMOVED, MERGED or CONFLICT." - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (and (not (cvs-fileinfo->handled fileinfo)) - (or (eq type 'MODIFIED) - (eq type 'ADDED) - (eq type 'REMOVED) - (eq type 'MERGED) - (eq type 'CONFLICT))))) - -(defun cvs-mode-commit () - - "Check in all marked files, or the current file. -The user will be asked for a log message in a buffer. -If cvs-erase-input-buffer is non-nil that buffer will be erased. -Otherwise mark and point will be set around the entire contents of the -buffer so that it is easy to kill the contents of the buffer with \\[kill-region]." - - (interactive) - - (let* ((cvs-buf (current-buffer)) - (marked (cvs-filter (function cvs-committable) - (cvs-get-marked)))) - (if (null marked) - (error "Nothing to commit!") - (pop-to-buffer (get-buffer-create cvs-commit-prompt-buffer)) - (goto-char (point-min)) - - (if cvs-erase-input-buffer - (erase-buffer) - (push-mark (point-max))) - (cvs-edit-mode) - (make-local-variable 'cvs-commit-list) - (setq cvs-commit-list marked) - (message "Press C-c C-c when you are done editing.")))) - - -(defun cvs-edit-done () - "Commit the files to the repository." - (interactive) - (if (null cvs-commit-list) - (error "You have already commited the files")) - (if (and (> (point-max) 1) - (/= (char-after (1- (point-max))) ?\n) - (or (eq cvs-commit-buffer-require-final-newline t) - (and cvs-commit-buffer-require-final-newline - (yes-or-no-p - (format "Buffer %s does not end in newline. Add one? " - (buffer-name)))))) - (save-excursion - (goto-char (point-max)) - (insert ?\n))) - (save-some-buffers) - (let ((cc-list cvs-commit-list) - (cc-buffer (get-buffer cvs-buffer-name)) - (msg-buffer (current-buffer)) - (msg (buffer-substring (point-min) (point-max)))) - (pop-to-buffer cc-buffer) - (bury-buffer msg-buffer) - (cvs-use-temp-buffer) - (message "Committing...") - (if (cvs-execute-list cc-list cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "commit" "-m" msg) - (list "commit" "-m" msg))) - (error "Something went wrong. Check the %s buffer carefully." - cvs-temp-buffer-name)) - (let ((ccl cc-list)) - (while ccl - (cvs-after-commit-function (tin-cookie cvs-cookie-handle (car ccl))) - (setq ccl (cdr ccl)))) - (apply 'tin-invalidate cvs-cookie-handle cc-list) - (set-buffer msg-buffer) - (setq cvs-commit-list nil) - (set-buffer cc-buffer) - (if cvs-auto-remove-handled - (cvs-mode-remove-handled))) - - (message "Committing... Done.")) - -(defun cvs-after-commit-function (fileinfo) - "Do everything that needs to be done when FILEINFO has been commited. -The fileinfo->handle is set, and if the buffer is present it is reverted." - (cvs-set-fileinfo->handled fileinfo t) - (if cvs-auto-revert-after-commit - (let* ((file (cvs-fileinfo->full-path fileinfo)) - (buffer (get-file-buffer file))) - ;; For a revert to happen... - (if buffer - ;; ...the user must be editing the file... - (save-excursion - (set-buffer buffer) - (if (not (buffer-modified-p)) - ;; ...but it must be unmodified. - (revert-buffer 'dont-use-auto-save-file 'dont-ask))))))) - - -(defun cvs-execute-list (tin-list program constant-args) - "Run PROGRAM on all elements on TIN-LIST. -Args: TIN-LIST PROGRAM CONSTANT-ARGS -The PROGRAM will be called with pwd set to the directory the -files reside in. CONSTANT-ARGS should be a list of strings. The -arguments given to the program will be CONSTANT-ARGS followed by all -the files (from TIN-LIST) that resides in that directory. If the files -in TIN-LIST resides in different directories the PROGRAM will be run -once for each directory (if all files in the same directory appears -after each other). - -Any output from PROGRAM will be inserted in the current buffer. - -This function return nil if all went well, or the numerical exit -status or a signal name as a string. Note that PROGRAM might be called -several times. This will return non-nil if something goes wrong, but -there is no way to know which process that failed." - - (let ((exitstatus nil)) - (while tin-list - (let ((current-dir (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle - (car tin-list)))) - arg-list arg-str) - - ;; Collect all marked files in this directory. - - (while (and tin-list - (string= - current-dir - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle (car tin-list))))) - (setq arg-list - (cons (cvs-fileinfo->file-name - (tin-cookie cvs-cookie-handle (car tin-list))) - arg-list)) - (setq tin-list (cdr tin-list))) - - (setq arg-list (nreverse arg-list)) - - ;; Execute the command on all the files that were collected. - - (setq default-directory (file-name-as-directory current-dir)) - (insert (format "=== cd %s\n" default-directory)) - (insert (format "=== %s %s\n\n" - program - (mapconcat '(lambda (foo) foo) - (nconc (copy-sequence constant-args) - arg-list) - " "))) - (let ((res (apply 'call-process program nil t t - (nconc (copy-sequence constant-args) arg-list)))) - ;; Remember the first, or highest, exitstatus. - (if (and (not (and (integerp res) (zerop res))) - (or (null exitstatus) - (and (integerp exitstatus) (= 1 exitstatus)))) - (setq exitstatus res))) - (goto-char (point-max)))) - exitstatus)) - - -(defun cvs-execute-single-file-list (tin-list extractor program constant-args) - "Run PROGRAM on all elements on TIN-LIST. - -Args: TIN-LIST EXTRACTOR PROGRAM CONSTANT-ARGS - -The PROGRAM will be called with pwd set to the directory the files -reside in. CONSTANT-ARGS is a list of strings to pass as arguments to -PROGRAM. The arguments given to the program will be CONSTANT-ARGS -followed by the list that EXTRACTOR returns. - -EXTRACTOR will be called once for each file on TIN-LIST. It is given -one argument, the cvs-fileinfo. It can return t, which means ignore -this file, or a list of arguments to send to the program." - - (while tin-list - (let ((default-directory (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle - (car tin-list))))) - (arg-list - (funcall extractor - (tin-cookie cvs-cookie-handle (car tin-list))))) - - ;; Execute the command unless extractor returned t. - - (if (eq arg-list t) - nil - (insert (format "=== cd %s\n" default-directory)) - (insert (format "=== %s %s\n\n" - program - (mapconcat '(lambda (foo) foo) - (nconc (copy-sequence constant-args) - arg-list) - " "))) - (apply 'call-process program nil t t - (nconc (copy-sequence constant-args) arg-list)) - (goto-char (point-max)))) - (setq tin-list (cdr tin-list)))) - - -(defun cvs-edit-mode () - "\\<cvs-edit-mode-map>Mode for editing cvs log messages. -Commands: -\\[cvs-edit-done] checks in the file when you are ready. -This mode is based on fundamental mode." - (interactive) - (use-local-map cvs-edit-mode-map) - (setq major-mode 'cvs-edit-mode) - (setq mode-name "CVS Log") - (auto-fill-mode 1)) - - -(if cvs-edit-mode-map - nil - (setq cvs-edit-mode-map (make-sparse-keymap)) - (define-prefix-command 'cvs-control-c-prefix) - (define-key cvs-edit-mode-map "\C-c" 'cvs-control-c-prefix) - (define-key cvs-edit-mode-map "\C-c\C-c" 'cvs-edit-done)) - - -(defun cvs-diffable (tins) - "Return a list of all tins on TINS that it makes sense to run -``cvs diff'' on." - ;; +++ There is an unnecessary (nreverse) here. Get the list the - ;; other way around instead! - (let ((result nil)) - (while tins - (let ((type (cvs-fileinfo->type - (tin-cookie cvs-cookie-handle (car tins))))) - (if (or (eq type 'MODIFIED) - (eq type 'UPDATED) - (eq type 'MERGED) - (eq type 'CONFLICT) - (eq type 'REMOVED) ;+++Does this line make sense? - (eq type 'ADDED)) ;+++Does this line make sense? - (setq result (cons (car tins) result))) - (setq tins (cdr tins)))) - (nreverse result))) - - -(defun cvs-mode-diff-cvs (&optional ignore-marks) - "Diff the selected files against the repository. -The flags in the variable cvs-diff-flags (which should be a list -of strings) will be passed to ``cvs diff''. If the variable -cvs-diff-ignore-marks is non-nil any marked files will not be -considered to be selected. An optional prefix argument will invert -the influence from cvs-diff-ignore-marks." - - (interactive "P") - - (if (not (listp cvs-diff-flags)) - (error "cvs-diff-flags should be a list of strings")) - - (save-some-buffers) - (let ((marked (cvs-diffable - (cvs-get-marked - (or (and ignore-marks (not cvs-diff-ignore-marks)) - (and (not ignore-marks) cvs-diff-ignore-marks)))))) - (cvs-use-temp-buffer) - (message "cvsdiffing...") - ;; Don't care much about the exit status since it is the _sum_ of - ;; the status codes from the different files (not the _max_ as it - ;; should be). - (if (cvs-execute-list marked cvs-program - (if cvs-cvsroot - (cons "-d" (cons cvs-cvsroot - (cons "diff" cvs-diff-flags))) - (cons "diff" cvs-diff-flags))) - (message "cvsdiffing... Done.") - (message "cvsdiffing... No differences found.")))) - - -(defun cvs-backup-diffable (tin) - "Check if the TIN is backup-diffable. -It must have a backup file to be diffable." - (file-readable-p - (cvs-fileinfo->backup-file (tin-cookie cvs-cookie-handle tin)))) - -(defun cvs-mode-diff-backup (&optional ignore-marks) - "Diff the files against the backup file. -This command can be used on files that are marked with \"Merged\" -or \"Conflict\" in the *cvs* buffer. - -If the variable cvs-diff-ignore-marks is non-nil any marked files will -not be considered to be selected. An optional prefix argument will -invert the influence from cvs-diff-ignore-marks. - -The flags in cvs-diff-flags will be passed to ``diff''." - - (interactive "P") - - (if (not (listp cvs-diff-flags)) - (error "cvs-diff-flags should be a list of strings.")) - - (save-some-buffers) - (let ((marked (cvs-filter - (function cvs-backup-diffable) - (cvs-get-marked - (or - (and ignore-marks (not cvs-diff-ignore-marks)) - (and (not ignore-marks) cvs-diff-ignore-marks)))))) - (if (null marked) - (error "No ``Conflict'' or ``Merged'' file selected!")) - (cvs-use-temp-buffer) - (message "diffing...") - (cvs-execute-single-file-list - marked 'cvs-diff-backup-extractor cvs-diff-program cvs-diff-flags)) - (message "diffing... Done.")) - - -(defun cvs-diff-backup-extractor (fileinfo) - "Return the filename and the name of the backup file as a list. -Signal an error if there is no backup file." - (if (not (file-readable-p (cvs-fileinfo->backup-file fileinfo))) - (error "%s has no backup file." - (concat - (file-name-as-directory (cvs-fileinfo->dir fileinfo)) - (cvs-fileinfo->file-name fileinfo)))) - (list (cvs-fileinfo->backup-file fileinfo) - (cvs-fileinfo->file-name fileinfo))) - -(defun cvs-mode-find-file-other-window (pos) - "Select a buffer containing the file in another window. -Args: POS" - (interactive "d") - (let ((tin (tin-locate cvs-cookie-handle pos))) - (if tin - (let ((type (cvs-fileinfo->type (tin-cookie cvs-cookie-handle - tin)))) - (cond - ((or (eq type 'REMOVED) - (eq type 'CVS-REMOVED)) - (error "Can't visit a removed file.")) - ((eq type 'DIRCHANGE) - (let ((obuf (current-buffer)) - (odir default-directory)) - (setq default-directory - (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle tin)))) - (dired-other-window default-directory) - (set-buffer obuf) - (setq default-directory odir))) - (t - (find-file-other-window (cvs-full-path tin))))) - (error "There is no file to find.")))) - -(defun cvs-fileinfo->full-path (fileinfo) - "Return the full path for the file that is described in FILEINFO." - (concat - (file-name-as-directory - (cvs-fileinfo->dir fileinfo)) - (cvs-fileinfo->file-name fileinfo))) - -(defun cvs-full-path (tin) - "Return the full path for the file that is described in TIN." - (cvs-fileinfo->full-path (tin-cookie cvs-cookie-handle tin))) - -(defun cvs-mode-find-file (pos) - "Select a buffer containing the file in another window. -Args: POS" - (interactive "d") - (let* ((cvs-buf (current-buffer)) - (tin (tin-locate cvs-cookie-handle pos))) - (if tin - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond - ((or (eq type 'REMOVED) - (eq type 'CVS-REMOVED)) - (error "Can't visit a removed file.")) - ((eq type 'DIRCHANGE) - (let ((odir default-directory)) - (setq default-directory - (file-name-as-directory (cvs-fileinfo->dir fileinfo))) - (dired default-directory) - (set-buffer cvs-buf) - (setq default-directory odir))) - (t - (find-file (cvs-full-path tin))))) - (error "There is no file to find.")))) - -(defun cvs-mode-mark-all-files () - "Mark all files. -Directories are not marked." - (interactive) - (cookie-map (function (lambda (cookie) - (cond - ((not (eq (cvs-fileinfo->type cookie) 'DIRCHANGE)) - (cvs-set-fileinfo->marked cookie t) - t)))) - cvs-cookie-handle)) - - -(defun cvs-mode-unmark (pos) - "Unmark a fileinfo. Args: POS." - (interactive "d") - - (let* ((tin (tin-locate cvs-cookie-handle pos)) - (sel (tin-cookie cvs-cookie-handle tin))) - - (cond - ((eq (cvs-fileinfo->type sel) 'DIRCHANGE) - (cookie-map - (function (lambda (f dir) - (cond - ((cvs-dir-member-p f dir) - (cvs-set-fileinfo->marked f nil) - t)))) - cvs-cookie-handle - (cvs-fileinfo->dir sel))) - (t - (cvs-set-fileinfo->marked sel nil) - (tin-invalidate cvs-cookie-handle tin) - (tin-goto-next cvs-cookie-handle pos 1))))) - -(defun cvs-mode-unmark-all-files () - "Unmark all files. -Directories are also unmarked, but that doesn't matter, since -they should always be unmarked." - (interactive) - (cookie-map (function (lambda (cookie) - (cvs-set-fileinfo->marked cookie nil) - t)) - cvs-cookie-handle)) - - -(defun cvs-do-removal (tins) - "Remove files. -Args: TINS. -TINS is a list of tins that the -user wants to delete. The files are deleted. If the type of -the tin is 'UNKNOWN the tin is removed from the buffer. If it -is anything else the file is added to a list that should be -`cvs remove'd and the tin is changed to be of type 'REMOVED. - -Returns a list of tins files that should be `cvs remove'd." - (cvs-use-temp-buffer) - (mapcar 'cvs-insert-full-path tins) - (cond - ((and tins (yes-or-no-p (format "Delete %d files? " (length tins)))) - (let (files-to-remove) - (while tins - (let* ((tin (car tins)) - (fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (if (not (or (eq type 'REMOVED) (eq type 'CVS-REMOVED))) - (progn - (delete-file (cvs-full-path tin)) - (cond - ((or (eq type 'UNKNOWN) (eq type 'MOVE-AWAY)) - (tin-delete cvs-cookie-handle tin)) - (t - (setq files-to-remove (cons tin files-to-remove)) - (cvs-set-fileinfo->type fileinfo 'REMOVED) - (cvs-set-fileinfo->handled fileinfo nil) - (tin-invalidate cvs-cookie-handle tin)))))) - (setq tins (cdr tins))) - files-to-remove)) - (t nil))) - - - -(defun cvs-mode-remove-file () - "Remove all marked files." - (interactive) - (let ((files-to-remove (cvs-do-removal (cvs-get-marked)))) - (if (null files-to-remove) - nil - (cvs-use-temp-buffer) - (message "removing from repository...") - (if (cvs-execute-list files-to-remove cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "remove") - '("remove"))) - (error "CVS exited with non-zero exit status.") - (message "removing from repository... done."))))) - -(defun cvs-mode-undo-local-changes () - "Undo local changes to all marked files. -The file is removed and `cvs update FILE' is run." - (interactive) - (let ((tins-to-undo (cvs-get-marked))) - (cvs-use-temp-buffer) - (mapcar 'cvs-insert-full-path tins-to-undo) - (cond - ((and tins-to-undo (yes-or-no-p (format "Undo changes to %d files? " - (length tins-to-undo)))) - (let (files-to-update) - (while tins-to-undo - (let* ((tin (car tins-to-undo)) - (fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond - ((or - (eq type 'UPDATED) (eq type 'MODIFIED) (eq type 'MERGED) - (eq type 'CONFLICT) (eq type 'CVS-REMOVED) - (eq type 'REM-CONFLICT) (eq type 'MOVE-AWAY) - (eq type 'REMOVED)) - (if (not (eq type 'REMOVED)) - (delete-file (cvs-full-path tin))) - (setq files-to-update (cons tin files-to-update)) - (cvs-set-fileinfo->type fileinfo 'UPDATED) - (cvs-set-fileinfo->handled fileinfo t) - (tin-invalidate cvs-cookie-handle tin)) - - ((eq type 'MOD-CONFLICT) - (error "Use cvs-mode-add instead on %s." - (cvs-fileinfo->file-name fileinfo))) - - ((eq type 'REM-CONFLICT) - (error "Can't deal with a file you have removed and recreated.")) - - ((eq type 'DIRCHANGE) - (error "Undo on directories not supported (yet).")) - - ((eq type 'ADDED) - (error "There is no old revision to get for %s" - (cvs-fileinfo->file-name fileinfo))) - (t (error "cvs-mode-undo-local-changes: can't handle an %s" - type))) - - (setq tins-to-undo (cdr tins-to-undo)))) - (cvs-use-temp-buffer) - (message "Regetting files from repository...") - (if (cvs-execute-list files-to-update cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "update") - '("update"))) - (error "CVS exited with non-zero exit status.") - (message "Regetting files from repository... done."))))))) - -(defun cvs-mode-acknowledge () - "Remove all marked files from the buffer." - (interactive) - - (mapcar (function (lambda (tin) - (tin-delete cvs-cookie-handle tin))) - (cvs-get-marked))) - - -(defun cvs-mode-unmark-up (pos) - "Unmark the file on the previous line. -Takes one argument POS, a buffer position." - (interactive "d") - (let ((tin (tin-goto-previous cvs-cookie-handle pos 1))) - (cond - (tin - (cvs-set-fileinfo->marked (tin-cookie cvs-cookie-handle tin) - nil) - (tin-invalidate cvs-cookie-handle tin))))) - -(defun cvs-mode-previous-line (arg) - "Go to the previous line. -If a prefix argument is given, move by that many lines." - (interactive "p") - (tin-goto-previous cvs-cookie-handle (point) arg)) - -(defun cvs-mode-next-line (arg) - "Go to the next line. -If a prefix argument is given, move by that many lines." - (interactive "p") - (tin-goto-next cvs-cookie-handle (point) arg)) - -(defun cvs-add-file-update-buffer (tin) - "Subfunction to cvs-mode-add. Internal use only. -Update the display. Return non-nil if `cvs add' should be called on this -file. Args: TIN. -Returns 'ADD or 'RESURRECT." - (let ((fileinfo (tin-cookie cvs-cookie-handle tin))) - (cond - ((eq (cvs-fileinfo->type fileinfo) 'UNKNOWN) - (cvs-set-fileinfo->type fileinfo 'ADDED) - (tin-invalidate cvs-cookie-handle tin) - 'ADD) - ((eq (cvs-fileinfo->type fileinfo) 'REMOVED) - (cvs-set-fileinfo->type fileinfo 'UPDATED) - (cvs-set-fileinfo->handled fileinfo t) - (tin-invalidate cvs-cookie-handle tin) - 'RESURRECT)))) - -(defun cvs-add-sub (cvs-buf candidates) - "Internal use only. -Args: CVS-BUF CANDIDATES. -CANDIDATES is a list of tins. Updates the CVS-BUF and returns a pair of lists. -The first list is unknown tins that shall be `cvs add -m msg'ed. -The second list is removed files that shall be `cvs add'ed (resurrected)." - (let (add resurrect) - (while candidates - (let ((type (cvs-add-file-update-buffer (car candidates)))) - (cond ((eq type 'ADD) - (setq add (cons (car candidates) add))) - ((eq type 'RESURRECT) - (setq resurrect (cons (car candidates) resurrect))))) - (setq candidates (cdr candidates))) - (cons add resurrect))) - -(defun cvs-mode-add () - "Add marked files to the cvs repository." - (interactive) - - (let* ((buf (current-buffer)) - (result (cvs-add-sub buf (cvs-get-marked))) - (added (car result)) - (resurrect (cdr result)) - (msg (if added (read-from-minibuffer "Enter description: ")))) - - (if (or resurrect added) - (cvs-use-temp-buffer)) - - (cond (resurrect - (message "Resurrecting files from repository...") - (if (cvs-execute-list resurrect cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "add") - '("add"))) - (error "CVS exited with non-zero exit status.") - (message "Done.")))) - - (cond (added - (message "Adding new files to repository...") - (if (cvs-execute-list added cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "add" "-m" msg) - (list "add" "-m" msg))) - (error "CVS exited with non-zero exit status.") - (message "Done.")))))) - -(defun cvs-mode-ignore () - "Arrange so that CVS ignores the selected files. -This command ignores files that are not flagged as `Unknown'." - (interactive) - - (mapcar (function (lambda (tin) - (cond - ((eq (cvs-fileinfo->type - (tin-cookie cvs-cookie-handle tin)) - 'UNKNOWN) - (cvs-append-to-ignore - (tin-cookie cvs-cookie-handle tin)) - (tin-delete cvs-cookie-handle tin))))) - (cvs-get-marked))) - -(defun cvs-append-to-ignore (fileinfo) - "Append the file in fileinfo to the .cvsignore file" - (save-window-excursion - (set-buffer (find-file-noselect (concat (file-name-as-directory - (cvs-fileinfo->dir fileinfo)) - ".cvsignore"))) - (goto-char (point-max)) - (if (not (zerop (current-column))) - (insert "\n")) - (insert (cvs-fileinfo->file-name fileinfo) "\n") - (if cvs-sort-ignore-file - (sort-lines nil (point-min) (point-max))) - (save-buffer))) - -(defun cvs-mode-status () - "Show cvs status for all marked files." - (interactive) - - (save-some-buffers) - (let ((marked (cvs-get-marked))) - (cvs-use-temp-buffer) - (message "Running cvs status ...") - (if (cvs-execute-list - marked cvs-program - (if cvs-cvsroot - (cons "-d" (cons cvs-cvsroot (cons "status" cvs-status-flags))) - (cons "status" cvs-status-flags))) - (error "CVS exited with non-zero exit status.") - (message "Running cvs status ... Done.")))) - -(defun cvs-mode-log () - "Display the cvs log of all selected files." - (interactive) - - (let ((marked (cvs-get-marked))) - (cvs-use-temp-buffer) - (message "Running cvs log ...") - (if (cvs-execute-list marked cvs-program - (if cvs-cvsroot - (cons "-d" (cons cvs-cvsroot - (cons "log" cvs-log-flags))) - (cons "log" cvs-log-flags))) - (error "CVS exited with non-zero exit status.") - (message "Running cvs log ... Done.")))) - -(defun cvs-byte-compile-files () - "Run byte-compile-file on all selected files that end in '.el'." - (interactive) - (let ((marked (cvs-get-marked))) - (while marked - (let ((filename (cvs-full-path (car marked)))) - (if (string-match "\\.el$" filename) - (byte-compile-file filename))) - (setq marked (cdr marked))))) - -(defun cvs-insert-full-path (tin) - "Insert full path to the file described in TIN in the current buffer." - (insert (format "%s\n" (cvs-full-path tin)))) - - -(defun cvs-mode-add-change-log-entry-other-window (pos) - "Add a ChangeLog entry in the ChangeLog of the current directory. -Args: POS." - (interactive "d") - (let* ((cvs-buf (current-buffer)) - (odir default-directory)) - (setq default-directory - (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie - cvs-cookie-handle - (tin-locate cvs-cookie-handle pos))))) - (if (not default-directory) ;In case there was no entries. - (setq default-directory odir)) - (add-change-log-entry-other-window) - (set-buffer cvs-buf) - (setq default-directory odir))) - - -(defun print-cvs-tin (foo) - "Debug utility." - (let ((cookie (tin-cookie cvs-cookie-handle foo)) - (stream (get-buffer-create "debug"))) - (princ "==============\n" stream) - (princ (cvs-fileinfo->file-name cookie) stream) - (princ "\n" stream) - (princ (cvs-fileinfo->dir cookie) stream) - (princ "\n" stream) - (princ (cvs-fileinfo->full-log cookie) stream) - (princ "\n" stream) - (princ (cvs-fileinfo->marked cookie) stream) - (princ "\n" stream))) - -(defun cvs-mode-emerge (pos) - "Emerge appropriate revisions of the selected file. -Args: POS" - (interactive "d") - (let* ((cvs-buf (current-buffer)) - (tin (tin-locate cvs-cookie-handle pos))) - (if tin - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond - ((eq type 'MODIFIED) - (require 'emerge) - (let ((tmp-file - (cvs-retrieve-revision-to-tmpfile fileinfo))) - (unwind-protect - (if (not (emerge-files - t - (cvs-fileinfo->full-path fileinfo) - tmp-file - (cvs-fileinfo->full-path fileinfo))) - (error "Emerge session failed")) - (delete-file tmp-file)))) - - ((or (eq type 'MERGED) - (eq type 'CONFLICT)) - (require 'emerge) - (let ((tmp-file - (cvs-retrieve-revision-to-tmpfile - fileinfo)) - (ancestor-file - (cvs-retrieve-revision-to-tmpfile - fileinfo - (cvs-fileinfo->base-revision fileinfo)))) - (unwind-protect - (if (not (emerge-files-with-ancestor - t - (cvs-fileinfo->backup-file fileinfo) - tmp-file - ancestor-file - (cvs-fileinfo->full-path fileinfo))) - (error "Emerge session failed")) - (delete-file tmp-file) - (delete-file ancestor-file)))) - (t - (error "Can only emerge \"Modified\", \"Merged\" or \"Conflict\"%s" - " files")))) - (error "There is no file to emerge.")))) - -(defun cvs-retrieve-revision-to-tmpfile (fileinfo &optional revision) - "Retrieve the latest revision of the file in FILEINFO to a temporary file. -If second optional argument REVISION is given, retrieve that revision instead." - (let - ((temp-name (make-temp-name - (concat (file-name-as-directory - (or (getenv "TMPDIR") "/tmp")) - "pcl-cvs." revision)))) - (cvs-kill-buffer-visiting temp-name) - (if revision - (message "Retrieving revision %s..." revision) - (message "Retrieving latest revision...")) - (let ((res (call-process cvs-shell nil nil nil "-c" - (concat cvs-program " update -p " - (if revision - (concat "-r " revision " ") - "") - (cvs-fileinfo->full-path fileinfo) - " > " temp-name)))) - (if (and res (not (and (integerp res) (zerop res)))) - (error "Something went wrong: %s" res)) - - (if revision - (message "Retrieving revision %s... Done." revision) - (message "Retrieving latest revision... Done.")) - (find-file-noselect temp-name) - temp-name))) - -(defun cvs-fileinfo->backup-file (fileinfo) - "Construct the file name of the backup file for FILEINFO." - (if (cvs-fileinfo->base-revision fileinfo) - (concat cvs-bakprefix (cvs-fileinfo->file-name fileinfo) - "." (cvs-fileinfo->base-revision fileinfo)))) - -(defun cvs-kill-buffer-visiting (filename) - "If there is any buffer visiting FILENAME, kill it (without confirmation)." - (let ((l (buffer-list))) - (while l - (if (string= (buffer-file-name (car l)) filename) - (kill-buffer (car l))) - (setq l (cdr l))))) - -(defun cvs-change-cvsroot (newroot) - "Change the cvsroot." - (interactive "DNew repository: ") - (if (or (file-directory-p (expand-file-name "CVSROOT" newroot)) - (y-or-n-p (concat "Warning: no CVSROOT found inside repository." - " Change cvs-cvsroot anyhow?"))) - (setq cvs-cvsroot newroot))) - -(if (string-match "Lucid" emacs-version) - (progn - (autoload 'pcl-cvs-fontify "pcl-cvs-lucid") - (add-hook 'cvs-mode-hook 'pcl-cvs-fontify))) - - -(defvar cvs-changelog-full-paragraphs t - "If non-nil, include full ChangeLog paragraphs in the CVS log. -This may be set in the ``local variables'' section of a ChangeLog, to -indicate the policy for that ChangeLog. - -A ChangeLog paragraph is a bunch of log text containing no blank lines; -a paragraph usually describes a set of changes with a single purpose, -but perhaps spanning several functions in several files. Changes in -different paragraphs are unrelated. - -You could argue that the CVS log entry for a file should contain the -full ChangeLog paragraph mentioning the change to the file, even though -it may mention other files, because that gives you the full context you -need to understand the change. This is the behavior you get when this -variable is set to t. - -On the other hand, you could argue that the CVS log entry for a change -should contain only the text for the changes which occurred in that -file, because the CVS log is per-file. This is the behavior you get -when this variable is set to nil.") - -(defun cvs-changelog-name (directory) - "Return the name of the ChangeLog file that handles DIRECTORY. -This is in DIRECTORY or one of its parents. -Signal an error if we can't find an appropriate ChangeLog file." - (let ((dir (file-name-as-directory directory)) - file) - (while (and dir - (not (file-exists-p - (setq file (expand-file-name "ChangeLog" dir))))) - (let ((last dir)) - (setq dir (file-name-directory (directory-file-name dir))) - (if (equal last dir) - (setq dir nil)))) - (or dir - (error "Can't find ChangeLog for %s" directory)) - file)) - -(defun cvs-narrow-changelog () - "Narrow to the top page of the current buffer, a ChangeLog file. -Actually, the narrowed region doesn't include the date line. -A \"page\" in a ChangeLog file is the area between two dates." - (or (eq major-mode 'change-log-mode) - (error "cvs-narrow-changelog: current buffer isn't a ChangeLog")) - - (goto-char (point-min)) - - ;; Skip date line and subsequent blank lines. - (forward-line 1) - (if (looking-at "[ \t\n]*\n") - (goto-char (match-end 0))) - - (let ((start (point))) - (forward-page 1) - (narrow-to-region start (point)) - (goto-char (point-min)))) - -(defun cvs-changelog-paragraph () - "Return the bounds of the ChangeLog paragraph containing point. -If we are between paragraphs, return the previous paragraph." - (save-excursion - (beginning-of-line) - (if (looking-at "^[ \t]*$") - (skip-chars-backward " \t\n" (point-min))) - (list (progn - (if (re-search-backward "^[ \t]*\n" nil 'or-to-limit) - (goto-char (match-end 0))) - (point)) - (if (re-search-forward "^[ \t\n]*$" nil t) - (match-beginning 0) - (point))))) - -(defun cvs-changelog-subparagraph () - "Return the bounds of the ChangeLog subparagraph containing point. -A subparagraph is a block of non-blank lines beginning with an asterisk. -If we are between subparagraphs, return the previous subparagraph." - (save-excursion - (end-of-line) - (if (search-backward "*" nil t) - (list (progn (beginning-of-line) (point)) - (progn - (forward-line 1) - (if (re-search-forward "^[ \t]*[\n*]" nil t) - (match-beginning 0) - (point-max)))) - (list (point) (point))))) - -(defun cvs-changelog-entry () - "Return the bounds of the ChangeLog entry containing point. -The variable `cvs-changelog-full-paragraphs' decides whether an -\"entry\" is a paragraph or a subparagraph; see its documentation string -for more details." - (if cvs-changelog-full-paragraphs - (cvs-changelog-paragraph) - (cvs-changelog-subparagraph))) - -(defun cvs-changelog-ours-p () - "See if ChangeLog entry at point is for the current user, today. -Return non-nil iff it is." - ;; Code adapted from add-change-log-entry. - (looking-at (concat (regexp-quote (substring (current-time-string) - 0 10)) - ".* " - (regexp-quote (substring (current-time-string) -4)) - "[ \t]+" - (regexp-quote (if (boundp 'add-log-full-name) - add-log-full-name - user-full-name)) - " <" - (regexp-quote - (if (boundp 'add-log-mailing-address) - add-log-mailing-address - user-mail-address))))) - -(defun cvs-relative-path (base child) - "Return a directory path relative to BASE for CHILD. -If CHILD doesn't seem to be in a subdirectory of BASE, just return -the full path to CHILD." - (let ((base (file-name-as-directory (expand-file-name base))) - (child (expand-file-name child))) - (or (string= base (substring child 0 (length base))) - (error "cvs-relative-path: %s isn't in %s" child base)) - (substring child (length base)))) - -(defun cvs-changelog-entries (file) - "Return the ChangeLog entries for FILE, and the ChangeLog they came from. -The return value looks like this: - (LOGBUFFER (ENTRYSTART . ENTRYEND) ...) -where LOGBUFFER is the name of the ChangeLog buffer, and each -\(ENTRYSTART . ENTRYEND\) pair is a buffer region." - (save-excursion - (set-buffer (find-file-noselect - (cvs-changelog-name - (file-name-directory - (expand-file-name file))))) - (or (eq major-mode 'change-log-mode) - (change-log-mode)) - (goto-char (point-min)) - (if (looking-at "[ \t\n]*\n") - (goto-char (match-end 0))) - (if (not (cvs-changelog-ours-p)) - (list (current-buffer)) - (save-restriction - (cvs-narrow-changelog) - (goto-char (point-min)) - - ;; Search for the name of FILE relative to the ChangeLog. If that - ;; doesn't occur anywhere, they're not using full relative - ;; filenames in the ChangeLog, so just look for FILE; we'll accept - ;; some false positives. - (let ((pattern (cvs-relative-path - (file-name-directory buffer-file-name) file))) - (if (or (string= pattern "") - (not (save-excursion - (search-forward pattern nil t)))) - (setq pattern file)) - - (let (texts) - (while (search-forward pattern nil t) - (let ((entry (cvs-changelog-entry))) - (setq texts (cons entry texts)) - (goto-char (elt entry 1)))) - - (cons (current-buffer) texts))))))) - -(defun cvs-changelog-insert-entries (buffer regions) - "Insert those regions in BUFFER specified in REGIONS. -Sort REGIONS front-to-back first." - (let ((regions (sort regions 'car-less-than-car)) - (last)) - (while regions - (if (and last (< last (car (car regions)))) - (newline)) - (setq last (elt (car regions) 1)) - (apply 'insert-buffer-substring buffer (car regions)) - (setq regions (cdr regions))))) - -(defun cvs-union (set1 set2) - "Return the union of SET1 and SET2, according to `equal'." - (while set2 - (or (member (car set2) set1) - (setq set1 (cons (car set2) set1))) - (setq set2 (cdr set2))) - set1) - -(defun cvs-insert-changelog-entries (files) - "Given a list of files FILES, insert the ChangeLog entries for them." - (let ((buffer-entries nil)) - - ;; Add each buffer to buffer-entries, and associate it with the list - ;; of entries we want from that file. - (while files - (let* ((entries (cvs-changelog-entries (car files))) - (pair (assq (car entries) buffer-entries))) - (if pair - (setcdr pair (cvs-union (cdr pair) (cdr entries))) - (setq buffer-entries (cons entries buffer-entries)))) - (setq files (cdr files))) - - ;; Now map over each buffer in buffer-entries, sort the entries for - ;; each buffer, and extract them as strings. - (while buffer-entries - (cvs-changelog-insert-entries (car (car buffer-entries)) - (cdr (car buffer-entries))) - (if (and (cdr buffer-entries) (cdr (car buffer-entries))) - (newline)) - (setq buffer-entries (cdr buffer-entries))))) - -(defun cvs-edit-delete-common-indentation () - "Unindent the current buffer rigidly until at least one line is flush left." - (save-excursion - (let ((common 100000)) - (goto-char (point-min)) - (while (< (point) (point-max)) - (if (not (looking-at "^[ \t]*$")) - (setq common (min common (current-indentation)))) - (forward-line 1)) - (indent-rigidly (point-min) (point-max) (- common))))) - -(defun cvs-mode-changelog-commit () - - "Check in all marked files, or the current file. -Ask the user for a log message in a buffer. - -This is just like `\\[cvs-mode-commit]', except that it tries to provide -appropriate default log messages by looking at the ChangeLogs. The -idea is to write your ChangeLog entries first, and then use this -command to commit your changes. - -To select default log text, we: -- find the ChangeLogs for the files to be checked in, -- verify that the top entry in the ChangeLog is on the current date - and by the current user; if not, we don't provide any default text, -- search the ChangeLog entry for paragraphs containing the names of - the files we're checking in, and finally -- use those paragraphs as the log text." - - (interactive) - - (let* ((cvs-buf (current-buffer)) - (marked (cvs-filter (function cvs-committable) - (cvs-get-marked)))) - (if (null marked) - (error "Nothing to commit!") - (pop-to-buffer (get-buffer-create cvs-commit-prompt-buffer)) - (goto-char (point-min)) - - (erase-buffer) - (cvs-insert-changelog-entries - (mapcar (lambda (tin) - (let ((cookie (tin-cookie cvs-cookie-handle tin))) - (expand-file-name - (cvs-fileinfo->file-name cookie) - (cvs-fileinfo->dir cookie)))) - marked)) - (cvs-edit-delete-common-indentation) - - (cvs-edit-mode) - (make-local-variable 'cvs-commit-list) - (setq cvs-commit-list marked) - (message "Press C-c C-c when you are done editing.")))) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.texinfo b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.texinfo deleted file mode 100644 index bb0a4fec3d80f..0000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.texinfo +++ /dev/null @@ -1,1744 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@comment Id: pcl-cvs.texinfo,v 1.45 1993/05/31 22:38:15 ceder Exp -@comment Documentation for the GNU Emacs CVS mode. -@comment Copyright (C) 1992 Per Cederqvist - -@comment This file is part of the pcl-cvs distribution. - -@comment Pcl-cvs is free software; you can redistribute it and/or modify -@comment it under the terms of the GNU General Public License as published by -@comment the Free Software Foundation; either version 1, or (at your option) -@comment any later version. - -@comment Pcl-cvs is distributed in the hope that it will be useful, -@comment but WITHOUT ANY WARRANTY; without even the implied warranty of -@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -@comment GNU General Public License for more details. - -@comment You should have received a copy of the GNU General Public License -@comment along with pcl-cvs; see the file COPYING. If not, write to -@comment the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -@setfilename pcl-cvs.info -@settitle Pcl-cvs - The Emacs Front-End to CVS -@setchapternewpage on - -@ifinfo -Copyright @copyright{} 1992 Per Cederqvist - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU General Public License'' is included exactly as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU General Public License'' and -this permission notice may be included in translations approved by the -Free Software Foundation instead of in the original English. -@end ifinfo - -@synindex vr fn -@comment The titlepage section does not appear in the Info file. -@titlepage -@sp 4 -@comment The title is printed in a large font. -@center @titlefont{User's Guide} -@sp -@center @titlefont{to} -@sp -@center @titlefont{pcl-cvs - the Emacs Front-End to CVS} -@sp 2 -@center release 1.05 -@comment -release- -@sp 3 -@center Per Cederqvist -@sp 3 -@center last updated 31 May 1993 -@comment -date- - -@comment The following two commands start the copyright page -@comment for the printed manual. This will not appear in the Info file. -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1992 Per Cederqvist - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU General Public License'' is included exactly as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU General Public License'' and -this permission notice may be included in translations approved by the -Free Software Foundation instead of in the original English. -@end titlepage - -@comment ================================================================ -@comment The real text starts here -@comment ================================================================ - -@node Top, Copying, (dir), (dir) -@comment node-name, next, previous, up - - -@ifinfo -This info manual describes pcl-cvs which is a GNU Emacs front-end to -CVS. It works with CVS version 1.3. This manual is updated to release -1.05 of pcl-cvs. -@end ifinfo -@comment -release- - -@menu -* Copying:: GNU General Public License -* Installation:: How to install pcl-cvs on your system. -* About pcl-cvs:: Authors and ftp sites. - -* Getting started:: An introduction with a walk-through example. -* Buffer contents:: An explanation of the buffer contents. -* Commands:: All commands, grouped by type. - -* Customization:: How you can tailor pcl-cvs to suit your needs. -* Future enhancements:: Future enhancements of pcl-cvs. -* Bugs:: Bugs (known and unknown). -* Function and Variable Index:: List of functions and variables. -* Concept Index:: List of concepts. -* Key Index:: List of keystrokes. - - --- The Detailed Node Listing --- - -Installation - -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. - -About pcl-cvs - -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? - -Buffer contents - -* File status:: The meaning of the second field. -* Selected files:: How selection works. - -Commands - -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to @samp{diff} different versions. -* Emerge:: -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands -@end menu - -@node Copying, Installation, Top, Top -@unnumbered GNU GENERAL PUBLIC LICENSE -@center Version 2, June 1991 - -@display -Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. -675 Mass Ave, Cambridge, MA 02139, USA - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. -@end display - -@unnumberedsec 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. - -@iftex -@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end iftex -@ifinfo -@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end ifinfo - -@enumerate -@item -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. - -@item -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. - -@item -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: - -@enumerate a -@item -You must cause the modified files to carry prominent notices -stating that you changed the files and the date of any change. - -@item -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. - -@item -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.) -@end enumerate - -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. - -@item -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: - -@enumerate a -@item -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, - -@item -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, - -@item -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.) -@end enumerate - -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. - -@item -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. - -@item -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. - -@item -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. - -@item -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. - -@item -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. - -@item -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. - -@item -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. - -@iftex -@heading NO WARRANTY -@end iftex -@ifinfo -@center NO WARRANTY -@end ifinfo - -@item -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. - -@item -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 enumerate - -@iftex -@heading END OF TERMS AND CONDITIONS -@end iftex -@ifinfo -@center END OF TERMS AND CONDITIONS -@end ifinfo - -@page -@unnumberedsec Appendix: 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. - -@smallexample -@var{one line to give the program's name and a brief idea of what it does.} -Copyright (C) 19@var{yy} @var{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., 675 Mass Ave, Cambridge, MA 02139, USA. -@end smallexample - -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: - -@smallexample -Gnomovision version 69, Copyright (C) 19@var{yy} @var{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. -@end smallexample - -The hypothetical commands @samp{show w} and @samp{show c} should show -the appropriate parts of the General Public License. Of course, the -commands you use may be called something other than @samp{show w} and -@samp{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: - -@example -Yoyodyne, Inc., hereby disclaims all copyright interest in the program -`Gnomovision' (which makes passes at compilers) written by James Hacker. - -@var{signature of Ty Coon}, 1 April 1989 -Ty Coon, President of Vice -@end example - -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. - -@node Installation, About pcl-cvs, Copying, Top -@comment node-name, next, previous, up -@chapter Installation -@cindex Installation - -This section describes the installation of pcl-cvs, the GNU Emacs CVS -front-end. You should install not only the elisp files themselves, but -also the on-line documentation so that your users will know how to use -it. You can create typeset documentation from the file -@file{pcl-cvs.texinfo} as well as an on-line info file. The following -steps are also described in the file @file{INSTALL} in the source -directory. - -@menu -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. -@end menu - -@node Pcl-cvs installation, On-line manual installation, Installation, Installation -@comment node-name, next, previous, up -@section Installation of the pcl-cvs program -@cindex Installation of elisp files - -@enumerate -@item -Edit the file @file{Makefile} to reflect the situation at your site. -The only things you have to change is the definition of @code{lispdir} -and @code{infodir}. The elisp files will be copied to @code{lispdir}, -and the info file to @code{infodir}. - -@item -Configure pcl-cvs.el - -There are a couple of paths that you have to check to make sure that -they match you system. They appear early in the file pcl-cvs.el. - -@strong{NOTE:} If your system is running emacs 18.57 or earlier you MUST -uncomment the line that says: - -@example -(setq delete-exited-processes nil) -@end example - -Setting @code{delete-exited-processes} to @code{nil} works around a bug -in emacs that causes it to dump core. The bug was fixed in emacs -18.58.@refill - -@item -Release 1.05 and later of pcl-cvs requires parts of the Elib library, -version 0.07 or later. Elib is available via anonymous ftp from -prep.ai.mit.edu in @file{pub/gnu/elib-0.07.tar.z}, and from a lot of -other sites that mirrors prep. Get Elib, and install it, before -proceeding. - -@item -Type @samp{make install} in the source directory. This will -byte-compile all @file{.el} files and copy both the @file{.el} and the -@file{.elc} into the directory you specified in step 1. - -If you don't want to install the @file{.el} files but only the -@file{.elc} files (the byte-compiled files), you can type `@samp{make -install_elc}' instead of `@samp{make install}'. - -If you only want to create the compiled elisp files, but don't want to -install them, you can type @samp{make elcfiles} instead. This is what -happens if you only type @samp{make} without parameters. - -@item -Edit the file @file{default.el} in your emacs lisp directory (usually -@file{/usr/gnu/emacs/lisp} or something similar) and enter the contents -of the file @file{pcl-cvs-startup.el} into it. It contains a couple of -@code{auto-load}s that facilitates the use of pcl-cvs. - -@end enumerate - -@node On-line manual installation, Typeset manual installation, Pcl-cvs installation, Installation -@comment node-name, next, previous, up -@section Installation of the on-line manual. -@cindex Manual installation (on-line) -@cindex Installation of on-line manual -@cindex Generating the on-line manual -@cindex On-line manual (how to generate) -@cindex Info-file (how to generate) - -@enumerate -@item -Create the info file @file{pcl-cvs} from @file{pcl-cvs.texinfo} by -typing @samp{make info}. If you don't have the program @samp{makeinfo} -you can get it by anonymous ftp from e.g. @samp{ftp.gnu.ai.mit.edu} as -@file{pub/gnu/texinfo-2.14.tar.Z} (there might be a newer version there -when you read this), or you could use the preformatted info file -@file{pcl-cvs.info} that is included in the distribution (type -@samp{cp pcl-cvs.info pcl-cvs}).@refill - -@item -Move the info file @file{pcl-cvs} to your standard info directory. -This might be called something like @file{/usr/gnu/emacs/info}.@refill - -@item -Edit the file @file{dir} in the info directory and enter one line to -contain a pointer to the info file @file{pcl-cvs}. The line can, for -instance, look like this:@refill - -@example -* Pcl-cvs: (pcl-cvs). An Emacs front-end to CVS. -@end example -@end enumerate - -@node Typeset manual installation, , On-line manual installation, Installation -@comment node-name, next, previous, up -@section How to make typeset documentation from pcl-cvs.texinfo -@cindex Manual installation (typeset) -@cindex Installation of typeset manual -@cindex Printing a manual -@cindex TeX - generating a typeset manual -@cindex Generating a typeset manual - -If you have @TeX{} installed at your site, you can make a typeset manual -from @file{pcl-cvs.texinfo}. - -@enumerate -@item -Run @TeX{} by typing `@samp{make pcl-cvs.dvi}'. You will not get the -indices unless you have the @code{texindex} program. - -@item -Convert the resulting device independent file @file{pcl-cvs.dvi} to a -form which your printer can output and print it. If you have a -postscript printer there is a program, @code{dvi2ps}, which does. There -is also a program which comes together with @TeX{}, @code{dvips}, which -you can use. - -@end enumerate - -@node About pcl-cvs, Getting started, Installation, Top -@comment node-name, next, previous, up -@chapter About pcl-cvs -@cindex About pcl-cvs - -Pcl-cvs is a front-end to CVS version 1.3. It integrates the most -frequently used CVS commands into emacs. - -@menu -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? -@end menu - -@node Contributors, Archives, About pcl-cvs, About pcl-cvs -@comment node-name, next, previous, up -@section Contributors to pcl-cvs -@cindex Contributors -@cindex Authors - -Contributions to the package are welcome. I have limited time to work -on this project, but I will gladly add any code that you contribute to -me to this package (@pxref{Bugs}). - -The following persons have made contributions to pcl-cvs. - -@itemize @bullet -@item -Brian Berliner wrote CVS, together with some other contributors. -Without his work on CVS this package would be useless@dots{} - -@item -Per Cederqvist wrote most of the otherwise unattributed functions in -pcl-cvs as well as all documentation. - -@item -Inge Wallin (@samp{inge@@lysator.liu.se}) wrote the skeleton to -@file{pcl-cvs.texinfo}, and gave useful comments on it. He also wrote -the files @file{elib-node.el} and @file{compile-all.el}. The file -@file{cookie.el} was inspired by Inge.@refill - -@item -Linus Tolke (@samp{linus@@lysator.liu.se}) contributed useful comments -on both the functionality and the documentation.@refill - -@item -Jamie Zawinski (@samp{jwz@@lucid.com}) contributed -@file{pcl-cvs-lucid.el}. - -@item -Leif Lonnblad contributed RCVS support. -@end itemize - -Apart from these, a lot of people have send me suggestions, ideas, -requests, bug reports and encouragement. Thanks a lot! Without your -there would be no new releases of pcl-cvs. - -@node Archives, , Contributors, About pcl-cvs -@comment node-name, next, previous, up -@section Where can I get pcl-cvs? -@cindex Sites -@cindex Archives -@cindex Ftp-sites -@cindex Getting pcl-cvs -@cindex Email archives - -The latest release of pcl-cvs can be fetched via anonymous ftp from -@code{ftp.lysator.liu.se}, (IP no. 130.236.254.1) in the directory -@code{pub/emacs}. If you don't live in Scandinavia you should probably -check with archie to see if there is a site closer to you that archives -pcl-cvs. - -New releases will be announced to appropriate newsgroups. If you send -your email address to me I will add you to my list of people to mail -when I make a new release. - -@node Getting started, Buffer contents, About pcl-cvs, Top -@comment node-name, next, previous, up -@chapter Getting started -@cindex Introduction -@cindex Example run - -This document assumes that you know what CVS is, and that you at least -knows the fundamental concepts of CVS. If that is not the case you -should read the man page for CVS. - -Pcl-cvs is only useful once you have checked out a module. So before -you invoke it you must have a copy of a module somewhere in the file -system. - -You invoke pcl-cvs by typing @kbd{M-x cvs-update RET}. If your emacs -responds with @samp{[No match]} your system administrator has not -installed pcl-cvs properly. Try @kbd{M-x load-library RET pcl-cvs RET}. -If that also fails - talk to your root. If it succeeds you might put -this line in your @file{.emacs} file so that you don't have to type the -@samp{load-library} command every time you wish to use pcl-cvs: - -@example -(autoload 'cvs-update "pcl-cvs" nil t) -@end example - -The function @code{cvs-update} will ask for a directory. The command -@samp{cvs update} will be run in that directory. (It should contain -files that have been checked out from a CVS archive.) The output from -@code{cvs} will be parsed and presented in a table in a buffer called -@samp{*cvs*}. It might look something like this: - -@example -PCL-CVS release 1.05. -@comment -release- - -In directory /users/ceder/FOO/test: - Updated bar - Updated file.txt - Modified ci namechange - Updated newer - -In directory /users/ceder/FOO/test/sub: - Modified ci ChangeLog ----------- End ----- -@end example - -In this example the three files (@file{bar}, @file{file.txt} and -@file{newer}) that are marked with @samp{Updated} have been copied from -the CVS repository to @file{/users/ceder/FOO/test/} since someone else -have checked in newer versions of them. Two files (@file{namechange} -and @file{sub/ChangeLog}) have been modified locally, and needs to be -checked in. - -You can move the cursor up and down in the buffer with @kbd{C-n} and -@kbd{C-p} or @kbd{n} and @kbd{p}. If you press @kbd{c} on one of the -@samp{Modified} files that file will be checked in to the CVS -repository. @xref{Committing changes}. You can press @kbd{x} to get rid -of the "uninteresting" files that have only been @samp{Updated} (and -don't require any further action from you).@refill - -You can also easily get a @samp{diff} between your modified file and the -base version that you started from, and you can get the output from -@samp{cvs log} and @samp{cvs status} on the listed files simply by -pressing a key (@pxref{Getting info about files}). - -@node Buffer contents, Commands, Getting started, Top -@comment node-name, next, previous, up -@chapter Buffer contents -@cindex Buffer contents - -The display contains four columns. They contain, from left to right: - -@itemize @bullet -@item -An asterisk when the file is @dfn{marked} (@pxref{Selected -files}).@refill -@item -The status of the file. See @xref{File status}, for more information.@refill -@item -A "need to be checked in"-marker (@samp{ci}). -@item -The file name. -@end itemize - -@menu -* File status:: The meaning of the second field. -* Selected files:: How selection works. -@end menu - -@node File status, Selected files, Buffer contents, Buffer contents -@comment node-name, next, previous, up -@section File status -@cindex File status -@cindex Updated (file status) -@cindex Modified (file status) -@cindex Merged (file status) -@cindex Conflict (file status) -@cindex Added (file status) -@cindex Removed (file status) -@cindex Unknown (file status) -@cindex Removed from repository (file status) -@cindex Removed from repository, changed by you (file status) -@cindex Removed by you, changed in repository (file status) -@cindex Move away @var{file} - it is in the way (file status) -@cindex This repository is missing!@dots{} (file status) - -The @samp{file status} field can have the following values: - -@table @samp -@item Updated -The file was brought up to date with respect to the repository. This is -done for any file that exists in the repository but not in your source, -and for files that you haven't changed but are not the most recent -versions available in the repository.@refill - -@item Modified -The file is modified in your working directory, and there was no -modification to the same file in the repository.@refill - -@item Merged -The file is modified in your working directory, and there were -modifications in the repository as well as in your copy, but they were -merged successfully, without conflict, in your working directory.@refill - -@item Conflict -A conflict was detected while trying to merge your changes to @var{file} -with changes from the source repository. @var{file} (the copy in your -working directory) is now the output of the @samp{rcsmerge} command on -the two versions; an unmodified copy of your file is also in your -working directory, with the name @file{.#@var{file}.@var{version}}, -where @var{version} is the RCS revision that your modified file started -from. @xref{Viewing differences}, for more details.@refill - -@item Added -The file has been added by you, but it still needs to be checked in to -the repository.@refill - -@item Removed -The file has been removed by you, but it needs to be checked in to the -repository. You can resurrect it by typing @kbd{a} (@pxref{Adding and -removing files}).@refill - -@item Unknown -A file that was detected in your directory, but that neither appears in -the repository, nor is present on the list of files that CVS should -ignore.@refill - -@end table - -There are also a few special cases, that rarely occur, which have longer -strings in the fields: - -@table @samp -@item Removed from repository -The file has been removed from your directory since someone has removed -it from the repository. (It is still present in the Attic directory, so -no permanent loss has occurred). This, unlike the other entries in this -table, is not an error condition.@refill - -@item Removed from repository, changed by you -You have modified a file that someone have removed from the repository. -You can correct this situation by removing the file manually (see -@pxref{Adding and removing files}).@refill - -@item Removed by you, changed in repository -You have removed a file, and before you committed the removal someone -committed a change to that file. You could use @kbd{a} to resurrect the -file (see @pxref{Adding and removing files}).@refill - -@item Move away @var{file} - it is in the way -For some reason CVS does not like the file @var{file}. Rename or remove -it.@refill - -@item This repository is missing! Remove this dir manually. -It is impossible to remove a directory in the CVS repository in a clean -way. Someone have tried to remove one, and CVS gets confused. Remove -your copy of the directory.@refill -@end table - -@node Selected files, , File status, Buffer contents -@comment node-name, next, previous, up -@section Selected files -@cindex Selected files -@cindex Marked files -@cindex File selection -@cindex Active files - -Many of the commands works on the current set of @dfn{selected} files. - -@itemize @bullet -@item -If there are any files that are marked they constitute the set of -selected files.@refill -@item -Otherwise, if the cursor points to a file, that file is the selected -file.@refill -@item -Otherwise, if the cursor points to a directory, all the files in that -directory that appears in the buffer are the selected files. -@end itemize - -This scheme might seem a little complicated, but once one get used to -it, it is quite powerful. - -@xref{Marking files} tells how you mark and unmark files. - -@node Commands, Customization, Buffer contents, Top -@comment node-name, next, previous, up -@chapter Commands - -@iftex -This chapter describes all the commands that you can use in pcl-cvs. -@end iftex -@ifinfo -The nodes in this menu contains explanations about all the commands that -you can use in pcl-cvs. They are grouped together by type. -@end ifinfo - -@menu -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to @samp{diff} different versions. -* Emerge:: -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands -@end menu - -@node Updating the directory, Movement commands, Commands, Commands -@comment node-name, next, previous, up -@section Updating the directory -@findex cvs-update -@findex cvs-mode-update-no-prompt -@findex cvs-delete-lock -@cindex Getting the *cvs* buffer -@kindex g - Rerun @samp{cvs update} - - -@table @kbd - -@item M-x cvs-update -Run a @samp{cvs update} command. You will be asked for the directory in -which the @samp{cvs update} will be run. The output will be parsed by -pcl-cvs, and the result printed in the @samp{*cvs*} buffer (see -@pxref{Buffer contents} for a description of the contents).@refill - -By default, @samp{cvs-update} will descend recursively into -subdirectories. You can avoid that behavior by giving a prefix -argument to it (e.g., by typing @kbd{C-u M-x cvs-update RET}).@refill - -All other commands in pcl-cvs requires that you have a @samp{*cvs*} -buffer. This is the command that you use to get one.@refill - -CVS uses lock files in the repository to ensure the integrity of the -data files in the repository. They might be left behind i.e. if a -workstation crashes in the middle of a CVS operation. CVS outputs a -message when it is waiting for a lock file to go away. Pcl-cvs will -show the same message in the *cvs* buffer, together with instructions -for deleting the lock files. You should normally not have to delete -them manually --- just wait a little while and the problem should fix -itself. But if the lock files doesn't disappear you can delete them -with @kbd{M-x cvs-delete-lock RET}.@refill - -@item g -This will run @samp{cvs update} again. It will always use the same -buffer that was used with the previous @samp{cvs update}. Give a prefix -argument to avoid descending into subdirectories. This runs the command -@samp{cvs-mode-update-no-prompt}.@refill -@end table -@node Movement commands, Marking files, Updating the directory, Commands -@comment node-name, next, previous, up -@section Movement Commands -@cindex Movement Commands -@findex cookie-next-cookie -@findex cookie-previous-cookie -@kindex SPC - Move down one file -@kindex C-n - Move down one file -@kindex n - Move down one file -@kindex C-p - Move up one file -@kindex p - Move up on file - -You can use most normal Emacs commands to move forward and backward in -the buffer. Some keys are rebound to functions that take advantage of -the fact that the buffer is a pcl-cvs buffer: - - -@table @kbd -@item SPC -@itemx C-n -@itemx n -These keys move the cursor one file forward, towards the end of the -buffer (@code{cookie-next-cookie}). - -@item C-p -@itemx p -These keys move one file backward, towards the beginning of the buffer -(@code{cookie-previous-cookie}). -@end table - -@node Marking files, Committing changes, Movement commands, Commands -@comment node-name, next, previous, up -@section Marking files -@cindex Selecting files (commands to mark files) -@cindex Marking files -@kindex m - marking a file -@kindex M - marking all files -@kindex u - unmark a file -@kindex ESC DEL - unmark all files -@kindex DEL - unmark previous file -@findex cvs-mode-mark -@findex cvs-mode-unmark -@findex cvs-mode-mark-all-files -@findex cvs-mode-unmark-all-files -@findex cvs-mode-unmark-up - -Pcl-cvs works on a set of @dfn{selected files} (@pxref{Selected files}). -You can mark and unmark files with these commands: - -@table @kbd -@item m -This marks the file that the cursor is positioned on. If the cursor is -positioned on a directory all files in that directory will be marked. -(@code{cvs-mode-mark}). - -@item u -Unmark the file that the cursor is positioned on. If the cursor is on a -directory, all files in that directory will be unmarked. -(@code{cvs-mode-unmark}).@refill - -@item M -Mark @emph{all} files in the buffer (@code{cvs-mode-mark-all-files}). - -@item @key{ESC} @key{DEL} -Unmark @emph{all} files (@code{cvs-mode-unmark-all-files}). - -@item @key{DEL} -Unmark the file on the previous line, and move point to that line -(@code{cvs-mode-unmark-up}). -@end table - -@node Committing changes, Editing files, Marking files, Commands -@comment node-name, next, previous, up -@section Committing changes -@cindex Committing changes -@cindex Ci -@findex cvs-mode-commit -@kindex c - commit files -@vindex cvs-erase-input-buffer (variable) -@vindex cvs-auto-revert-after-commit (variable) -@cindex Commit buffer -@cindex Edit buffer -@cindex Erasing commit message -@cindex Reverting buffers after commit - -@table @kbd -@item c -All files that have a "need to be checked in"-marker (@pxref{Buffer -contents}) can be checked in with the @kbd{c} command. It checks in all -selected files (@pxref{Selected files}) (except those who lack the -"ci"-marker - they are ignored). Pressing @kbd{c} causes -@code{cvs-mode-commit} to be run.@refill - -When you press @kbd{c} you will get a buffer called -@samp{*cvs-commit-message*}. Enter the log message for the file(s) in -it. When you are ready you should press @kbd{C-c C-c} to actually -commit the files (using @code{cvs-edit-done}). - -Normally the @samp{*cvs-commit-message*} buffer will retain the log -message from the previous commit, but if the variable -@code{cvs-erase-input-buffer} is set to a non-@code{nil} value the -buffer will be erased. Point and mark will always be located around the -entire buffer so that you can easily erase it with @kbd{C-w} -(@samp{kill-region}).@refill - -If you are editing the files in your emacs an automatic -@samp{revert-buffer} will be performed. (If the file contains -@samp{$@asis{Id}$} keywords @samp{cvs commit} will write a new file with -the new values substituted. The auto-revert makes sure that you get -them into your buffer). The revert will not occur if you have modified -your buffer, or if @samp{cvs-auto-revert-after-commit} is set to -@samp{nil}.@refill -@end table - -@node Editing files, Getting info about files, Committing changes, Commands -@comment node-name, next, previous, up -@section Editing files - -@cindex Editing files -@cindex Finding files -@cindex Loading files -@cindex Dired -@cindex Invoking dired -@findex cvs-mode-find-file -@findex cvs-mode-find-file-other-window -@findex cvs-mode-add-change-log-entry-other-window -@kindex f - find file or directory -@kindex o - find file in other window -@kindex A - add ChangeLog entry - -There are currently three commands that can be used to find a file (that -is, load it into a buffer and start editing it there). These commands -work on the line that the cursor is situated at. They ignore any marked -files. - -@table @kbd -@item f -Find the file that the cursor points to. Run @samp{dired} -@ifinfo -(@pxref{Dired,,,Emacs}) -@end ifinfo -if the cursor points to a directory (@code{cvs-mode-find-file}).@refill - -@item o -Like @kbd{f}, but use another window -(@code{cvs-mode-find-file-other-window}).@refill - -@item A -Invoke @samp{add-change-log-entry-other-window} to edit a -@samp{ChangeLog} file. The @samp{ChangeLog} will be found in the -directory of the file the cursor points to. -(@code{cvs-mode-add-change-log-entry-other-window}).@refill -@end table - -@node Getting info about files, Adding and removing files, Editing files, Commands -@comment node-name, next, previous, up -@section Getting info about files -@cindex Status (cvs command) -@cindex Log (RCS/cvs command) -@cindex Getting status -@kindex l - run @samp{cvs log} -@kindex s - run @samp{cvs status} -@findex cvs-mode-log -@findex cvs-mode-status - -Both of the following commands can be customized. -@xref{Customization}.@refill - -@table @kbd -@item l -Run @samp{cvs log} on all selected files, and show the result in a -temporary buffer (@code{cvs-mode-log}). - -@item s -Run @samp{cvs status} on all selected files, and show the result in a -temporary buffer (@code{cvs-mode-status}). -@end table - -@node Adding and removing files, Undoing changes, Getting info about files, Commands -@comment node-name, next, previous, up -@section Adding and removing files -@cindex Adding files -@cindex Removing files -@cindex Resurrecting files -@cindex Deleting files -@cindex Putting files under CVS control -@kindex a - add a file -@kindex r - remove a file -@findex cvs-mode-add -@findex cvs-mode-remove-file - -The following commands are available to make it easy to add and remove -files from the CVS repository. - -@table @kbd -@item a -Add all selected files. This command can be used on @samp{Unknown} -files (see @pxref{File status}). The status of the file will change to -@samp{Added}, and you will have to use @kbd{c} (@samp{cvs-mode-commit}, see -@pxref{Committing changes}) to really add the file to the -repository.@refill - -This command can also be used on @samp{Removed} files (before you commit -them) to resurrect them. - -Selected files that are neither @samp{Unknown} nor @samp{Removed} will -be ignored by this command. - -The command that is run is @code{cvs-mode-add}. - -@item r -This command removes the selected files (after prompting for -confirmation). The files are @samp{rm}ed from your directory and -(unless the status was @samp{Unknown}; @pxref{File status}) they will -also be @samp{cvs remove}d. If the files were @samp{Unknown} they will -disappear from the buffer. Otherwise their status will change to -@samp{Removed}, and you must use @kbd{c} (@samp{cvs-mode-commit}, -@pxref{Committing changes}) to commit the removal.@refill - -The command that is run is @code{cvs-mode-remove-file}. -@end table - -@node Undoing changes, Removing handled entries, Adding and removing files, Commands -@comment node-name, next, previous, up -@section Undoing changes -@cindex Undo changes -@cindex Flush changes -@kindex U - undo changes -@findex cvs-mode-undo-local-changes - -@table @kbd -@item U -If you have modified a file, and for some reason decide that you don't -want to keep the changes, you can undo them with this command. It works -by removing your working copy of the file and then getting the latest -version from the repository (@code{cvs-mode-undo-local-changes}. -@end table - -@node Removing handled entries, Ignoring files, Undoing changes, Commands -@comment node-name, next, previous, up -@section Removing handled entries -@cindex Expunging uninteresting entries -@cindex Uninteresting entries, getting rid of them -@cindex Getting rid of uninteresting lines -@cindex Removing uninteresting (processed) lines -@cindex Handled lines, removing them -@kindex x - remove processed entries -@kindex C-k - remove selected entries -@findex cvs-mode-remove-handled -@findex cvs-mode-acknowledge -@findex cvs-mode-ignore - -@table @kbd -@item x -This command allows you to remove all entries that you have processed. -More specifically, the lines for @samp{Updated} files (@pxref{File -status} and files that have been checked in (@pxref{Committing changes}) -are removed from the buffer. If a directory becomes empty the heading -for that directory is also removed. This makes it easier to get an -overview of what needs to be done. - -The command is called @code{cvs-mode-remove-handled}. If -@samp{cvs-auto-remove-handled} is set to non-@code{nil} this will -automatically be performed after every commit.@refill - -@item C-k -This command can be used for lines that @samp{cvs-mode-remove-handled} would -not delete, but that you want to delete (@code{cvs-mode-acknowledge}). -@end table - -@node Ignoring files, Viewing differences, Removing handled entries, Commands -@comment node-name, next, previous, up -@section Ignoring files - -@table @kbd -@item i -Arrange so that CVS will ignore the selected files. The file names are -added to the @file{.cvsignore} file in the corresponding directory. If -the @file{.cvsignore} doesn't exist it will be created. - -The @file{.cvsignore} file should normally be added to the repository, -but you could ignore it also if you like it better that way. - -This runs @code{cvs-mode-ignore}. -@end table - -@node Viewing differences, Emerge, Ignoring files, Commands -@comment node-name, next, previous, up -@section Viewing differences -@cindex Diff -@cindex Conflicts, how to resolve them -@cindex Viewing differences -@kindex d - run @samp{cvs diff} -@kindex b - diff backup file -@findex cvs-mode-diff-cvs -@findex cvs-mode-diff-backup -@vindex cvs-diff-ignore-marks (variable) - -@table @kbd -@item d -Display a @samp{cvs diff} between the selected files and the RCS version -that they are based on. @xref{Customization} describes how you can send -flags to @samp{cvs diff}. If @var{cvs-diff-ignore-marks} is set to a -non-@code{nil} value or if a prefix argument is given (but not both) any -marked files will not be considered to be selected. -(@code{cvs-mode-diff-cvs}).@refill - -@item b -If CVS finds a conflict while merging two versions of a file (during a -@samp{cvs update}, @pxref{Updating the directory}) it will save the -original file in a file called @file{.#@var{FILE}.@var{VERSION}} where -@var{FILE} is the name of the file, and @var{VERSION} is the RCS version -number that your file was based on.@refill - -With the @kbd{b} command you can run a @samp{diff} on the files -@file{.#@var{FILE}.@var{VERSION}} and @file{@var{FILE}}. You can get a -context- or Unidiff by setting @samp{cvs-diff-flags} - -@pxref{Customization}. This command only works on files that have -status @samp{Conflict} or @samp{Merged}.@refill - -If @var{cvs-diff-ignore-marks} is set to a non-@code{nil} value or if a -prefix argument is given (but not both) any marked files will not be -considered to be selected. (@code{cvs-mode-diff-backup}).@refill -@end table - -@node Emerge, Reverting your buffers, Viewing differences, Commands -@comment node-name, next, previous, up -@section Running emerge -@cindex Emerge -@cindex Invoking emerge -@cindex Conflicts, resolving -@cindex Resolving conflicts -@kindex e - invoke @samp{emerge} -@findex cvs-mode-emerge - -@table @kbd -@item e -Invoke @samp{emerge} on one file. This command works slightly different -depending on the file status. - -@table @asis -@item @samp{Modified} -Run @samp{emerge-files} with your working file as file A, and the latest -revision in the repository as file B. - -@item @samp{Merged} -@itemx @samp{Conflict} -Run @samp{emerge-files-with-ancestor} with your working file (as it was -prior to your invocation of @samp{cvs-update}) as file A, the latest -revision in the repository as file B, and the revision that you based -your local modifications on as ancestor. -@end table - -@strong{Note:} CVS has already performed a merge. The resulting file is -not used in any way if you use this command. If you use the @kbd{q} -command inside @samp{emerge} (to successfully terminate the merge) the -file that CVS created will be overwritten. -@end table - -@node Reverting your buffers, Miscellaneous commands, Emerge, Commands -@comment node-name, next, previous, up -@section Reverting your buffers -@findex cvs-mode-revert-updated-buffers -@kindex R - revert buffers -@cindex Syncing buffers -@cindex Reverting buffers - -@table @kbd -@item R -If you are editing (or just viewing) a file in a buffer, and that file -is changed by CVS during a @samp{cvs-update}, all you have to do is type -@kbd{R} in the *cvs* buffer to read in the new versions of the -files.@refill - -All files that are @samp{Updated}, @samp{Merged} or in @samp{Conflict} -are reverted from the disk. Any other files are ignored. Only files -that you were already editing are read.@refill - -An error is signalled if you have modified the buffer since it was last -changed. (@code{cvs-mode-revert-updated-buffers}).@refill -@end table - -@node Miscellaneous commands, , Reverting your buffers, Commands -@comment node-name, next, previous, up -@section Miscellaneous commands -@findex cvs-byte-compile-files -@cindex Recompiling elisp files -@cindex Byte compilation -@cindex Getting rid of lock files -@cindex Lock files -@kindex q - bury the *cvs* buffer -@findex bury-buffer - -@table @kbd -@item M-x cvs-byte-compile-files -Byte compile all selected files that end in .el. - -@item M-x cvs-delete-lock -This command can be used in any buffer, and deletes the lock files that -the *cvs* buffer informs you about. You should normally never have to -use this command since CVS tries very carefully to always remove the -lock files itself. - -You can only use this command when a message in the *cvs* buffer tells -you so. You should wait a while before using this command in case -someone else is running a cvs command. - -@item q -Bury the *cvs* buffer. (@code{bury-buffer}). - -@end table - -@node Customization, Future enhancements, Commands, Top -@comment node-name, next, previous, up -@chapter Customization -@vindex cvs-erase-input-buffer (variable) -@vindex cvs-inhibit-copyright-message (variable) -@vindex cvs-diff-flags (variable) -@vindex cvs-diff-ignore-marks (variable) -@vindex cvs-log-flags (variable) -@vindex cvs-status-flags (variable) -@vindex cvs-auto-remove-handled (variable) -@vindex cvs-update-prog-output-skip-regexp (variable) -@vindex cvs-cvsroot (variable) -@vindex TMPDIR (environment variable) -@vindex cvs-auto-revert-after-commit (variable) -@vindex cvs-commit-buffer-require-final-newline (variable) -@vindex cvs-sort-ignore-file (variable) -@cindex Inhibiting the Copyright message. -@cindex Copyright message, getting rid of it -@cindex Getting rid of the Copyright message. -@cindex Customization -@cindex Variables, list of all -@cindex Erasing the input buffer -@cindex Context diff, how to get -@cindex Unidiff, how to get -@cindex Automatically remove handled files -@cindex -u option in modules file -@cindex Modules file (-u option) -@cindex Update program (-u option in modules file) -@cindex Reverting buffers after commit -@cindex Require final newline -@cindex Automatically inserting newline -@cindex Commit message, inserting newline -@cindex Sorting the .cvsignore file -@cindex .cvsignore file, sorting -@cindex Automatically sorting .cvsignore - -If you have an idea about any customization that would be handy but -isn't present in this list, please tell me! @xref{Bugs} for info on how -to reach me.@refill - -@table @samp -@item cvs-erase-input-buffer -If set to anything else than @code{nil} the edit buffer will be erased -before you write the log message (@pxref{Committing changes}). - -@item cvs-inhibit-copyright-message -The copyright message that is displayed on startup can be annoying after -a while. Set this variable to @samp{t} if you want to get rid of it. -(But don't set this to @samp{t} in the system defaults file - new users -should see this message at least once). - -@item cvs-diff-flags -A list of strings to pass as arguments to the @samp{cvs diff} and -@samp{diff} programs. This is used by @samp{cvs-mode-diff-cvs} and -@samp{cvs-mode-diff-backup} (key @kbd{b}, @pxref{Viewing differences}). If -you prefer the Unidiff format you could add this line to your -@file{.emacs} file:@refill - -@example -(setq cvs-diff-flags '("-u")) -@end example - -@item cvs-diff-ignore-marks -If this variable is non-@code{nil} or if a prefix argument is given (but -not both) to @samp{cvs-mode-diff-cvs} or @samp{cvs-mode-diff-backup} -marked files are not considered selected. - -@item cvs-log-flags -List of strings to send to @samp{cvs log}. Used by @samp{cvs-mode-log} -(key @kbd{l}, @pxref{Getting info about files}). - -@item cvs-status-flags -List of strings to send to @samp{cvs status}. Used by @samp{cvs-mode-status} -(key @kbd{s}, @pxref{Getting info about files}). - -@item cvs-auto-remove-handled -If this variable is set to any non-@code{nil} value -@samp{cvs-mode-remove-handled} will be called every time you check in -files, after the check-in is ready. @xref{Removing handled -entries}.@refill - -@item cvs-auto-revert-after-commit -If this variable is set to any non-@samp{nil} value any buffers you have -that visit a file that is committed will be automatically reverted. -This variable is default @samp{t}. @xref{Committing changes}.@refill - -@item cvs-update-prog-output-skip-regexp -The @samp{-u} flag in the @file{modules} file can be used to run a command -whenever a @samp{cvs update} is performed (see cvs(5)). This regexp -is used to search for the last line in that output. It is normally set -to @samp{"$"}. That setting is only correct if the command outputs -nothing. Note that pcl-cvs will get very confused if the command -outputs @emph{anything} to @samp{stderr}. - -@item cvs-cvsroot -This variable can be set to override @samp{CVSROOT}. It should be a -string. If it is set then everytime a cvs command is run it will be -called as @samp{cvs -d @var{cvs-cvsroot}@dots{}} This can be useful if -your site has several repositories. - -@item TMPDIR -Pcl-cvs uses this @emph{environment variable} to decide where to put the -temporary files it needs. It defaults to @file{/tmp} if it is not set. - -@item cvs-commit-buffer-require-final-newline -When you enter a log message in the @samp{*cvs-commit-message*} buffer -pcl-cvs will normally automatically insert a trailing newline, unless -there already is one. This behavior can be controlled via -@samp{cvs-commit-buffer-require-final-newline}. If it is @samp{t} (the -default behavior), a newline will always be appended. If it is -@samp{nil}, newlines will never be appended. Any other value causes -pcl-cvs to ask the user whenever there is no trailing newline in the -commit message buffer. - -@item cvs-sort-ignore-file -If this variable is set to any non-@samp{nil} value the -@file{.cvsignore} will always be sorted whenever you use -@samp{cvs-mode-ignore} to add a file to it. This option is on by -default. - -@end table -@node Future enhancements, Bugs, Customization, Top -@comment node-name, next, previous, up -@chapter Future enhancements -@cindex Enhancements - -Pcl-cvs is still under development and needs a number of enhancements to -be called complete. Below is my current wish-list for future releases -of pcl-cvs. Please, let me know which of these features you want most. -They are listed below in approximately the order that I currently think -I will implement them in. - -@itemize @bullet -@item -Rewritten parser code. There are many situations where pcl-cvs will -fail to recognize the output from CVS. The situation could be greatly -increased. - -@item -@samp{cvs-status}. This will run @samp{cvs status} in a directory and -produce a buffer that looks pretty much like the current *cvs* buffer. -That buffer will include information for all version-controlled files. -(There will be a simple keystroke to remove all "uninteresting" files, -that is, files that are "Up-to-date"). In this new buffer you will be -able to update a file, commit a file, et c. The big win with this is -that you will be able to watch the differences between your current -working file and the head revision in the repository before you update -the file, and you can then choose to update it or let it wait for a -while longer. - -@item -Log mode. When this mode is finished you will be able to move around -(using @kbd{n} and @kbd{p}) between the revisions of a file, mark two of -them, and run a diff between them. You will be able to hide branches -(similar to the way you can hide sub-paragraphs in outline-mode) and do -merges between revisions. Other ideas about this are welcome. - -@item -The current model for marks in the *cvs* buffer seems to be confusing. -I am considering to use the VM model instead, where marks are normally -inactive. To activate the mark, you issue a command like -@samp{cvs-mode-next-command-uses-marks}. I might implement a flag so -that you can use either version. Feedback on this before I start coding -it is very welcome. - -@item -It should be possible to run commands such as @samp{cvs log}, @samp{cvs -status} and @samp{cvs commit} directly from a buffer containing a file, -instead of having to @samp{cvs-update}. If the directory contains many -files the @samp{cvs-update} can take quite some time, especially on a -slow machine. I planed to put these kind of commands on the prefix -@kbd{C-c C-v}, but that turned out to be used by for instance c++-mode. -If you have any suggestions for a better prefix key, please let me know. - -@item -Increased robustness. For instance, you can not currently press -@kbd{C-g} when you are entering the description of a file that you are -adding without confusing pcl-cvs. - -@item -Support for multiple active *cvs* buffers. - -@item -Dired support. I have an experimental @file{dired-cvs.el} that works -together with CVS 1.2. Unfortunately I wrote it on top of a -non-standard @file{dired.el}, so it must be rewritten.@refill - -@item -An ability to send user-supplied options to all the cvs commands. - -@item -Pcl-cvs is not at all clever about what it should do when @samp{cvs -update} runs a program (due to the @samp{-u} option in the -@file{modules} file --- see @samp{cvs(5)}). The current release uses a -regexp to search for the end. At the very least that regexp should be -configured for different modules. Tell me if you have any idea about -what is the right thing to do. In a perfect world the program should -also be allowed to print to @samp{stderr} without causing pcl-cvs to -crash. -@end itemize - - -If you miss something in this wish-list, let me know! I don't promise -that I will write it, but I will at least try to coordinate the efforts -of making a good Emacs front end to CVS. See @xref{Bugs} for -information about how to reach me.@refill - -So far, I have written most of pcl-cvs in my all-to-rare spare time. If -you want pcl-cvs to be developed faster you can write a contract with -Signum Support to do the extension. You can reach Signum Support by -email to @samp{info@@signum.se} or via mail to Signum Support AB, Box -2044, S-580 02 Linkoping, Sweden. Phone: +46 (0) 13 - 21 46 00. Fax: +46 -(0) 13 - 21 47 00. - -@node Bugs, Function and Variable Index, Future enhancements, Top -@comment node-name, next, previous, up -@chapter Bugs (known and unknown) -@cindex Reporting bugs and ideas -@cindex Bugs, how to report them -@cindex Author, how to reach -@cindex Email to the author -@cindex Known bugs -@cindex Bugs, known -@cindex FAQ -@cindex Problems, list of common - -If you find a bug or misfeature, don't hesitate to tell me! Send email -to @samp{ceder@@lysator.liu.se}. - -If you have ideas for improvements, or if you have written some -extensions to this package, I would like to hear from you. I hope that -you find this package useful! - -Below is a partial list of currently known problems with pcl-cvs version -1.05. - -@table @asis -@item Commit causes Emacs to hang -Emacs waits for the @samp{cvs commit} command to finish before you can -do anything. If you start a background job from the loginfo file you -must take care that it closes @samp{stdout} and @samp{stderr} if you do -not want to wait for it. (You do that with @samp{background-command &>- -2&>- &} if you are starting @samp{background-command} from a -@samp{/bin/sh} shell script). - -Your emacs will also hang if there was a lock file in the repository. -In this case you can type @kbd{C-g} to get control over your emacs -again. - -@item Name clash in Emacs 19 -This is really a bug in Elib or the Emacs 19 distribution. Both Elib and -Emacs 19.6 through at least 19.10 contains a file named -@file{cookie.el}. One of the files will have to be renamed, and we are -currently negotiating about which of the files to rename. - -@item Commands while cvs-update is running -It is possible to type commands in the *cvs* buffer while the update is -running, but error messages is all that you will get. The error -messages should be better. - -@item Unexpected output from CVS -Unexpected output from CVS confuses pcl-cvs. It will currently create a -bug report that you can mail to me. It should do something more -civilized. -@end table - -@node Function and Variable Index, Concept Index, Bugs, Top -@comment node-name, next, previous, up -@unnumbered Function and Variable Index - -@printindex fn - -@node Concept Index, Key Index, Function and Variable Index, Top -@comment node-name, next, previous, up -@unnumbered Concept Index - -@printindex cp - -@node Key Index, , Concept Index, Top -@comment node-name, next, previous, up -@unnumbered Key Index - -@printindex ky - -@summarycontents -@contents -@bye diff --git a/gnu/usr.bin/cvs/contrib/rcs-to-cvs b/gnu/usr.bin/cvs/contrib/rcs-to-cvs deleted file mode 100644 index 5863ed87414c3..0000000000000 --- a/gnu/usr.bin/cvs/contrib/rcs-to-cvs +++ /dev/null @@ -1,184 +0,0 @@ -#!/bin/sh -# -# $Id: rcs-to-cvs,v 1.4 1994/09/21 07:23:16 berliner Exp $ -# Based on the CVS 1.0 checkin csh script. -# Contributed by Per Cederqvist <ceder@signum.se>. -# Rewritten in sh by David MacKenzie <djm@cygnus.com>. -# -# Copyright (c) 1989, Brian Berliner -# -# You may distribute under the terms of the GNU General Public License. -# -############################################################################# -# -# Check in sources that previously were under RCS or no source control system. -# -# The repository is the directory where the sources should be deposited. -# -# Traverses the current directory, ensuring that an -# identical directory structure exists in the repository directory. It -# then checks the files in in the following manner: -# -# 1) If the file doesn't yet exist, check it in as revision 1.1 -# -# The script also is somewhat verbose in letting the user know what is -# going on. It prints a diagnostic when it creates a new file, or updates -# a file that has been modified on the trunk. -# -# Bugs: doesn't put the files in branch 1.1.1 -# doesn't put in release and vendor tags -# -############################################################################# - -usage="Usage: rcs-to-cvs [-v] [-m message] [-f message_file] repository" -vbose=0 -message="" -message_file=/usr/tmp/checkin.$$ -got_one=0 - -if [ $# -lt 1 ]; then - echo "$usage" >&2 - exit 1 -fi - -while [ $# -ne 0 ]; do - case "$1" in - -v) - vbose=1 - ;; - -m) - shift - echo $1 > $message_file - got_one=1 - ;; - -f) - shift - message_file=$1 - got_one=2 - ;; - *) - break - esac - shift -done - -if [ $# -lt 1 ]; then - echo "$usage" >&2 - exit 1 -fi - -repository=$1 -shift - -if [ -z "$CVSROOT" ]; then - echo "Please the environmental variable CVSROOT to the root" >&2 - echo " of the tree you wish to update" >&2 - exit 1 -fi - -if [ $got_one -eq 0 ]; then - echo "Please Edit this file to contain the RCS log information" >$message_file - echo "to be associated with this directory (please remove these lines)">>$message_file - ${EDITOR-/usr/ucb/vi} $message_file - got_one=1 -fi - -umask 22 - -update_dir=${CVSROOT}/${repository} -[ ! -d ${update_dir} ] && mkdir $update_dir - -if [ -d SCCS ]; then - echo SCCS files detected! >&2 - exit 1 -fi -if [ -d RCS ]; then - co RCS/* -fi - -for name in * .[a-zA-Z0-9]* -do - case "$name" in - RCS | \* | .\[a-zA-Z0-9\]\* ) continue ;; - esac - echo $name - if [ $vbose -ne 0 ]; then - echo "Updating ${repository}/${name}" - fi - if [ -d "$name" ]; then - if [ ! -d "${update_dir}/${name}" ]; then - echo "WARNING: Creating new directory ${repository}/${name}" - mkdir "${update_dir}/${name}" - if [ $? -ne 0 ]; then - echo "ERROR: mkdir failed - aborting" >&2 - exit 1 - fi - fi - cd "$name" - if [ $? -ne 0 ]; then - echo "ERROR: Couldn\'t cd to $name - aborting" >&2 - exit 1 - fi - if [ $vbose -ne 0 ]; then - $0 -v -f $message_file "${repository}/${name}" - else - $0 -f $message_file "${repository}/${name}" - fi - if [ $? -ne 0 ]; then - exit 1 - fi - cd .. - else # if not directory - if [ ! -f "$name" ]; then - echo "WARNING: $name is neither a regular file" - echo " nor a directory - ignored" - continue - fi - file="${update_dir}/${name},v" - comment="" - if grep -s '\$Log.*\$' "${name}"; then # If $Log keyword - myext=`echo $name | sed 's,.*\.,,'` - [ "$myext" = "$name" ] && myext= - case "$myext" in - c | csh | e | f | h | l | mac | me | mm | ms | p | r | red | s | sh | sl | cl | ml | el | tex | y | ye | yr | "" ) - ;; - - * ) - echo "For file ${file}:" - grep '\$Log.*\$' "${name}" - echo -n "Please insert a comment leader for file ${name} > " - read comment - ;; - esac - fi - if [ ! -f "$file" ]; then # If not exists in repository - if [ ! -f "${update_dir}/Attic/${name},v" ]; then - echo "WARNING: Creating new file ${repository}/${name}" - if [ -f RCS/"${name}",v ]; then - echo "MSG: Copying old rcs file." - cp RCS/"${name}",v "$file" - else - if [ -n "${comment}" ]; then - rcs -q -i -c"${comment}" -t${message_file} -m'.' "$file" - fi - ci -q -u1.1 -t${message_file} -m'.' "$file" - if [ $? -ne 0 ]; then - echo "ERROR: Initial check-in of $file failed - aborting" >&2 - exit 1 - fi - fi - else - file="${update_dir}/Attic/${name},v" - echo "WARNING: IGNORED: ${repository}/Attic/${name}" - continue - fi - else # File existed - echo "ERROR: File exists in repository: Ignored: $file" - continue - fi - fi -done - -[ $got_one -eq 1 ] && rm -f $message_file - -exit 0 diff --git a/gnu/usr.bin/cvs/contrib/rcs-to-cvs.sh b/gnu/usr.bin/cvs/contrib/rcs-to-cvs.sh deleted file mode 100644 index 3af83d708ca4a..0000000000000 --- a/gnu/usr.bin/cvs/contrib/rcs-to-cvs.sh +++ /dev/null @@ -1,185 +0,0 @@ -#! /bin/sh -# -# $Id: rcs-to-cvs.sh,v 1.2 1995/07/15 03:40:34 jimb Exp $ -# Based on the CVS 1.0 checkin csh script. -# Contributed by Per Cederqvist <ceder@signum.se>. -# Rewritten in sh by David MacKenzie <djm@cygnus.com>. -# -# Copyright (c) 1989, Brian Berliner -# -# You may distribute under the terms of the GNU General Public License. -# -############################################################################# -# -# Check in sources that previously were under RCS or no source control system. -# -# The repository is the directory where the sources should be deposited. -# -# Traverses the current directory, ensuring that an -# identical directory structure exists in the repository directory. It -# then checks the files in in the following manner: -# -# 1) If the file doesn't yet exist, check it in as revision 1.1 -# -# The script also is somewhat verbose in letting the user know what is -# going on. It prints a diagnostic when it creates a new file, or updates -# a file that has been modified on the trunk. -# -# Bugs: doesn't put the files in branch 1.1.1 -# doesn't put in release and vendor tags -# -############################################################################# - -usage="Usage: rcs-to-cvs [-v] [-m message] [-f message_file] repository" -vbose=0 -message="" -message_file=/usr/tmp/checkin.$$ -got_one=0 - -if [ $# -lt 1 ]; then - echo "$usage" >&2 - exit 1 -fi - -while [ $# -ne 0 ]; do - case "$1" in - -v) - vbose=1 - ;; - -m) - shift - echo $1 > $message_file - got_one=1 - ;; - -f) - shift - message_file=$1 - got_one=2 - ;; - *) - break - esac - shift -done - -if [ $# -lt 1 ]; then - echo "$usage" >&2 - exit 1 -fi - -repository=$1 -shift - -if [ -z "$CVSROOT" ]; then - echo "Please the environmental variable CVSROOT to the root" >&2 - echo " of the tree you wish to update" >&2 - exit 1 -fi - -if [ $got_one -eq 0 ]; then - echo "Please Edit this file to contain the RCS log information" >$message_file - echo "to be associated with this directory (please remove these lines)">>$message_file - ${EDITOR-/usr/ucb/vi} $message_file - got_one=1 -fi - -# Ya gotta share. -umask 0 - -update_dir=${CVSROOT}/${repository} -[ ! -d ${update_dir} ] && mkdir $update_dir - -if [ -d SCCS ]; then - echo SCCS files detected! >&2 - exit 1 -fi -if [ -d RCS ]; then - co RCS/* -fi - -for name in * .[a-zA-Z0-9]* -do - case "$name" in - RCS | *~ | \* | .\[a-zA-Z0-9\]\* ) continue ;; - esac - echo $name - if [ $vbose -ne 0 ]; then - echo "Updating ${repository}/${name}" - fi - if [ -d "$name" ]; then - if [ ! -d "${update_dir}/${name}" ]; then - echo "WARNING: Creating new directory ${repository}/${name}" - mkdir "${update_dir}/${name}" - if [ $? -ne 0 ]; then - echo "ERROR: mkdir failed - aborting" >&2 - exit 1 - fi - fi - cd "$name" - if [ $? -ne 0 ]; then - echo "ERROR: Couldn\'t cd to $name - aborting" >&2 - exit 1 - fi - if [ $vbose -ne 0 ]; then - $0 -v -f $message_file "${repository}/${name}" - else - $0 -f $message_file "${repository}/${name}" - fi - if [ $? -ne 0 ]; then - exit 1 - fi - cd .. - else # if not directory - if [ ! -f "$name" ]; then - echo "WARNING: $name is neither a regular file" - echo " nor a directory - ignored" - continue - fi - file="${update_dir}/${name},v" - comment="" - if grep -s '\$Log.*\$' "${name}"; then # If $Log keyword - myext=`echo $name | sed 's,.*\.,,'` - [ "$myext" = "$name" ] && myext= - case "$myext" in - c | csh | e | f | h | l | mac | me | mm | ms | p | r | red | s | sh | sl | cl | ml | el | tex | y | ye | yr | "" ) - ;; - - * ) - echo "For file ${file}:" - grep '\$Log.*\$' "${name}" - echo -n "Please insert a comment leader for file ${name} > " - read comment - ;; - esac - fi - if [ ! -f "$file" ]; then # If not exists in repository - if [ ! -f "${update_dir}/Attic/${name},v" ]; then - echo "WARNING: Creating new file ${repository}/${name}" - if [ -f RCS/"${name}",v ]; then - echo "MSG: Copying old rcs file." - cp RCS/"${name}",v "$file" - else - if [ -n "${comment}" ]; then - rcs -q -i -c"${comment}" -t${message_file} -m'.' "$file" - fi - ci -q -u1.1 -t${message_file} -m'.' "$file" - if [ $? -ne 0 ]; then - echo "ERROR: Initial check-in of $file failed - aborting" >&2 - exit 1 - fi - fi - else - file="${update_dir}/Attic/${name},v" - echo "WARNING: IGNORED: ${repository}/Attic/${name}" - continue - fi - else # File existed - echo "ERROR: File exists in repository: Ignored: $file" - continue - fi - fi -done - -[ $got_one -eq 1 ] && rm -f $message_file - -exit 0 diff --git a/gnu/usr.bin/cvs/contrib/rcs2log b/gnu/usr.bin/cvs/contrib/rcs2log deleted file mode 100644 index d7900025b8517..0000000000000 --- a/gnu/usr.bin/cvs/contrib/rcs2log +++ /dev/null @@ -1,326 +0,0 @@ -#!/bin/sh - -# RCS to ChangeLog generator - -# Generate a change log prefix from RCS/* and the existing ChangeLog (if any). -# Output the new prefix to standard output. -# You can edit this prefix by hand, and then prepend it to ChangeLog. - -# Ignore log entries that start with `#'. -# Clump together log entries that start with `{topic} ', -# where `topic' contains neither white space nor `}'. - -# Author: Paul Eggert <eggert@twinsun.com> - -# OrigId: rcs2log,v 1.9 1993/01/15 05:33:29 eggert Exp - -# Copyright 1992, 1993 Free Software Foundation, Inc. - -# 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, 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; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - - -# Parse options. - -# defaults -indent=8 # indent of log line -length=79 # suggested max width of log line -tabwidth=8 # width of horizontal tab - -while : -do - case $1 in - -i) indent=${2?};; - -l) length=${2?};; - -t) tabwidth=${2?};; - -*) echo >&2 "$0: usage: $0 [-i indent] [-l length] [-t tabwidth] [file ...]" - exit 1;; - *) break - esac - shift; shift -done - - -# Log into $rlogout the revisions checked in since the first ChangeLog entry. - -date=1970 -if test -s ChangeLog -then - # Add 1 to seconds to avoid duplicating most recent log. - # It's a good thing `rlog' doesn't mind a time ending in `:60'. - e=' - /^... ... [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]+ /{ - printf "%s%02d %s\n", substr($0,1,17), substr($0,18,2)+1, $5 - exit - } - ' - d=`awk "$e" <ChangeLog` || exit - case $d in - ?*) date=$d - esac -fi -datearg="-d>$date" - -rlogout=/tmp/chg$$ -trap exit 1 2 13 15 -trap 'rm -f $rlogout; exit 1' 0 - -case $# in -0) set RCS/* -esac - -rlog "$datearg" "$@" >$rlogout || exit - - -# Get the full name of each author the logs mention, and set initialize_fullname -# to awk code that initializes the `fullname' awk associative array. -# Warning: foreign authors (i.e. not known in the passwd file) are mishandled; -# you have to fix the resulting output by hand. - -initialize_fullname= -authors=` - sed -n 's|^date: *[0-9]*/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]; *author: *\([^; ]*\).*|\1|p' <$rlogout | - sort -u -` -case $authors in -?*) - initialize_author= - for author in $authors - do - initialize_author="$initialize_author - author[\"$author\"] = 1 - " - done - - awkscript=' - BEGIN { - alphabet = "abcdefghijklmnopqrstuvwxyz" - ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - '"$initialize_author"' - } - { - if (author[$1]) { - fullname = $5 - abbr = index(fullname, "&") - if (abbr) { - a = substr($1, 1, 1) - A = a - i = index(alphabet, a) - if (i) A = substr(ALPHABET, i, 1) - fullname = substr(fullname, 1, abbr-1) A substr($1, 2) substr(fullname, abbr+1) - } - printf "fullname[\"%s\"] = \"%s\"\n", $1, fullname - author[$1] = 0 - } - } - ' - - initialize_fullname=` - (cat /etc/passwd; ypmatch $authors passwd) 2>/dev/null | - awk -F: "$awkscript" - ` -esac - - -# Function to print a single log line. -# We don't use awk functions, to stay compatible with old awk versions. -# `Log' is the log message (with \n replaced by \r). -# `files' contains the affected files. -printlogline='{ - - # Following the GNU coding standards, rewrite - # * file: (function): comment - # to - # * file (function): comment - if (Log ~ /^\([^)]*\): /) { - i = index(Log, ")") - files = files " " substr(Log, 1, i) - Log = substr(Log, i+3) - } - - # If "label: comment" is too long, break the line after the ":". - sep = " " - if ('"$length"' <= '"$indent"' + 1 + length(files) + index(Log, "\r")) sep = "\n" indent_string - - # Print the label. - printf "%s*%s:", indent_string, files - - # Print each line of the log, transliterating \r to \n. - while ((i = index(Log, "\r")) != 0) { - printf "%s%s\n", sep, substr(Log, 1, i-1) - sep = indent_string - Log = substr(Log, i+1) - } -}' - -hostname=`( - hostname || cat /etc/whoami || uuname -l || uname -n -) 2>/dev/null` || { - echo >&2 "$0: cannot deduce hostname" - exit 1 -} - - -# Process the rlog output, generating ChangeLog style entries. - -# First, reformat the rlog output so that each line contains one log entry. -# Transliterate \n to \r so that multiline entries fit on a single line. -# Discard irrelevant rlog output. -awk <$rlogout ' - /^Working file:/ { filename = $3 } - /^date: /, /^(-----------*|===========*)$/ { - if ($0 ~ /^branches: /) { next } - if ($0 ~ /^date: [0-9][ /0-9:]*;/) { - time = substr($3, 1, length($3)-1) - author = substr($5, 1, length($5)-1) - printf "%s %s %s %s \r", filename, $2, time, author - next - } - if ($0 ~ /^(-----------*|===========*)$/) { print ""; next } - printf "%s\r", $0 - } -' | - -# Now each line is of the form -# FILENAME YYYY/MM/DD HH:MM:SS AUTHOR \rLOG -# where \r stands for a carriage return, -# and each line of the log is terminated by \r instead of \n. -# Sort the log entries, first by date+time (in reverse order), -# then by author, then by log entry, and finally by file name (just in case). -sort +1 -3r +3 +0 | - -# Finally, reformat the sorted log entries. -awk ' - BEGIN { - - # Initialize the fullname associative array. - '"$initialize_fullname"' - - # Initialize indent string. - indent_string = "" - i = '"$indent"' - if (0 < '"$tabwidth"') - for (; '"$tabwidth"' <= i; i -= '"$tabwidth"') - indent_string = indent_string "\t" - while (1 <= i--) - indent_string = indent_string " " - - # Set up date conversion tables. - # RCS uses a nice, clean, sortable format, - # but ChangeLog wants the traditional, ugly ctime format. - - # January 1, 0 AD (Gregorian) was Saturday = 6 - EPOCH_WEEKDAY = 6 - # Of course, there was no 0 AD, but the algorithm works anyway. - - w[0]="Sun"; w[1]="Mon"; w[2]="Tue"; w[3]="Wed" - w[4]="Thu"; w[5]="Fri"; w[6]="Sat" - - m[0]="Jan"; m[1]="Feb"; m[2]="Mar" - m[3]="Apr"; m[4]="May"; m[5]="Jun" - m[6]="Jul"; m[7]="Aug"; m[8]="Sep" - m[9]="Oct"; m[10]="Nov"; m[11]="Dec" - - # days in non-leap year thus far, indexed by month (0-12) - mo[0]=0; mo[1]=31; mo[2]=59; mo[3]=90 - mo[4]=120; mo[5]=151; mo[6]=181; mo[7]=212 - mo[8]=243; mo[9]=273; mo[10]=304; mo[11]=334 - mo[12]=365 - } - - { - newlog = substr($0, 1 + index($0, "\r")) - - # Ignore log entries prefixed by "#". - if (newlog ~ /^#/) { next } - - if (Log != newlog || date != $2 || author != $4) { - - # The previous log and this log differ. - - # Print the old log. - if (date != "") '"$printlogline"' - - # Logs that begin with "{clumpname} " should be grouped together, - # and the clumpname should be removed. - # Extract the new clumpname from the log header, - # and use it to decide whether to output a blank line. - newclumpname = "" - sep = "\n" - if (date == "") sep = "" - if (newlog ~ /^{[^ }]*}[ ]/) { - i = index(newlog, "}") - newclumpname = substr(newlog, 1, i) - while (substr(newlog, i+1) ~ /^[ ]/) i++ - newlog = substr(newlog, i+1) - if (clumpname == newclumpname) sep = "" - } - printf sep - clumpname = newclumpname - - # Get ready for the next log. - Log = newlog - if (files != "") - for (i in filesknown) - filesknown[i] = 0 - files = "" - } - if (date != $2 || author != $4) { - # The previous date+author and this date+author differ. - # Print the new one. - date = $2 - author = $4 - - # Convert nice RCS date like "1992/01/03 00:03:44" - # into ugly ctime date like "Fri Jan 3 00:03:44 1992". - # Calculate day of week from Gregorian calendar. - i = index($2, "/") - year = substr($2, 1, i-1) + 0 - monthday = substr($2, i+1) - i = index(monthday, "/") - month = substr(monthday, 1, i-1) + 0 - day = substr(monthday, i+1) + 0 - leap = 0 - if (2 < month && year%4 == 0 && (year%100 != 0 || year%400 == 0)) leap = 1 - days_since_Sunday_before_epoch = EPOCH_WEEKDAY + year * 365 + int((year + 3) / 4) - int((year + 99) / 100) + int((year + 399) / 400) + mo[month-1] + leap + day - 1 - - # Print "date fullname (email address)" if the fullname is known; - # print "date author" otherwise. - # Get the fullname from the associative array. - # The email address is just author@thishostname. - printf "%s %s %2d %s %d ", w[days_since_Sunday_before_epoch%7], m[month-1], day, $3, year - if (fullname[author]) - printf "%s (%s@%s)\n\n", fullname[author], author, "'"$hostname"'" - else - printf "%s\n\n", author - } - if (! filesknown[$1]) { - filesknown[$1] = 1 - if (files == "") files = " " $1 - else files = files ", " $1 - } - } - END { - # Print the last log. - if (date != "") { - '"$printlogline"' - printf "\n" - } - } -' && - - -# Exit successfully. - -exec rm -f $rlogout diff --git a/gnu/usr.bin/cvs/contrib/rcs2log.sh b/gnu/usr.bin/cvs/contrib/rcs2log.sh deleted file mode 100644 index ccea907ea37b6..0000000000000 --- a/gnu/usr.bin/cvs/contrib/rcs2log.sh +++ /dev/null @@ -1,592 +0,0 @@ -#! /bin/sh - -# RCS to ChangeLog generator - -# Generate a change log prefix from RCS files and the ChangeLog (if any). -# Output the new prefix to standard output. -# You can edit this prefix by hand, and then prepend it to ChangeLog. - -# Ignore log entries that start with `#'. -# Clump together log entries that start with `{topic} ', -# where `topic' contains neither white space nor `}'. - -# Author: Paul Eggert <eggert@twinsun.com> - -# $Id: rcs2log.sh,v 1.2 1995/07/28 19:48:45 eggert Exp $ - -# Copyright 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - -# 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, 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; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -tab=' ' -nl=' -' - -# Parse options. - -# defaults -: ${AWK=awk} -: ${TMPDIR=/tmp} -hostname= # name of local host (if empty, will deduce it later) -indent=8 # indent of log line -length=79 # suggested max width of log line -logins= # login names for people we know fullnames and mailaddrs of -loginFullnameMailaddrs= # login<tab>fullname<tab>mailaddr triplets -recursive= # t if we want recursive rlog -rlog_options= # options to pass to rlog -tabwidth=8 # width of horizontal tab - -while : -do - case $1 in - -i) indent=${2?}; shift;; - -h) hostname=${2?}; shift;; - -l) length=${2?}; shift;; - -[nu]) # -n is obsolescent; it is replaced by -u. - case $1 in - -n) case ${2?}${3?}${4?} in - *"$tab"* | *"$nl"*) - echo >&2 "$0: -n '$2' '$3' '$4': tabs, newlines not allowed" - exit 1 - esac - loginFullnameMailaddrs=$loginFullnameMailaddrs$nl$2$tab$3$tab$4 - shift; shift; shift;; - -u) - # If $2 is not tab-separated, use colon for separator. - case ${2?} in - *"$nl"*) - echo >&2 "$0: -u '$2': newlines not allowed" - exit 1;; - *"$tab"*) - t=$tab;; - *) - t=: - esac - case $2 in - *"$t"*"$t"*"$t"*) - echo >&2 "$0: -u '$2': too many fields" - exit 1;; - *"$t"*"$t"*) - ;; - *) - echo >&2 "$0: -u '$2': not enough fields" - exit 1 - esac - loginFullnameMailaddrs=$loginFullnameMailaddrs$nl$2 - shift - esac - logins=$logins$nl$login - ;; - -r) rlog_options=$rlog_options$nl${2?}; shift;; - -R) recursive=t;; - -t) tabwidth=${2?}; shift;; - -*) echo >&2 "$0: usage: $0 [options] [file ...] -Options: - [-h hostname] [-i indent] [-l length] [-R] [-r rlog_option] - [-t tabwidth] [-u 'login<TAB>fullname<TAB>mailaddr']..." - exit 1;; - *) break - esac - shift -done - -month_data=' - m[0]="Jan"; m[1]="Feb"; m[2]="Mar" - m[3]="Apr"; m[4]="May"; m[5]="Jun" - m[6]="Jul"; m[7]="Aug"; m[8]="Sep" - m[9]="Oct"; m[10]="Nov"; m[11]="Dec" - - # days in non-leap year thus far, indexed by month (0-12) - mo[0]=0; mo[1]=31; mo[2]=59; mo[3]=90 - mo[4]=120; mo[5]=151; mo[6]=181; mo[7]=212 - mo[8]=243; mo[9]=273; mo[10]=304; mo[11]=334 - mo[12]=365 -' - - -# Put rlog output into $rlogout. - -# If no rlog options are given, -# log the revisions checked in since the first ChangeLog entry. -case $rlog_options in -'') - date=1970 - if test -s ChangeLog - then - # Add 1 to seconds to avoid duplicating most recent log. - e=' - /^... ... [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]+ /{ - '"$month_data"' - year = $5 - for (i=0; i<=11; i++) if (m[i] == $2) break - dd = $3 - hh = substr($0,12,2) - mm = substr($0,15,2) - ss = substr($0,18,2) - ss++ - if (ss == 60) { - ss = 0 - mm++ - if (mm == 60) { - mm = 0 - hh++ - if (hh == 24) { - hh = 0 - dd++ - monthdays = mo[i+1] - mo[i] - if (i == 1 && year%4 == 0 && (year%100 != 0 || year%400 == 0)) monthdays++ - if (dd == monthdays + 1) { - dd = 1 - i++ - if (i == 12) { - i = 0 - year++ - } - } - } - } - } - # Output comma instead of space to avoid CVS 1.5 bug. - printf "%d/%02d/%02d,%02d:%02d:%02d\n", year,i+1,dd,hh,mm,ss - exit - } - ' - d=`$AWK "$e" <ChangeLog` || exit - case $d in - ?*) date=$d - esac - fi - datearg="-d>$date" -esac - -# If CVS is in use, examine its repository, not the normal RCS files. -if test ! -f CVS/Repository -then - rlog=rlog - repository= -else - rlog='cvs log' - repository=`sed 1q <CVS/Repository` || exit - test ! -f CVS/Root || CVSROOT=`cat <CVS/Root` || exit - case $CVSROOT in - *:/*) - # remote repository - ;; - *) - # local repository - case $repository in - /*) ;; - *) repository=${CVSROOT?}/$repository - esac - if test ! -d "$repository" - then - echo >&2 "$0: $repository: bad repository (see CVS/Repository)" - exit 1 - fi - esac -fi - -# With no arguments, examine all files under the RCS directory. -case $# in -0) - case $repository in - '') - oldIFS=$IFS - IFS=$nl - case $recursive in - t) - RCSdirs=`find . -name RCS -type d -print` - filesFromRCSfiles='s|,v$||; s|/RCS/|/|; s|^\./||' - files=` - { - case $RCSdirs in - ?*) find $RCSdirs -type f -print - esac - find . -name '*,v' -print - } | - sort -u | - sed "$filesFromRCSfiles" - `;; - *) - files= - for file in RCS/.* RCS/* .*,v *,v - do - case $file in - RCS/. | RCS/..) continue;; - RCS/.\* | RCS/\* | .\*,v | \*,v) test -f "$file" || continue - esac - files=$files$nl$file - done - case $files in - '') exit 0 - esac - esac - set x $files - shift - IFS=$oldIFS - esac -esac - -llogout=$TMPDIR/rcs2log$$l -rlogout=$TMPDIR/rcs2log$$r -trap exit 1 2 13 15 -trap "rm -f $llogout $rlogout; exit 1" 0 - -case $rlog_options in -?*) $rlog $rlog_options ${1+"$@"} >$rlogout;; -'') $rlog "$datearg" ${1+"$@"} >$rlogout -esac || exit - - -# Get the full name of each author the logs mention, and set initialize_fullname -# to awk code that initializes the `fullname' awk associative array. -# Warning: foreign authors (i.e. not known in the passwd file) are mishandled; -# you have to fix the resulting output by hand. - -initialize_fullname= -initialize_mailaddr= - -case $loginFullnameMailaddrs in -?*) - case $loginFullnameMailaddrs in - *\"* | *\\*) - sed 's/["\\]/\\&/g' >$llogout <<EOF || exit -$loginFullnameMailaddrs -EOF - loginFullnameMailaddrs=`cat $llogout` - esac - - oldIFS=$IFS - IFS=$nl - for loginFullnameMailaddr in $loginFullnameMailaddrs - do - case $loginFullnameMailaddr in - *"$tab"*) IFS=$tab;; - *) IFS=: - esac - set x $loginFullnameMailaddr - login=$2 - fullname=$3 - mailaddr=$4 - initialize_fullname="$initialize_fullname - fullname[\"$login\"] = \"$fullname\"" - initialize_mailaddr="$initialize_mailaddr - mailaddr[\"$login\"] = \"$mailaddr\"" - done - IFS=$oldIFS -esac - -case $llogout in -?*) sort -u -o $llogout <<EOF || exit -$logins -EOF -esac -output_authors='/^date: / { - if ($2 ~ /^[0-9]*[-\/][0-9][0-9][-\/][0-9][0-9]$/ && $3 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9][-+0-9:]*;$/ && $4 == "author:" && $5 ~ /^[^;]*;$/) { - print substr($5, 1, length($5)-1) - } -}' -authors=` - $AWK "$output_authors" <$rlogout | - case $llogout in - '') sort -u;; - ?*) sort -u | comm -23 - $llogout - esac -` -case $authors in -?*) - cat >$llogout <<EOF || exit -$authors -EOF - initialize_author_script='s/["\\]/\\&/g; s/.*/author[\"&\"] = 1/' - initialize_author=`sed -e "$initialize_author_script" <$llogout` - awkscript=' - BEGIN { - alphabet = "abcdefghijklmnopqrstuvwxyz" - ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - '"$initialize_author"' - } - { - if (author[$1]) { - fullname = $5 - if (fullname ~ /[0-9]+-[^(]*\([0-9]+\)$/) { - # Remove the junk from fullnames like "0000-Admin(0000)". - fullname = substr(fullname, index(fullname, "-") + 1) - fullname = substr(fullname, 1, index(fullname, "(") - 1) - } - if (fullname ~ /,[^ ]/) { - # Some sites put comma-separated junk after the fullname. - # Remove it, but leave "Bill Gates, Jr" alone. - fullname = substr(fullname, 1, index(fullname, ",") - 1) - } - abbr = index(fullname, "&") - if (abbr) { - a = substr($1, 1, 1) - A = a - i = index(alphabet, a) - if (i) A = substr(ALPHABET, i, 1) - fullname = substr(fullname, 1, abbr-1) A substr($1, 2) substr(fullname, abbr+1) - } - - # Quote quotes and backslashes properly in full names. - # Do not use gsub; traditional awk lacks it. - quoted = "" - rest = fullname - for (;;) { - p = index(rest, "\\") - q = index(rest, "\"") - if (p) { - if (q && q<p) p = q - } else { - if (!q) break - p = q - } - quoted = quoted substr(rest, 1, p-1) "\\" substr(rest, p, 1) - rest = substr(rest, p+1) - } - - printf "fullname[\"%s\"] = \"%s%s\"\n", $1, quoted, rest - author[$1] = 0 - } - } - ' - - initialize_fullname=` - (cat /etc/passwd; ypmatch $authors passwd) 2>/dev/null | - $AWK -F: "$awkscript" - `$initialize_fullname -esac - - -# Function to print a single log line. -# We don't use awk functions, to stay compatible with old awk versions. -# `Log' is the log message (with \n replaced by \r). -# `files' contains the affected files. -printlogline='{ - - # Following the GNU coding standards, rewrite - # * file: (function): comment - # to - # * file (function): comment - if (Log ~ /^\([^)]*\): /) { - i = index(Log, ")") - files = files " " substr(Log, 1, i) - Log = substr(Log, i+3) - } - - # If "label: comment" is too long, break the line after the ":". - sep = " " - if ('"$length"' <= '"$indent"' + 1 + length(files) + index(Log, CR)) sep = "\n" indent_string - - # Print the label. - printf "%s*%s:", indent_string, files - - # Print each line of the log, transliterating \r to \n. - while ((i = index(Log, CR)) != 0) { - logline = substr(Log, 1, i-1) - if (logline ~ /[^'"$tab"' ]/) { - printf "%s%s\n", sep, logline - } else { - print "" - } - sep = indent_string - Log = substr(Log, i+1) - } -}' - -case $hostname in -'') - hostname=`( - hostname || uname -n || uuname -l || cat /etc/whoami - ) 2>/dev/null` || { - echo >&2 "$0: cannot deduce hostname" - exit 1 - } -esac - - -# Process the rlog output, generating ChangeLog style entries. - -# First, reformat the rlog output so that each line contains one log entry. -# Transliterate \n to \r so that multiline entries fit on a single line. -# Discard irrelevant rlog output. -$AWK <$rlogout ' - BEGIN { repository = "'"$repository"'" } - /^RCS file:/ { - if (repository != "") { - filename = $3 - if (substr(filename, 1, length(repository) + 1) == repository "/") { - filename = substr(filename, length(repository) + 2) - } - if (filename ~ /,v$/) { - filename = substr(filename, 1, length(filename) - 2) - } - } - } - /^Working file:/ { if (repository == "") filename = $3 } - /^date: /, /^(-----------*|===========*)$/ { - if ($0 ~ /^branches: /) { next } - if ($0 ~ /^date: [0-9][- +\/0-9:]*;/) { - date = $2 - if (date ~ /-/) { - # An ISO format date. Replace all "-"s with "/"s. - newdate = "" - while ((i = index(date, "-")) != 0) { - newdate = newdate substr(date, 1, i-1) "/" - date = substr(date, i+1) - } - date = newdate date - } - # Ignore any time zone; ChangeLog has no room for it. - time = substr($3, 1, 8) - author = substr($5, 1, length($5)-1) - printf "%s %s %s %s %c", filename, date, time, author, 13 - next - } - if ($0 ~ /^(-----------*|===========*)$/) { print ""; next } - printf "%s%c", $0, 13 - } -' | - -# Now each line is of the form -# FILENAME YYYY/MM/DD HH:MM:SS AUTHOR \rLOG -# where \r stands for a carriage return, -# and each line of the log is terminated by \r instead of \n. -# Sort the log entries, first by date+time (in reverse order), -# then by author, then by log entry, and finally by file name (just in case). -sort +1 -3r +3 +0 | - -# Finally, reformat the sorted log entries. -$AWK ' - BEGIN { - # Some awk variants do not understand "\r" or "\013", so we have to - # put a carriage return directly in the file. - CR="
" # <-- There is a single CR between the " chars here. - - # Initialize the fullname and mailaddr associative arrays. - '"$initialize_fullname"' - '"$initialize_mailaddr"' - - # Initialize indent string. - indent_string = "" - i = '"$indent"' - if (0 < '"$tabwidth"') - for (; '"$tabwidth"' <= i; i -= '"$tabwidth"') - indent_string = indent_string "\t" - while (1 <= i--) - indent_string = indent_string " " - - # Set up date conversion tables. - # RCS uses a nice, clean, sortable format, - # but ChangeLog wants the traditional, ugly ctime format. - - # January 1, 0 AD (Gregorian) was Saturday = 6 - EPOCH_WEEKDAY = 6 - # Of course, there was no 0 AD, but the algorithm works anyway. - - w[0]="Sun"; w[1]="Mon"; w[2]="Tue"; w[3]="Wed" - w[4]="Thu"; w[5]="Fri"; w[6]="Sat" - - '"$month_data"' - } - - { - newlog = substr($0, 1 + index($0, CR)) - - # Ignore log entries prefixed by "#". - if (newlog ~ /^#/) { next } - - if (Log != newlog || date != $2 || author != $4) { - - # The previous log and this log differ. - - # Print the old log. - if (date != "") '"$printlogline"' - - # Logs that begin with "{clumpname} " should be grouped together, - # and the clumpname should be removed. - # Extract the new clumpname from the log header, - # and use it to decide whether to output a blank line. - newclumpname = "" - sep = "\n" - if (date == "") sep = "" - if (newlog ~ /^\{[^'"$tab"' }]*}['"$tab"' ]/) { - i = index(newlog, "}") - newclumpname = substr(newlog, 1, i) - while (substr(newlog, i+1) ~ /^['"$tab"' ]/) i++ - newlog = substr(newlog, i+1) - if (clumpname == newclumpname) sep = "" - } - printf sep - clumpname = newclumpname - - # Get ready for the next log. - Log = newlog - if (files != "") - for (i in filesknown) - filesknown[i] = 0 - files = "" - } - if (date != $2 || author != $4) { - # The previous date+author and this date+author differ. - # Print the new one. - date = $2 - author = $4 - - # Convert nice RCS date like "1992/01/03 00:03:44" - # into ugly ctime date like "Fri Jan 3 00:03:44 1992". - # Calculate day of week from Gregorian calendar. - i = index($2, "/") - year = substr($2, 1, i-1) + 0 - monthday = substr($2, i+1) - i = index(monthday, "/") - month = substr(monthday, 1, i-1) + 0 - day = substr(monthday, i+1) + 0 - leap = 0 - if (2 < month && year%4 == 0 && (year%100 != 0 || year%400 == 0)) leap = 1 - days_since_Sunday_before_epoch = EPOCH_WEEKDAY + year * 365 + int((year + 3) / 4) - int((year + 99) / 100) + int((year + 399) / 400) + mo[month-1] + leap + day - 1 - - # Print "date fullname (email address)". - # Get fullname and email address from associative arrays; - # default to author and author@hostname if not in arrays. - if (fullname[author]) - auth = fullname[author] - else - auth = author - printf "%s %s %2d %s %d %s ", w[days_since_Sunday_before_epoch%7], m[month-1], day, $3, year, auth - if (mailaddr[author]) - printf "<%s>\n\n", mailaddr[author] - else - printf "<%s@%s>\n\n", author, "'"$hostname"'" - } - if (! filesknown[$1]) { - filesknown[$1] = 1 - if (files == "") files = " " $1 - else files = files ", " $1 - } - } - END { - # Print the last log. - if (date != "") { - '"$printlogline"' - printf "\n" - } - } -' && - - -# Exit successfully. - -exec rm -f $llogout $rlogout diff --git a/gnu/usr.bin/cvs/contrib/rcs2sccs b/gnu/usr.bin/cvs/contrib/rcs2sccs deleted file mode 100644 index 054ac6c1eca9f..0000000000000 --- a/gnu/usr.bin/cvs/contrib/rcs2sccs +++ /dev/null @@ -1,143 +0,0 @@ -#!/bin/sh -# -# -# OrigId: rcs2sccs,v 1.12 90/10/04 20:52:23 kenc Exp Locker: kenc -# $Id: rcs2sccs,v 1.1 1993/12/06 06:37:14 berliner Exp $ - -############################################################ -# Error checking -# -if [ ! -d SCCS ] ; then - mkdir SCCS -fi - -logfile=/tmp/rcs2sccs_$$_log -rm -f $logfile -tmpfile=/tmp/rcs2sccs_$$_tmp -rm -f $tmpfile -emptyfile=/tmp/rcs2sccs_$$_empty -echo -n "" > $emptyfile -initialfile=/tmp/rcs2sccs_$$_init -echo "Initial revision" > $initialfile -sedfile=/tmp/rcs2sccs_$$_sed -rm -f $sedfile -revfile=/tmp/rcs2sccs_$$_rev -rm -f $revfile -commentfile=/tmp/rcs2sccs_$$_comment -rm -f $commentfile - -# create the sed script -cat > $sedfile << EOF -s,;Id;,%Z%%M% %I% %E%,g -s,;SunId;,%Z%%M% %I% %E%,g -s,;RCSfile;,%M%,g -s,;Revision;,%I%,g -s,;Date;,%E%,g -s,;Id:.*;,%Z%%M% %I% %E%,g -s,;SunId:.*;,%Z%%M% %I% %E%,g -s,;RCSfile:.*;,%M%,g -s,;Revision:.*;,%I%,g -s,;Date:.*;,%E%,g -EOF -sed -e 's/;/\\$/g' $sedfile > $tmpfile -cp $tmpfile $sedfile -############################################################ -# Loop over every RCS file in RCS dir -# -for vfile in *,v; do - # get rid of the ",v" at the end of the name - file=`echo $vfile | sed -e 's/,v$//'` - - # work on each rev of that file in ascending order - firsttime=1 - rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile - for rev in `cat $revfile`; do - if [ $? != 0 ]; then - echo ERROR - revision - exit - fi - # get file into current dir and get stats - date=`rlog -r$rev $file | grep "^date: " | awk '{print $2; exit}' | sed -e 's/^19//'` - time=`rlog -r$rev $file | grep "^date: " | awk '{print $3; exit}' | sed -e 's/;//'` - author=`rlog -r$rev $file | grep "^date: " | awk '{print $5; exit}' | sed -e 's/;//'` - date="$date $time" - echo "" - rlog -r$rev $file | sed -e '/^branches: /d' -e '1,/^date: /d' -e '/^===========/d' -e 's/$/\\/' | awk '{if ((total += length($0) + 1) < 510) print $0}' > $commentfile - echo "==> file $file, rev=$rev, date=$date, author=$author" - rm -f $file - co -r$rev $file >> $logfile 2>&1 - if [ $? != 0 ]; then - echo ERROR - co - exit - fi - echo checked out of RCS - - # add SCCS keywords in place of RCS keywords - sed -f $sedfile $file > $tmpfile - if [ $? != 0 ]; then - echo ERROR - sed - exit - fi - echo performed keyword substitutions - rm -f $file - cp $tmpfile $file - - # check file into SCCS - if [ "$firsttime" = "1" ]; then - firsttime=0 - echo about to do sccs admin - echo sccs admin -n -i$file $file < $commentfile - sccs admin -n -i$file $file < $commentfile >> $logfile 2>&1 - if [ $? != 0 ]; then - echo ERROR - sccs admin - exit - fi - echo initial rev checked into SCCS - else - case $rev in - *.*.*.*) - brev=`echo $rev | sed -e 's/\.[0-9]*$//'` - sccs admin -fb $file 2>>$logfile - echo sccs get -e -p -r$brev $file - sccs get -e -p -r$brev $file >/dev/null 2>>$logfile - ;; - *) - echo sccs get -e -p $file - sccs get -e -p $file >/dev/null 2>> $logfile - ;; - esac - if [ $? != 0 ]; then - echo ERROR - sccs get - exit - fi - sccs delta $file < $commentfile >> $logfile 2>&1 - if [ $? != 0 ]; then - echo ERROR - sccs delta -r$rev $file - exit - fi - echo checked into SCCS - fi - sed -e "s;^d D $rev ../../.. ..:..:.. [^ ][^ ]*;d D $rev $date $author;" SCCS/s.$file > $tmpfile - rm -f SCCS/s.$file - cp $tmpfile SCCS/s.$file - chmod 444 SCCS/s.$file - sccs admin -z $file - if [ $? != 0 ]; then - echo ERROR - sccs admin -z - exit - fi - done - rm -f $file -done - - -############################################################ -# Clean up -# -echo cleaning up... -rm -f $tmpfile $emptyfile $initialfile $sedfile $commentfile -echo =================================================== -echo " Conversion Completed Successfully" -echo =================================================== - -rm -f *,v diff --git a/gnu/usr.bin/cvs/contrib/rcs2sccs.sh b/gnu/usr.bin/cvs/contrib/rcs2sccs.sh deleted file mode 100644 index af701384e4b61..0000000000000 --- a/gnu/usr.bin/cvs/contrib/rcs2sccs.sh +++ /dev/null @@ -1,143 +0,0 @@ -#! /bin/sh -# -# -# OrigId: rcs2sccs,v 1.12 90/10/04 20:52:23 kenc Exp Locker: kenc -# $Id: rcs2sccs.sh,v 1.1 1995/07/10 02:26:45 kfogel Exp $ - -############################################################ -# Error checking -# -if [ ! -d SCCS ] ; then - mkdir SCCS -fi - -logfile=/tmp/rcs2sccs_$$_log -rm -f $logfile -tmpfile=/tmp/rcs2sccs_$$_tmp -rm -f $tmpfile -emptyfile=/tmp/rcs2sccs_$$_empty -echo -n "" > $emptyfile -initialfile=/tmp/rcs2sccs_$$_init -echo "Initial revision" > $initialfile -sedfile=/tmp/rcs2sccs_$$_sed -rm -f $sedfile -revfile=/tmp/rcs2sccs_$$_rev -rm -f $revfile -commentfile=/tmp/rcs2sccs_$$_comment -rm -f $commentfile - -# create the sed script -cat > $sedfile << EOF -s,;Id;,%Z%%M% %I% %E%,g -s,;SunId;,%Z%%M% %I% %E%,g -s,;RCSfile;,%M%,g -s,;Revision;,%I%,g -s,;Date;,%E%,g -s,;Id:.*;,%Z%%M% %I% %E%,g -s,;SunId:.*;,%Z%%M% %I% %E%,g -s,;RCSfile:.*;,%M%,g -s,;Revision:.*;,%I%,g -s,;Date:.*;,%E%,g -EOF -sed -e 's/;/\\$/g' $sedfile > $tmpfile -cp $tmpfile $sedfile -############################################################ -# Loop over every RCS file in RCS dir -# -for vfile in *,v; do - # get rid of the ",v" at the end of the name - file=`echo $vfile | sed -e 's/,v$//'` - - # work on each rev of that file in ascending order - firsttime=1 - rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile - for rev in `cat $revfile`; do - if [ $? != 0 ]; then - echo ERROR - revision - exit - fi - # get file into current dir and get stats - date=`rlog -r$rev $file | grep "^date: " | awk '{print $2; exit}' | sed -e 's/^19//'` - time=`rlog -r$rev $file | grep "^date: " | awk '{print $3; exit}' | sed -e 's/;//'` - author=`rlog -r$rev $file | grep "^date: " | awk '{print $5; exit}' | sed -e 's/;//'` - date="$date $time" - echo "" - rlog -r$rev $file | sed -e '/^branches: /d' -e '1,/^date: /d' -e '/^===========/d' -e 's/$/\\/' | awk '{if ((total += length($0) + 1) < 510) print $0}' > $commentfile - echo "==> file $file, rev=$rev, date=$date, author=$author" - rm -f $file - co -r$rev $file >> $logfile 2>&1 - if [ $? != 0 ]; then - echo ERROR - co - exit - fi - echo checked out of RCS - - # add SCCS keywords in place of RCS keywords - sed -f $sedfile $file > $tmpfile - if [ $? != 0 ]; then - echo ERROR - sed - exit - fi - echo performed keyword substitutions - rm -f $file - cp $tmpfile $file - - # check file into SCCS - if [ "$firsttime" = "1" ]; then - firsttime=0 - echo about to do sccs admin - echo sccs admin -n -i$file $file < $commentfile - sccs admin -n -i$file $file < $commentfile >> $logfile 2>&1 - if [ $? != 0 ]; then - echo ERROR - sccs admin - exit - fi - echo initial rev checked into SCCS - else - case $rev in - *.*.*.*) - brev=`echo $rev | sed -e 's/\.[0-9]*$//'` - sccs admin -fb $file 2>>$logfile - echo sccs get -e -p -r$brev $file - sccs get -e -p -r$brev $file >/dev/null 2>>$logfile - ;; - *) - echo sccs get -e -p $file - sccs get -e -p $file >/dev/null 2>> $logfile - ;; - esac - if [ $? != 0 ]; then - echo ERROR - sccs get - exit - fi - sccs delta $file < $commentfile >> $logfile 2>&1 - if [ $? != 0 ]; then - echo ERROR - sccs delta -r$rev $file - exit - fi - echo checked into SCCS - fi - sed -e "s;^d D $rev ../../.. ..:..:.. [^ ][^ ]*;d D $rev $date $author;" SCCS/s.$file > $tmpfile - rm -f SCCS/s.$file - cp $tmpfile SCCS/s.$file - chmod 444 SCCS/s.$file - sccs admin -z $file - if [ $? != 0 ]; then - echo ERROR - sccs admin -z - exit - fi - done - rm -f $file -done - - -############################################################ -# Clean up -# -echo cleaning up... -rm -f $tmpfile $emptyfile $initialfile $sedfile $commentfile -echo =================================================== -echo " Conversion Completed Successfully" -echo =================================================== - -rm -f *,v diff --git a/gnu/usr.bin/cvs/contrib/rcslock.pl b/gnu/usr.bin/cvs/contrib/rcslock.pl deleted file mode 100644 index 01e349ff02584..0000000000000 --- a/gnu/usr.bin/cvs/contrib/rcslock.pl +++ /dev/null @@ -1,235 +0,0 @@ -#! xPERL_PATHx -# -*-Perl-*- - -# Author: John Rouillard (rouilj@cs.umb.edu) -# Supported: Yeah right. (Well what do you expect for 2 hours work?) -# Blame-to: rouilj@cs.umb.edu -# Complaints to: Anybody except Brian Berliner, he's blameless for -# this script. -# Acknowlegements: The base code for this script has been acquired -# from the log.pl script. - -# rcslock.pl - A program to prevent commits when a file to be ckecked -# in is locked in the repository. - -# There are times when you need exclusive access to a file. This -# often occurs when binaries are checked into the repository, since -# cvs's (actually rcs's) text based merging mechanism won't work. This -# script allows you to use the rcs lock mechanism (rcs -l) to make -# sure that no changes to a repository are able to be committed if -# those changes would result in a locked file being changed. - -# WARNING: -# This script will work only if locking is set to strict. -# - -# Setup: -# Add the following line to the commitinfo file: - -# ALL /local/location/for/script/lockcheck [options] - -# Where ALL is replaced by any suitable regular expression. -# Options are -v for verbose info, or -d for debugging info. -# The %s will provide the repository directory name and the names of -# all changed files. - -# Use: -# When a developer needs exclusive access to a version of a file, s/he -# should use "rcs -l" in the repository tree to lock the version they -# are working on. CVS will automagically release the lock when the -# commit is performed. - -# Method: -# An "rlog -h" is exec'ed to give info on all about to be -# committed files. This (header) information is parsed to determine -# if any locks are outstanding and what versions of the file are -# locked. This filename, version number info is used to index an -# associative array. All of the files to be committed are checked to -# see if any locks are outstanding. If locks are outstanding, the -# version number of the current file (taken from the CVS/Entries -# subdirectory) is used in the key to determine if that version is -# locked. If the file being checked in is locked by the person doing -# the checkin, the commit is allowed, but if the lock is held on that -# version of a file by another person, the commit is not allowed. - -$ext = ",v"; # The extension on your rcs files. - -$\="\n"; # I hate having to put \n's at the end of my print statements -$,=' '; # Spaces should occur between arguments to print when printed - -# turn off setgid -# -$) = $(; - -# -# parse command line arguments -# -require 'getopts.pl'; - -&Getopts("vd"); # verbose or debugging - -# Verbose is useful when debugging -$opt_v = $opt_d if defined $opt_d; - -# $files[0] is really the name of the subdirectory. -# @files = split(/ /,$ARGV[0]); -@files = @ARGV[0..$#ARGV]; -$cvsroot = $ENV{'CVSROOT'}; - -# -# get login name -# -$login = getlogin || (getpwuid($<))[0] || "nobody"; - -# -# save the current directory since we have to return here to parse the -# CVS/Entries file if a lock is found. -# -$pwd = `/bin/pwd`; -chop $pwd; - -print "Starting directory is $pwd" if defined $opt_d ; - -# -# cd to the repository directory and check on the files. -# -print "Checking directory ", $files[0] if defined $opt_v ; - -if ( $files[0] =~ /^\// ) -{ - print "Directory path is $files[0]" if defined $opt_d ; - chdir $files[0] || die "Can't change to repository directory $files[0]" ; -} -else -{ - print "Directory path is $cvsroot/$files[0]" if defined $opt_d ; - chdir ($cvsroot . "/" . $files[0]) || - die "Can't change to repository directory $files[0] in $cvsroot" ; -} - - -# Open the rlog process and apss all of the file names to that one -# process to cut down on exec overhead. This may backfire if there -# are too many files for the system buffer to handle, but if there are -# that many files, chances are that the cvs repository is not set up -# cleanly. - -print "opening rlog -h @files[1..$#files] |" if defined $opt_d; - -open( RLOG, "rlog -h @files[1..$#files] |") || die "Can't run rlog command" ; - -# Create the locks associative array. The elements in the array are -# of two types: -# -# The name of the RCS file with a value of the total number of locks found -# for that file, -# or -# -# The name of the rcs file concatenated with the version number of the lock. -# The value of this element is the name of the locker. - -# The regular expressions used to split the rcs info may have to be changed. -# The current ones work for rcs 5.6. - -$lock = 0; - -while (<RLOG>) -{ - chop; - next if /^$/; # ditch blank lines - - if ( $_ =~ /^RCS file: (.*)$/ ) - { - $curfile = $1; - next; - } - - if ( $_ =~ /^locks: strict$/ ) - { - $lock = 1 ; - next; - } - - if ( $lock ) - { - # access list: is the line immediately following the list of locks. - if ( /^access list:/ ) - { # we are done getting lock info for this file. - $lock = 0; - } - else - { # We are accumulating lock info. - - # increment the lock count - $locks{$curfile}++; - # save the info on the version that is locked. $2 is the - # version number $1 is the name of the locker. - $locks{"$curfile" . "$2"} = $1 - if /[ ]*([a-zA-Z._]*): ([0-9.]*)$/; - - print "lock by $1 found on $curfile version $2" if defined $opt_d; - - } - } -} - -# Lets go back to the starting directory and see if any locked files -# are ones we are interested in. - -chdir $pwd; - -# fo all of the file names (remember $files[0] is the directory name -foreach $i (@files[1..$#files]) -{ - if ( defined $locks{$i . $ext} ) - { # well the file has at least one lock outstanding - - # find the base version number of our file - &parse_cvs_entry($i,*entry); - - # is our version of this file locked? - if ( defined $locks{$i . $ext . $entry{"version"}} ) - { # if so, it is by us? - if ( $login ne ($by = $locks{$i . $ext . $entry{"version"}}) ) - {# crud somebody else has it locked. - $outstanding_lock++ ; - print "$by has file $i locked for version " , $entry{"version"}; - } - else - { # yeah I have it locked. - print "You have a lock on file $i for version " , $entry{"version"} - if defined $opt_v; - } - } - } -} - -exit $outstanding_lock; - - -### End of main program - -sub parse_cvs_entry -{ # a very simple minded hack at parsing an entries file. -local ( $file, *entry ) = @_; -local ( @pp ); - - -open(ENTRIES, "< CVS/Entries") || die "Can't open entries file"; - -while (<ENTRIES>) - { - if ( $_ =~ /^\/$file\// ) - { - @pp = split('/'); - - $entry{"name"} = $pp[1]; - $entry{"version"} = $pp[2]; - $entry{"dates"} = $pp[3]; - $entry{"name"} = $pp[4]; - $entry{"name"} = $pp[5]; - $entry{"sticky"} = $pp[6]; - return; - } - } -} diff --git a/gnu/usr.bin/cvs/contrib/sccs2rcs b/gnu/usr.bin/cvs/contrib/sccs2rcs deleted file mode 100644 index 654024bf3fc31..0000000000000 --- a/gnu/usr.bin/cvs/contrib/sccs2rcs +++ /dev/null @@ -1,277 +0,0 @@ -#!/bin/csh -f -# -# Sccs2rcs is a script to convert an existing SCCS -# history into an RCS history without losing any of -# the information contained therein. -# It has been tested under the following OS's: -# SunOS 3.5, 4.0.3, 4.1 -# Ultrix-32 2.0, 3.1 -# -# Things to note: -# + It will NOT delete or alter your ./SCCS history under any circumstances. -# -# + Run in a directory where ./SCCS exists and where you can -# create ./RCS -# -# + /usr/local/bin is put in front of the default path. -# (SCCS under Ultrix is set-uid sccs, bad bad bad, so -# /usr/local/bin/sccs here fixes that) -# -# + Date, time, author, comments, branches, are all preserved. -# -# + If a command fails somewhere in the middle, it bombs with -# a message -- remove what it's done so far and try again. -# "rm -rf RCS; sccs unedit `sccs tell`; sccs clean" -# There is no recovery and exit is far from graceful. -# If a particular module is hanging you up, consider -# doing it separately; move it from the current area so that -# the next run will have a better chance or working. -# Also (for the brave only) you might consider hacking -# the s-file for simpler problems: I've successfully changed -# the date of a delta to be in sync, then run "sccs admin -z" -# on the thing. -# -# + After everything finishes, ./SCCS will be moved to ./old-SCCS. -# -# This file may be copied, processed, hacked, mutilated, and -# even destroyed as long as you don't tell anyone you wrote it. -# -# Ken Cox -# Viewlogic Systems, Inc. -# kenstir@viewlogic.com -# ...!harvard!cg-atla!viewlog!kenstir -# -# Various hacks made by Brian Berliner before inclusion in CVS contrib area. -# -# $Id: sccs2rcs,v 1.1 1992/04/10 03:04:26 berliner Exp $ - - -#we'll assume the user set up the path correctly -# for the Pmax, /usr/ucb/sccs is suid sccs, what a pain -# /usr/local/bin/sccs should override /usr/ucb/sccs there -set path = (/usr/local/bin $path) - - -############################################################ -# Error checking -# -if (! -w .) then - echo "Error: ./ not writeable by you." - exit 1 -endif -if (! -d SCCS) then - echo "Error: ./SCCS directory not found." - exit 1 -endif -set edits = (`sccs tell`) -if ($#edits) then - echo "Error: $#edits file(s) out for edit...clean up before converting." - exit 1 -endif -if (-d RCS) then - echo "Warning: RCS directory exists" - if (`ls -a RCS | wc -l` > 2) then - echo "Error: RCS directory not empty - exit 1 - endif -else - mkdir RCS -endif - -sccs clean - -set logfile = /tmp/sccs2rcs_$$_log -rm -f $logfile -set tmpfile = /tmp/sccs2rcs_$$_tmp -rm -f $tmpfile -set emptyfile = /tmp/sccs2rcs_$$_empty -echo -n "" > $emptyfile -set initialfile = /tmp/sccs2rcs_$$_init -echo "Initial revision" > $initialfile -set sedfile = /tmp/sccs2rcs_$$_sed -rm -f $sedfile -set revfile = /tmp/sccs2rcs_$$_rev -rm -f $revfile - -# the quotes surround the dollar signs to fool RCS when I check in this script -set sccs_keywords = (\ - '%W%[ ]*%G%'\ - '%W%[ ]*%E%'\ - '%W%'\ - '%Z%%M%[ ]*%I%[ ]*%G%'\ - '%Z%%M%[ ]*%I%[ ]*%E%'\ - '%M%[ ]*%I%[ ]*%G%'\ - '%M%[ ]*%I%[ ]*%E%'\ - '%M%'\ - '%I%'\ - '%G%'\ - '%E%'\ - '%U%') -set rcs_keywords = (\ - '$'Id'$'\ - '$'Id'$'\ - '$'Id'$'\ - '$'SunId'$'\ - '$'SunId'$'\ - '$'Id'$'\ - '$'Id'$'\ - '$'RCSfile'$'\ - '$'Revision'$'\ - '$'Date'$'\ - '$'Date'$'\ - '') - - -############################################################ -# Get some answers from user -# -echo "" -echo "Do you want to be prompted for a description of each" -echo "file as it is checked in to RCS initially?" -echo -n "(y=prompt for description, n=null description) [y] ?" -set ans = $< -if ((_$ans == _) || (_$ans == _y) || (_$ans == _Y)) then - set nodesc = 0 -else - set nodesc = 1 -endif -echo "" -echo "The default keyword substitutions are as follows and are" -echo "applied in the order specified:" -set i = 1 -while ($i <= $#sccs_keywords) -# echo ' '\"$sccs_keywords[$i]\"' ==> '\"$rcs_keywords[$i]\" - echo " $sccs_keywords[$i] ==> $rcs_keywords[$i]" - @ i = $i + 1 -end -echo "" -echo -n "Do you want to change them [n] ?" -set ans = $< -if ((_$ans != _) && (_$ans != _n) && (_$ans != _N)) then - echo "You can't always get what you want." - echo "Edit this script file and change the variables:" - echo ' $sccs_keywords' - echo ' $rcs_keywords' -else - echo "good idea." -endif - -# create the sed script -set i = 1 -while ($i <= $#sccs_keywords) - echo "s,$sccs_keywords[$i],$rcs_keywords[$i],g" >> $sedfile - @ i = $i + 1 -end - -onintr ERROR - -############################################################ -# Loop over every s-file in SCCS dir -# -foreach sfile (SCCS/s.*) - # get rid of the "s." at the beginning of the name - set file = `echo $sfile:t | sed -e "s/^..//"` - - # work on each rev of that file in ascending order - set firsttime = 1 - sccs prs $file | grep "^D " | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile - foreach rev (`cat $revfile`) - if ($status != 0) goto ERROR - - # get file into current dir and get stats - set date = `sccs prs -r$rev $file | grep "^D " | awk '{printf("19%s %s", $3, $4); exit}'` - set author = `sccs prs -r$rev $file | grep "^D " | awk '{print $5; exit}'` - echo "" - echo "==> file $file, rev=$rev, date=$date, author=$author" - sccs edit -r$rev $file >>& $logfile - if ($status != 0) goto ERROR - echo checked out of SCCS - - # add RCS keywords in place of SCCS keywords - sed -f $sedfile $file > $tmpfile - if ($status != 0) goto ERROR - echo performed keyword substitutions - cp $tmpfile $file - - # check file into RCS - if ($firsttime) then - set firsttime = 0 - if ($nodesc) then - echo about to do ci - echo ci -f -r$rev -d"$date" -w$author -t$emptyfile $file - ci -f -r$rev -d"$date" -w$author -t$emptyfile $file < $initialfile >>& $logfile - if ($status != 0) goto ERROR - echo initial rev checked into RCS without description - else - echo "" - echo Enter a brief description of the file $file \(end w/ Ctrl-D\): - cat > $tmpfile - ci -f -r$rev -d"$date" -w$author -t$tmpfile $file < $initialfile >>& $logfile - if ($status != 0) goto ERROR - echo initial rev checked into RCS - endif - else - # get RCS lock - set lckrev = `echo $rev | sed -e 's/\.[0-9]*$//'` - if ("$lckrev" =~ [0-9]*.*) then - # need to lock the brach -- it is OK if the lock fails - rcs -l$lckrev $file >>& $logfile - else - # need to lock the trunk -- must succeed - rcs -l $file >>& $logfile - if ($status != 0) goto ERROR - endif - echo got lock - sccs prs -r$rev $file | grep "." > $tmpfile - # it's OK if grep fails here and gives status == 1 - # put the delta message in $tmpfile - ed $tmpfile >>& $logfile <<EOF -/COMMENTS -1,.d -w -q -EOF - ci -f -r$rev -d"$date" -w$author $file < $tmpfile >>& $logfile - if ($status != 0) goto ERROR - echo checked into RCS - endif - sccs unedit $file >>& $logfile - if ($status != 0) goto ERROR - end - rm -f $file -end - - -############################################################ -# Clean up -# -echo cleaning up... -mv SCCS old-SCCS -rm -f $tmpfile $emptyfile $initialfile $sedfile -echo =================================================== -echo " Conversion Completed Successfully" -echo "" -echo " SCCS history now in old-SCCS/" -echo =================================================== -set exitval = 0 -goto cleanup - -ERROR: -foreach f (`sccs tell`) - sccs unedit $f -end -echo "" -echo "" -echo Danger\! Danger\! -echo Some command exited with a non-zero exit status. -echo Log file exists in $logfile. -echo "" -echo Incomplete history in ./RCS -- remove it -echo Original unchanged history in ./SCCS -set exitval = 1 - -cleanup: -# leave log file -rm -f $tmpfile $emptyfile $initialfile $sedfile $revfile - -exit $exitval diff --git a/gnu/usr.bin/cvs/contrib/sccs2rcs.csh b/gnu/usr.bin/cvs/contrib/sccs2rcs.csh deleted file mode 100644 index 0f31893d3b245..0000000000000 --- a/gnu/usr.bin/cvs/contrib/sccs2rcs.csh +++ /dev/null @@ -1,277 +0,0 @@ -#! xCSH_PATHx -f -# -# Sccs2rcs is a script to convert an existing SCCS -# history into an RCS history without losing any of -# the information contained therein. -# It has been tested under the following OS's: -# SunOS 3.5, 4.0.3, 4.1 -# Ultrix-32 2.0, 3.1 -# -# Things to note: -# + It will NOT delete or alter your ./SCCS history under any circumstances. -# -# + Run in a directory where ./SCCS exists and where you can -# create ./RCS -# -# + /usr/local/bin is put in front of the default path. -# (SCCS under Ultrix is set-uid sccs, bad bad bad, so -# /usr/local/bin/sccs here fixes that) -# -# + Date, time, author, comments, branches, are all preserved. -# -# + If a command fails somewhere in the middle, it bombs with -# a message -- remove what it's done so far and try again. -# "rm -rf RCS; sccs unedit `sccs tell`; sccs clean" -# There is no recovery and exit is far from graceful. -# If a particular module is hanging you up, consider -# doing it separately; move it from the current area so that -# the next run will have a better chance or working. -# Also (for the brave only) you might consider hacking -# the s-file for simpler problems: I've successfully changed -# the date of a delta to be in sync, then run "sccs admin -z" -# on the thing. -# -# + After everything finishes, ./SCCS will be moved to ./old-SCCS. -# -# This file may be copied, processed, hacked, mutilated, and -# even destroyed as long as you don't tell anyone you wrote it. -# -# Ken Cox -# Viewlogic Systems, Inc. -# kenstir@viewlogic.com -# ...!harvard!cg-atla!viewlog!kenstir -# -# Various hacks made by Brian Berliner before inclusion in CVS contrib area. -# -# $Id: sccs2rcs.csh,v 1.1 1995/07/10 02:26:48 kfogel Exp $ - - -#we'll assume the user set up the path correctly -# for the Pmax, /usr/ucb/sccs is suid sccs, what a pain -# /usr/local/bin/sccs should override /usr/ucb/sccs there -set path = (/usr/local/bin $path) - - -############################################################ -# Error checking -# -if (! -w .) then - echo "Error: ./ not writeable by you." - exit 1 -endif -if (! -d SCCS) then - echo "Error: ./SCCS directory not found." - exit 1 -endif -set edits = (`sccs tell`) -if ($#edits) then - echo "Error: $#edits file(s) out for edit...clean up before converting." - exit 1 -endif -if (-d RCS) then - echo "Warning: RCS directory exists" - if (`ls -a RCS | wc -l` > 2) then - echo "Error: RCS directory not empty - exit 1 - endif -else - mkdir RCS -endif - -sccs clean - -set logfile = /tmp/sccs2rcs_$$_log -rm -f $logfile -set tmpfile = /tmp/sccs2rcs_$$_tmp -rm -f $tmpfile -set emptyfile = /tmp/sccs2rcs_$$_empty -echo -n "" > $emptyfile -set initialfile = /tmp/sccs2rcs_$$_init -echo "Initial revision" > $initialfile -set sedfile = /tmp/sccs2rcs_$$_sed -rm -f $sedfile -set revfile = /tmp/sccs2rcs_$$_rev -rm -f $revfile - -# the quotes surround the dollar signs to fool RCS when I check in this script -set sccs_keywords = (\ - '%W%[ ]*%G%'\ - '%W%[ ]*%E%'\ - '%W%'\ - '%Z%%M%[ ]*%I%[ ]*%G%'\ - '%Z%%M%[ ]*%I%[ ]*%E%'\ - '%M%[ ]*%I%[ ]*%G%'\ - '%M%[ ]*%I%[ ]*%E%'\ - '%M%'\ - '%I%'\ - '%G%'\ - '%E%'\ - '%U%') -set rcs_keywords = (\ - '$'Id'$'\ - '$'Id'$'\ - '$'Id'$'\ - '$'SunId'$'\ - '$'SunId'$'\ - '$'Id'$'\ - '$'Id'$'\ - '$'RCSfile'$'\ - '$'Revision'$'\ - '$'Date'$'\ - '$'Date'$'\ - '') - - -############################################################ -# Get some answers from user -# -echo "" -echo "Do you want to be prompted for a description of each" -echo "file as it is checked in to RCS initially?" -echo -n "(y=prompt for description, n=null description) [y] ?" -set ans = $< -if ((_$ans == _) || (_$ans == _y) || (_$ans == _Y)) then - set nodesc = 0 -else - set nodesc = 1 -endif -echo "" -echo "The default keyword substitutions are as follows and are" -echo "applied in the order specified:" -set i = 1 -while ($i <= $#sccs_keywords) -# echo ' '\"$sccs_keywords[$i]\"' ==> '\"$rcs_keywords[$i]\" - echo " $sccs_keywords[$i] ==> $rcs_keywords[$i]" - @ i = $i + 1 -end -echo "" -echo -n "Do you want to change them [n] ?" -set ans = $< -if ((_$ans != _) && (_$ans != _n) && (_$ans != _N)) then - echo "You can't always get what you want." - echo "Edit this script file and change the variables:" - echo ' $sccs_keywords' - echo ' $rcs_keywords' -else - echo "good idea." -endif - -# create the sed script -set i = 1 -while ($i <= $#sccs_keywords) - echo "s,$sccs_keywords[$i],$rcs_keywords[$i],g" >> $sedfile - @ i = $i + 1 -end - -onintr ERROR - -############################################################ -# Loop over every s-file in SCCS dir -# -foreach sfile (SCCS/s.*) - # get rid of the "s." at the beginning of the name - set file = `echo $sfile:t | sed -e "s/^..//"` - - # work on each rev of that file in ascending order - set firsttime = 1 - sccs prs $file | grep "^D " | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile - foreach rev (`cat $revfile`) - if ($status != 0) goto ERROR - - # get file into current dir and get stats - set date = `sccs prs -r$rev $file | grep "^D " | awk '{printf("19%s %s", $3, $4); exit}'` - set author = `sccs prs -r$rev $file | grep "^D " | awk '{print $5; exit}'` - echo "" - echo "==> file $file, rev=$rev, date=$date, author=$author" - sccs edit -r$rev $file >>& $logfile - if ($status != 0) goto ERROR - echo checked out of SCCS - - # add RCS keywords in place of SCCS keywords - sed -f $sedfile $file > $tmpfile - if ($status != 0) goto ERROR - echo performed keyword substitutions - cp $tmpfile $file - - # check file into RCS - if ($firsttime) then - set firsttime = 0 - if ($nodesc) then - echo about to do ci - echo ci -f -r$rev -d"$date" -w$author -t$emptyfile $file - ci -f -r$rev -d"$date" -w$author -t$emptyfile $file < $initialfile >>& $logfile - if ($status != 0) goto ERROR - echo initial rev checked into RCS without description - else - echo "" - echo Enter a brief description of the file $file \(end w/ Ctrl-D\): - cat > $tmpfile - ci -f -r$rev -d"$date" -w$author -t$tmpfile $file < $initialfile >>& $logfile - if ($status != 0) goto ERROR - echo initial rev checked into RCS - endif - else - # get RCS lock - set lckrev = `echo $rev | sed -e 's/\.[0-9]*$//'` - if ("$lckrev" =~ [0-9]*.*) then - # need to lock the brach -- it is OK if the lock fails - rcs -l$lckrev $file >>& $logfile - else - # need to lock the trunk -- must succeed - rcs -l $file >>& $logfile - if ($status != 0) goto ERROR - endif - echo got lock - sccs prs -r$rev $file | grep "." > $tmpfile - # it's OK if grep fails here and gives status == 1 - # put the delta message in $tmpfile - ed $tmpfile >>& $logfile <<EOF -/COMMENTS -1,.d -w -q -EOF - ci -f -r$rev -d"$date" -w$author $file < $tmpfile >>& $logfile - if ($status != 0) goto ERROR - echo checked into RCS - endif - sccs unedit $file >>& $logfile - if ($status != 0) goto ERROR - end - rm -f $file -end - - -############################################################ -# Clean up -# -echo cleaning up... -mv SCCS old-SCCS -rm -f $tmpfile $emptyfile $initialfile $sedfile -echo =================================================== -echo " Conversion Completed Successfully" -echo "" -echo " SCCS history now in old-SCCS/" -echo =================================================== -set exitval = 0 -goto cleanup - -ERROR: -foreach f (`sccs tell`) - sccs unedit $f -end -echo "" -echo "" -echo Danger\! Danger\! -echo Some command exited with a non-zero exit status. -echo Log file exists in $logfile. -echo "" -echo Incomplete history in ./RCS -- remove it -echo Original unchanged history in ./SCCS -set exitval = 1 - -cleanup: -# leave log file -rm -f $tmpfile $emptyfile $initialfile $sedfile $revfile - -exit $exitval |