Differences between revisions 2 and 3
Revision 2 as of 2009-04-24 16:20:47
Size: 3941
Editor: BradOlson
Comment: Initial proposal and usage.
Revision 3 as of 2009-04-24 16:22:34
Size: 3951
Editor: BradOlson
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
== Extension Name == == Fold: Case Folding Rescue ==
Line 5: Line 5:
''Author: Brad Olson'' ''Author: BradOlson''

Fold: Case Folding Rescue

This extension is in proposal stage.

Author: BradOlson

Download site: Under Discussion

Jargon

FS
Filesystem (file system).
CS
Case-sensitive (case-preserving), a context where "THEGREENTREE" and "thegreentree" refer to two different files.
CI
Case-insensitive (case-folding), a context where "THEGREENTREE" and "thegreentree" refer to the same file or entity.
Collision
Case collision, two names that differ only by case.

Overview

This extension seeks to comprehensively deal with the problem of Mercurial filename case collisions in merges and updates. (It does not address Mercurial's internal storage, which is and needs to be CI no matter the file system, cf. CaseFoldingPlan.)

It's developed with these core principles (open for community discussion, cf. CaseFolding):

  1. It takes a person to decide whether a project's filenames are CI or CS. Current FS is not an adequate decider.
  2. In a CS project, a collision is just another file; in a CI project, a collision is a conflict.
  3. Mercurial users need sane ways to remedy collisions on a CIFS. (It's easy to fix them on a CSFS, but on a CIFS you have to modify parentage, which can get dangerous. See FixingCaseCollisions.)

  4. This is an easy thing to get wrong, so it needs community input.

It proposes the following phases (also open to discussion):

  1. (Current) Add commands that will:
    1. Coerce the case of filenames in the working copy to match that of the manifest (if they exist in the manifest). FixcaseExtension may suffice for this.

    2. List the collisions that would happen on a merge.
    3. Offer a way to merge, treating collisions as conflicts or, if that isn't possible, splitting the collisions off into separate files.
  2. Adding options to merge, add, and commit providing the above functionality.
  3. Making a versioned means of telling merge, add, and commit to make the above functionality default.

The burning issue for phase 1 is I have 2000 potential users, most on Windows systems, some with 20 commits/day, and even in my small beta test group, we have jammed repos (can't be merged) because somebody's code (surely not mine!) every once in awhile will create filename with the wrong case. We need a sane way out.

Limitations

This extension has not been tested on filenames containing characters outside the basic Roman set.

Configuration

Configure your .hgrc to enable the extension by adding following lines:

[extensions]
fold = /full/path/to/fold.py

Usage

  • hg fold --coerce = coerce wc filenames to match case of manifest hg fold [-r REV] [--list|--split] - merge in a CI-aware manner
    • --list - no action, just list the files that would collide in the merge --split - give the collisions names that will be unique on a CIFS (default behavior is to treat as conflicts and merge

Development Discussion

A couple big questions:

  1. Is coercing case to manifest ever the right thing? What if your software is trying to rename a file to some cannonical case as a correction to application or user sloppiness?
  2. CI merging two heads could result in more than a three-way merge this extension hasn't been used consistently on all copies. For instance, You even on a Windows machine you could end up with two heads that each have files "Apple" and "apple". That's a five-way merge. And finding a common ancestor gets really strange. What if Apple-1, Apple-2, and apple-1 share an ancestor, but apple-2 was added independently. The best thing would be some core declaration upon hg init declaring a repo to be CI for all adds, commits, and merges. But until then, we're effectively telling Mercurial, "You know that thing you didn't think was a conflict? Well, it is. So merge it."

Other Solutions


CategoryExtension

CaseFoldExtension (last edited 2011-04-02 00:19:54 by GregWard)