|
|
1.1 root 1: /*
2: * RCS rcsclean operation
3: */
4:
5: static char rcsid[]=
6: "$Header $ Purdue CS";
7: /*****************************************************************************
8: * remove unneded working files
9: *****************************************************************************
10: */
11:
12: /* Copyright (C) 1982, 1988, 1989 Walter Tichy
13: * All rights reserved.
14: *
15: * Redistribution and use in source and binary forms are permitted
16: * provided that the above copyright notice and this paragraph are
17: * duplicated in all such forms and that any documentation,
18: * advertising materials, and other materials related to such
19: * distribution and use acknowledge that the software was developed
20: * by Walter Tichy.
21: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
22: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
23: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
24: *
25: * Report all problems and direct all questions to:
26: * [email protected]
27: *
28:
29:
30:
31:
32:
33:
34:
35: */
36:
37:
38:
39:
40: /* $Log: rcsclean.c,v $
41: * Revision 4.4 89/05/01 15:12:21 narten
42: * changed copyright header to reflect current distribution rules
43: *
44: * Revision 4.3 88/11/08 15:59:54 narten
45: * removed reference to TARGETDIR
46: *
47: * Revision 4.2 87/10/18 10:30:43 narten
48: * Updating version numbers. Changes relative to 1.1 are actually
49: * relative to 4.1
50: *
51: * Revision 1.2 87/09/24 13:59:13 narten
52: * Sources now pass through lint (if you ignore printf/sprintf/fprintf
53: * warnings)
54: *
55: * Revision 1.1 84/01/23 14:50:16 kcs
56: * Initial revision
57: *
58: * Revision 4.1 83/12/15 12:26:18 wft
59: * Initial revision.
60: *
61: */
62: #include "rcsbase.h"
63: #define ERRCODE 2 /*error code for exit status */
64: static char rcsbaseid[] = RCSBASE;
65:
66: extern int cleanup(); /* cleanup after signals */
67: extern char * mktempfile(); /*temporary file name generator */
68: extern int fterror(); /*forward for special fatal error func. */
69: extern struct hshentry * genrevs(); /*generate delta numbers */
70: extern int nerror; /*counter for errors */
71: extern int quietflag; /*suppresses diagnostics */
72: extern FILE * finptr; /* RCS input file */
73: extern FILE * fopen();
74:
75: char *RCSfilename;
76: char *workfilename;
77: char * tempfile;
78: FILE * file1, * file2; /*file descriptors for comparison */
79:
80: main (argc, argv)
81: int argc; char **argv;
82: {
83: char * cmdusage;
84: char command[NCPPN+revlength+40];
85: char * rev; /* revision number from command line */
86: char numericrev[revlength]; /* holds expanded revision number */
87: int revnums; /* number of -r options */
88: struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
89: struct hshentry * target;
90: int filecounter;
91: register int c1; /* reading input */
92: int result; /* result of comparison */
93: int pairresult; /* reulst of pairfilenames */
94:
95: catchints();
96: cmdid = "rcsclean";
97: cmdusage = "command format:\n rcsclean [-rrev] file";
98: filecounter=revnums=0;
99: quietflag=true; /* default no diagnostics */
100: while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
101: switch ((*argv)[1]) {
102: case 'r':
103: revno: if ((*argv)[2]!='\0') {
104: if (revnums==0) {
105: rev= *argv+2; revnums=1;
106: } else {
107: fterror("too many revision numbers");
108: }
109: } /* do nothing for empty -r */
110: break;
111: case 'D': /* debug option */
112: quietflag = false;
113: break;
114:
115: default:
116: fterror("unknown option: %s\n%s", *argv,cmdusage);
117: };
118: } /* end of option processing */
119:
120: if (argc<1) fterror("No input file\n%s",cmdusage);
121:
122: /* now handle all filenames */
123: do {
124: finptr=NULL;
125: pairresult=pairfilenames(argc,argv,false,false);
126:
127: if (pairresult==0) continue; /* error */
128: if (!(access(workfilename,4)==0)) {
129: diagnose("Can't open %s",workfilename);
130: continue;
131: } elsif (pairresult == -1) {
132: warn("Can't find RCS file for %s",workfilename);
133: continue;
134: }
135: diagnose("RCS file: %s",RCSfilename);
136: if (!trysema(RCSfilename,false)) continue; /* give up */
137:
138:
139: gettree(); /* reads in the delta tree */
140:
141: if (Head==nil) {
142: error("no revisions present");
143: continue;
144: }
145: if (revnums==0)
146: rev=(Dbranch!=nil?Dbranch->num:Head->num); /* default rev1 */
147:
148: if (!expandsym(rev,numericrev)) continue;
149: if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) continue;
150:
151: tempfile=mktempfile("/tmp/",TMPFILE1);
152: diagnose("retrieving revision %s",target->num);
153: VOID sprintf(command,"%s -q -p%s %s > %s\n",
154: CO ,target->num,RCSfilename,tempfile);
155: if (system(command)){
156: error("co failed");
157: continue;
158: }
159: /* now do comparison */
160: if ((file1=fopen(tempfile,"r"))==NULL) {
161: error("Can't open checked out file %s",tempfile);
162: continue;
163: }
164: if ((file2=fopen(workfilename,"r"))==NULL) {
165: error("Can't open %s",workfilename);
166: continue;
167: }
168: result=1;
169: while ((c1=getc(file1))==getc(file2)) {
170: if (c1==EOF) {
171: /* identical files; can remove working file */
172: result=0;
173: diagnose("files identical; %s removed",workfilename);
174: if (unlink(workfilename)!=0) {
175: error("Can't unlink %s",workfilename);
176: }
177: break;
178: }
179: }
180: fclose(file1); fclose(file2);
181:
182: if (result==1) diagnose ("files different");
183:
184:
185: } while (cleanup(),
186: ++argv, --argc >=1);
187:
188:
189: if (nerror>0) {
190: exit(ERRCODE);
191: } else {
192: exit(result);
193: }
194:
195: }
196:
197:
198: fterror(e, e1, e2)
199: char * e, * e1, * e2;
200: /* prints error message and terminates program with ERRCODE */
201: { nerror++;
202: VOID fprintf(stderr,"%s error: ",cmdid);
203: VOID fprintf(stderr,e, e1, e2);
204: VOID fprintf(stderr,"\n%s aborted\n",cmdid);
205: VOID cleanup();
206: exit(ERRCODE);
207: }
208:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.