[prev in list] [next in list] [prev in thread] [next in thread] 

List:       subversion-issues
Subject:    [Issue 469] New - merge logic too restrictive.
From:       issues () subversion ! tigris ! org
Date:       2001-08-30 17:16:39
[Download RAW message or body]

http://subversion.tigris.org/issues/show_bug.cgi?id=469

*** shadow/issues_15/469	Thu Aug 30 10:16:39 2001
--- shadow/issues_15/469.tmp.16830	Thu Aug 30 10:16:39 2001
***************
*** 0 ****
--- 1,53 ----
+ +============================================================================+
+ | merge logic too restrictive.                                               |
+ +----------------------------------------------------------------------------+
+ |      Issue #: 469                       Component: subversion              |
+ |       Status: NEW                         Version: current                 |
+ |   Resolution:                            Platform: Other                   |
+ |   Issue type: DEFECT                   OS/Version: other                   |
+ |     Priority: P2                     Subcomponent: src                     |
+ +----------------------------------------------------------------------------+
+ |  Assigned To: issues@subversion.tigris.org                                 |
+ |  Reported By: sussman@tigris.org                                           |
+ |      CC list: Cc:                                                          |
+ +----------------------------------------------------------------------------+
+ |    Milestone: TargetMilestone: ---                                         |
+ |          URL:                                                              |
+ +============================================================================+
+ |                              DESCRIPTION                                   |
+ merge() assumes that the Ancestor tree is all at a single revision;
+ as a result, it's possible this can sometime lead to the flagging of a
+ conflict when there is none.
+ 
+ For example, assume that merge() loops over an ancestor directory with
+ node-rev-id N.1.  N.1 has a child with id M.1.  It's possible for source
+ (the head) to have M.3 and the target (transaction) to have M.2.  And yet,
+ this is not a conflict.  If we had been using a more "recent" ancestor, then
+ ancestor and target would be equal (both having M.2), and the target would 
+ just absordb the M.3 change.  But because we're using a very old ancestor,
+ we're signalling a false conflict.
+ 
+ There are three solutions:
+ 
+  1.  construct a multi-revision Ancestor transaction tree.  But this ruins
+       the generality of merge().
+ 
+  2.  stop calling fs_link() on directories when constructing the commit
+       transaction.  But this omits information in a weird way.
+ 
+  3.  add a new rule into merge():  if A < T < S  in terms of lineage, then
+      allow T to absorb changes from S.
+ 
+ We'll try approach #3.  In the meantime, here's a reproduction recipe on
+ a standard greek tree:
+ 
+ echo "moo" >> iota; echo "moo" >> A/D/H/chi; svn ci; 
+ svn up A/D/H; 
+ echo "moo" >> iota; svn ci iota; 
+ echo "moo" >> A/D/H/chi; svn ci A/D/H/chi; 
+ echo "moo" >> iota; svn ci iota; 
+ echo "moo" >> A/D/H/omega ; echo "moo" >> iota; svn ci
+ 
+ Note that the final commit must be multi-arg, so that the 'root' of the commit
+ is '.', which causes the commit transaction to be built at revision 1, which
+ causes merge to assume the entire ancestor tree is at revision 1 as well.
\ No newline at end of file

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic