1/* 2 * Copyright (c) 1992, Brian Berliner and Jeff Polk 3 * 4 * You may distribute under the terms of the GNU General Public License as 5 * specified in the README file that comes with the CVS source distribution. 6 * 7 * General recursion handler 8 * |
9 * $FreeBSD: head/contrib/cvs/src/recurse.c 107487 2002-12-02 03:17:49Z peter $ |
10 */ 11 12#include "cvs.h" 13#include "savecwd.h" 14#include "fileattr.h" 15#include "edit.h" 16 17static int do_dir_proc PROTO((Node * p, void *closure)); --- 11 unchanged lines hidden (view full) --- 29 FILEPROC fileproc; 30 FILESDONEPROC filesdoneproc; 31 DIRENTPROC direntproc; 32 DIRLEAVEPROC dirleaveproc; 33 void *callerdat; 34 Dtype flags; 35 int which; 36 int aflag; |
37 int locktype; |
38 int dosrcs; 39}; 40 41static int do_recursion PROTO ((struct recursion_frame *frame)); 42 43/* I am half tempted to shove a struct file_info * into the struct 44 recursion_frame (but then we would need to modify or create a 45 recursion_frame for each file), or shove a struct recursion_frame * --- 16 unchanged lines hidden (view full) --- 62 63/* Start a recursive command. 64 65 Command line arguments (ARGC, ARGV) dictate the directories and 66 files on which we operate. In the special case of no arguments, we 67 default to ".". */ 68int 69start_recursion (fileproc, filesdoneproc, direntproc, dirleaveproc, callerdat, |
70 argc, argv, local, which, aflag, locktype, |
71 update_preload, dosrcs) 72 FILEPROC fileproc; 73 FILESDONEPROC filesdoneproc; 74 DIRENTPROC direntproc; 75 DIRLEAVEPROC dirleaveproc; 76 void *callerdat; 77 78 int argc; --- 19 unchanged lines hidden (view full) --- 98 but we recurse into a directory if it is exists in the working 99 directory *or* it exists in the repository. If a directory 100 does not exist in the working directory, the direntproc must 101 either tell us to skip it (R_SKIP_ALL), or must create it (I 102 think those are the only two cases). */ 103 int which; 104 105 int aflag; |
106 int locktype; |
107 char *update_preload; 108 int dosrcs; 109{ 110 int i, err = 0; 111#ifdef CLIENT_SUPPORT 112 List *args_to_send_when_finished = NULL; 113#endif 114 List *files_by_dir = NULL; 115 struct recursion_frame frame; 116 117 frame.fileproc = fileproc; 118 frame.filesdoneproc = filesdoneproc; 119 frame.direntproc = direntproc; 120 frame.dirleaveproc = dirleaveproc; 121 frame.callerdat = callerdat; 122 frame.flags = local ? R_SKIP_DIRS : R_PROCESS; 123 frame.which = which; 124 frame.aflag = aflag; |
125 frame.locktype = locktype; |
126 frame.dosrcs = dosrcs; 127 128 expand_wild (argc, argv, &argc, &argv); 129 130 if (update_preload == NULL) 131 update_dir = xstrdup (""); 132 else 133 update_dir = xstrdup (update_preload); --- 366 unchanged lines hidden (view full) --- 500static int 501do_recursion (frame) 502 struct recursion_frame *frame; 503{ 504 int err = 0; 505 int dodoneproc = 1; 506 char *srepository; 507 List *entries = NULL; |
508 int locktype; |
509 int process_this_directory = 1; 510 511 /* do nothing if told */ 512 if (frame->flags == R_SKIP_ALL) 513 return (0); 514 |
515 locktype = noexec ? LOCK_NONE : frame->locktype; |
516 517 /* The fact that locks are not active here is what makes us fail to have 518 the 519 520 If someone commits some changes in one cvs command, 521 then an update by someone else will either get all the 522 changes, or none of them. 523 --- 21 unchanged lines hidden (view full) --- 545 implemented in Jan 96, are probably acceptable; improvements 546 would be possible such as branch attributes which are in 547 separate files for each branch). */ 548 549#if defined(SERVER_SUPPORT) && defined(SERVER_FLOWCONTROL) 550 /* 551 * Now would be a good time to check to see if we need to stop 552 * generating data, to give the buffers a chance to drain to the |
553 * remote client. We should not have locks active at this point, 554 * but if there are writelocks around, we cannot pause here. */ 555 if (server_active && locktype != LOCK_NONE) |
556 server_pause_check(); 557#endif 558 559 /* Check the value in CVSADM_ROOT and see if it's in the list. If 560 not, add it to our lists of CVS/Root directories and do not 561 process the files in this directory. Otherwise, continue as 562 usual. THIS_ROOT might be NULL if we're doing an initial 563 checkout -- check before using it. The default should be that --- 136 unchanged lines hidden (view full) --- 700 701 /* process the files (if any) */ 702 if (process_this_directory && filelist != NULL && frame->fileproc) 703 { 704 struct file_info finfo_struct; 705 struct frame_and_file frfile; 706 707 /* read lock it if necessary */ |
708 if (repository) 709 { 710 if (locktype == LOCK_READ) 711 { 712 if (Reader_Lock (repository) != 0) 713 error (1, 0, "read lock failed - giving up"); 714 } 715 else if (locktype == LOCK_WRITE) 716 lock_dir_for_write (repository); 717 } |
718 719#ifdef CLIENT_SUPPORT 720 /* For the server, we handle notifications in a completely different 721 place (server_notify). For local, we can't do them here--we don't 722 have writelocks in place, and there is no way to get writelocks 723 here. */ 724 if (current_parsed_root->isremote) 725 notify_check (repository, update_dir); --- 6 unchanged lines hidden (view full) --- 732 733 frfile.finfo = &finfo_struct; 734 frfile.frame = frame; 735 736 /* process the files */ 737 err += walklist (filelist, do_file_proc, &frfile); 738 739 /* unlock it */ |
740 if (locktype != LOCK_NONE) |
741 Lock_Cleanup (); 742 743 /* clean up */ 744 dellist (&filelist); 745 } 746 747 /* call-back files done proc (if any) */ 748 if (process_this_directory && dodoneproc && frame->filesdoneproc != NULL) --- 478 unchanged lines hidden --- |