Say I created a branch in perforce of our codebase. Here is the branch spec:
//depot/code/main/... //depot/code/branch/...
Then, in the branch, say I move the branched file a.txt -> b.txt using
p4 integrate //depot/code/branch/a.txt //depot/code/branch/b.txt
p4 delete //depot/code/branch/a.txt
Now, let's say some changes are made to a.txt in main which I would like to have integrated into b.txt in the branch
When I try to integrate using the original branch spec, it doesn't reflect the changes made to a.txt in main onto b.txt - is there any way to have the changes made in main show up in the renamed file?
The branch spec is rather large (hundreds of changes) and quite a few files were renamed in the branch, so I'd like to have an automated way to do this. Let me know if I can clarify anything here -- it would help to have a whiteboard ;)
Thanks!
Sam
Perforce 2009.1 has proper renames, which might help with this - probably, and in any case only for future renames. See Perforce 2009.1 release notes, in particular:
#177023 * **
The new 'p4 move' command allows for better support for
renaming files. A file must be already opened for 'edit'
or 'add' in order to be moved. Moved files can be synced,
resolved and diffed against the repository just like files
opened for 'edit'. See 'p4 help move' for more info.
You can add the rename into the branch spec. Then at least the integrations will be automatic - even if the branch spec will be even longer and more complicated.
You can add '-3' switch to use a new engine for integration, which will detect target files that have been previously moved with 'p4 move', and automatically 'retarget' itself to follow
those move operations.
p4 integrate -3 //depot/code/main/... //depot/code/branch/...
will integrate your changes in //depot/code/main/a.txt to //depot/code/branch/b.txt.
This is the 'undoc' feature in current 2010.2 release, but will be the default behavior in the upcoming 2011.1.
The only way I know of to have Perforce handle this for you is to use the branch spec to map the old file in the original to the new file in the branch. Perhaps that has changed with the new move command in the recent Perforce versions, but not that I've experienced.
You could script the creation of a branch spec for handling moved files using the output of p4 fstat.
Use the following as a starting point:
ROOT_PATH="//depot/books/..."
FIRST_CHANGE=91212
p4 fstat -Os -T headChange -F "headAction=move/* headChange>$FIRST_CHANGE" $ROOT_PATH|grep headChange | sort -u|while read DUMMY1 DUMMY2 change; do p4 describe $change; done|grep "moved from"|sed 's/\.\.\./\t/g; s/\#[0-9]*//g; s/ moved from//g;'
This will find all files in //depot/books/... that were moved in change 91212 or later
For us, the output of this looks like
//depot/books/bar.txt //depot/books/foo.txt
Use it for crafting a branch spec.
I don't believe so. Since there is no direct p4 rename
, you have to integrate and delete - once you've done that, integrates from another branch no longer go to the right file. At least that's been my experience.