/* archive-meta-info.c
 *
 ****************************************************************
 * Copyright (C) 2003 Tom Lord
 *
 * See the file "COPYING" for further information about
 * the copyright and warranty status of this work.
 */


#include "config-options.h"
#include "po/gettext.h"
#include "hackerlab/bugs/exception.h"
#include "hackerlab/cmd/main.h"
#include "libarch/archive.h"
#include "libarch/debug.h"
#include "libarch/namespace.h"
#include "libarch/project-tree.h"
#include "libarch/my.h"
#include "commands/cmd.h"
#include "commands/archive-meta-info.h"
#include "commands/version.h"



static t_uchar * usage = N_("[options] [archive/]item-name");

/* FIXME: archive-meta-info needs a -d argument */
#define OPTS(OP) \
  OP (opt_help_msg, "h", "help", 0, \
      N_("Display a help message and exit.")) \
  OP (opt_long_help, "H", 0, 0, \
      N_("Display a verbose help message and exit.")) \
  OP (opt_version, "V", "version", 0, \
      N_("Display a release identifier string\n" \
      "and exit.")) 


t_uchar arch_cmd_archive_meta_info_help[] = N_("report meta-info from an archive\n"
                                             "Print the contents of a meta-info file from an archive.\n"
                                             "For example,\n"
                                             "\n"
                                             "    % baz archive-meta-info name\n"
                                             "\n"
                                             "prints the official name of your default archive.\n");

enum options
{
  OPTS (OPT_ENUM)
};

static struct opt_desc opts[] =
{
  OPTS (OPT_DESC)
    {-1, 0, 0, 0, 0}
};



int
arch_cmd_archive_meta_info (t_uchar *program_name, int argc, char * argv[])
{
  int o;
  int result=0;
  struct opt_parsed * option;


  safe_buffer_fd (1, 0, O_WRONLY, 0);

  option = 0;

  while (1)
    {
      o = opt_standard (lim_use_must_malloc, &option, opts, &argc, argv, program_name, usage, libarch_version_string, arch_cmd_archive_meta_info_help, opt_help_msg, opt_long_help, opt_version);
      if (o == opt_none)
        break;
      switch (o)
        {
        default:
          safe_printfmt (2, _("unhandled option `%s'\n"), option->opt_string);
          panic ("internal error parsing arguments");

        usage_error:
          opt_usage (2, argv[0], program_name, usage, 1);
          exit (1);

          /* bogus_arg: */
          safe_printfmt (2, _("ill-formed argument for `%s' (`%s')\n"),
                         option->opt_string, option->arg_string);
          goto usage_error;

        }
    }

  if (argc != 2)
    goto usage_error;


  {
    /* try to connect to the archive the user supplied */
    t_uchar * namespace = NULL;
    t_uchar * query_item = NULL;
    t_uchar * info;
    struct arch_archive * arch = NULL;
    arch_project_tree_t * tree = arch_project_tree_new (talloc_context, ".");
    
    if (tree && tree->root)
      {
	arch_project_tree_check_name (tree, &arch, &namespace, argv[1]);
	arch_project_tree_delete (tree);
      }
    
    if (!arch)
	arch = arch_archive_connect_branch (argv[1], &namespace);

    if (arch)
      {
	/* archive is always present in namespace, and never has / in it */
	debug (dbg_ui, 2, _("arch connected: '%s' at '%s'\n"), arch->official_name, arch->location);
	if (str_chr_index (namespace, '/'))
	  query_item = str_save (0, str_chr_index (namespace, '/') + 1);
	if (!str_length (query_item))
	  {
	    lim_free (0, query_item);
	    query_item = NULL;
	  }
	debug (dbg_ui, 2, _("querying for '%s' from '%s'\n"), query_item, arch->official_name);
      }
    
    if (!query_item || !arch)
      {
        safe_printfmt (2, _("%s: unable to connect to an appropriate archive, or invalid query. '%s'\n"), argv[0], argv[1]);
        exit(1);
      }

    info = arch_get_meta_info (arch, query_item);
    result = ! info;
    safe_printfmt (1, "%s", (info ? info : (t_uchar *)""));

    arch_archive_close (arch);
    lim_free (0, info);
    lim_free (0, query_item);
    lim_free (0, namespace);
  }

  return result;
}




/* tag: Tom Lord Mon Jun  9 22:33:13 2003 (cmd-archive-meta-info.c)
 */


syntax highlighted by Code2HTML, v. 0.9.1