##
# P4 EVERYDAY
# A set of aliases to make P4 behave more like Git
# https://git-scm.com/docs/everyday
#
# Note: this requires an internal build of p4 with bash alias support (sorry!)
#
# Please see
# https://swarm.workshop.perforce.com/projects/perforce_software-p4alias-examples/
# instead.
##
# STANDALONE DEVELOPER
# add show-branch like output
show-branch = !\
`which p4` streams //stream/... | \
cut -f2 -d " " | \
while read stream; do \
branch=${stream##*/}; \
/bin/echo -n "[$branch] "; \
`which p4` -ztag -F %desc% changes -m1 $stream/...; \
done;
log = changes -L
# map checkout to switch, also:
# treat -b as -c
# make -r default
# treat 'master' as 'main'
checkout = !\
args=('-r'); \
for arg in "$@"; do \
if [[ $arg == "-b" ]]; then \
arg="-c"; \
fi; \
if [[ $arg == "master" ]]; then \
arg="main"; \
fi; \
args+=("$arg"); \
done; \
`which p4` switch "${args[@]}";
# branch runs switch -l, no support for add/delete
branch = switch -l
# add is basically reconcile, but treat '.' as './...'
add = !\
for arg in "$@"; do \
if [[ $arg == "." ]]; then \
arg="./..."; \
fi; \
args+=("$arg"); \
done; \
`which p4` reconcile "${args[@]}";
# run diff on unopened files (like git)
diff = diff -f -Od
# commit maps to submit, but with -m as -d
commit = !\
for arg in "$@"; do \
if [[ $arg == "-m" ]]; then \
arg="-d"; \
fi; \
args+=("$arg"); \
done; \
`which p4` submit "${args[@]}";
# when users run reset, direct them to obliterate
reset = !echo "Try: p4 help obliterate"
# merge maps to merge with changes:
# first arg is the from branch
# treat 'master' as 'main'
# auto resolve and submit
original-merge = merge
merge = !\
if [[ "$1" == "master" ]]; then \
1="main"; \
fi; \
`which p4` original-merge --from "$1" > /dev/null && \
`which p4` resolve -am > /dev/null && \
`which p4` submit -d "Merged $1"
# when users run rebase, direct them to unsubmit/resubmit
rebase = !echo "Try: p4 help unsubmit and p4 help resubmit"
# run p4 label when git tag is invoked
tag = label
# PARTICIPANT DEVELOPER
# support p4:// clone URIs
original-clone = clone
clone = !\
args=('original-clone'); \
for arg in "$@"; do \
if [[ $arg == p4://* ]]; then \
port=`expr "$arg" : 'p4://\([^/]*\)'`; \
path=`expr "$arg" : 'p4://[^/]*/\(.*\)'`; \
name=${path##*/}; \
if [[ -z "$port" || -z "$path" ]]; then \
echo "p4:// URI must have both a server:port and a path"; \
exit 1; \
fi; \
args=('-d' $name "${args[@]}" '-p' $port '-f' "//$path/main/..."); \
else \
args+=("$arg"); \
fi; \
done; \
`which p4` "${args[@]}";
# pull runs fetch
pull = fetch
# fetch suggests running pull
fetch = !echo "Try: p4 help pull"
# push maps to push with some changes:
# --set-upstream as an instruction to map this branch
# treat 'master' as 'main'
original-push = push
push = !\
[[ "$1" == "--set-upstream" ]] && map=true || map=false; \
[[ "$map" = true ]] && remote="$2" || remote="$1"; \
[[ "$map" = true ]] && stream="$3" || stream="$2"; \
if [[ "$stream" == "master" ]]; then \
stream="main"; \
fi; \
if [[ "$map" = true ]]; then \
map=$(`which p4` remote -o "$remote" | sed -n "s:/main/:/$stream/:pg"); \
(`which p4` remote -o "$remote"; echo "$map") | p4 remote -i; \
fi; \
`which p4` original-push -r "$remote" -S "//stream/$stream";
# format-patch suggests diff2
format-patch = !echo "Try: p4 help diff2 (see -u argument)"
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #2 | 20949 | Perforce maintenance |
At the request of tech support, redirect any Perforce customers to the P4Alias examples instead, as this uses a custom build. https://swarm.workshop.perforce.com/projects/perforce_software-p4alias-examples/ |
||
| #1 | 18944 | Stewart Lord | Added p4aliases file to make DVCS act more like git |