/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=2 et sw=2 tw=80: */ /* ** Copyright (c) 2013 D. Richard Hipp ** ** This program is free software; you can redistribute it and/or ** modify it under the terms of the Simplified BSD License (also ** known as the "2-Clause License" or "FreeBSD License".) ** ** 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. ** ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ******************************************************************************* ** This file implements a basic artifact tagging [test] app using the libfossil ** API. */ #include "fossil-scm/fossil-cli.h" /* Fossil App mini-framework */ /* #include "fossil-scm/fossil-internal.h" */ static void fcli_local_help(){ printf("Usage:\n\t%s [options]\n\n", fcli.appName); puts("Lists all files in a repository. Currently does no introspection " "vs. the local checkout. " "Options:\n"); puts("\t--own|-o lists only files actually contained in the " "given version's manifest. The result will differ only " "for delta manifests.\n"); puts("\t--version|-v=VERSION (uuid or symbolic name). " "Default is 'current' if there is an opened checkout, " "else 'trunk'.\n"); puts("\t--verbose|-V enables more details."); } /** A fsl_card_F_visitor_f() implementation which outputs state from fc to the fossil output channel. */ static int ls_F_card_v(fsl_card_F const * fc, void * state){ char perm; if(FSL_MF_PERM_EXE & fc->perms) perm = 'x'; else if(FSL_MF_PERM_LINK & fc->perms) perm = 'L'; else perm = '-'; if(fcli.verbose){ f_out("%-8"FSL_ID_T_PFMT, fsl_uuid_to_rid(fcli.f, fc->uuid)); } f_out("%.*s %c %s\n", 8, fc->uuid, perm, fc->name); return 0; } static int ls_ls( fsl_deck * d, char onlyFromSelf ){ /* fsl_cx * f = fcli.f; */ int rc; if(fcli.verbose){ f_out("RID "); } f_out("%-8s P Name\n", "UUID"); rc = fsl_deck_F_foreach(d, onlyFromSelf ? 0 : 1, ls_F_card_v, NULL); return rc; } int main(int argc, char * const * argv ){ int rc = 0; char * lsVersion = NULL; fsl_cx * f; fsl_id_t vid = 0; fsl_deck deck = fsl_deck_empty; fsl_deck * d = &deck; char onlyFromSelf = 0; /* fsl_db * db; */ fcli.appHelp = fcli_local_help; rc = fcli_setup(argc, argv); if(FSL_RC_BREAK==rc) /* --help */ return 0; else if(rc) goto end; f = fcli.f; onlyFromSelf = fcli_flag2("o", "own", NULL); if(!fcli_flag2("v","version", &lsVersion)){ lsVersion = fsl_strdup(fsl_cx_db_checkout(f) ? "current" : "trunk"); } assert(lsVersion); rc = fsl_sym_to_rid(f, lsVersion, FSL_ATYPE_CHECKIN, &vid); if(rc) goto end; rc = fsl_deck_load_rid( f, vid, d, FSL_CATYPE_MANIFEST ); if(rc) goto end; VERBOSE(("File list from manifest version [%s] " "(RID %"FSL_ID_T_PFMT")%s:\n", lsVersion, vid, onlyFromSelf ? " (only files from _this_ manifest)" : "")); rc = ls_ls(d, onlyFromSelf); end: fsl_free(lsVersion); fsl_deck_finalize(d); return (fcli_err_report(0)||rc) ? EXIT_FAILURE : EXIT_SUCCESS; }