http://qs1969.pair.com?node_id=210449


in reply to CVS repository via Perl

As Dave says, I think you should look again at VCS.

From your query about VCS, I think you may have misunderstood how CVS works. I had this same problem at first, because I had previously used PVCS and SourceSafe, which use the same terms to mean different things.

With CVS, your "project" is a "module" and to even look at it (e.g. to see it's structure in terms of files and directories), you must "checkout" the module to a working directory - this is effectively the same as a "Get Latest Version" in SourceSafe parlance. As far as I'm aware, you can't examine a file from the repository without taking a working copy, unlike SourceSafe and PVCS.

To modify a file, you "edit" it - the same as a checkout in SourceSafe, but beware, CVS edits are not exclusive by default. To save your changes in the repository, you "commit" - the same as a SourceSafe checkin.

Hope this helps!

Replies are listed 'Best First'.
Re: Re: CVS repository via Perl
by shushu (Scribe) on Nov 05, 2002 at 14:55 UTC
    Hi, Thanks for the feedback.
    I did look into VCS support, and went over their mailing list archive. First of all - it is very quiet there. Second - it gives no information except "look at our examples". Well - I looked into them, and they work with a copy, after cehckout.

    Now to the question - do I understand CVS, because if I do understand why won't I "checkout" before I start to work.
    Well, let's just say I know CVS well enough.
    If you will look into cvsweb for example, or Apache::CVS, they both work direcrly with the CVS repository, and whenever they can't - they immitate a working directory or do some "magic" to solve this problem (look into cvsweb doAnnotate, for example, where they use cvs server command).
    The reasons I need a direct work with a repository are complicated (maybe another message...), but in the bottom line I need to keep live and updated branches (around 4 branches) that weight 200MB each on more then 20 machines.
    Just keeping a copy of all of the branches on every machine will be a headache.

    What I currently try to do is to immitate Apache request. If I will succeed I will be able to work with Apache::CVS not via the Apache.
    I am not sure it is such a good idea, but I will give it a shot since it can short my development process a lot.

    Any more ideas ?
    Thanks,
    shushu
      Hi again,
      I think I have the solution I needed.
      Using Apache::CVS::* modules directly seems to give me exactly what I need.

      See the code below that brings me the last revision of a file:
      use Apache::CVS::RcsConfig(); use Apache::CVS::PlainFile(); use Apache::CVS::Directory(); use Apache::CVS::File(); use Apache::CVS::Revision(); # /tmp/remote/ is the directory of my CVS module in the repository my $PATH = "/tmp/remote//VC_DB/utilities/pack_conf.pl"; my $RCSCONFIG = Apache::CVS::RcsConfig->new(); my $file = Apache::CVS::File->new($PATH, $RCSCONFIG); my $LAST = $file->revision('prev'); print $LAST->content;

      In addition, all of the Apache::CVS::* modules can give a nice and working direct access to the CVS repository.
      The main idea is - you don't need to know how it is done !

      I believe those modules should be moved from below Apache.

      Have a nice day,
      shushu
        Hi,
        Below is the mail I sent to John Barbee:

        Hi John,

        When working I am trying to get a directory object and go over all of its sub directories.
        I found out that when I am asking for the name of the subdir object, I get an error message.

        The error message is:
        Can't call method "extension" on an undefined value at /usr/lib/perl5/site_perl/5.6.1/Apache/CVS/File.pm line 231 (#1 +) (F) You used the syntax of a method call, but the slot filled by t +he object reference or package name contains an undefined value. Som +ething like this will reproduce the error:
        Looking on the subdir object I saw its rcsconfig object is undef.
        Looking in sub load in Apache::CVS::Directory I saw the following:
        foreach my $path ( @directories ) { $self->push('directory', Apache::CVS::Directory->new($self->path() . "/$pat +h")); }
        And:
        foreach my $path ( @files ) { if ( $path =~ /,v$/ ) { $self->push('file', Apache::CVS::File->new($self->path() . "/$path +", $self->rcs_confi +g())); } else { $self->push('plain_file', Apache::CVS::PlainFile->new($self->path() . "/ +$path")); } }

        The bottom line is - just by fixing the directory object creation to work like the file creation by sending the $self->rcsconfig object it seems I fixed the problem.
        Is it a bug ?
        Maybe you did this for a reason, and I harm something else by fixing it like that ?
        If it is a bug, and this is a good fix, how do we proceed to release a new version ?
        Thanks,
        And I will appriciate a quick response,
        shushu