README #1

  • //
  • guest/
  • dave_hildebrandt/
  • perforce/
  • utils/
  • vsstop4/
  • README
  • View
  • Commits
  • Open Download .zip Download (9 KB)
Microsoft Visual SourceSafe (VSS) to Perforce converter

Summary

- Obtain and install a version of Perl for your machine.  If you are running
  a version of UNIX and for some reason don't already have Perl available,
  download http://www.perl.com/CPAN/src/latest.tar.gz and get your sysadmin
  to compile and install it.  If you are running Windows 95 or NT you can
  download a precompiled binary from http://www.activestate.com/

- Ensure both Perforce and SourceSafe's "SS" command can execute correctly.
  Add the directory containing SS.EXE to your path, then try running "ss".
  You must use Visual SourceSafe version 5.0 or later.
  Test Perforce by running "p4 info". The Perforce depot should be empty
  (we have not tested running the converter against non-empty servers).
  The Perforce server need not run on the same machine you are running
  the converter on, however it may be wise to do so to avoid network
  traffic.

- 2002-03-04/ps - if your PC does not use the U.S. time format, you have
  to adjust parse_user_and_timestamp in readhist.pl. An example for
  Swiss time format is provided in the comment. Still better would be a
  configuration option...
  
- Untar or Unzip the converter on a disk large enough to hold all files
  stored in VSS, plus the space required for the "metadata".
  The directory you put the converter in must not be under the Perforce
  server root!

- RHGC - If you are not a superuser in your depot then you will get
  error messages since the script tries to update date/time and
  username in changelists and labels - limited to superusers.


- Change directory to the directory the converter was installed into and
  edit the file "config"

- Create a client workspace called "vss" which looks similar to the one in
  "client_spec" (and has appropriate variables in "config").

- Then run "perl convert.pl"

- Note that many sites have reported failures mid-way through conversions
  due to corruption in the SourceSafe database.  The only way around this
  is to determine what files SourceSafe has corrupted and fix them somehow.

It is highly recommended, however, that you read the following before
attempting to do the conversion.


Differences between VSS and Perforce

VSS defines a hierarchy of files using the concept of a "project",
which is essentially just a versioned directory.  The current
project must be set specifically before any VSS operation.  The
information stored by VSS is stored in a proprietary format.

Perforce stores an arbitrary tree of files which can be mapped to
multiple clients independently using any 1:1 mapping.  Perforce
uses RCS format files to store revisions, but all metadata
is stored in a single, central database.

Perforce uses the notion of an atomic change which may consist of many
add, edit, and/or delete operations.  It is guaranteed that either all
of a change is visible, or none of it is.  VSS does not provide atomic
change transactions.


VSS implements branching by "sharing" files among projects, then "branching"
them by breaking this link.  There is no record of merging activity.

In Perforce when you wish to create a "branch", you simply copy the files,
typically to another directory.  The recommended convention
is to make the second component of the depot pathname
the branchname.  Thus, when it is time for the main line of development
to be released as v7, you would typically do a
"p4 integrate //depot/main/... //depot/v7/..."
which (since there aren't any files in //depot/v7 currently) would create
copies of all files in //depot/main in //depot/v7.  To refer to the mainline
version of foo.c use //depot/main/foo.c; for the v7 branched copy, use
//depot/v7/foo.c

This works well because Perforce implements a lazy copy.  Archive files
are never duplicated; only the metadata changes.

Merging operations are recorded in Perforce - if, for example, patches
were made to v7 code these patches could be merged back into the main line
of development with "p4 integrate //depot/v7/... //depot/main/..."
Only files which have changes that have not been previously integrated
into main will be integrated, and the integration will be recorded so
that next time those changes will not have to be revisited.

Because VSS lacks information on merging operations, the converter
simply imports files as they existed in VSS.  Because the branching
models are quite different and adjustments will have to be made
after moving to Perforce, the converter does not attempt to infer
any branching relationships.  It is highly recommended that the first
step after conversion is to identify directories which have a branching
relationship and establish this relationship in Perforce.  Contact
Perforce Technical Support (support@perforce.com) for help with this.

Labels are commonly used in VSS; they are available in Perforce but not
usually needed.  Perforce uses atomic change transactions, and thus the
state of the depot or any part of it is easy to specify.


Restrictions and limitations

Filenames may not contain ASCII unprintable characters, at signs
(@) or hashes (#).
VSS files cannot start with a dollar sign ($) or contain colons
(:) - these restrictions do not exist under Perforce.

Userids and labels may not contain spaces or ASCII unprintable characters.
These characters will be mapped to underscores.

The converter currently does not record any file deletions or renames, partially because
it's extra effort to do that but also because it's impossible to do it
properly; Visual SourceSafe simply will not give any history information
for files which are currently deleted.

Sort order is based on time but VSS does not output seconds; it is thus
possible that two checkins will appear to be at the same time when they
weren't.  This may result in two revisions of a file appearing to be out
of order.

Corrupt dates (later revisions newer than earlier) may cause problems with
labels since the converter takes the label to refer to the next real
revision (not a label revision) rather than the closest revision in time.

The converter is not regularly tested against old server versions, and thus
it is not guaranteed to always work against all older versions.  Unless
you have a good reason to use an old server version, you should run the
converter against the latest version of Perforce.

2002-03-04/ps: If your comments contain lines with 17 ore more asterisks
in a row, the extraction of metadata stops there and the conversion is
only partial. If this happens to you either fix readhist.pl or just edit
the VSS comments.



How does the converter work?

The converter works in four phases:
Phase I:   extract VSS metadata
Phase II:  improve the metadata (sort and compact changes using a heuristic)
Phase III: execute appropriate VSS and p4 commands
           to construct Perforce database
Phase IV:  niceties after the fact

The "ss properties" and "ss history" commands are used to extract the
metadata from VSS.

When the converter runs it reads configuration values from the file "config".
Only root must be supplied; the others have defaults.  See the comments
in "config" for a description of each option.


How do I check the end result, and what does it all mean?

If you want to be certain that the revisions stored in Perforce are
correct, answer yes to the question "Do you wish to verify the result?"
(If you say no and then change your mind, just run "perl verify.pl").
The verification step isn't done by default because it takes a long
time, and because there is no portable way to determine whether earlier
phases of the converter succeeded.

You can verify that all changes were successfully submitted by running
"p4 changes -s pending"; it should produce no output.  Look in
the directory "metadata" for files containing a mapping of all VSS
files and revision numbers to the associated Perforce filename and
change number.  The sorted, more human readable version is in the file
"mapping"; the tabular version is in "mapping.ns" (ns for "not sorted").

Change numbers should not be confused with version numbers.  To see the
files and versions affected by a particular change, type

p4 describe -s <change_number>

(Without the -s all differences between files involved in the change are
displayed as well).

To see the list of all changes (you may want to pipe this through more):
p4 changes

To see the list of labels:
p4 labels

To see the list of changes affecting a particular file:
p4 filelog filename

To list revisions associated with the label "labelname":
p4 files @labelname


A note about re-running the converter

If you want to re-run the converter it would be best to erase the directory
tree "data", so that there cannot be any conflicts between runs.  If you
don't want to keep the results of the previous conversion, delete all
files in the server root and directories below it.


originally by James Strickland (james@perforce.com)
Modified by Robert Cowham (robert@vaccaperna.co.uk)
Modified by Peter Steiner (peter.steiner@hugwi.ch)

# Change User Description Committed
#1 1798 Dave Hildebrandt branch from //guest/robert_cowham
//guest/robert_cowham/perforce/utils/vsstop4/README
#3 1695 Robert Cowham Integrated Peter's changes in - note not fully tested...
#2 686 Robert Cowham Fixed problem in improve.pl where more than one "unget" after another caused a croak to fire.
Seems more reliable now.
#1 237 Robert Cowham Improved version of vsstop4.
Makes life easier if importing into a depot which already
contains stuff you want to keep.
Also handles other people updating the depot at the same
time.
See changes labelled RHGC, and new items in config file.