#!/bin/bash
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#### CATEGORY=Software delivery
#### DEPRECATED
### push packages to a device

## usage: fx push-package [pkg1 pkg2 ...]
##
## Deprecated: This command is deprecated as it is misleading. Packages in
## Fuchsia are only cached, not installed, and the cache is updated on-demand
## when a component is launched from a fuchsia package URL. An attempt to "push"
## a package as implemented here only performs one of these resolutions, and may
## or may not influence what happens "next" if a user "runs" a component url. As
## such this command influences a poor mental model of the system and should be
## avoided.
##
## Push packages to a device. One or more package names may be supplied. If no
## package name is suppled all packages in the build output will be pushed. The
## target must be reachable from the host and must already know how to reach
## the host package server (i.e. fx serve must be running).
##
## See https://fuchsia.dev/fuchsia-src/development/workflows/package_update
## for more information about using this workflow.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-config-read

fx-warn "fx push-package is deprecated and should not be used"
fx-warn "The notion of 'push' is falsified in this implementation and does not really exist."
fx-warn "Users can simply 'fx run <component-url>' in order to affect cache updates."
sleep 5

function main {
  fx-standard-switches "$@"
  set -- "${FX_ARGV[@]}"

  # if the second arg is set, but 0-length, publish nothing
  if [[ $# -eq 1 ]] && [[ -z "${1}" ]]; then
    exit 0
  fi

  local all_pkgs=($(fx-command-run list-packages))

  # pkgs is the last argument
  local pkgs=()

  if [[ $# -eq 0 ]]; then
    fx-warn "Pushing ${#all_pkgs[@]} packages, this may take some time..."
    pkgs=("${all_pkgs[@]}")
  else
    for pkg in "$@"; do
      for p in "${all_pkgs[@]}"; do
        if [[ "$p" == "$pkg" ]]; then
          pkgs+=("$p")
          continue 2
        fi
      done
      fx-error "Package $pkg is not known to the current build configuration."
      fx-error "Check \`fx list-packages\` for the correct name,"
      fx-error "or adjust the build configuration with \`fx set\`."
      exit 1
    done
  fi

  for pkg in "${pkgs[@]}"; do
    if ! fx-command-run shell pkgctl resolve "fuchsia-pkg://fuchsia.com/${pkg}"; then
      r=$?
      fx-error "Push of $pkg failed"
      return $r
    fi
  done
}

main "$@"
