[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