ftp.nice.ch/pub/next/unix/developer/rcvs.0.7.9.s.tar.gz#/src/rcvs_folder.c

This is rcvs_folder.c in view mode; [Download] [Up]

 /*
 *    Copyright (c) 1992, Brian Berliner and Jeff Polk
 *    Copyright (c) 1989-1992, Brian Berliner
 *
 *    You may distribute under the terms of the GNU General Public License
 *    as specified in the README file that comes with the CVS 1.3 kit.
 */

#include "cvs.h"
#include "rcvs.h"
#include "patchlevel.h"

static struct cmd *cm;

#if __STDC__
int rcvs_add (int argc, char **argv);
int rcvs_checkout (int argc, char **argv);
int rcvs_export (int argc, char **argv);
int rcvs_history (int argc, char **argv);
int rcvs_import (int argc, char **argv);
int rcvs_need_folder (int argc, char **argv);
int rcvs_rdiff (int argc, char **argv);
int rcvs_remove (int argc, char **argv);
int rcvs_rtag (int argc, char **argv);
int rcvs_tag (int argc, char **argv);
int rcvs_do_folder (int argc, char **argv);
char *rcvs_get_repos (char *dir, char **Id, char **Repository);
#else
int rcvs_add ();
int rcvs_checkout ();
int rcvs_export ();
int rcvs_history ();
int rcvs_import ();
int rcvs_need_folder ();
int rcvs_rdiff ();
int rcvs_remove ();
int rcvs_rtag ();
int rcvs_tag ();
int rcvs_do_folder ();
char *rcvs_get_repos ();
#endif   		     /* __STDC__ */

struct cmd
{
    char *fullname;    
    char *nick1;       
    char *nick2;       
    int (*func) ();    
};

static char msg1[] = "clone   ----> folder";
static char msg2[] = "clone   ----> stdout";
static char msg3[] = "clone   <---- folder";
static char msg4[] = "clone   <---- tag";
static char msg5[] = "clone   <---- changes";
static char msg6[] = "clone   <---- changes";
static char msg7[] = "cvsroot ----> stdout";
static char msg8[] = "./CVS   <---- changes";
static char msg9[] = "cvsroot <---- tag";

/* struct to describe the behavior of a command with following fields:
 *
 * fullname:   name of command
 * sync_name:  name of command to use for sync
 * msg:        message to be printed
 * func:       which function to be called 
 * steps:      specify steps [1-3]. 1= forward sync 2= local 3= back sync
 *             internal usage: 8= set read-lock 9= set phase3 lock
 * need_repos: need a clone repository e.g need_repos=0 for 'history'
 * add_hist:   does it change history file?
 */
struct CMD CMDS [] =
{
    { "add", "add", msg5, rcvs_add, "123", 1, 1 },
    { "add_file", "add", msg8, rcvs_add, "128", 1, 1 },
    { "admin", "checkout", msg5, rcvs_need_folder, "123", 1, 1 },
    { "checkout", "checkout", msg1, rcvs_checkout, "128", 1, 1 },
    { "commit", "commit", msg3, rcvs_need_folder, "123", 1, 1 },
    { "diff", "checkout", msg2, rcvs_need_folder, "128", 1, 0 },
    { "export",  "checkout", msg1, rcvs_export, "128", 1, 1 },
    { "history", "history", msg7, rcvs_history, "1", 0, 0 },
    { "import", "import", msg3, rcvs_import, "123", 1, 1 },
    { "log", "checkout", msg2, rcvs_need_folder, "128", 1, 0 },
    { "rdiff", "rdiff", msg2, rcvs_rdiff, "1", 0, 0 },
    { "release", "checkout", msg8, rcvs_do_folder, "2", 1, 1 },
    { "remove", "remove", msg8, rcvs_remove, "128", 0, 1 },
    { "rtag", "rtag", msg9, rcvs_rtag, "18", 0, 0 },
    { "status", "checkout", msg2, rcvs_do_folder, "128", 1, 0 },
    { "tag", "checkout", msg4, rcvs_tag, "123", 1, 1 },
    { "update", "checkout", msg1, rcvs_need_folder, "128", 1, 1 },
    { NULL, NULL, NULL, NULL, 0, 0 },
};

/* rcvs: find all existing folders */
int
rcvs_Find_folder (argc, argv, cmds)
    int argc;
    char *argv[];
    struct cmd *cmds; 
{
    struct CMD *CM;
    char *CP = argv[0];
    char *cp = NULL;
    int err = 0;
    char repository[PATH_MAX];
    char dir[PATH_MAX];
    char *Repository;

    command_name = argv[0];
    err = rcvs_eval_command (argc, argv, cmds);
    if (err) 
        return (err);

    /* call cvs command to parse command options */
    rcvs_parse_opt = TRUE;
    err = (*(cm->func)) (argc, argv); 
    rcvs_parse_opt = FALSE;
    argc -= rcvs_cmd_optind;
    argv += rcvs_cmd_optind;

    for (CM = CMDS; CM->fullname; CM++)
	if (!strcmp (cm->fullname, CM->fullname))
	    break;
    rcvs_CM = CM;

    err = (*(CM->func)) (argc, argv);

    return (err);
}

/* rcvs: collect information for commands that needs folder */
int
rcvs_need_folder (argc, argv)
    int argc;
    char *argv[];     
{
    int err = 0;
    err = rcvs_do_folder (argc, argv);
    if (err)
        error (1, 0, "no legitimate folder found");
    return (0);
}

/* rcvs: put command options into list */
int
rcvs_put_options (argc, argv, ID)
    int argc;
    char *argv[];     
    char *ID;
{
    register int i;
    /* this routine only serves history/rdiff/rtag commands */
    if (strcmp(cm->fullname,"history") && strcmp(cm->fullname,"rdiff")
	       && strcmp(cm->fullname,"rtag"))
	return(0);       

    argv -= rcvs_cmd_optind;
    if (rcvs_cmd_optind > 0)
        for (i=1; i<rcvs_cmd_optind; i++)
	    rcvs_addlist (&rcvs_dirlist, ID, argv[i], argv[i]);
    argv += rcvs_cmd_optind;
    return (0);
}

/* rcvs: find existing folders */
int
rcvs_do_folder (argc, argv)
    int argc;
    char *argv[];     
{
    char repository[PATH_MAX];
    char dir[PATH_MAX];
    char *Repository;
    char *repos;
    char *ID;
    register int i;
    int err = 0;

     /* no directory is specified, use current directory */ 
    if (argc == 0)
    {  
        /* if CVS found, current directory is a module */
        if ( isreadable (CVSADM_REP))
	{	
	    repos = rcvs_get_repos (".", &ID, &Repository);
	    rcvs_put_options (argc, argv, ID);
	    rcvs_addlist (&rcvs_dirlist, ID, "", repos);
        }	 

	/* no module found, search for all folders in current directory */
	else 
	{  
	    List *L;
	    L = Find_Dirs ((char *) NULL, W_LOCAL);
	    if ( L != NULL )
	        rcvs_walklist (argc, argv, "rcvs_do_folder", L, rcvs_add_onedir);
	}	
    }  

    /* argc > 0, some directory or files are specified */
    else
    {  
        for (i=0; i<argc; i++)
        {    
	    int found_folder = FALSE;
	    sprintf (repository, "%s/%s", argv[i], CVSADM_REP);

	    /* directory */
	    if (isreadable ( repository))
	    {      
		repos = rcvs_get_repos (argv[i], &ID, &Repository);
		if (!quiet && ID != NULL && index(ID,':') != NULL &&
		    CVSrootr_v != NULL && index(ID,':') != NULL &&
		    strcmp (ID, CVSrootr_v) != 0)
		    fprintf (stderr, "%s is ignored\n", CVSrootr_n);
		rcvs_put_options (argc, argv, ID);
		rcvs_addlist(&rcvs_dirlist, ID, argv[i], repos);
		found_folder = TRUE;
            }   

	    /* if CVS directory doesn't exist, error */
	    else if ( isdir(argv[i]))
	    {  
	        if (rcvs_CM->need_repos)
		    error(1, 0, "rcvs_do_folder: %s is not a CVS folder",
			   argv[0]); 
		else
		{  
		    rcvs_put_options (argc, argv, rcvs_ID);
		    rcvs_addlist(&rcvs_dirlist,rcvs_ID,argv[i], argv[i]);
		    found_folder = TRUE;
    	            if (rcvs_ID != NULL && index (rcvs_ID, ':') != NULL)
		        rcvs_native_RCVS = TRUE; 
		}    
	    }	 

	    /* 
	     * file or typo,
	     * we'll assume it exists on master repository.
	     */ 
	    else 
	    {  
	        char *fn;    
		(void) strcpy (dir, argv[i]);
		fn = rindex (dir, '/');
		if (fn != NULL)
		    *fn++ = '\0';
		else
		{  
		    fn = argv[i];
		    (void) strcpy (dir, ".");
		}	
		if (fn == NULL)
		    error(1, 0, "rcvs_do_folder #2: fn = null"); 
		sprintf (repository, "%s/%s", dir, CVSADM_REP);
		if (isreadable ( repository ))
		{
		    char *file;
		    char *Repository;
		    repos = rcvs_get_repos (dir, &ID, &Repository);
		    sprintf (repository, "%s/%s", repos, fn);
		    file = xstrdup (repository);
		    rcvs_put_options (argc, argv, ID);
		    rcvs_addlist (&rcvs_dirlist, ID,argv[i],file);
		    found_folder = TRUE;
		}    
		else 
		{  
    	            if (rcvs_ID != NULL && index (rcvs_ID, ':') != NULL)
			rcvs_native_RCVS = TRUE; 
		    rcvs_put_options (argc, argv, rcvs_ID);
		    rcvs_addlist(&rcvs_dirlist,rcvs_ID,argv[i], argv[i]);
	        } 
            } 
		
	    if (!found_folder)
		err = 1;
        } 
    } 
    return (err);    
}

/* rcvs: set some flags according to the command */
int
rcvs_eval_command (argc, argv, cmds)
    int argc;
    char *argv[];
    struct cmd *cmds;
{
    char *CP = argv[0];
  
    /* translate command into fullname */
    for (cm = cmds; cm->fullname; cm++)
    {
	if (cm->nick1 && !strcmp (CP, cm->nick1))
	    break;
	if (cm->nick2 && !strcmp (CP, cm->nick2))
	    break;
	if (!strcmp (CP, cm->fullname))
	    break;
    }

    if (!cm->fullname)
    {  
        error (0, 0, "rcvs_eval_command: bad command '%s'", argv[0]);
        rcvs_native_RCVS = FALSE;
	return (1);
    }
    return (0);
}

/* rcvs: print out error */
int
rcvs_local_folder_error ( dir, repository, cvsroot)
    char *dir;  
    char *repository;
    char *cvsroot;
{
    if (cvsroot != NULL && index (cvsroot,':') == NULL)
        fprintf(stderr, "local formatted ");
    else
        fprintf(stderr, "remote formatted ");
    fprintf (stderr, "%s does not match local folder '%s'\n", rcvs_Id, dir);
    error (1, 0, "%s = %s", CVSADM_REP, repository);
    return (0);
}

/* rcvs: print out error */
int
rcvs_remote_folder_error ( dir, repository, cvsroot)
    char *dir;  
    char *repository;
    char *cvsroot;
{
    if (cvsroot != NULL && index (cvsroot,':') == NULL)
        fprintf(stderr, "local formatted ");
    else
        fprintf(stderr, "remote formatted ");
    fprintf (stderr, "%s does not match remote folder '%s'\n", 
	  rcvs_Id, dir);
    error (1, 0, "%s = %s", RCVSADM_REMOTE, repository);
    return (0);
}

/* rcvs: compare existing folder with current CVSROOT */
rcvs_compare_folder(dir, ID, Repository)
    char *dir;
    char *ID; 
    char *Repository;
{
    char *Command_Name;
    char *command;
    Command_Name = command_name;
    command = xstrdup ("rcvs_compare_folder");
    command_name = command;
    if (ID == NULL || Repository == NULL)
    {
        error (0, 0, "rcvs_compare_folder: bug #1, ID=%s, Repository=%s",
	       ID, Repository);
	return (0);
    }

    /* check local folder */
    if ( index (ID, ':') == NULL)
    {  
        if ( rcvs_ID != NULL && index (rcvs_ID, ':') != NULL )
	    (void) rcvs_local_folder_error (dir, ID, rcvs_ID);
        if (Repository != NULL && rcvs_ID != NULL && 
	    (strncmp (Repository, rcvs_ID, strlen (rcvs_ID)) != 0))
	    (void) rcvs_local_folder_error (dir, Repository, rcvs_ID);
    }	 

    /* check remote folder */  
    else
    {  
        if ( index (rcvs_ID, ':') == NULL )
	    (void) rcvs_remote_folder_error (dir, ID, rcvs_ID);
        if ( (ID != NULL) && (rcvs_ID != NULL) && (strcmp (ID, rcvs_ID) != 0) )
	    (void) rcvs_remote_folder_error (dir, ID, rcvs_ID);
    }	 
    free (command);
    command_name = Command_Name;
    return (0);
}

/* rcvs: check existing folders for 'add' */
int
rcvs_add (argc, argv)
    int argc;
    char *argv[];     
{
    char tmp[PATH_MAX];
    char repository[PATH_MAX];
    char curdir[PATH_MAX];
    char *Repository;
    char *repos;
    char *ID;
    register int i;
    if (argc <= 0)
        return(1);

    /* return if this is not a folder */
    sprintf (repository, "./%s", CVSADM_REP);
    if (!isreadable ( repository ))
        return (0);

    /* return if this is not a remote folder */
    (void) strcpy (curdir, ".");
    repos = rcvs_get_repos (curdir, &ID, &Repository);
    if (!rcvs_native_RCVS)
        return (0);

    /* walk the arg list adding files/dirs */
    for (i=0; i<argc; i++)
    {    
        int found_folder = FALSE;
        if (rindex (argv[i], '/'))
            error (1, 0,
            "cannot add files with '/' in their name; %s not added",argv[i]);

        sprintf (repository, "%s/%s", argv[i], CVSADM_REP);
	if ( isdir(argv[i]))                            /* add dir */
	{      
	    if ((rcvs_Popt_phases == NULL) ||
		(rcvs_Popt_phases != NULL) && 
		(index(rcvs_Popt_phases,'2') != NULL))
	    {  
	        /* CVS already exist, ERROR */
	        if ( isreadable ( repository))
	            error(1, 0,"rcvs_add: %s is a CVS folder", argv[0]); 

	        sprintf (tmp,"rm -r -f %s/%s/%s", Repository, repos, argv[0]);
	        if (trace)
	        {  
	            command_name = xstrdup ("rcvs_add");
	            fprintf (stderr, "-> %s\n", tmp);
		}    
		(void) system (tmp);
	    }	
	    
	    sprintf (repository, "%s/%s", repos, argv[i]);
	    rcvs_addlist(&rcvs_dirlist, ID, argv[i], repository);
	    found_folder = TRUE;
        }   

	else                                    /* add file */
	{  
	    struct CMD *CM;
	    if (!isfile (argv[i]))
	        error( 1, 0, "nothing known about %s", argv[i]);
	    for (CM = CMDS; CM->fullname; CM++)
	        if (!strcmp ("add_file", CM->fullname))
		    break;
	    rcvs_CM = CM;

	    {
	        char *rcvsuser;
		char *rcvshost;
		char *rcvsroot;
		char *rcvsdir;
		char *cvsroot;	  
		(void) rcvs_Parse_ID (ID, &rcvsuser, &rcvshost,
				      &rcvsroot,&rcvsdir, &cvsroot);
		sprintf (tmp,"%s/%s", rcvsdir, repos);
		if (trace)
		    fprintf (stderr, "-> rcvs_add: mkdir %s\n", tmp);
		if (!isdir (tmp))
	        if ( mkdir ( tmp, 0777) )
	        {	 
		    command_name = xstrdup ("rcvs_add");
		    error (1, 0, "fail to mkdir %s", tmp); 
	        }		  
	    }	
	    sprintf (tmp,"%s/%s", repos, argv[i]);
	    rcvs_addlist (&rcvs_dirlist, ID, argv[i], tmp);
	    found_folder = TRUE;
	} 
	
	if (!found_folder)
 	    error (1, 0, "'%s' not found", argv[i]);
    } 
    return (0);
}

int
rcvs_checkout (argc, argv)
    int argc;
    char *argv[];
{
    register int i;
    char repository[PATH_MAX];
    char *Repository;
    char *cp;

    /* check all the folders */
    {
	char *repos;
        char *ID;

        /*if (CVSroot == NULL)
	   error (1, 0, "rcvs_checkout: CVSROOT not specified");*/

	{  
	    char dir[PATH_MAX];
            for (i=0; i<argc; i++)
            {    
	        if (rcvs_dopt_where != NULL)       /* co -d */
		{  
    	            if (rcvs_ID != NULL && index (rcvs_ID, ':') != NULL)
			rcvs_native_RCVS = TRUE; 
		    rcvs_addlist(&rcvs_dirlist,rcvs_ID,argv[i], argv[i]);
		}  
		else
		{  
		    sprintf (repository, "%s/%s", argv[i], CVSADM_REP);

		    if ( isreadable ( repository ) )     /* directory */
		    {    
		        repos = rcvs_get_repos (argv[i], &ID, &Repository);
		        (void) rcvs_compare_folder(argv[i], ID, Repository);
			rcvs_addlist (&rcvs_dirlist, rcvs_ID, argv[i], repos);
		    }   

		    else if (isdir(argv[i]))             /* non-CVS folder */
		        error(1, 0, "rcvs_checkout: a non-CVS directory '%s' exist", 
			  argv[i]); 

		    else                          /* file or non-exist dir*/ 
		    {  
		        if (rcvs_ID != NULL && index (rcvs_ID, ':') != NULL)
			    rcvs_native_RCVS = TRUE; 
			rcvs_addlist(&rcvs_dirlist,rcvs_ID,argv[i], argv[i]);
		    	
		    } 
		}    
            } 
	} 
    }	  

    return (0);
}

int
rcvs_export (argc, argv)
    int argc;
    char *argv[];
{
    register int i;
    char repository[PATH_MAX];
    char *Repository;
    char *cp;

    /* check all the folders */
    {
	char *repos;
        char *ID;

	{  
	    char dir[PATH_MAX];
            for (i=0; i<argc; i++)
            {    
	        if (rcvs_dopt_where != NULL)       /* export -d */
		{  
    	            if (rcvs_ID != NULL && index (rcvs_ID, ':') != NULL)
			rcvs_native_RCVS = TRUE; 
		    rcvs_addlist(&rcvs_dirlist,rcvs_ID,argv[i], argv[i]);
	        } 
		else
		{  
		    sprintf (repository, "%s/%s", argv[i], CVSADM_REP);

		    if ( isreadable ( repository ) )    /* directory */
		        error (1, 0, "CVS folder '%s' exist", argv[i]);

		    else if (isdir(argv[i]))        /* non-CVS folder */
		        error(1, 0, "rcvs_export: a non-CVS directory '%s' exist", 
			      argv[i]); 

		    else              /* file or non-exist dir */
		    {  
		        if (rcvs_ID != NULL && index (rcvs_ID, ':') != NULL)
			    rcvs_native_RCVS = TRUE; 
			rcvs_addlist(&rcvs_dirlist,rcvs_ID,argv[i], argv[i]);
		    } 
		}  
            } 
	} 
    }	  

    return (0);
}

/* rcvs: collect arguments for 'history' */
int
rcvs_history (argc, argv)
    int argc;
    char *argv[];
{
    register int i;
    char repository[PATH_MAX];
    char *Repository;
    char *repos;
    char *ID = NULL;
    char *Id = NULL;       
    char *id = NULL;       /* ID of folder, all folder must have same ID */
    int has_mod = 0;
    argv -= rcvs_cmd_optind;
    if ( isreadable (CVSADM_REP))
	repos = rcvs_get_repos (".", &Id, &Repository);
    else
        Id=rcvs_ID; 

    if (rcvs_cmd_optind > 0)
    {
        for (i=1; i<rcvs_cmd_optind; i++)
	{  
	    if ((strcmp(argv[i],"-m") == 0) || (strcmp(argv[i],"-n") == 0))
	    {
	        i++;
		has_mod++;
		sprintf (repository, "%s/%s", argv[i], CVSADM_REP);
		if (isreadable ( repository ))
		{  
		    repos = rcvs_get_repos (argv[i], &ID, &Repository);
		    if (id != NULL)
		    {
		        if (strcmp(id, ID) != 0)
			{  
			    error(0, 0, "RCVS cannot inquire history for folders from different repository");
			    error(1, 0, "%s <> %s", id, ID);
			}    
		    }	
		    else
		        id = Id = ID;
		}    
		else
		    id = Id;
	    }	
	}    
    }
    argv += rcvs_cmd_optind;

    rcvs_put_options (argc, argv, Id);

    /* put file names into stack if any */
    for (i=0; i<argc; i++)
        rcvs_addlist (&rcvs_dirlist, Id, argv[i], argv[i]);
    if (rcvs_ID != NULL && index (rcvs_ID, ':') == NULL)
        return (0);
    return (0);
}

int
rcvs_import (argc, argv)
    int argc;
    char *argv[];     
{
    register int i;
    if (rcvs_ID != NULL && index (rcvs_ID, ':') == NULL)
        return (0);
    rcvs_native_RCVS = TRUE;

    if (argc > 2)
    {
        {
	    char *CurDir;
	    CurDir = xmalloc (PATH_MAX);
	    (void) getwd (CurDir);
	    fprintf(stderr, "import from '%s'\n", CurDir);
	}    

	/* cleanup clone */
	{
	    char tmp[PATH_MAX];
	    if ((rcvs_Popt_phases == NULL) ||
		(rcvs_Popt_phases != NULL) && 
		(index(rcvs_Popt_phases,'2') != NULL))
	    {  
	        char *rcvsuser;
		char *rcvshost;
		char *rcvsroot;
		char *rcvsdir;
		char *cvsroot;	  
  	        if (rcvs_ID != NULL && index (rcvs_ID, ':') != NULL)
		{  
		    (void) rcvs_Parse_ID (rcvs_ID, &rcvsuser, &rcvshost,
				      &rcvsroot,&rcvsdir, &cvsroot);
		    sprintf (tmp,"rm -r -f %s/%s", rcvsdir, argv[0]);
		    if (trace)
		    {  
		        command_name = xstrdup ("rcvs_import");
		        fprintf (stderr, "-> %s\n", tmp);
		    }	
		    (void) system (tmp);
		}	
	    }    
	}    

	rcvs_addlist (&rcvs_dirlist, rcvs_ID, argv[0], argv[0]);
        for (i=1; i<argc; i++)
    	    rcvs_addlist (&rcvs_dirlist, rcvs_ID, argv[i], "");
    }
    else
        rcvs_addlist (&rcvs_dirlist, rcvs_ID, "", "");
    return (0);
}

/* rcvs: collect information for rdiff */
int
rcvs_rdiff (argc, argv)
    int argc;
    char *argv[];     
{
    register int i;
    if (rcvs_ID != NULL && index (rcvs_ID, ':') == NULL)
        return (0);
    rcvs_native_RCVS = TRUE;

    rcvs_put_options (argc, argv, rcvs_ID);
    for (i=0; i<argc; i++)
        rcvs_addlist (&rcvs_dirlist, rcvs_ID, argv[i], argv[i]);
    return (0);

}

/* rcvs: check existing folders for 'remove' */
int
rcvs_remove (argc, argv)
    int argc;
    char *argv[];     
{
    char tmp[PATH_MAX];
    char repository[PATH_MAX];
    char curdir[PATH_MAX];
    char *Repository;
    char *repos;
    char *ID;
    register int i;
    if (argc <= 0)
        return(1);

    /* return if this is not a folder */
    sprintf (repository, "./%s", CVSADM_REP);
    if (!isreadable ( repository ))
        return(0);

    /* return if this is not a remote folder */
    (void) strcpy (curdir, ".");
    repos = rcvs_get_repos (curdir, &ID, &Repository);
    if (!rcvs_native_RCVS)
        return(0);

    /* walk the arg list removing files/dirs */
    for (i=0; i<argc; i++)
    {    
        char *dir;    
        char *fn;    
        int found_folder = FALSE;

	if ( isdir(argv[i]))                            /* remove dir */
	    error (1, 0, "cannot remove directories");	

	if (isfile (argv[i]))                           /* file exist */
	{
	    command_name = xstrdup ("rcvs_remove");
	    error( 1, 0, " no files removed; use `rm' to remove the file first");
	}    

	(void) strcpy (tmp, argv[i]);
	fn = rindex (tmp, '/');
	if (fn != NULL)
	{  
	    dir = tmp;
	    *fn++ = '\0';
	}    
	else
	{  
	    dir = xstrdup (".");
	    fn = tmp;
	}    

	sprintf (repository, "%s/%s", dir, CVSADM_REP);
	if ( !isreadable ( repository))
	    error(1, 0,"rcvs_remove: %s is not a CVS folder", dir);

	sprintf (repository,"%s/%s", repos, argv[i]);
	rcvs_addlist (&rcvs_dirlist, ID, argv[i], repository);
      } 
    return (0);
}

/* rcvs: collect information for rtag */
int
rcvs_rtag (argc, argv)
    int argc;
    char *argv[];     
{
    register int i;
    if (rcvs_ID != NULL && index (rcvs_ID, ':') == NULL)
        return (0);
    rcvs_native_RCVS = TRUE;

    rcvs_put_options (argc, argv, rcvs_ID);
    for (i=0; i<argc; i++)
        rcvs_addlist (&rcvs_dirlist, rcvs_ID, argv[i], argv[i]);
    return (0);

}

/* rcvs: collect information for tag */
int
rcvs_tag (argc, argv)
    int argc;
    char *argv[];     
{
    register int i;
    if (argc > 0)
    {  
        rcvs_cmd_optind += 1;
        argc -= 1;
	argv += 1;
	(void) rcvs_do_folder (argc, argv);
    }	
    return (0);
}





These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.