package: Add "info" command
It allows to print individual information from the package meta data.
This commit is contained in:
@@ -7,11 +7,11 @@ BinCommand package :
|
|||||||
command_create.cpp
|
command_create.cpp
|
||||||
command_dump.cpp
|
command_dump.cpp
|
||||||
command_extract.cpp
|
command_extract.cpp
|
||||||
|
command_info.cpp
|
||||||
command_list.cpp
|
command_list.cpp
|
||||||
package.cpp
|
package.cpp
|
||||||
PackageWriterListener.cpp
|
PackageWriterListener.cpp
|
||||||
PackageWritingUtils.cpp
|
PackageWritingUtils.cpp
|
||||||
|
|
||||||
:
|
:
|
||||||
package be
|
package be
|
||||||
$(TARGET_LIBSUPC++)
|
$(TARGET_LIBSUPC++)
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013, Ingo Weinhold, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <Entry.h>
|
||||||
|
#include <package/PackageInfo.h>
|
||||||
|
|
||||||
|
#include "package.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace BPackageKit;
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
command_info(int argc, const char* const* argv)
|
||||||
|
{
|
||||||
|
const char* format = "name: %name% version: %version%\n";
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
static struct option sLongOptions[] = {
|
||||||
|
{ "format", required_argument, 0, 'f' },
|
||||||
|
{ "help", no_argument, 0, 'h' },
|
||||||
|
{ 0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
opterr = 0; // don't print errors
|
||||||
|
int c = getopt_long(argc, (char**)argv, "f:h", sLongOptions, NULL);
|
||||||
|
if (c == -1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'f':
|
||||||
|
format = optarg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
print_usage_and_exit(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// One argument should remain -- the package file name.
|
||||||
|
if (optind + 1 != argc)
|
||||||
|
print_usage_and_exit(true);
|
||||||
|
|
||||||
|
const char* fileName = argv[optind++];
|
||||||
|
|
||||||
|
// Read the package info from the package file. If it doesn't look like a
|
||||||
|
// package file, assume it is a package info file.
|
||||||
|
BPackageInfo info;
|
||||||
|
if (BString(fileName).EndsWith(".hpkg")) {
|
||||||
|
status_t error = info.ReadFromPackageFile(fileName);
|
||||||
|
if (error != B_OK) {
|
||||||
|
fprintf(stderr, "Error: Failed to read package file \"%s\": %s\n",
|
||||||
|
fileName, strerror(error));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
status_t error = info.ReadFromConfigFile(BEntry(fileName));
|
||||||
|
if (error != B_OK) {
|
||||||
|
fprintf(stderr, "Error: Failed to read package info file \"%s\": "
|
||||||
|
"%s\n", fileName, strerror(error));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse format string and produce output
|
||||||
|
BString output;
|
||||||
|
while (*format != '\0') {
|
||||||
|
char c = *format++;
|
||||||
|
switch (c) {
|
||||||
|
case '%':
|
||||||
|
{
|
||||||
|
const char* start = format;
|
||||||
|
while (*format != '\0' && *format != '%')
|
||||||
|
format++;
|
||||||
|
if (*format != '%') {
|
||||||
|
fprintf(stderr, "Error: Unexpected at end of the format "
|
||||||
|
"string. Expected \"%%\".\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format == start) {
|
||||||
|
output << '%';
|
||||||
|
} else {
|
||||||
|
BString variable(start, format - start);
|
||||||
|
if (variable == "fileName") {
|
||||||
|
output << info.CanonicalFileName();
|
||||||
|
} else if (variable == "name") {
|
||||||
|
output << info.Name();
|
||||||
|
} else if (variable == "version") {
|
||||||
|
output << info.Version().ToString();
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Error: Unsupported placeholder \"%s\" "
|
||||||
|
"in format string.\n", variable.String());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
format++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '\\':
|
||||||
|
c = *format++;
|
||||||
|
if (c == '\0') {
|
||||||
|
fprintf(stderr, "Error: \"\\\" at the end of the format "
|
||||||
|
"string.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
switch (c) {
|
||||||
|
case 'n':
|
||||||
|
c = '\n';
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
c = '\t';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// fall through
|
||||||
|
|
||||||
|
default:
|
||||||
|
output << c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fputs(output.String(), stdout);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -76,6 +76,19 @@ static const char* kUsage =
|
|||||||
" of the archive.\n"
|
" of the archive.\n"
|
||||||
" -i <info> - Extract the .PackageInfo file to <info> instead.\n"
|
" -i <info> - Extract the .PackageInfo file to <info> instead.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
" info [ <options> ] <package>\n"
|
||||||
|
" Prints individual meta information of package file <package>.\n"
|
||||||
|
"\n"
|
||||||
|
" -f <format>, --format <format>\n"
|
||||||
|
" - Print the given format string, performing the following\n"
|
||||||
|
" replacements:\n"
|
||||||
|
" %fileName% - the package's canonical file name\n"
|
||||||
|
" %name% - the package name\n"
|
||||||
|
" %version% - the package version\n"
|
||||||
|
" %% - %\n"
|
||||||
|
" \n - new line\n"
|
||||||
|
" \t - tab\n"
|
||||||
|
"\n"
|
||||||
" list [ <options> ] <package>\n"
|
" list [ <options> ] <package>\n"
|
||||||
" Lists the contents of package file <package>.\n"
|
" Lists the contents of package file <package>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -118,6 +131,9 @@ main(int argc, const char* const* argv)
|
|||||||
if (strcmp(command, "list") == 0)
|
if (strcmp(command, "list") == 0)
|
||||||
return command_list(argc - 1, argv + 1);
|
return command_list(argc - 1, argv + 1);
|
||||||
|
|
||||||
|
if (strcmp(command, "info") == 0)
|
||||||
|
return command_info(argc - 1, argv + 1);
|
||||||
|
|
||||||
if (strcmp(command, "help") == 0)
|
if (strcmp(command, "help") == 0)
|
||||||
print_usage_and_exit(false);
|
print_usage_and_exit(false);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2009, Ingo Weinhold, [email protected].
|
* Copyright 2009-2013, Ingo Weinhold, [email protected].
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef PACKAGE_H
|
#ifndef PACKAGE_H
|
||||||
@@ -12,6 +12,7 @@ int command_add(int argc, const char* const* argv);
|
|||||||
int command_create(int argc, const char* const* argv);
|
int command_create(int argc, const char* const* argv);
|
||||||
int command_dump(int argc, const char* const* argv);
|
int command_dump(int argc, const char* const* argv);
|
||||||
int command_extract(int argc, const char* const* argv);
|
int command_extract(int argc, const char* const* argv);
|
||||||
|
int command_info(int argc, const char* const* argv);
|
||||||
int command_list(int argc, const char* const* argv);
|
int command_list(int argc, const char* const* argv);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ BuildPlatformMain <build>package :
|
|||||||
command_create.cpp
|
command_create.cpp
|
||||||
command_dump.cpp
|
command_dump.cpp
|
||||||
command_extract.cpp
|
command_extract.cpp
|
||||||
|
command_info.cpp
|
||||||
command_list.cpp
|
command_list.cpp
|
||||||
package.cpp
|
package.cpp
|
||||||
PackageWriterListener.cpp
|
PackageWriterListener.cpp
|
||||||
|
|||||||
Reference in New Issue
Block a user