pactree: add -s option to walk sync DBs
Add a whole lot of bloat to parse pacman.conf and only a few lines to use the list of sync DBs instead of the local DB. Dan: I fully plan on this being temporary and us finding a better way in the future to parse pacman.conf from multiple binaries. Adding a standalone config parser is probably not the right way of going about things, but for now it is by far the easiest. Signed-off-by: Dave Reisner <d@falconindy.com> Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
777bdc6c50
commit
3725998cbc
1 changed files with 92 additions and 4 deletions
|
@ -26,6 +26,8 @@
|
||||||
#include <alpm.h>
|
#include <alpm.h>
|
||||||
#include <alpm_list.h>
|
#include <alpm_list.h>
|
||||||
|
|
||||||
|
#define LINE_MAX 512
|
||||||
|
|
||||||
/* output */
|
/* output */
|
||||||
struct graph_style {
|
struct graph_style {
|
||||||
const char *provides;
|
const char *provides;
|
||||||
|
@ -85,8 +87,77 @@ int graphviz = 0;
|
||||||
int max_depth = -1;
|
int max_depth = -1;
|
||||||
int reverse = 0;
|
int reverse = 0;
|
||||||
int unique = 0;
|
int unique = 0;
|
||||||
|
int searchsyncs = 0;
|
||||||
const char *dbpath = DBPATH;
|
const char *dbpath = DBPATH;
|
||||||
|
|
||||||
|
static char *strtrim(char *str)
|
||||||
|
{
|
||||||
|
char *pch = str;
|
||||||
|
|
||||||
|
if(str == NULL || *str == '\0') {
|
||||||
|
/* string is empty, so we're done. */
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(isspace((unsigned char)*pch)) {
|
||||||
|
pch++;
|
||||||
|
}
|
||||||
|
if(pch != str) {
|
||||||
|
memmove(str, pch, (strlen(pch) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if there wasn't anything but whitespace in the string. */
|
||||||
|
if(*str == '\0') {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
pch = (str + (strlen(str) - 1));
|
||||||
|
while(isspace((unsigned char)*pch)) {
|
||||||
|
pch--;
|
||||||
|
}
|
||||||
|
*++pch = '\0';
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int register_syncs(pmhandle_t *handle) {
|
||||||
|
FILE *fp;
|
||||||
|
char *ptr, *section = NULL;
|
||||||
|
char line[LINE_MAX];
|
||||||
|
|
||||||
|
fp = fopen(CONFFILE, "r");
|
||||||
|
if(!fp) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(fgets(line, LINE_MAX, fp)) {
|
||||||
|
strtrim(line);
|
||||||
|
|
||||||
|
if(line[0] == '#' || !strlen(line)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((ptr = strchr(line, '#'))) {
|
||||||
|
*ptr = '\0';
|
||||||
|
strtrim(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line[0] == '[' && line[strlen(line) - 1] == ']') {
|
||||||
|
free(section);
|
||||||
|
section = strndup(&line[1], strlen(line) - 2);
|
||||||
|
|
||||||
|
if(section && strcmp(section, "options") != 0) {
|
||||||
|
alpm_db_register_sync(handle, section, PM_PGP_VERIFY_OPTIONAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(section);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_options(int argc, char *argv[])
|
static int parse_options(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int opt, option_index = 0;
|
int opt, option_index = 0;
|
||||||
|
@ -100,11 +171,12 @@ static int parse_options(int argc, char *argv[])
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
{"linear", no_argument, 0, 'l'},
|
{"linear", no_argument, 0, 'l'},
|
||||||
{"reverse", no_argument, 0, 'r'},
|
{"reverse", no_argument, 0, 'r'},
|
||||||
|
{"sync", no_argument, 0, 'S'},
|
||||||
{"unique", no_argument, 0, 'u'},
|
{"unique", no_argument, 0, 'u'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
while((opt = getopt_long(argc, argv, "b:cd:ghlru", opts, &option_index))) {
|
while((opt = getopt_long(argc, argv, "b:cd:ghlrsu", opts, &option_index))) {
|
||||||
if(opt < 0) {
|
if(opt < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -133,6 +205,9 @@ static int parse_options(int argc, char *argv[])
|
||||||
case 'r':
|
case 'r':
|
||||||
reverse = 1;
|
reverse = 1;
|
||||||
break;
|
break;
|
||||||
|
case 's':
|
||||||
|
searchsyncs = 1;
|
||||||
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
unique = 1;
|
unique = 1;
|
||||||
style = &graph_linear;
|
style = &graph_linear;
|
||||||
|
@ -161,6 +236,7 @@ static void usage(void)
|
||||||
" -g, --graph generate output for graphviz's dot\n"
|
" -g, --graph generate output for graphviz's dot\n"
|
||||||
" -l, --linear enable linear output\n"
|
" -l, --linear enable linear output\n"
|
||||||
" -r, --reverse show reverse dependencies\n"
|
" -r, --reverse show reverse dependencies\n"
|
||||||
|
" -s, --sync search sync DBs instead of local\n"
|
||||||
" -u, --unique show dependencies with no duplicates (implies -l)\n\n"
|
" -u, --unique show dependencies with no duplicates (implies -l)\n\n"
|
||||||
" -h, --help display this help message\n");
|
" -h, --help display this help message\n");
|
||||||
}
|
}
|
||||||
|
@ -324,7 +400,7 @@ static void walk_deps(alpm_list_t *dblist, pmpkg_t *pkg, int depth)
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int freelist = 0, ret = 0;
|
||||||
enum _pmerrno_t err;
|
enum _pmerrno_t err;
|
||||||
const char *target_name;
|
const char *target_name;
|
||||||
pmpkg_t *pkg;
|
pmpkg_t *pkg;
|
||||||
|
@ -344,7 +420,17 @@ int main(int argc, char *argv[])
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
dblist = alpm_list_add(dblist, alpm_option_get_localdb(handle));
|
if(searchsyncs) {
|
||||||
|
if(register_syncs(handle) != 0) {
|
||||||
|
fprintf(stderr, "error: failed to register sync DBs\n");
|
||||||
|
ret = 1;
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
dblist = alpm_option_get_syncdbs(handle);
|
||||||
|
} else {
|
||||||
|
dblist = alpm_list_add(dblist, alpm_option_get_localdb(handle));
|
||||||
|
freelist = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* we only care about the first non option arg for walking */
|
/* we only care about the first non option arg for walking */
|
||||||
target_name = argv[optind];
|
target_name = argv[optind];
|
||||||
|
@ -366,7 +452,9 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
print_end();
|
print_end();
|
||||||
|
|
||||||
alpm_list_free(dblist);
|
if(freelist) {
|
||||||
|
alpm_list_free(dblist);
|
||||||
|
}
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
cleanup();
|
cleanup();
|
||||||
|
|
Loading…
Add table
Reference in a new issue