Hi fella Monks!

I wrote a little semi-useful script to fake CVS import of a working
module.  How is it useful? Well, I found it useful (why else
would I have wasted my time on hacking up that damned script! ;) in cases
when you have an existing CVS repository and a separate working 
directory that has never been a part of that repository (that is,
it was never 'checked out' from it before...) and you wish
to add this directory of yours to the CVS repository in order
to start preserving older versions of whatever you hold in that
directory.

For example, there's a CVS repository located in /web/common/repository on your 'development' server and a working directory /export/home/fooadmin/myscripts in which you hold your perl scripts. Now, in order to allow yourself to preserve older versions of your scripts, you will have to 'import' this working directory into an existing CVS repository. One good old way of doing this would be via 'cvs import' command followed by immediate 'cvs checkout', which wouldn't work unless you 'rm -rf' your original working directory first or checkout into a different location... and if you do choose to remove your working directory in order to replace it with a version in the repository, the checked out version may have certain files that were present in the original working directory missing. This normally occurs if your cvs repository is configured, for example, to exclude binary files, reserved directories/files etc. The latter is a case with many repositories that I had to deal with. It is for this very reason that I chose to write up a script that would be a better alternative to 'cvs import'. This is an initial draft so any comment/suggestion would be appreciated. So, here we go (just copy and paste into a file of your choosing):
#!/usr/local/bin/perl -w # Author: Vladimir Bogdanov (Monk ID: c0d34w4y) # License? I guess GNU would apply. use strict; ######################## ### MAIN ######################## print intro(); my $pwd = `pwd`; chomp($pwd); exit unless (user_prompt("Add working directory '$pwd' to existing CVS + repository? (y/n): ", "[yY]")); unless(exists $ENV{CVSROOT} && length($ENV{CVSROOT})) { $ENV{CVSROOT} = user_ask("\nEnvironment variable CVSROOT is not se +t! What should I set it to?\n CVSROOT: "); check_cvsroot(); } else { print "Will use existing CVSROOT '" . $ENV{CVSROOT} ."'\n"; $ENV{CVSROOT} = user_ask("\nNew CVSROOT: ") unless (user_prompt("C +onfirm if you are OK with it? (y/n): ", "[yY]")); check_cvsroot(); } my $module = user_ask("\nRepository module name for the working direct +ory: "); my $cvs_module_path = "$ENV{CVSROOT}/$module"; my $cvs_dir = "$pwd/CVS"; eval { if (-d $cvs_dir) { print "\nDirectory '$cvs_dir' already exists!\n" ."Which implies that this working directory may belong to + an existing cvs repository."; exit unless user_prompt("\nProceed anyway? (will replace the c +ontents of '$cvs_dir' cvs directory): ", "[yY]"); } unless (-d $cvs_module_path) { print "\nDirectory '$cvs_module_path' doesn't exist! "; mkdir_rec($cvs_module_path) if (user_prompt("Create One? (y/n) +: ", "[yY]")); } print "\nInitializing..."; mkdir_rec($cvs_dir) unless (-d $cvs_dir); open(FOUT, ">$cvs_dir/Repository") or die "can't open '$cvs_dir/Re +pository'"; print FOUT "$module"; close(FOUT); open(FOUT, ">$cvs_dir/Root") or die "can't open '$cvs_dir/Root'"; print FOUT $ENV{CVSROOT}; close(FOUT); touch("$cvs_dir/Entries"); print "\nDone!\n"; }; if ($@) { print "\nFAILED: $@\n"; exit(0); } ######################## ### SUBS ######################## sub check_cvsroot { unless (-d $ENV{CVSROOT}) { print "Directory " . $ENV{CVSROOT} . " doesn't exist!\n"; exit; } } sub user_ask { print $_[0]; my $answer = <STDIN>; chomp($answer); return $answer; } sub user_prompt { my $answer = user_ask($_[0]); return ($answer =~ m/$_[1]/); } #--------------------------------------------------------------------- # mkdir_rec($dir, $mode, $safe) # # safe = 1 - return appropriate numerical code instead of a die. # 0 - die. (default) # sub mkdir_rec { my ($dir, $mode, $safe) = @_; return 0 unless ($dir); # $dir required. return 1 if (-d $dir); # return if already exists my $mode_o = ($mode)?"-m $mode":""; # execute shell comand: use -p to create directories recursively # back tick command should return 0 on failure. system("mkdir -p $dir $mode_o") == 0 or ($safe ? return 0 : die "Failed to create '$dir'."); return 1; } sub touch { my $now = time; local (*TMP); foreach my $file (@_) { utime ($now, $now, $file) || open (TMP, ">>$file") || die ("Couldn't touch file: $!\n"); } } sub intro { return <DATA>; } __DATA__ #----------------------------------------------------------------- # A CVS IMPORT like Utility # # Associates your current directory with an existing CVS # repository. Similar to what a 'cvs import' command would do. # # by Vladimir Bogdanov (email: user=b_vlad server=telus.net, Perl Monk + ID: c0d34w4y) #-----------------------------------------------------------------


--
print join(" ", map { sprintf "%#02x", $_ }unpack("C*",pack("L",0x1234 +5678)))

In reply to Fake CVS import with Perl. by c0d34w4y

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.