delete++;
delete_flag++;
release (argc, argv)    int argc;    char **argv;{    FILE *fp;    register int i, c;    char *repository, *srepos;    char line[PATH_MAX], update_cmd[PATH_MAX];    char *thisarg;    int arg_start_idx;    int err = 0;#ifdef SERVER_SUPPORT    if (!server_active)      {#endif /* SERVER_SUPPORT */        if (argc == -1)          usage (release_usage);        optind = 1;        while ((c = getopt (argc, argv, "Qdq")) != -1)          {            switch (c)              {              case 'Q':              case 'q':#ifdef SERVER_SUPPORT		/* The CVS 1.5 client sends these options (in addition to		   Global_option requests), so we must ignore them.  */		if (!server_active)#endif                  error (1, 0,                         "-q or -Q must be specified before \"%s\"",                         command_name);		break;              case 'd':		delete++;		break;              case '?':              default:		usage (release_usage);		break;              }          }        argc -= optind;        argv += optind;#ifdef SERVER_SUPPORT      }#endif /* SERVER_SUPPORT */    /* We're going to run "cvs -n -q update" and check its output; if     * the output is sufficiently unalarming, then we release with no     * questions asked.  Else we prompt, then maybe release.     */    /* Construct the update command. */    sprintf (update_cmd, "%s -n -q -d %s update",             program_path, CVSroot);#ifdef CLIENT_SUPPORT    /* Start the server; we'll close it after looping. */    if (client_active)      {	start_server ();	ign_setup ();      }#endif /* CLIENT_SUPPORT */    /* If !server_active, we already skipped over argv[0] in the "argc       -= optind;" statement above.  But if server_active, we need to       skip it now.  */#ifdef SERVER_SUPPORT    if (server_active)      arg_start_idx = 1;    else#endif /* SERVER_SUPPORT */      arg_start_idx = 0;    for (i = arg_start_idx; i < argc; i++)    {      thisarg = argv[i];        #ifdef SERVER_SUPPORT      if (server_active)      {        /* Just log the release -- all the interesting stuff happened         * on the client.         */        history_write ('F', thisarg, "", thisarg, "");	/* F == Free */      }      else      {#endif /* SERVER_SUPPORT */                /*         * If we are in a repository, do it.  Else if we are in the parent of         * a directory with the same name as the module, "cd" into it and         * look for a repository there.         */        if (isdir (thisarg))        {          if (chdir (thisarg) < 0)          {            if (!really_quiet)              error (0, 0, "can't chdir to: %s", thisarg);            continue;          }          if (!isdir (CVSADM))          {            if (!really_quiet)              error (0, 0, "no repository module: %s", thisarg);            continue;          }	}	else        {          if (!really_quiet)            error (0, 0, "no such directory: %s", thisarg);          continue;	}	repository = Name_Repository ((char *) NULL, (char *) NULL);	srepos = Short_Repository (repository);        	if (!really_quiet)	{          /* The "release" command piggybacks on "update", which           * does the real work of finding out if anything is not           * up-to-date with the repository.  Then "release" prompts           * the user, telling her how many files have been           * modified, and asking if she still wants to do the           * release.           */          fp = Popen (update_cmd, "r");          c = 0;          while (fgets (line, sizeof (line), fp))          {            if (strchr ("MARCZ", *line))              c++;            (void) printf (line);          }          /* If the update exited with an error, then we just want to           * complain and go on to the next arg.  Especially, we do           * not want to delete the local copy, since it's obviously           * not what the user thinks it is.           */          if ((pclose (fp)) != 0)          {            error (0, 0, "unable to release `%s'", thisarg);            continue;          }          (void) printf ("You have [%d] altered files in this repository.\n",                         c);          (void) printf ("Are you sure you want to release %smodule `%s': ",                         delete ? "(and delete) " : "", thisarg);          c = !yesno ();          if (c)			/* "No" */          {            (void) fprintf (stderr, "** `%s' aborted by user choice.\n",                            command_name);            free (repository);            continue;          }	}	if (1#ifdef SERVER_SUPPORT	    && !server_active#endif#ifdef CLIENT_SUPPORT	    && !(client_active		 && (!supported_request ("noop")		     || !supported_request ("Notify")))#endif	    )	{	  /* We are chdir'ed into the directory in question.  	     So don't pass args to unedit.  */	  int argc = 1;	  char *argv[3];	  argv[0] = "dummy";	  argv[1] = NULL;	  err += unedit (argc, argv);	}#ifdef CLIENT_SUPPORT        if (client_active)        {          send_to_server ("Argument ", 0);          send_to_server (thisarg, 0);          send_to_server ("\012", 1);          send_to_server ("release\012", 0);        }        else        {#endif /* CLIENT_SUPPORT */          history_write ('F', thisarg, "", thisarg, ""); /* F == Free */#ifdef CLIENT_SUPPORT        } /* else client not active */#endif /* CLIENT_SUPPORT */                free (repository);        if (delete) release_delete (thisarg);        #ifdef CLIENT_SUPPORT        if (client_active)          return get_responses_and_close ();        else#endif /* CLIENT_SUPPORT */          return (0);        #ifdef SERVER_SUPPORT      } /* else server not active */#endif  /* SERVER_SUPPORT */    }   /* `for' loop */    return err;}