[Haskell-cafe] Re: [ANNOUNCE] git-darcs-import 0.1

Aaron Denney wnoise at ofb.net
Wed Jun 4 07:11:56 EDT 2008

On 2008-06-04, apfelmus <apfelmus at quantentunnel.de> wrote:
> Peter Hercek wrote:
>> But what about this git rebasing option? How to do it more easily
>>  (than the solution I know and I described it later) in darcs?
>> using "git-rebase --onto master next topic" to get from:
>> to:
>>     o---o---o---o---o  master
>>          \
>>           o---o---o---o---o  next
>>                            \
>>                             o---o---o  topic
>>     o---o---o---o---o  master
>>         |            \
>>         |             o'--o'--o'  topic
>>          \
>>           o---o---o---o---o  next
>> This is the reason why I mentioned reordering depending patches AB
>>  to BA (with manual conflict resolution) would be needed in darcs
>>  to support (I believe a better) alternative to git rebase.
> I don't understand (probably because I haven't use either dvcs).
> Either the changes in the  next->topic  path don't depend on the changes 
> in the  fork->next  path. Then, the patches commute and it's no problem 
> for darcs.

Right.  Then 

>>     o---o---o---o---o  master
>>          \
>>           o---o---o---o---o  next
>>                            \
>>                             o---o---o  topic

is not a good model for what darcs has.  What it has is more like

>>     o---o---o---o---o  master
>>         |\
>>         | o---o---o---o---o  next
>>         \                 |
>>          o---o---o--------+  topic

The patches in "topic" that are in "next" are indepent of the ones that
aren't in "next", so it's another (virtual) line-of-development, that
darcs can lazily construct as needed.  These lines-of-development are
similar to branches of git that have been merged, but you also have
access to the "unmerged" versions until a patch comes in that depends on
the merger.

If I commit three new features that don't interact, a darcs repo will
essentially look like:

       ---- topicA -
      /             \
history --- topicB --+--
      \             /
       ---- topicC -

Where the merger is "virtual".  Darcs will implicitly linearize this to
any of 
history --- topicA --- topicB --- topicC ---
history --- topicA --- topicC --- topicB ---
history --- topicB --- topicA --- topicC ---
history --- topicB --- topicC --- topicA ---
history --- topicC --- topicA --- topicB ---
history --- topicC --- topicB --- topicA ---

/as needed/. git constructs one of these, based on how you did the
commits, and gives you ways to alter it to the others.

> Or the  next->topic  path relies on features from  next  that are not 
> present in  master . But then, you're screwed anyway


> and should merge some parts from next into master so as to advance the
> point where master and next fork.

That's one solution.  Of course, darcs doesn't have semantic dependency,
but syntactic dependency.  (You can add extra dependencies to
model semantic dependencies, but you can't take away the syntactic
dependencies.)  Another solution, if there's syntactic,
but not semantic dependencies, is to manually use patch and diff to get
90% there, and then cleanup and record.

Aaron Denney

More information about the Haskell-Cafe mailing list