Started repro.sh v1.1.1 at Sat May 7 22:51:59 EDT 2016. ReproDir=/tmp/repro ============================================================================== Scenario 3: No Renames on Main Preliminary info: Show versions of p4/p4d on the PATH: Executing command: p4 -V Perforce - The Fast Software Configuration Management System. Copyright 1995-2016 Perforce Software. All rights reserved. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) See 'p4 help legal' for full OpenSSL license information Version of OpenSSL Libraries: OpenSSL 1.0.1s 1 Mar 2016 Rev. P4/DARWIN90X86_64/2016.1/1374211 (2016/04/06). Executing command: p4d -V Perforce - The Fast Software Configuration Management System. Copyright 1995-2016 Perforce Software. All rights reserved. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) See 'p4 help legal' for full OpenSSL license information Version of OpenSSL Libraries: OpenSSL 1.0.1s 1 Mar 2016 This product includes software developed by the OpenLDAP Foundation (http://www.openldap.org/) This product includes software developed by Computing Services at Carnegie Mellon University: Cyrus SASL (http://www.cmu.edu/computing/) See 'p4 help legal' for full Cyrus SASL and OpenLDAP license information Version of OpenLDAP Libraries: 2.4.40 Version of Cyrus SASL Libraries: 2.1.26 Rev. P4D/DARWIN90X86_64/2016.1/1374211 (2016/04/06). License: none Preliminary setup: Spin up a local repo. Executing command: p4 init Matching server configuration from 'p4poke.perforce.com:1667': case-sensitive (-C0), non-unicode (-n) Server ttyler-dvcs-1462675919 saved. Add some files. Executing command: p4 status One.h - reconcile to add //stream/main/One.h#1 Two.h - reconcile to add //stream/main/Two.h#1 Reconcile and submit. //stream/main/One.h#1 - opened for add //stream/main/Two.h#1 - opened for add Submitting change 1. Locking 2 files ... add //stream/main/One.h#1 add //stream/main/Two.h#1 Change 1 submitted. == Release r1 == Stream //stream/r1 saved. Executing command: p4 populate -f -r -S //stream/r1 2 files branched (change 2). Start point of r1 on main is change @1. == Release r2 == Stream //stream/r2 saved. Executing command: p4 populate -f -r -S //stream/r2 2 files branched (change 3). Rename Two.h in r2. Executing command: p4 switch r2 r2 //stream/r2/Two.h#1 - opened for edit //stream/r2/TheNumberTwo.h#1 - moved from //stream/r2/Two.h#1 Submitting change 4. Locking 2 files ... move/add //stream/r2/TheNumberTwo.h#1 move/delete //stream/r2/Two.h#2 Change 4 submitted. Reparent flow of change to: r1 --> r2 --> main. This is follow the best practice North of Main merge flow. That means the flow of change for release streams (North of Main, as opposed to development branches that live South of Main), should be managed such that changes flow from older branches to newer ones, to newer, and finally to main. The basic idea is that merge should Laura Wingerd's Google Talk from 2006 reinforces this. Listen to the section from 24:40 – 27:15: http://www.youtube.com/watch?v=AJ-CpGsCpM0 Laura recommends the oldest-to-newest merging model and does a nice job explaining the rationale for it. Stream //stream/r1 saved. Executing command: p4 stream -o //stream/r1 Stream: //stream/r1 Update: 2016/05/07 22:52:00 Access: 2016/05/07 22:52:00 Owner: ttyler Name: r1 Parent: //stream/r2 Type: release Description: Created by ttyler. Options: allsubmit unlocked toparent nofromparent mergedown Paths: share ... == Bug Fix in r1 == Make changes in r1. Executing command: p4 switch r1 r1 Updating One.h and Two.h in r1. Executing command: p4 edit One.h Two.h //stream/r1/One.h#1 - opened for edit //stream/r1/Two.h#1 - opened for edit Submitting. Submitting change 5. Locking 2 files ... edit //stream/r1/One.h#2 edit //stream/r1/Two.h#2 Change 5 submitted. Scenario 3: Merging r1->r2 direct. == Merging r1 to r2 == Executing command: p4 switch r2 Executing command: p4 switch r2 Merging ... Executing command: p4 merge -S r1 //stream/r2/One.h#1 - integrate from //stream/r1/One.h#2 ... must resolve content from //stream/r1/One.h#2 //stream/r2/TheNumberTwo.h#1 - integrate from //stream/r1/Two.h#2 (remapped from //stream/r2/Two.h) ... must resolve content from //stream/r1/Two.h#2 ... must resolve move to //stream/r2/Two.h Resolving with -am ... Executing command: p4 resolve -am /tmp/repro/One.h - merging //stream/r1/One.h#2 Diff chunks: 0 yours + 1 theirs + 0 both + 0 conflicting //ttyler-dvcs-1462675919/One.h - copy from //stream/r1/One.h /tmp/repro/TheNumberTwo.h - merging //stream/r1/Two.h#2 Diff chunks: 0 yours + 1 theirs + 0 both + 0 conflicting //ttyler-dvcs-1462675919/TheNumberTwo.h - copy from //stream/r1/Two.h /tmp/repro/TheNumberTwo.h - resolving move to //stream/r2/Two.h //ttyler-dvcs-1462675919/TheNumberTwo.h - ignored //stream/r2/Two.h Submitting: Merged r1 -> r2. Submitting change 6. Locking 2 files ... integrate //stream/r2/One.h#2 integrate //stream/r2/TheNumberTwo.h#2 Change 6 submitted. OK, so we can get the optimal result for rename handling in Scenario 3 because the integration engine benefits from the renames occuring directly in the source and target paths. The problem is, renames will surely occur in the mainline between creation of new release streams. This flow illustrates the engine does the right thing when renames occur directly in the source and target stream. The desired behavior is to get this 'Scenario 3' merge result when we use the basic Scenario 1 flow.