Search code examples
perforceperforce-integrate

Perforce: The submitted file doesn't match workspace version


I am facing a weird behavior in perforce submitted files, after p4 integrate

Scenario

Repo contains C# code and the built DLL. I wished to integrate a changeset from one branch to another so I am following the steps which I had discussed, a while ago

The .cs files doesn't complain. If there is resolve conflict in the DLL, I choose either of Accept Source or Accept Target without much care. Reason being, I always rebuild the DLL before submitting

Issue

The DLL which was built in local workspace and reflected in the changeset is correct. I tested it locally and do p4 submit. But to my amazement, the DLL submitted is not the one which I had built. Instead the one which came from that other branch was submitted

Confusion

I thought that with perforce, when a file is opened in a changeset, always the latest(local) copy will be submitted. That is why I don't pay much attention if there are conflict reported in DLL

Isn't that correct ?

Why would the submitted file be different from my workspace version ?


Solution

  • When you "accept source" you're recording that you want the target file to be an exact copy of the source file; consequently, if you submit the file, it's not even transferred from the workspace (in order to save time) -- instead it's just copied server-side. If you tampered with the workspace file, this leads to the situation you describe where the workspace is now inconsistent with the depot, just like if you'd modified a file that wasn't open for edit.

    If you submit with the -t flag (for "tamper checking"), it will check for tampered files by comparing what's in your workspace with what should be in your workspace according to the resolve options you picked:

    C:\Perforce\test\integ>p4 integ source target
    //depot/integ/target#2 - integrate from //depot/integ/source#3
    
    C:\Perforce\test\integ>p4 resolve -at
    c:\Perforce\test\integ\target - vs //depot/integ/source#3
    //Samwise-dvcs-1509687817/integ/target - copy from //depot/integ/source
    
    C:\Perforce\test\integ>echo tampertampertamper >> target
    
    C:\Perforce\test\integ>p4 submit -t -d "submitting tampered file"
    Submitting change 190.
    Locking 1 files ...
    integrate //depot/integ/target#3
    //Samwise-dvcs-1509687817/integ/target tampered with after resolve - edit or revert.
    Submit aborted -- fix problems then use 'p4 submit -c 190'.
    Some file(s) could not be transferred from client.
    

    If you p4 edit the file, it's changed from a pure copy to an edit, and will be read from the workspace instead of from the source file:

    C:\Perforce\test\integ>p4 edit target
    //depot/integ/target#2 - reopened for edit
    
    C:\Perforce\test\integ>p4 submit -c 190
    Submitting change 190.
    edit //depot/integ/target#3
    Change 190 submitted.