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,
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.
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.
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.
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.