Started repro.sh v1.0.1 at Sun Apr 3 01:25:22 EDT 2016. ReproDir=/tmp/repro 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/2015.2/1366233 (2016/03/17). 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/2015.2/1366233 (2016/03/17). License: none Preliminary setup: Spin up a local repo. Executing command: p4 init Matching server configuration from 'localhost:1520': case-insensitive (-C1), non-unicode (-n) Server ttyler-dvcs-1459661122 saved. 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). 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. == Release r2 == Stream //stream/r2 saved. Executing command: p4 populate -f -r -S //stream/r2 3 files branched (change 4). 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 # A Perforce Stream Specification. # # Stream: The stream field is unique and specifies the depot path. # Update: The date the specification was last changed. # Access: The date the specification was originally created. # Owner: The user who created this stream. # Name: A short title which may be updated. # Parent: The parent of this stream, or 'none' if Type is mainline. # Type: Type of stream provides clues for commands run # between stream and parent. Five types include 'mainline', # 'release', 'development' (default), 'virtual' and 'task'. # Description: A short description of the stream (optional). # Options: Stream Options: # allsubmit/ownersubmit [un]locked # [no]toparent [no]fromparent mergedown/mergeany # Paths: Identify paths in the stream and how they are to be # generated in resulting clients of this stream. # Path types are share/isolate/import/import+/exclude. # Remapped: Remap a stream path in the resulting client view. # Ignored: Ignore a stream path in the resulting client view. # # Use 'p4 help stream' to see more about stream specifications and command. Stream: //stream/r1 Update: 2016/04/03 01:25:22 Access: 2016/04/03 01:25:22 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. 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. == 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/Two.h#1 - sync/delete from //stream/r1/Two.h#2 ... must resolve branch from //stream/r1/Two.h#2 Resolving with -as ... 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-1459661122/One.h - copy from //stream/r1/One.h /tmp/repro/Two.h - resolving branch from //stream/r1/Two.h#2 //ttyler-dvcs-1459661122/Two.h - resolve skipped. Uh oh, it lost track of renames, and created an extra file, and not getting the content to the correct target file. The desired behaviour when doing 'p4 resolve -am' would be that content from //stream/r1/Two.h#2 would be propagated to //stream/r2/TheNumberTwo.h.
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#3 | 19088 | C. Thomas Tyler |
Added Scenario 4, The "North of Main" Populate/Copy Overlay Strategy, which works around the problem. |
||
#2 | 18865 | C. Thomas Tyler |
Added Scenario 1 and 2. Both are broken in different ways. |
||
#1 | 18862 | C. Thomas Tyler | Added repro. |