diff options
Diffstat (limited to 'plugins/ipfs')
| -rw-r--r-- | plugins/ipfs/LICENSE | 22 | ||||
| -rw-r--r-- | plugins/ipfs/README.md | 17 | ||||
| -rw-r--r-- | plugins/ipfs/_ipfs | 717 | 
3 files changed, 756 insertions, 0 deletions
| diff --git a/plugins/ipfs/LICENSE b/plugins/ipfs/LICENSE new file mode 100644 index 000000000..cf84491bb --- /dev/null +++ b/plugins/ipfs/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Angel Ramboi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/plugins/ipfs/README.md b/plugins/ipfs/README.md new file mode 100644 index 000000000..0808a26c1 --- /dev/null +++ b/plugins/ipfs/README.md @@ -0,0 +1,17 @@ +# zsh-ipfs + +zsh completion plugin for [The InterPlanetary File System (IPFS)][1] + +Please submit issues and pull requests to the [main zsh-ipfs repo][2]. + +### About + +[IPFS (InterPlanetary File System)][1] is a peer-to-peer hypermedia protocol +designed to make the web faster, safer, and more open. + +### License + +See: https://github.com/hellounicorn/zsh-ipfs/blob/master/LICENSE + +[1]: http://ipfs.io/ +[2]: https://github.com/hellounicorn/zsh-ipfs diff --git a/plugins/ipfs/_ipfs b/plugins/ipfs/_ipfs new file mode 100644 index 000000000..9ee8bd79c --- /dev/null +++ b/plugins/ipfs/_ipfs @@ -0,0 +1,717 @@ +#compdef ipfs +#autoload + +local -a _1st_arguments +_1st_arguments=( +  'add:Add a file or directory to ipfs.' +  'bitswap:Interact with the bitswap agent.' +  'block:Interact with raw IPFS blocks.' +  'bootstrap:Show or edit the list of bootstrap peers.' +  'cat:Show IPFS object data.' +  'cid:Convert and discover properties of CIDs' +  'commands:List all available commands.' +  'config:Get and set ipfs config values.' +  'daemon:Run a network-connected IPFS node.' +  'dag:Interact with ipld dag objects. (experimental)' +  'dht:Issue commands directly through the DHT.' +  'diag:Generate diagnostic reports.' +  'dns:Resolve DNS links.' +  'files:Interact with unixfs files.' +  'filestore:Interact with filestore objects. (experimental)' +  'get:Download IPFS objects.' +  'id:Show ipfs node id info.' +  'init:Initializes ipfs config file.' +  'key:Create and list IPNS name keypairs.' +  'log:Interact with the daemon log output.' +  'ls:List directory contents for Unix filesystem objects.' +  'mount:Mounts IPFS to the filesystem (read-only).' +  'name:Publish and resolve IPNS names.' +  'object:Interact with IPFS objects.' +  'p2p:Libp2p stream mounting.' +  'pin:Pin (and unpin) objects to local storage.' +  'ping:Send echo request packets to IPFS hosts.' +  'refs:List links (references) from an object.' +  'repo:Manipulate the IPFS repo.' +  'resolve:Resolve the value of names to IPFS.' +  'stats:Query IPFS statistics.' +  'swarm:Interact with the swarm.' +  'tar:Utility functions for tar files in ipfs.' +  'update:Download and apply go-ipfs updates' +  'version:Show ipfs version information.' +) + +_ipfs_subcommand(){ +  local curcontext="$curcontext" state line +  typeset -A opt_args +  _arguments -C ':command:->command' '*::options:->options' +  case $state in +    (command) +      _describe -t commands "ipfs subcommand" $1 +      return +    ;; +    (options) +      case $line[1] in +        (wantlist) +          case $MAIN_SUBCOMMAND in +            (bitswap) +              _arguments '(-p --peer)'{-p,--peer}'[Specify which peer to show wantlist for. Default: self.]' +            ;; +          esac +        ;; +        (add) +          case $MAIN_SUBCOMMAND in +            (pin) +              _arguments \ +                '(-r --recursive)'{-r,--recursive}'[Recursively pin the object linked to by the specified object(s). Default: true.]' \ +                '--progress[Show progress.]' +            ;; +            (bootstrap) +              local -a _bootstrap_rm_arguments +              _bootstrap_rm_arguments=( +                'default:Add default peers to the bootstrap list.' +              ) +              _ipfs_subcommand _bootstrap_rm_arguments +            ;; +          esac +        ;; +        (rm) +          case $MAIN_SUBCOMMAND in +            (pin) +              _arguments '(-r --recursive)'{-r,--recursive}'[Recursively unpin the object linked to by the specified object(s). Default: true.]' +            ;; +            (bootstrap) +              local -a _bootstrap_rm_arguments +              _bootstrap_rm_arguments=( +                'all:Remove all peers from the bootstrap list.' +              ) +              _ipfs_subcommand _bootstrap_rm_arguments +            ;; +          esac +        ;; +        (ls) +          case $MAIN_SUBCOMMAND in +            (pin) +              _arguments \ +                '(-t --type)'{-t,--type}'[The type of pinned keys to list. Can be "direct", "indirect", "recursive", or "all". Default: all.]' \ +                '(-q --quiet)'{-q,--quiet}'[Write just hashes of objects.]' +            ;; +            (p2p) +              _arguments '(-v --headers)'{-v,--headers}'[Print table headers (Protocol, Listen, Target).]' +            ;; +          esac +        ;; +        (update) +          case $MAIN_SUBCOMMAND in +            (pin) +              _arguments '--unpin[Remove the old pin. Default: true.]' +            ;; +          esac +        ;; +        (verify) +          case $MAIN_SUBCOMMAND in +            (pin) +              _arguments \ +                '--verbose[Also write the hashes of non-broken pins.]' \ +                '(-q --quiet)'{-q,--quiet}'[Write just hashes of broken pins.]' +            ;; +          esac +        ;; +        (get|query|findpeer) +          case $MAIN_SUBCOMMAND in +            (dht) +              _arguments '(-v --verbose)'{-v,--verbose}'[Print extra information.]' +            ;; +            (object) +              _arguments '--data-encoding[Encoding type of the data field, either "text" or "base64". Default: text.]' +            ;; +          esac +        ;; +        (put) +          case $MAIN_SUBCOMMAND in +            (dht) +              _arguments '(-v --verbose)'{-v,--verbose}'[Print extra information.]' +            ;; +            (object) +              _arguments \ +                '--inputenc[Encoding type of input data. One of: {"protobuf", "json"}. Default: json.]' \ +                '--datafieldenc[Encoding type of the data field, either "text" or "base64". Default: text.]' \ +                '--pin[Pin this object when adding.]' \ +                '(-q --quiet)'{-q,--quiet}'[Write minimal output]' +            ;; +          esac +        ;; +        (findprovs) +          case $MAIN_SUBCOMMAND in +            (dht) +              _arguments \ +                '(-v --verbose)'{-v,--verbose}'[Print extra information.]' \ +                '(-n --num-providers)'{-n,--num-providers}'[The number of providers to find. Default: 20.]' +            ;; +          esac +        ;; +        (provide) +          case $MAIN_SUBCOMMAND in +            (dht) +              _arguments \ +                '(-v --verbose)'{-v,--verbose}'[Print extra information.]' \ +                '(-r --recursive)'{-r,--recursive}'[Recursively provide entire graph.]' +            ;; +          esac +        ;; +        (cmds|diff) +          case $MAIN_SUBCOMMAND in +            (diag|object) +              _arguments '(-v --verbose)'{-v,--verbose}'[Print extra information.]' +            ;; +          esac +        ;; +        (stat) +          case $MAIN_SUBCOMMAND in +            (object) +              _arguments '--human[Print sizes in human readable format (e.g., 1K 234M 2G).]' +            ;; +            (repo) +              _arguments \ +                '--size-only[Only report RepoSize and StorageMax.]' \ +                '--human[Print sizes in human readable format (e.g., 1K 234M 2G).]' +            ;; +          esac +        ;; +        (publish) +          case $MAIN_SUBCOMMAND in +            (name) +              _arguments \ +                '--resolve[Check if the given path can be resolved before publishing. Default: true.]' \ +                '(-t --lifetime)'{-t,--lifetime}'[Time duration that the record will be valid for. Default: 24h.]' \ +                '--allow-offline[When offline, save the IPNS record to the the local datastore without broadcasting to the network instead of simply failing.]' \ +                '--ttl[Time duration this record should be cached for. Uses the same syntax as the lifetime option. (caution: experimental).]' \ +                '(-k --key)'{-k,--key}"[Name of the key to be used or a valid PeerID, as listed by 'ipfs key list -l'. Default: self.]" \ +                '(-Q --quieter)'{-Q,--quieter}'[Write only final hash.]' +            ;; +          esac +        ;; +        (pubsub) +          case $MAIN_SUBCOMMAND in +            (name) +              local -a _name_pubsub_arguments +              _name_pubsub_arguments=( +                'cancel:Cancel a name subscription' +                'state:Query the state of IPNS pubsub' +                'subs:Show current name subscriptions' +              ) +              _ipfs_subcommand _name_pubsub_arguments +            ;; +          esac +        ;; +        (resolve) +          case $MAIN_SUBCOMMAND in +            (name) +              _arguments \ +                '(-r --recursive)'{-r,--recursive}'[Resolve until the result is not an IPNS name. Default: true.]' \ +                '(-n --nocache)'{-n,--nocache}'[Do not use cached entries.]' \ +                '(--dhtrc --dht-record-count)'{--dhtrc,--dht-record-count}'[Number of records to request for DHT resolution.]' \ +                '(--dhtt --dht-timeout)'{--dhtt,--dht-timeout}'[Max time to collect values during DHT resolution eg "30s". Pass 0 for no timeout.]' \ +                '(-s --stream)'{-s,--stream}'[Stream entries as they are found.]' +            ;; +          esac +        ;; +        (patch) +          case $MAIN_SUBCOMMAND in +            (object) +              local -a _object_patch_arguments +              _object_patch_arguments=( +                'add-link:Add a link to a given object.' +                'append-data:Append data to the data segment of a dag node.' +                'rm-link:Remove a link from a given object.' +                'set-data:Set the data field of an IPFS object.' +              ) +              _ipfs_subcommand _object_patch_arguments +            ;; +          esac +        ;; +        (gc) +          case $MAIN_SUBCOMMAND in +            (repo) +              _arguments \ +                '--stream-errors[Stream errors.]' \ +                '(-q --quiet)'{-q,--quiet}'[Write minimal output.]' +            ;; +          esac +        ;; +        (bitswap) +          case $MAIN_SUBCOMMAND in +            (stats) +              _arguments \ +                '(-v --verbose)'{-v,--verbose}'[Print extra information.]' \ +                '--human[Print sizes in human readable format (e.g., 1K 234M 2G).]' +            ;; +          esac +        ;; +        (bw) +          case $MAIN_SUBCOMMAND in +            (stats) +              _arguments \ +                '(-p --peer)'{-p,--peer}'[Specify a peer to print bandwidth for.]' \ +                '(-t --proto)'{-t,--proto}'[Specify a protocol to print bandwidth for.]' \ +                '--poll[Print bandwidth at an interval.]' \ +                '(-i --interval)'{-i,--interval}'[Time interval to wait between updating output, if 'poll' is true.]' +            ;; +          esac +        ;; +        (repo) +          case $MAIN_SUBCOMMAND in +            (stats) +              _arguments \ +                '--size-only[Only report RepoSize and StorageMax.]' \ +                '--human[Print sizes in human readable format (e.g., 1K 234M 2G).]' +            ;; +          esac +        ;; +        (bases) +          case $MAIN_SUBCOMMAND in +            (cid) +              _arguments \ +                '--prefix[also include the single leter prefixes in addition to the code.]' \ +                '--numeric[also include numeric codes.]' +            ;; +          esac +        ;; +        (codecs|hashes) +          case $MAIN_SUBCOMMAND in +            (cid) +              _arguments '--numeric[also include numeric codes.]' +            ;; +          esac +        ;; +        (format) +          case $MAIN_SUBCOMMAND in +            (cid) +              _arguments \ +                '-f[Printf style format string. Default: %s.]' \ +                '-v[CID version to convert to.]' \ +                '-b[Multibase to display CID in.]' +            ;; +          esac +        ;; +        (close) +          case $MAIN_SUBCOMMAND in +            (p2p) +              _arguments \ +                '(-a --all)'{-a,--all}'[Close all listeners.]' \ +                '(-p --protocol)'{-p,--protocol}'[Match protocol name.]' \ +                '(-l --listen-address)'{-l,--listen-address}'[Match listen address.]' \ +                '(-t --target-address)'{-t,--target-address}'[Match target address.]' +            ;; +          esac +        ;; +        (forward) +          case $MAIN_SUBCOMMAND in +            (p2p) +              _arguments "--allow-custom-protocol[Don't require /x/ prefix.]" +            ;; +          esac +        ;; +        (listen) +          case $MAIN_SUBCOMMAND in +            (p2p) +              _arguments \ +                "--allow-custom-protocol[Don't require /x/ prefix.]" \ +                '(-r --report-peer-id)'{-r,--report-peer-id}'[Send remote base58 peerid to target when a new connection is established.]' +            ;; +          esac +        ;; +        (stream) +          case $MAIN_SUBCOMMAND in +            (p2p) +              local -a _p2p_stream_arguments +              _p2p_stream_arguments=( +                'close:Close active p2p stream.' +                'ls:List active p2p streams.' +              ) +              _ipfs_subcommand _p2p_stream_arguments +            ;; +          esac +        ;; +        (addrs) +          case $MAIN_SUBCOMMAND in +            (swarm) +              local -a _swarm_addrs_arguments +              _swarm_addrs_arguments=( +                'listen:List interface listening addresses.' +                'local:List local addresses.' +              ) +              _ipfs_subcommand _swarm_addrs_arguments +            ;; +          esac +        ;; +        (filters) +          case $MAIN_SUBCOMMAND in +            (swarm) +              local -a _swarm_filters_arguments +              _swarm_filters_arguments=( +                'add:Add an address filter.' +                'rm:Remove an address filter.' +              ) +              _ipfs_subcommand _swarm_filters_arguments +            ;; +          esac +        ;; +        (peers) +          case $MAIN_SUBCOMMAND in +            (swarm) +              _arguments \ +                '(-v --verbose)'{-v,--verbose}'[display all extra information.]' \ +                '--streams[Also list information about open streams for each peer.]' \ +                '--latency[Also list information about latency to each peer.]' \ +                '--direction[Also list information about the direction of connection.]' +            ;; +          esac +        ;; +      esac +    ;; +  esac +} + +local expl + +_arguments \ +  '(-c --config)'{-c,--config}'[Path to the configuration file to use.]' \ +  '(-D --debug)'{-D,--debug}'[Operate in debug mode.]' \ +  '(--help)--help[Show the full command help text.]' \ +  '(--h)-h[Show a short version of the command help text.]' \ +  '(-L --local)'{-L,--local}'[Run the command locally, instead of using the daemon. DEPRECATED: use --offline.]' \ +  '(--offline)--offline[Run the command offline.]' \ +  '(--api)--api[Use a specific API instance (defaults to /ip4/127.0.0.1/tcp/5001).]' \ +  '(--cid-base)--cid-base[Multibase encoding used for version 1 CIDs in output.]' \ +  '(--upgrade-cidv0-in-output)--upgrade-cidv0-in-output[Upgrade version 0 to version 1 CIDs in output.]' \ +  '(--enc --encoding)'{--enc,--encoding}'[The encoding type the output should be encoded with (json, xml, or text). Default: text.]' \ +  '(--stream-channels)--stream-channels[Stream channel output.]' \ +  '(--timeout)--timeout[Set a global timeout on the command.]' \ +  '*:: :->subcmds' && return 0 + +if (( CURRENT == 1 )); then +  _describe -t commands "ipfs subcommand" _1st_arguments +  return +fi + +MAIN_SUBCOMMAND="$words[1]" +case $MAIN_SUBCOMMAND in +  (add) +    _arguments \ +      '(-r --recursive)'{-r,--recursive}'[Add directory paths recursively.]' \ +      '(--dereference-args)--dereference-args[Symlinks supplied in arguments are dereferenced.]' \ +      '(--stdin-name)--stdin-name[Assign a name if the file source is stdin.]' \ +      '(-H --hidden)'{-H,--hidden}'[Include files that are hidden. Only takes effect on recursive add.]' \ +      '(-q --quiet)'{-q,--quiet}'[Write minimal output.]' \ +      '(-Q --quieter)'{-Q,--quieter}'[Write only final hash.]' \ +      '(--silent)--silent[Write no output.]' \ +      '(-p --progress)'{-p,--progress}'[Stream progress data.]' \ +      '(-t --trickle)'{-t,--trickle}'[Use trickle-dag format for dag generation.]' \ +      '(-n --only-hash)'{-n,--only-hash}'[Only chunk and hash - do not write to disk.]' \ +      '(-w --wrap-with-directory)'{-w,--wrap-with-directory}'[Wrap files with a directory object.]' \ +      '(-s --chunker)'{-s,--chunker}'[Chunking algorithm, size-(bytes) or rabin-(min)-(avg)-(max). Default: size-262144.]' \ +      '(--pin)--pin[Pin this object when adding. Default: true.]' \ +      '(--raw-leaves)--raw-leaves[Use raw blocks for leaf nodes. (experimental).]' \ +      '(--nocopy)--nocopy[Add the file using filestore. Implies raw-leaves. (experimental).]' \ +      '(--fscache)--fscache[Check the filestore for pre-existing blocks. (experimental).]' \ +      '(--cid-version)--cid-version[CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. (experimental).]' \ +      '(--hash)--hash[Hash function to use. Implies CIDv1 if not sha2-256. (experimental). Default: sha2-256.]' \ +      '(--inline)--inline[Inline small blocks into CIDs. (experimental).]' \ +      '(--inline-limit)--inline-limit[Maximum block size to inline. (experimental). Default: 32.]' +  ;; +  (bitswap) +    local -a _bitswap_arguments +    _bitswap_arguments=( +      'ledger:Show the current ledger for a peer.' +      'reprovide:Trigger reprovider.' +      'stat:Show some diagnostic information on the bitswap agent.' +      'wantlist:Show blocks currently on the wantlist.' +    ) +    _ipfs_subcommand _bitswap_arguments +  ;; +  (block) +    local -a _block_arguments +    _block_arguments=( +      'get:Get a raw IPFS block.' +      'put:Store input as an IPFS block.' +      'rm:Remove IPFS block(s).' +      'stat:Print information of a raw IPFS block.' +    ) +    _ipfs_subcommand _block_arguments +  ;; +  (bootstrap) +    local -a _bootstrap_arguments +    _bootstrap_arguments=( +      'add:Add peers to the bootstrap list.' +      'list:Show peers in the bootstrap list.' +      'rm:Remove peers from the bootstrap list.' +    ) +    _ipfs_subcommand _bootstrap_arguments +  ;; +  (cat) +    _arguments \ +      '(-o --offset)'{-o,--offset}'[Byte offset to begin reading from.]' \ +      '(-l --length)'{-l,--length}'[Maximum number of bytes to read.]' +  ;; +  (cid) +    local -a _cid_arguments +    _cid_arguments=( +      'base32:Convert CIDs to Base32 CID version 1.' +      'bases:List available multibase encodings.' +      'codecs:List available CID codecs.' +      'format:Format and convert a CID in various useful ways.' +      'hashes:List available multihashes.' +    ) +    _ipfs_subcommand _cid_arguments +  ;; +  (commands) +    _arguments '(-f --flags)'{-f,--flags}'[Show command flags.]' +  ;; +  (config) +    _arguments \ +      '--bool[Set a boolean value.]' \ +      '--json[Parse stringified JSON.]' +    local -a _config_arguments +    _config_arguments=( +      'edit:Open the config file for editing in $EDITOR.' +      'profile:Apply profiles to config.' +      'replace:Replace the config with <file>.' +      'show:Output config file contents.' +    ) +    _ipfs_subcommand _config_arguments +  ;; +  (daemon) +    _arguments \ +      '--init[Initialize ipfs with default settings if not already initialized.]' \ +      '--init-profile[Configuration profiles to apply for --init. See ipfs init --help for more.]' \ +      '--routing[Overrides the routing option. Default: default.]' \ +      '--mount[Mounts IPFS to the filesystem.]' \ +      '--writable[Enable writing objects (with POST, PUT and DELETE).]' \ +      '--mount-ipfs[Path to the mountpoint for IPFS (if using --mount). Defaults to config setting.]' \ +      '--mount-ipns[Path to the mountpoint for IPNS (if using --mount). Defaults to config setting.]' \ +      '--unrestricted-api[Allow API access to unlisted hashes.]' \ +      '--disable-transport-encryption[Disable transport encryption (for debugging protocols).]' \ +      '--enable-gc[Enable automatic periodic repo garbage collection.]' \ +      '--manage-fdlimit[Check and raise file descriptor limits if needed. Default: true.]' \ +      '--migrate[If true, assume yes at the migrate prompt. If false, assume no.]' \ +      '--enable-pubsub-experiment[Instantiate the ipfs daemon with the experimental pubsub feature enabled.]' \ +      '--enable-namesys-pubsub[Enable IPNS record distribution through pubsub; enables pubsub.]' \ +      '--enable-mplex-experiment[Add the experimental 'go-multiplex' stream muxer to libp2p on construction. Default: true.]' +  ;; +  (dag) +    local -a _dag_arguments +    _dag_arguments=( +      'get:Get a dag node from ipfs.' +      'put:Add a dag node to ipfs.' +      'resolve:Resolve ipld block.' +    ) +    _ipfs_subcommand _dag_arguments +  ;; +  (dht) +    local -a _dht_arguments +    _dht_arguments=( +      'findpeer:Find the multiaddresses associated with a Peer ID.' +      'findprovs:Find peers that can provide a specific value, given a key.' +      'get:Given a key, query the routing system for its best value.' +      'provide:Announce to the network that you are providing given values.' +      'put:Write a key/value pair to the routing system.' +      'query:Find the closest Peer IDs to a given Peer ID by querying the DHT.' +    ) +    _ipfs_subcommand _dht_arguments +  ;; +  (diag) +    local -a _diag_arguments +    _diag_arguments=( +      'cmds:List commands run on this IPFS node.' +      'sys:Print system diagnostic information.' +    ) +    _ipfs_subcommand _diag_arguments +  ;; +  (dns) +    _arguments '(-r --recursive)'{-r,--recursive}'[Resolve until the result is not a DNS link. Default: true.]' +  ;; +  (files) +    _arguments '(-f --flush)'{-f,--flush}'[Flush target and ancestors after write. Default: true.]' +    local -a _files_arguments +    _files_arguments=( +      'chcid:Change the cid version or hash function of the root node of a given path.' +      'cp:Copy files into mfs.' +      "flush:Flush a given path's data to disk." +      'ls:List directories in the local mutable namespace.' +      'mkdir:Make directories.' +      'mv:Move files.' +      'read:Read a file in a given mfs.' +      'rm:Remove a file.' +      'stat:Display file status.' +      'write:Write to a mutable file in a given filesystem.' +    ) +    _ipfs_subcommand _files_arguments +  ;; +  (filestore) +    local -a _filestore_arguments +    _filestore_arguments=( +      'dups:List blocks that are both in the filestore and standard block storage.' +      'ls:List objects in filestore.' +      'verify:Verify objects in filestore.' +    ) +    _ipfs_subcommand _filestore_arguments +  ;; +  (get) +    _arguments \ +      '(-o --output)'{-o,--output}'[The path where the output should be stored.]'\ +      '(-a --archive)'{-a,--archive}'[Output a TAR archive.]' \ +      '(-C --compress)'{-C,--compress}'[Compress the output with GZIP compression.]' \ +      '(-l --compression-level)'{-l,--compression-level}'[The level of compression (1-9).]' +  ;; +  (id) +    _arguments '(-f --format)'{-f,--format}'[Optional output format.]' +  ;; +  (init) +    _arguments \ +      '(-b --bits)'{-b,--bits}'[Number of bits to use in the generated RSA private key. Default: 2048.]' \ +      '(-e --empty-repo)'{-e,--empty-repo}"[Don't add and pin help files to the local storage.]" \ +      '(-p --profile)'{-p,--profile}"[Apply profile settings to config. Multiple profiles can be separated by ','.]" +  ;; +  (key) +    local -a _key_arguments +    _key_arguments=( +      'gen:Create a new keypair' +      'list:List all local keypairs' +      'rename:Rename a keypair' +      'rm:Remove a keypair' +    ) +    _ipfs_subcommand _key_arguments +  ;; +  (log) +    local -a _log_arguments +    _log_arguments=( +      'level:Change the logging level.' +      'ls:List the logging subsystems.' +      'tail:Read the event log.' +    ) +    _ipfs_subcommand _log_arguments +  ;; +  (ls) +    _arguments \ +      '(-v --headers)'{-v,--headers}'[Print table headers (Hash, Size, Name).]' \ +      '--resolve-type[Resolve linked objects to find out their types. Default: true.]' \ +      '--size[Resolve linked objects to find out their file size. Default: true.]' \ +      '(-s --stream)'{-s,--stream}'[Enable exprimental streaming of directory entries as they are traversed.]' \ +  ;; +  (mount) +    _arguments \ +      '(-f --ipfs-path)'{-f,--ipfs-path}'[The path where IPFS should be mounted.]' \ +      '(-n --ipns-path)'{-n,--ipns-path}'[The path where IPNS should be mounted.]' +  ;; +  (name) +    local -a _name_arguments +    _name_arguments=( +      'publish:Publish IPNS names.' +      'pubsub:IPNS pubsub management.' +      'resolve:Resolve IPNS names.' +    ) +    _ipfs_subcommand _name_arguments +  ;; +  (object) +    local -a _object_arguments +    _object_arguments=( +      'data:Output the raw bytes of an IPFS object.' +      'diff:Display the diff between two ipfs objects.' +      'get:Get and serialize the DAG node named by <key>.' +      'links:Output the links pointed to by the specified object.' +      'new:Create a new object from an ipfs template.' +      'patch:Create a new merkledag object based on an existing one.' +      'put:Store input as a DAG object, print its key.' +      'stat:Get stats for the DAG node named by <key>.' +    ) +    _ipfs_subcommand _object_arguments +  ;; +  (p2p) +    local -a _p2p_arguments +    _p2p_arguments=( +      'close:Stop listening for new connections to forward.' +      'forward:Forward connections to libp2p service' +      'listen:Create libp2p service' +      'ls:List active p2p listeners.' +      'stream:P2P stream management.' +    ) +    _ipfs_subcommand _p2p_arguments +  ;; +  (pin) +    local -a _pin_arguments +    _pin_arguments=( +      'add:Pin objects to local storage.' +      'ls:List objects pinned to local storage.' +      'rm:Remove pinned objects from local storage.' +      'update:Update a recursive pin' +      'verify:Verify that recursive pins are complete.' +    ) +    _ipfs_subcommand _pin_arguments +  ;; +  (ping) +    _arguments '(-n --count)'{-n,--count}'[Number of ping messages to send. Default: 10.]' +  ;; +  (refs) +    _arguments \ +      '--format[Emit edges with given format. Available tokens: <src> <dst> <linkname>. Default: <dst>.]' \ +      '(-e --edges)'{-e,--edges}'[Emit edge format: `<from> -> <to>`.]' \ +      '(-u --unique)'{-u,--unique}'[Omit duplicate refs from output.]' \ +      '(-r --recursive)'{-r,--recursive}'[Recursively list links of child nodes.]' \ +      '--max-depth[Only for recursive refs, limits fetch and listing to the given depth. Default: -1.]' +    local -a _refs_arguments +    _refs_arguments='local:List all local references.' +    _ipfs_subcommand _refs_arguments +  ;; +  (repo) +    local -a _repo_arguments +    _repo_arguments=( +      'fsck:Remove repo lockfiles.' +      'gc:Perform a garbage collection sweep on the repo.' +      'stat:Get stats for the currently used repo.' +      'verify:Verify all blocks in repo are not corrupted.' +      'version:Show the repo version.' +    ) +    _ipfs_subcommand _repo_arguments +  ;; +  (resolve) +    _arguments \ +      '(-r --recursive)'{-r,--recursive}'[Resolve until the result is an IPFS name. Default: true.]' \ +      '(--dhtrc --dht-record-count)'{--dhtrc,--dht-record-count}'[Number of records to request for DHT resolution.]' \ +      '(--dhtt --dht-timeout)'{--dhtt,--dht-timeout}'[Max time to collect values during DHT resolution eg "30s". Pass 0 for no timeout.]' +  ;; +  (stats) +    local -a _stats_arguments +    _stats_arguments=( +      'bitswap:Show some diagnostic information on the bitswap agent.' +      'bw:Print ipfs bandwidth information.' +      'repo:Get stats for the currently used repo.' +    ) +    _ipfs_subcommand _stats_arguments +  ;; +  (swarm) +    local -a _swarm_arguments +    _swarm_arguments=( +      'addrs:List known addresses. Useful for debugging.' +      'connect:Open connection to a given address.' +      'disconnect:Close connection to a given address.' +      'filters:Manipulate address filters.' +      'peers:List peers with open connections.' +    ) +    _ipfs_subcommand _swarm_arguments +  ;; +  (tar) +    local -a _tar_arguments +    _tar_arguments=( +      'add:Import a tar file into ipfs.' +      'cat:Export a tar file from IPFS.' +    ) +    _ipfs_subcommand _tar_arguments +  ;; +  (version) +    _arguments \ +      '(-n --number)'{-n,--number}'[Only show the version number.]' \ +      '--commit[Show the commit hash.]' \ +      '--repo[Show repo version.]' \ +      '--all[Show all version information.]' +  ;; +esac | 
