|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.