diff --git a/Makefile-hacktree.am b/Makefile-hacktree.am index b62081b5..d3e757d9 100644 --- a/Makefile-hacktree.am +++ b/Makefile-hacktree.am @@ -47,9 +47,10 @@ bin_PROGRAMS += hacktree hacktree_SOURCES = src/main.c \ src/ht-builtins.h \ src/ht-builtin-commit.c \ + src/ht-builtin-fsck.c \ src/ht-builtin-init.c \ src/ht-builtin-link-file.c \ - src/ht-builtin-fsck.c \ + src/ht-builtin-show.c \ $(NULL) hacktree_CFLAGS = -I$(srcdir)/src -I$(srcdir)/src/libhacktree -I$(srcdir)/src/libhtutil -DLOCALEDIR=\"$(datadir)/locale\" $(GIO_UNIX_CFLAGS) hacktree_LDADD = libhtutil.la libhacktree.la $(GIO_UNIX_LIBS) diff --git a/src/ht-builtin-show.c b/src/ht-builtin-show.c new file mode 100644 index 00000000..b9f30f24 --- /dev/null +++ b/src/ht-builtin-show.c @@ -0,0 +1,90 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2011 Colin Walters + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Author: Colin Walters + */ + +#include "config.h" + +#include "ht-builtins.h" +#include "hacktree.h" + +#include + +static char *repo_path; + +static GOptionEntry options[] = { + { "repo", 0, 0, G_OPTION_ARG_FILENAME, &repo_path, "Repository path", "repo" }, + { NULL } +}; + +gboolean +hacktree_builtin_show (int argc, char **argv, const char *prefix, GError **error) +{ + GOptionContext *context; + gboolean ret = FALSE; + HacktreeRepo *repo = NULL; + int i; + const char *target; + HacktreeSerializedVariantType type; + GVariant *variant = NULL; + char *formatted_variant = NULL; + + context = g_option_context_new ("- Output a metadata object"); + g_option_context_add_main_entries (context, options, NULL); + + if (!g_option_context_parse (context, &argc, &argv, error)) + goto out; + + if (repo_path == NULL) + repo_path = "."; + + repo = hacktree_repo_new (repo_path); + if (!hacktree_repo_check (repo, error)) + goto out; + + if (argc < 2) + { + target = hacktree_repo_get_head (repo); + if (!target) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "No arguments specified and no HEAD exists"); + goto out; + } + } + else + target = argv[1]; + + if (!hacktree_repo_load_variant (repo, target, &type, &variant, error)) + goto out; + + g_print ("Object: %s\nType: %d\n", target, type); + formatted_variant = g_variant_print (variant, TRUE); + g_print ("%s\n", formatted_variant); + + ret = TRUE; + out: + if (context) + g_option_context_free (context); + g_clear_object (&repo); + if (variant) + g_variant_unref (variant); + g_free (formatted_variant); + return ret; +} diff --git a/src/ht-builtins.h b/src/ht-builtins.h index e9c8c6e8..da5a2866 100644 --- a/src/ht-builtins.h +++ b/src/ht-builtins.h @@ -40,6 +40,7 @@ gboolean hacktree_builtin_commit (int argc, char **argv, const char *prefix, GEr gboolean hacktree_builtin_init (int argc, char **argv, const char *prefix, GError **error); gboolean hacktree_builtin_link_file (int argc, char **argv, const char *prefix, GError **error); gboolean hacktree_builtin_fsck (int argc, char **argv, const char *prefix, GError **error); +gboolean hacktree_builtin_show (int argc, char **argv, const char *prefix, GError **error); G_END_DECLS diff --git a/src/main.c b/src/main.c index 6428a1b0..c3cafb87 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,7 @@ static HacktreeBuiltin builtins[] = { { "commit", hacktree_builtin_commit, 0 }, { "link-file", hacktree_builtin_link_file, 0 }, { "fsck", hacktree_builtin_fsck, 0 }, + { "show", hacktree_builtin_show, 0 }, { NULL } };