Let's take a web development environment, where developers checkout a project onto their local machines, work on it, and check in changes to development. These changes are further tested on development and moved live on a regular schedule (eg weekly, monthly, etc.). Is it possible to have an auto-moveup of the latest tagged version (and not the latest checkin, as that might not be 100% stable), for example 8AM on Monday mornings, either using a script or a built-in feature of the VCS?
Certainly, but the exact product may be dependent upon the VCS you are using.
What you might want to do, is have a a few different branches, and migrate up as you progress. E.g., Development -> Stable-Dev -> Beta -> Production. You can then simply auto-update to the latest version of Stable-Dev and Beta for your testers, and always be able to deploy a new Production version at the drop of a hat.
@CodeSlave
I like that idea, with branches. Although we would probably only have two, maybe three branches. I can see Alpha for prototyping and such, Development for things that are being rolled out soon, and Production for the live site. Then, the production server can just grab the latest release of the Production branch and make it "live", so to speak.
Would any major VCS provide the functionality I need to do this?
Anything you can do with cvs can be done with the command line, and I am pretty sure svn is the same. Just work out the functionality you want and stick it in a shell script or a command file.
Yes, it is possible. This is usually a feature provided by continuous integration tools. Typically they will get the latest source from version control, build the project, test it (running unit tests) and possibly deploy it on a (test) server.
If you don't require all those steps, you can easily do the same thing with some shell scripting or similar (i.e. checkout from version control and copy to the production folder on the server).
The only two I have experience with are SVN and Mercurial. For Mercurial, you specify which branch you want it to update from (let's say default) and then whenever you merge a branch into default, you can just have the server run:
hg update
Which updates your repository to the latest version of the branch you set it to.
SVN is the same concept, you only check out which branch you want initially
svn co <http://host/repository/branchname/>
then you have your server update that with a cron job, ala
svn up
In theory though, any VCS that supports branching (all the good ones do : git, mercurial, SVN, etc...), should be able to do something similar to this.
As a follow up,
I'm of the opinion that an app should do one job and do it well. Often if you start combining tools into one product, none of them will shine, and most of them will be "'alright, sort-of".
If I was doing something like this, I would get myself something like SVN, ANT, and Subversion Ant Library (http://ant.apache.org/antlibs/svn/index.html) - your millage may vary though.