git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: David Mansfield <david@cobite.com>
Cc: Steffen Prohaska <prohaska@zib.de>, git@vger.kernel.org
Subject: Re: [PATCH] cvsps/cvsimport: fix branch point calculation and	broken branch imports
Date: Fri, 04 Apr 2008 11:52:57 +0200	[thread overview]
Message-ID: <47F5FA79.8010604@alum.mit.edu> (raw)
In-Reply-To: <1207230582.17329.39.camel@gandalf.cobite.com>

David Mansfield wrote:
> The main issue with git-cvsimport stems from an unfixable problem.
> cvsps's design goal is to show commits in chronological order.  Based
> solely on this data, it's impossible to always reconstruct a branch
> point (or a tag) since a person could have committed files after someone
> else's commit, but not done an update then tagged.  

Just to be more explicit, I think you are talking about a situation like
this:

1. Add file1:1.1 and file2:1.1 to repository.
2. User1 modifies file1 and commits file1:1.2.
   ...some non-negligible amount of time passes...
3. User2 modifies file2 and commits file2:1.2.
4. User2, without updating file1 to revision 1.2, adds a tag.

This results in a tag that refers to file1:1.1 and file2:1.2, even
though those two revisions never appeared in the repository at the same
time.

> So some files are from before the 'other' user's commit, and some files
> after.  What can you do?  

You can do the only thing that is consistent with the CVS
history--create the tag not from a single source revision but from
multiple revisions.  Unfortunately, git cannot handle this directly, but
there is a workaround using a "fixup branch" [1].

cvs2svn/cvs2git [2] creates a "fixup branch", copies file1:1.1 and
file2:1.2 onto that branch, then creates the tag from the fixup branch.
 This ensures that checking the tag out of git gives the same file
contents as checking the tag out of CVS.  I think that git-cvsimport
gets this wrong (!?!)

It is your framing of the problem that is leading to the impossibility.
 CVS's design does *not* require that a tag or branch is created in a
single commit, nor that it is created from a single source revision.
Trying to impose these artificial constraints means that the resulting
git repository is inconsistent with the CVS repository in quite common
circumstances.

> It's not per se a flaw in cvsps, it always wanted to show commits in
> chronological order, but it is a severe limitation in using cvsps to
> generate changesets for git.

cvs2git always creates commits in chronological order too, but its
output is by design always consistent with the CVS record.

> By engineering a direct tool (such as parsecvs, I presume) these
> obstacles can be overcome by constructing some commits that were never
> made by the actual users of the cvs repo in order to get it right.
> 
> I'm not sure exactly how this is done, because I've never looked at
> parsecvs.

cvs2git's design is documented quite extensively, if you are interested
[3].  Parsecvs, AFAIK, uses a similar approach.

Michael

[1] http://www.kernel.org/pub/software/scm/git/docs/git-fast-import.html
[2] http://cvs2svn.tigris.org/cvs2git.html
[3] http://cvs2svn.tigris.org/svn/cvs2svn/trunk/doc/design-notes.txt

  reply	other threads:[~2008-04-04  9:54 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-02  1:34 [PATCH] cvsps/cvsimport: fix branch point calculation and broken branch imports David Mansfield
2008-04-02 19:29 ` Junio C Hamano
2008-04-03  1:44   ` David Mansfield
2008-04-03  2:06     ` Junio C Hamano
2008-04-03  2:27       ` David Mansfield
2008-04-03  5:47 ` Steffen Prohaska
2008-04-03 13:49   ` David Mansfield
2008-04-04  9:52     ` Michael Haggerty [this message]
2008-04-07 17:54       ` David Mansfield
2008-04-07 18:07         ` Jean-François Veillette
2008-04-09  1:53         ` Michael Haggerty
2008-04-27  5:06           ` Ping Yin
2008-04-27  5:47             ` Michael Haggerty
2008-04-27  5:51               ` Ping Yin
2008-04-27  7:38                 ` Ping Yin
2008-04-27  7:43                   ` Ping Yin
2008-04-27  7:48                   ` Ping Yin
2008-04-27  8:48                     ` Ping Yin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47F5FA79.8010604@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=david@cobite.com \
    --cc=git@vger.kernel.org \
    --cc=prohaska@zib.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).