// file      : libbuild2/install/operation.hxx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

#ifndef LIBBUILD2_INSTALL_OPERATION_HXX
#define LIBBUILD2_INSTALL_OPERATION_HXX

#ifndef BUILD2_BOOTSTRAP
#  include <libbutl/json/serializer.hxx>
#endif

#include <libbuild2/types.hxx>
#include <libbuild2/utility.hxx>

#include <libbuild2/operation.hxx>
#include <libbuild2/filesystem.hxx> // auto_rmfile

namespace build2
{
  namespace install
  {
    extern const operation_info op_install;
    extern const operation_info op_uninstall;
    extern const operation_info op_update_for_install;

    // Set as context::current_inner_odata during the install/uninstall inner
    // operations.
    //
    struct context_data
    {
      // Manifest.
      //
#ifndef BUILD2_BOOTSTRAP
      path      manifest_file; // Absolute and normalized, empty if `-`.
      path_name manifest_name; // Original path/name.
      ofdstream manifest_ofs;
      ostream&  manifest_os;
      auto_rmfile manifest_autorm;
      json_stream_serializer manifest_json;
      const target* manifest_target = nullptr; // Target being installed.
      struct manifest_target_entry
      {
        build2::path path;
        string       mode;
        build2::path target;
      };
      vector<manifest_target_entry> manifest_target_entries;
#endif

      // The following manifest_install_[dfl]() functions correspond to (and
      // are called from) file_rule::install_[dfl]().

      // install -d -m <mode> <dir>
      //
      static void
      manifest_install_d (context&,
                          const target&,
                          const dir_path& dir,
                          const string& mode);

      // install -m <mode> <file> <dir>/<name>
      //
      static void
      manifest_install_f (context&,
                          const target& file,
                          const dir_path& dir,
                          const path& name,
                          const string& mode);

      // install -l <link_target> <dir>/<link>
      //
      static void
      manifest_install_l (context&,
                          const target&,
                          const path& link_target,
                          const dir_path& dir,
                          const path& link);

      // Constructor.
      //
      explicit
      context_data (const path* manifest);
    };
  }
}

#endif // LIBBUILD2_INSTALL_OPERATION_HXX
