Started repro.sh v1.1.2 at Mon May 9 13:08:16 EDT 2016. ReproDir=/tmp/repro ============================================================================== Scenario 5: Move Tracking with a Branch Spec 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-1462813696 saved. Creating branch spec r1_to_r2. info: Branch r1_to_r2 saved. exit: 0 Executing command: cp -p /Users/ttyler/p4/psi/depot/dev/ttyler/repro/LostRename/MoveTracker.sh . Installing move tracker trigger. info: Triggers saved. exit: 0 Add some files. Executing command: p4 status MoveTracker.sh - reconcile to add //stream/main/MoveTracker.sh#1 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/MoveTracker.sh#1 - opened for add //stream/main/One.h#1 - opened for add //stream/main/Two.h#1 - opened for add Submitting change 1. Locking 3 files ... add //stream/main/MoveTracker.sh#1 add //stream/main/One.h#1 add //stream/main/Two.h#1 Change 1 submitted. Branch Spec: Branch: r1_to_r2 Update: 2016/05/09 13:08:16 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... END_FILE TP=[//stream/r2/...] SS=[//stream/r1] TS=[//stream/r2] Tracking moves in change 1. CALL track_moves_in_change(1) Found 0 renames among 3 file actions in change 1. Updating Branch Spec to: Branch: r1_to_r2 Update: 2016/05/09 13:08:16 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... END_FILE Branch r1_to_r2 not changed. Updating key MoveTracker.LastChecked.r1_to_r2 to changelist 1. Key MoveTracker.LastChecked.r1_to_r2 set. == Release r1 == Stream //stream/r1 saved. Executing command: p4 populate -f -r -S //stream/r1 3 files branched (change 2). Start point of r1 on main is change @1. Rename Two.h directly in main. //stream/main/Two.h#1 - opened for edit //stream/main/TheNumberTwo.h#1 - moved from //stream/main/Two.h#1 Submitting change 3. Locking 2 files ... move/add //stream/main/TheNumberTwo.h#1 move/delete //stream/main/Two.h#2 Change 3 submitted. Branch Spec: Branch: r1_to_r2 Update: 2016/05/09 13:08:16 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... END_FILE TP=[//stream/r2/...] SS=[//stream/r1] TS=[//stream/r2] Tracking moves in change 3. CALL track_moves_in_change(3) Found 1 renames among 2 file actions in change 3. Updating Branch Spec to: Branch: r1_to_r2 Update: 2016/05/09 13:08:16 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... "//stream/r1/Two.h" "//stream/r2/TheNumberTwo.h" END_FILE Branch r1_to_r2 saved. Updating key MoveTracker.LastChecked.r1_to_r2 to changelist 3. Key MoveTracker.LastChecked.r1_to_r2 set. == Release r2 == Stream //stream/r2 saved. Executing command: p4 populate -f -r -S //stream/r2 4 files branched (change 4). Branch Spec: Branch: r1_to_r2 Update: 2016/05/09 13:08:17 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... //stream/r1/Two.h //stream/r2/TheNumberTwo.h END_FILE TP=[//stream/r2/...] SS=[//stream/r1] TS=[//stream/r2] Tracking moves in change 4. CALL track_moves_in_change(4) Found 0 renames among 4 file actions in change 4. Updating Branch Spec to: Branch: r1_to_r2 Update: 2016/05/09 13:08:17 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... //stream/r1/Two.h //stream/r2/TheNumberTwo.h END_FILE Branch r1_to_r2 not changed. Updating key MoveTracker.LastChecked.r1_to_r2 to changelist 4. Key MoveTracker.LastChecked.r1_to_r2 set. 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/09 13:08:17 Access: 2016/05/09 13:08:17 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 5: Merge using a move-tracking branch spec. == Merging r1 to r2 using branch spec r1_to_r2 == Executing command: p4 switch r2 Executing command: p4 switch r2 Merging ... Executing command: p4 merge -b r1_to_r2 //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 ... must resolve content from //stream/r1/Two.h#2 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-1462813696/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-1462813696/TheNumberTwo.h - copy from //stream/r1/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. Branch Spec: Branch: r1_to_r2 Update: 2016/05/09 13:08:17 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... //stream/r1/Two.h //stream/r2/TheNumberTwo.h END_FILE TP=[//stream/r2/...] SS=[//stream/r1] TS=[//stream/r2] Tracking moves in change 6. CALL track_moves_in_change(6) Found 0 renames among 2 file actions in change 6. Updating Branch Spec to: Branch: r1_to_r2 Update: 2016/05/09 13:08:17 Access: 2016/05/09 13:08:16 Options: unlocked View: //stream/r1/... //stream/r2/... //stream/r1/Two.h //stream/r2/TheNumberTwo.h END_FILE Branch r1_to_r2 not changed. Updating key MoveTracker.LastChecked.r1_to_r2 to changelist 6. Key MoveTracker.LastChecked.r1_to_r2 set. Yay! We get the optimal result for rename handling in Scenario 5.