Annotation of 43BSD/contrib/rcs/src/rcsmerge.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *                       rcsmerge operation
                      3:  */
                      4:  static char rcsid[]=
                      5:  "$Header: /usr/wft/RCS/SRC/RCS/rcsmerge.c,v 3.3 82/12/24 15:29:00 wft Exp $ Purdue CS";
                      6: /*****************************************************************************
                      7:  *                       join 2 revisions with respect to a third
                      8:  *****************************************************************************
                      9:  *
                     10:  * Copyright (C) 1982 by Walter F. Tichy
                     11:  *                       Purdue University
                     12:  *                       Computer Science Department
                     13:  *                       West Lafayette, IN 47907
                     14:  *
                     15:  * All rights reserved. No part of this software may be sold or distributed
                     16:  * in any form or by any means without the prior written permission of the
                     17:  * author.
                     18:  * Report problems and direct all inquiries to Tichy@purdue (ARPA net).
                     19:  */
                     20: 
                     21: 
                     22: /* $Log:       rcsmerge.c,v $
                     23:  * Revision 3.3  82/12/24  15:29:00  wft
                     24:  * Added call to catchsig().
                     25:  * 
                     26:  * Revision 3.2  82/12/10  21:32:02  wft
                     27:  * Replaced getdelta() with gettree(); improved error messages.
                     28:  *
                     29:  * Revision 3.1  82/11/28  19:27:44  wft
                     30:  * Initial revision.
                     31:  *
                     32:  */
                     33: #include "rcsbase.h"
                     34: static char rcsbaseid[] = RCSBASE;
                     35: 
                     36: extern int  cleanup();              /* cleanup after signals                */
                     37: extern char * mktempfile();         /*temporary file name generator         */
                     38: extern struct hshentry * genrevs(); /*generate delta numbers                */
                     39: extern int  nerror;                 /*counter for errors                    */
                     40: 
                     41: char *RCSfilename;
                     42: char *workfilename;
                     43: char * temp1file, * temp2file;
                     44: 
                     45: main (argc, argv)
                     46: int argc; char **argv;
                     47: {
                     48:         char * cmdusage;
                     49:         char command[NCPPN+revlength+40];
                     50:         int  revnums; /* counter for revision numbers given */
                     51:         int tostdout;
                     52:         char * rev1, * rev2; /*revision numbers*/
                     53:         char numericrev[revlength];   /* holds expanded revision number     */
                     54:         struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
                     55:         struct hshentry * target;
                     56: 
                     57:         catchints();
                     58:         cmdid = "rcsmerge";
                     59:         cmdusage = "command format:\n    rcsmerge -p -rrev1 -rrev2 file\n    rcsmerge -p -rrev1 file";
                     60:         revnums=0;tostdout=false;
                     61: 
                     62:         while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
                     63:                 switch ((*argv)[1]) {
                     64:                 case 'p':
                     65:                         tostdout=true;
                     66:                         /* falls into -r */
                     67:                 case 'r':
                     68:                         if ((*argv)[2]!='\0') {
                     69:                             if (revnums==0) {
                     70:                                     rev1= *argv+2; revnums=1;
                     71:                             } elif (revnums==1) {
                     72:                                     rev2= *argv+2; revnums=2;
                     73:                             } else {
                     74:                                     faterror("too many revision numbers");
                     75:                             }
                     76:                         } /* do nothing for empty -r or -p */
                     77:                         break;
                     78: 
                     79:                 default:
                     80:                         faterror("unknown option: %s\n%s", *argv,cmdusage);
                     81:                 };
                     82:         } /* end of option processing */
                     83: 
                     84:         if (argc<1) faterror("No input file\n%s",cmdusage);
                     85:         if (revnums<1) faterror("no base revision number given");
                     86: 
                     87:         /* now handle all filenames */
                     88: 
                     89:         if (pairfilenames(argc,argv,true,false)==1) {
                     90: 
                     91:                 if (argc>2 || (argc==2&&argv[1]!=nil))
                     92:                         warn("too many arguments");
                     93:                 diagnose("RCS file: %s",RCSfilename);
                     94:                 if (!(access(workfilename,4)==0))
                     95:                         faterror("Can't open %s",workfilename);
                     96: 
                     97:                 if (!trysema(RCSfilename,false)) goto end; /* give up */
                     98: 
                     99:                 gettree();  /* reads in the delta tree */
                    100: 
                    101:                 if (Head==nil) faterror("no revisions present");
                    102: 
                    103: 
                    104:                 if (!expandsym(rev1,numericrev)) goto end;
                    105:                 if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) goto end;
                    106:                 rev1=target->num;
                    107:                 if (revnums==1) rev2=Head->num; /* default for rev2 */
                    108:                 if (!expandsym(rev2,numericrev)) goto end;
                    109:                 if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) goto end;
                    110:                 rev2=target->num;
                    111: 
                    112:                 temp1file=mktempfile("/tmp/",TMPFILE1);
                    113:                 temp2file=mktempfile("/tmp/",TMPFILE2);
                    114: 
                    115:                 diagnose("retrieving revision %s",rev1);
                    116:                 sprintf(command,"%s/co -q -p%s %s > %s\n",
                    117:                         TARGETDIR,rev1,RCSfilename,temp1file);
                    118:                 if (system(command)){
                    119:                         faterror("co failed");
                    120:                 }
                    121:                 diagnose("retrieving revision %s",rev2);
                    122:                 sprintf(command,"%s/co -q -p%s %s > %s\n",
                    123:                          TARGETDIR,rev2,RCSfilename,temp2file);
                    124:                 if (system(command)){
                    125:                         faterror("co failed");
                    126:                 }
                    127:                 diagnose("Merging differences between %s and %s into %s%s",
                    128:                          rev1, rev2, workfilename,
                    129:                          tostdout?"; result to stdout":"");
                    130: 
                    131:                 sprintf(command,"%s %s%s %s %s %s %s\n",MERGE,tostdout?"-p ":"",
                    132:                         workfilename,temp1file,temp2file,workfilename,rev2);
                    133:                 if (system(command)) {
                    134:                         faterror("merge failed");
                    135:                 }
                    136:         }
                    137: 
                    138: end:
                    139:         cleanup();
                    140:         exit(nerror!=0);
                    141: 
                    142: }
                    143: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.