views:

827

answers:

4

Perforce allows people to check in unchanged files. Why any version control system would allow this is beyond me, but that's a topic for another question. I want to create a trigger that will deny the submission of unchanged files. However, I have no experience with Perforce triggers. From what I've read, I'm guessing this would be a "Change-content" trigger since the files being submitted would have to be diffed against the respective head revisions they are about to replace. I would need to iterate over the incoming files and make sure they had all indeed changed. The problem is, I have no idea how to go about it.

Can anyone with Perforce trigger experience offer an example or at least point me in the right direction?

+1  A: 

If you look at the Triggers table in Perforce, you will see that triggers are nothing but scripts that get invoked when some kind of event happens. In your case, the change-content event is triggered.

You have several options to write scripts that interact with Perforce. The Perforce downloads page has libraries and modules for many widely use languages. Any of this will help you and greatly simplify what you need to do. Also, check the Perforce Documentation page and download the administrator's guide. It will explain how to create the trigger, etc.

Basically, you need to write a script that will get the information from the change list that is being submitted and for each file in it run a "diff" command against the server. If you find a file that has not change, you need to invalidate the submission.

The Perforce module on you favorite language and the administrators guide will give you all the answers you need.

Curro
+4  A: 

In recent version of perforce allow a client setting which prevents submitting unchanged files:

    SubmitOptions:  Flags to change submit behaviour.

            submitunchanged           All open files are submitted
            submitunchanged+reopen    (default).

            revertunchanged           Files that have content or type
            revertunchanged+reopen    changes are submitted. Unchanged
                                      files are reverted.

            leaveunchanged            Files that have content or type
            leaveunchanged+reopen     changes are submitted. Unchanged
                                      files are moved to the default
                                      changelist.

                          +reopen     appended to the submit option flag
                                      will cause submitted files to be
                                      reopened on the default changelist.

This might be an avenue to investigate if the user is just checking unchanged files due to apathy.

EDIT:

Given that you want to enforce the restriction regardless of the user's workspace settings, then you'll need a trigger as suggested in other answers.

You'll need to look at Perforce's documentation to work out the details, but you'll need a change-content trigger.

You'll probably want to pass in %user% as well as %change% plus possibly other variables, so that you can restrict the expensive operations to just the problem user.

Douglas Leeder
A: 

You'll want to write a change-content trigger. These triggers are run after files are transferred to the server, but before they are committed to the DB. As per the perforce documentation, you can use a command similar to the following

p4 diff //depot/path/...@=<change>

In the change-content trigger the @= (where change is the changelist number sent to the trigger) will get you the contents of the files that were submitted. If you are looking for a way to check against the server version, you might be able to do something like

p4 diff -sr //...@=<change>

The -sr command will report on files that open and are the same as the current depot contents. Since the files haven't been committed yet, I'm going to assume that you will actually get a list of files whose contents that have been transferred to the server are the same as the current head revision in the depot. If p4 diff -sr returns any files that are the same, return a non-zero exit code and the submit will be halted and the user will have to revert his unchanged files manually.

I don't think that you want to actually modify the contents of the changelist by doing the revert for him. That sounds too dangerous.

Note that you can write your trigger in any language that makes sense (as a previous poster suggested). I do think that this kind of trigger is going to be pretty heavyweight though. You will essentially be enforcing a diff on all contents submitted for all users in order to make one developer step in line. Maybe that's an okay price to pay, but depending on the number of users and the sizes of their changelist (and files), this kind of trigger might take a long time to run.

Mark
I order to reduce the cost, you could pass %user% to the trigger script, and then only do the costly change evaluation if %user% matches the problem user.
Douglas Leeder
That should have been "In order" not "I order".
Douglas Leeder
yes, good point. That will help if you want to limit it to a user or particular set of users.
Mark
+1  A: 

Rather than using a trigger, you can edit his workspaces (assuming you have the correct permissions ) to default to a submission strategy that avoids this. By default (again I dont know why) peforce will submit all selected files even if unchanged, but it is possible to change this behaviour. Open his workspaces, and set the SubmitOptions drop down to 'revertunchanged' which will revert any files in the changelist that have not changed, or 'leaveunchanged' which will keep them checked out but not submit them.

It is also possible to do this on an individual changelist submit if he wishes just look at the On Submit Dropdown.

We had this problem in our environment, but once I explained to the offenders what was happening and how easy it was to change the default behaviour they changed without any problems.

Toby Allen