complete touch -d "change file access and modification times"
# common options
complete touch -s a -d "change access time (atime)"
complete touch -s m -d "change modification time (mtime)"
complete touch -s t -d "use specified time [[CC]YY]MMDDhhmm[.SS]"

if touch --version 2>/dev/null >/dev/null # GNU
    complete touch -s B -l backward -x -d "set date back"
    complete touch -s c -l no-create -d "don't create file if it doesn't exist"
    complete touch -s d -l date -x -d "set to specified YYYY-MM-DDThh:mm:SS[.frac][tz]"
    complete touch -s f -l forward -x -d "set date forward"
    complete touch -s r -l reference -d "use times from specified reference file"
    # TODO these may require that = but builtin complete doesn't seem to infer it should
    # use = here
    complete touch -l time -x -d "change specified kind of timestamp" -a \
        "atime\t'change access time (atime) only'
    access\t'change access time (atime) only'
    use\t'change access time (atime) only'
    mtime\t'change modification time (mtime) only'
    modify\t'change modification time (mtime) only'"
    complete touch -l help -d "display help"
    complete touch -l version -d "display version"
else # not GNU
    set -l uname (uname -s)
    contains $uname Darwin DragonFly FreeBSD
    and complete touch -s A -d "adjust timestamps by relative value [-][hh]mm]SS" -x
    contains $uname Darwin DragonFly FreeBSD NetBSD
    and complete touch -s h -d "act on symbolic links themselves"
    contains $uname Darwin DragonFly FreeBSD OpenBSD SunOS
    and complete touch -s d -d "set to specified YYYY-MM-DDThh:mm:SS[.frac][tz]" -x
    # common BSD options
    complete touch -s c -d "don't create file if it doesn't exist"
    complete touch -s r -d "use times from specified reference file" -r
end