summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/rcs/rcsmerge
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1995-10-28 21:50:58 +0000
committerpeter <peter@FreeBSD.org>1995-10-28 21:50:58 +0000
commit822bceb624e3740412b90941feb1158d82f50edc (patch)
tree5072ccf03f140b698e07703cd04f14e6e4d75591 /gnu/usr.bin/rcs/rcsmerge
parent9d7e3d8dc0cccad8e42e4822ffa52ee28b6f7d2f (diff)
downloadFreeBSD-src-822bceb624e3740412b90941feb1158d82f50edc.zip
FreeBSD-src-822bceb624e3740412b90941feb1158d82f50edc.tar.gz
First part of import conflict merge from rcs-5.7 import.
All those $Log$ entries, combined with the whitespace changes are a real pain. I'm committing this now, before it's completely finished to get it compiling and working again ASAP. Some of the FreeBSD specific features are not working in this commit yet (mainly rlog stuff and $FreeBSD$ support)
Diffstat (limited to 'gnu/usr.bin/rcs/rcsmerge')
-rw-r--r--gnu/usr.bin/rcs/rcsmerge/rcsmerge.c202
1 files changed, 117 insertions, 85 deletions
diff --git a/gnu/usr.bin/rcs/rcsmerge/rcsmerge.c b/gnu/usr.bin/rcs/rcsmerge/rcsmerge.c
index f5c46a8..30f4a8b 100644
--- a/gnu/usr.bin/rcs/rcsmerge/rcsmerge.c
+++ b/gnu/usr.bin/rcs/rcsmerge/rcsmerge.c
@@ -1,13 +1,7 @@
-/*
- * rcsmerge operation
- */
-/*****************************************************************************
- * join 2 revisions with respect to a third
- *****************************************************************************
- */
+/* Merge RCS revisions. */
-/* Copyright (C) 1982, 1988, 1989 Walter Tichy
- Copyright 1990, 1991 by Paul Eggert
+/* Copyright 1982, 1988, 1989 Walter Tichy
+ Copyright 1990, 1991, 1992, 1993, 1994, 1995 Paul Eggert
Distributed under license by the Free Software Foundation, Inc.
This file is part of RCS.
@@ -23,8 +17,9 @@ 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 RCS; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+along with RCS; see the file COPYING.
+If not, write to the Free Software Foundation,
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Report problems and direct all questions to:
@@ -32,11 +27,33 @@ Report problems and direct all questions to:
*/
-
-
-/* $Log: rcsmerge.c,v $
- * Revision 1.1.1.1 1993/06/18 04:22:16 jkh
- * Updated GNU utilities
+/*
+ * $Log: rcsmerge.c,v $
+ * Revision 5.15 1995/06/16 06:19:24 eggert
+ * Update FSF address.
+ *
+ * Revision 5.14 1995/06/01 16:23:43 eggert
+ * (main): Report an error if -kb, so don't worry about binary stdout.
+ * Punctuate messages properly. Rewrite to avoid `goto end'.
+ *
+ * Revision 5.13 1994/03/17 14:05:48 eggert
+ * Specify subprocess input via file descriptor, not file name. Remove lint.
+ *
+ * Revision 5.12 1993/11/09 17:40:15 eggert
+ * -V now prints version on stdout and exits. Don't print usage twice.
+ *
+ * Revision 5.11 1993/11/03 17:42:27 eggert
+ * Add -A, -E, -e, -z. Ignore -T. Allow up to three file labels.
+ * Pass -Vn to `co'. Pass unexpanded revision name to `co', so that Name works.
+ *
+ * Revision 5.10 1992/07/28 16:12:44 eggert
+ * Add -V.
+ *
+ * Revision 5.9 1992/01/24 18:44:19 eggert
+ * lint -> RCS_lint
+ *
+ * Revision 5.8 1992/01/06 02:42:34 eggert
+ * Update usage string.
*
* Revision 5.7 1991/11/20 17:58:09 eggert
* Don't Iopen(f, "r+"); it's not portable.
@@ -101,17 +118,17 @@ Report problems and direct all questions to:
static char const co[] = CO;
-mainProg(rcsmergeId, "rcsmerge", "$Id: rcsmerge.c,v 1.1.1.1 1993/06/18 04:22:16 jkh Exp $")
+mainProg(rcsmergeId, "rcsmerge", "$Id: rcsmerge.c,v 5.15 1995/06/16 06:19:24 eggert Exp $")
{
static char const cmdusage[] =
- "\nrcsmerge usage: rcsmerge -rrev1 [-rrev2] [-p] [-Vn] file";
+ "\nrcsmerge usage: rcsmerge -rrev1 [-rrev2] -ksubst -{pq}[rev] -Vn -xsuff -zzone file";
static char const quietarg[] = "-q";
register int i;
char *a, **newargv;
char const *arg[3];
- char const *rev[2]; /*revision numbers*/
- char const *expandarg, *versionarg;
+ char const *rev[3], *xrev[3]; /*revision numbers*/
+ char const *edarg, *expandarg, *suffixarg, *versionarg, *zonearg;
int tostdout;
int status;
RILE *workptr;
@@ -122,10 +139,10 @@ mainProg(rcsmergeId, "rcsmerge", "$Id: rcsmerge.c,v 1.1.1.1 1993/06/18 04:22:16
bufautobegin(&commarg);
bufautobegin(&numericrev);
- rev[0] = rev[1] = nil;
+ edarg = rev[1] = rev[2] = 0;
status = 0; /* Keep lint happy. */
tostdout = false;
- expandarg = versionarg = quietarg; /* i.e. a no-op */
+ expandarg = suffixarg = versionarg = zonearg = quietarg; /* no-op */
suffixes = X_DEFAULT;
argc = getRCSINIT(argc, argv, &newargv);
@@ -143,16 +160,33 @@ mainProg(rcsmergeId, "rcsmerge", "$Id: rcsmerge.c,v 1.1.1.1 1993/06/18 04:22:16
break;
/* falls into -r */
case 'r':
- if (!rev[0])
- rev[0] = a;
- else if (!rev[1])
+ if (!rev[1])
rev[1] = a;
+ else if (!rev[2])
+ rev[2] = a;
else
- faterror("too many revision numbers");
+ error("too many revision numbers");
break;
+
+ case 'A': case 'E': case 'e':
+ if (*a)
+ goto unknown;
+ edarg = *argv;
+ break;
+
case 'x':
+ suffixarg = *argv;
suffixes = a;
break;
+ case 'z':
+ zonearg = *argv;
+ zone_set(a);
+ break;
+ case 'T':
+ /* Ignore -T, so that RCSINIT can contain -T. */
+ if (*a)
+ goto unknown;
+ break;
case 'V':
versionarg = *argv;
setRCSversion(versionarg);
@@ -164,90 +198,88 @@ mainProg(rcsmergeId, "rcsmerge", "$Id: rcsmerge.c,v 1.1.1.1 1993/06/18 04:22:16
break;
/* fall into */
default:
- faterror("unknown option: %s%s", *argv, cmdusage);
+ unknown:
+ error("unknown option: %s%s", *argv, cmdusage);
};
} /* end of option processing */
- if (argc<1) faterror("no input file%s", cmdusage);
- if (!rev[0]) faterror("no base revision number given");
+ if (!rev[1]) faterror("no base revision number given");
- /* now handle all filenames */
+ /* Now handle all pathnames. */
- if (0 < pairfilenames(argc, argv, rcsreadopen, true, false)) {
+ if (!nerror) {
+ if (argc < 1)
+ faterror("no input file%s", cmdusage);
+ if (0 < pairnames(argc, argv, rcsreadopen, true, false)) {
- if (argc>2 || (argc==2&&argv[1]!=nil))
- warn("too many arguments");
- diagnose("RCS file: %s\n", RCSfilename);
- if (!(workptr = Iopen(workfilename,
- FOPEN_R_WORK,
- (struct stat*)0
- )))
- efaterror(workfilename);
+ if (argc>2 || (argc==2 && argv[1]))
+ warn("excess arguments ignored");
+ if (Expand == BINARY_EXPAND)
+ workerror("merging binary files");
+ diagnose("RCS file: %s\n", RCSname);
+ if (!(workptr = Iopen(workname, FOPEN_R_WORK, (struct stat*)0)))
+ efaterror(workname);
gettree(); /* reads in the delta tree */
- if (Head==nil) faterror("no revisions present");
+ if (!Head) rcsfaterror("no revisions present");
- if (!*rev[0])
- rev[0] = Dbranch ? Dbranch : Head->num;
- if (!fexpandsym(rev[0], &numericrev, workptr))
- goto end;
- if (!(target=genrevs(numericrev.string, (char *)nil, (char *)nil, (char *)nil,&gendeltas))) goto end;
- rev[0] = target->num;
- if (!rev[1] || !*rev[1])
+ if (!*rev[1])
rev[1] = Dbranch ? Dbranch : Head->num;
- if (!fexpandsym(rev[1], &numericrev, workptr))
- goto end;
- if (!(target=genrevs(numericrev.string, (char *)nil, (char *)nil, (char *)nil,&gendeltas))) goto end;
- rev[1] = target->num;
-
- if (strcmp(rev[0],rev[1]) == 0) {
- if (tostdout) {
- FILE *o;
-# if text_equals_binary_stdio || text_work_stdio
- o = stdout;
-# else
- if (!(o=fdopen(STDOUT_FILENO,FOPEN_W_WORK)))
- efaterror("stdout");
-# endif
- fastcopy(workptr,o);
- Ofclose(o);
- }
- goto end;
- }
- Izclose(&workptr);
+ if (fexpandsym(rev[1], &numericrev, workptr)
+ && (target=genrevs(numericrev.string, (char *)0, (char *)0, (char*)0, &gendeltas))
+ ) {
+ xrev[1] = target->num;
+ if (!rev[2] || !*rev[2])
+ rev[2] = Dbranch ? Dbranch : Head->num;
+ if (fexpandsym(rev[2], &numericrev, workptr)
+ && (target=genrevs(numericrev.string, (char *)0, (char *)0, (char *)0, &gendeltas))
+ ) {
+ xrev[2] = target->num;
+
+ if (strcmp(xrev[1],xrev[2]) == 0) {
+ if (tostdout) {
+ fastcopy(workptr, stdout);
+ Ofclose(stdout);
+ }
+ } else {
+ Izclose(&workptr);
- for (i=0; i<2; i++) {
- diagnose("retrieving revision %s\n", rev[i]);
+ for (i=1; i<=2; i++) {
+ diagnose("retrieving revision %s\n", xrev[i]);
bufscpy(&commarg, "-p");
- bufscat(&commarg, rev[i]);
+ bufscat(&commarg, rev[i]); /* not xrev[i], for $Name's sake */
if (run(
- (char*)0,
+ -1,
/* Do not collide with merger.c maketemp(). */
- arg[i+1] = maketemp(i+3),
- co, quietarg, commarg.string, expandarg,
- versionarg, RCSfilename, (char*)0
+ arg[i] = maketemp(i+2),
+ co, quietarg, commarg.string,
+ expandarg, suffixarg, versionarg, zonearg,
+ RCSname, (char*)0
))
- faterror("co failed");
+ rcsfaterror("co failed");
+ }
+ diagnose("Merging differences between %s and %s into %s%s\n",
+ xrev[1], xrev[2], workname,
+ tostdout?"; result to stdout":"");
+
+ arg[0] = xrev[0] = workname;
+ status = merge(tostdout, edarg, xrev, arg);
+ }
+ }
}
- diagnose("Merging differences between %s and %s into %s%s\n",
- rev[0], rev[1], workfilename,
- tostdout?"; result to stdout":"");
- arg[0] = rev[0] = workfilename;
- status = merge(tostdout, rev, arg);
+ Izclose(&workptr);
+ }
}
-
-end:
- Izclose(&workptr);
tempunlink();
exitmain(nerror ? DIFF_TROUBLE : status);
}
-#if lint
+#if RCS_lint
# define exiterr rmergeExit
#endif
- exiting void
+ void
exiterr()
{
tempunlink();
OpenPOWER on IntegriCloud