Beware!
p4 changes "...#>have"
does not list changelists that contain only new/added files.
Your best bet is to cache the last sync point, something like
HEAD=`p4 counter change`
if [ -f lastbuild.txt ]
then
OLDHEAD=`cat lastbuild.txt`
else
OLDHEAD=`p4 changes -m1 ...#have`
echo lastbuild.txt not found! I will guess that your last sync was @$OLDHEAD
fi
p4 changes ...@$OLDHEAD,$HEAD > changes.txt
# -snip- review changes.txt, perhaps prompt "Continue with sync to $HEAD?"
p4 sync ...@$HEAD
echo $HEAD > lastbuild.txt
With this method you will get false positives if you have submitted or cherry-pick-synced any changelists since the last time you updated the sync point cache, but it's better to list an extra changelist for review than to miss one, especially one containing all new code.
Don't try this at home
For posterity, here are a couple other things I've tried in the past that ultimately failed:
p4 changes ...#have > have.txt
p4 changes ...#head > head.txt
diff have.txt head.txt
covers the case of changelists containing all adds, but the final output falsely includes older changelists for files that are deleted at #have. Also perf can be pretty bad if you have a lot of history in the depot.
p4 sync -n ... | cut -f1 -d' ' | p4 -x- changes -m1 | sort | uniq
gets pretty close, but fails to list older changelists if a file has been edited multiple times since you last synced. It's also hitting the depot once for every file that will sync, so perf can be really poor.