******************************************************************************
                          COMPARISON WITH OTHER VCS
                                     FOR
                            ISSUE #516: OBLITERATE
******************************************************************************


TABLE OF CONTENTS

    1. INTRODUCTION

    2. COMPARISON MATRIX

    3. PERFORCE

    4. CVS

    5. CLEARCASE

    6. MERCURIAL

    7. GIT


1. INTRODUCTION

  This document describes how obliteration works in some other Version Control
  Systems.


2. COMPARISON MATRIX

  This table indicates whether and how three different goals can be
  accomplished in Subversion (prior to development of the Obliterate feature)
  and other version control systems.

  +-------------+-------------------+-------------------+-------------------+
  |             | Quick hiding      | Space recovery    | Latest only       |
  +-------------+-------------------+-------------------+-------------------+
  |             |                   |                   |                   |
  | Subversion  | Apache authz?     | dump/filter/load  | NO                |
  | (1.6)       | Hook scripts?     |                   |                   |
  |             |                   |                   |                   |
  | Perforce    | p4 obliterate     | p4 obliterate     | YES               |
  |             | p4 protect        |                   |                   |
  |             |                   |                   |                   |
  | CVS         | Admin manual task | Admin manual task | NO ?              |
  |             |                   |                   |                   |
  | ClearCase   | rmversion/rmelem  | rmversion/rmelem  | ?                 |
  |             |                   |                   |                   |
  | Mercurial   | ?                 | ?                 | ?                 |
  |             |                   |                   |                   |
  | GIT         | ?                 | ?                 | ?                 |
  |             |                   |                   |                   |
  +-------------+-------------------+-------------------+-------------------+


3. PERFORCE

  Perforce has a client-side command for obliterating file-revs from the
  repository.

  Invocation: Client side.

    p4 obliterate [-y] file[rev-range] ...

  Authz: Restricted by the "admin" priviledge which, like other privilege
  levels in Perforce, can be granted per user on arbitrary paths in the
  repository.

  Repository transformation: The file becomes nonexistent at the specified
  revision. At all other revisions it is unchanged. If the head revision of
  that file was obliterated, the head file-revision number of that file will
  go back to the highest remaining revision, and the next revision to be
  committed will have a file-revision number that has been used before. The
  repository-scope "changelist" numbers are not affected.

  Client (WC) issues: If a file is obliterated at all revisions, this file
  becomes unversioned in WCs and/or is removed from WCs by a "sync" command
  (that's not clear). If a file is obliterated at only specified revisions,
  according to the manual: "Syncing to an obliterated revision will remove the
  file from your client workspace, syncing to the head revision will [...]
  provide you with the most recent non-obliterated revision of the file."

  Backups, Mirrors: ### ?

  Relevant differences between Subversion and Perforce: In Perforce, only
  files are versioned, and files are tracked primarily by their path (with
  some support for renaming, moving and replacing). Perforce maintains both a
  file-revision number and a repository-scope "changeset" number (which is
  similar to Subversion's revision number). Perforce does not maintain
  client-side state for the WCs so the new state is immediately seen when any
  Perforce operation is attempted.

  Reference manual:
  <http://www.perforce.com/perforce/doc.current/manuals/cmdref/obliterate.html>


4. CVS

  CVS has no special support for obliterating, but it is established
  practice for administrators to obliterate the whole history of a file by
  deleting the corresponding archive file from the repository.

  CVS has little repository-side metadata outside the per-file RCS archive
  files, so deleting one of these achieves total obliteration of the
  corresponding file through all its revisions.

  Invocation: Server side, native operating system commands.

  Authz: Implicit (requires server file-system privileges).

  Repository transformation: The file's existence and its history is deleted,
  including its change logs.

  Client (WC) issues: ###

  Backups, Mirrors: ### ?


5. CLEARCASE


6. MERCURIAL

  Mercurial has no Obliterate command. This email describes how one might
  achieve obliteration:
  <http://www.selenic.com/pipermail/mercurial/2008-March/017859.html>.


7. GIT

  Git has a "git-filter-branch" command which can be used to achieve
  obliteration. See the manual page
  <http://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html>.