mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-23 08:18:51 -05:00
pacman/sync: implement interactive group selection
Signed-off-by: Xavier Chantry <chantry.xavier@gmail.com>
This commit is contained in:
parent
2a90dbe3a8
commit
00fec5e250
@ -636,9 +636,8 @@ static int process_group(alpm_list_t *dbs, char *group)
|
|||||||
printf(_(":: There are %d members in group %s:\n"), count,
|
printf(_(":: There are %d members in group %s:\n"), count,
|
||||||
group);
|
group);
|
||||||
select_display(pkgs);
|
select_display(pkgs);
|
||||||
select_question(count);
|
|
||||||
char *array = malloc(count);
|
char *array = malloc(count);
|
||||||
memset(array, 1, count);
|
multiselect_question(array, count);
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for(i = pkgs; i; i = alpm_list_next(i)) {
|
for(i = pkgs; i; i = alpm_list_next(i)) {
|
||||||
if(array[n++] == 0)
|
if(array[n++] == 0)
|
||||||
|
@ -694,6 +694,114 @@ void select_display(const alpm_list_t *pkglist)
|
|||||||
FREELIST(list);
|
FREELIST(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int parseindex(char *s, int *val, int min, int max)
|
||||||
|
{
|
||||||
|
char *endptr = NULL;
|
||||||
|
int n = strtol(s, &endptr, 10);
|
||||||
|
if(*endptr == '\0') {
|
||||||
|
if(n < min || n > max) {
|
||||||
|
fprintf(stderr, _("Invalid value: %d is not between %d and %d\n"),
|
||||||
|
n, min, max);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
*val = n;
|
||||||
|
return(0);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, _("Invalid number: %s\n"), s);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int multiselect_parse(char *array, int count, char *response)
|
||||||
|
{
|
||||||
|
char *str, *saveptr;
|
||||||
|
|
||||||
|
for (str = response; ; str = NULL) {
|
||||||
|
int include = 1;
|
||||||
|
int start, end;
|
||||||
|
char *ends = NULL;
|
||||||
|
char *starts = strtok_r(str, " ", &saveptr);
|
||||||
|
|
||||||
|
if (starts == NULL)
|
||||||
|
break;
|
||||||
|
strtrim(starts);
|
||||||
|
int len = strlen(starts);
|
||||||
|
if(len == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (*starts == '^') {
|
||||||
|
starts++;
|
||||||
|
len--;
|
||||||
|
include = 0;
|
||||||
|
} else if(str) {
|
||||||
|
/* if first token is including, we unselect all targets */
|
||||||
|
memset(array, 0, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(len > 1) {
|
||||||
|
/* check for range */
|
||||||
|
char *p;
|
||||||
|
if((p = strchr(starts+1, '-'))) {
|
||||||
|
*p = 0;
|
||||||
|
ends = p+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(parseindex(starts, &start, 1, count) != 0)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
if(!ends) {
|
||||||
|
array[start-1] = include;
|
||||||
|
} else {
|
||||||
|
if(parseindex(ends, &end, start, count) != 0)
|
||||||
|
return(-1);
|
||||||
|
for(int d = start; d <= end; d++) {
|
||||||
|
array[d-1] = include;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int multiselect_question(char *array, int count)
|
||||||
|
{
|
||||||
|
char response[64];
|
||||||
|
FILE *stream;
|
||||||
|
|
||||||
|
if(config->noconfirm) {
|
||||||
|
stream = stdout;
|
||||||
|
} else {
|
||||||
|
/* Use stderr so questions are always displayed when redirecting output */
|
||||||
|
stream = stderr;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
memset(array, 1, count);
|
||||||
|
|
||||||
|
fprintf(stream, "\n");
|
||||||
|
fprintf(stream, _("Enter a selection (default=all)"));
|
||||||
|
fprintf(stream, ": ");
|
||||||
|
|
||||||
|
if(config->noconfirm) {
|
||||||
|
fprintf(stream, "\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fgets(response, sizeof(response), stdin)) {
|
||||||
|
strtrim(response);
|
||||||
|
if(strlen(response) > 0) {
|
||||||
|
if(multiselect_parse(array, count, response) == -1) {
|
||||||
|
/* only loop if user gave an invalid answer */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
int select_question(int count)
|
int select_question(int count)
|
||||||
{
|
{
|
||||||
char response[32];
|
char response[32];
|
||||||
|
@ -61,6 +61,7 @@ void display_optdepends(pmpkg_t *pkg);
|
|||||||
void print_packages(const alpm_list_t *packages);
|
void print_packages(const alpm_list_t *packages);
|
||||||
void select_display(const alpm_list_t *pkglist);
|
void select_display(const alpm_list_t *pkglist);
|
||||||
int select_question(int count);
|
int select_question(int count);
|
||||||
|
int multiselect_question(char *array, int count);
|
||||||
int yesno(char *fmt, ...);
|
int yesno(char *fmt, ...);
|
||||||
int noyes(char *fmt, ...);
|
int noyes(char *fmt, ...);
|
||||||
int pm_printf(pmloglevel_t level, const char *format, ...) __attribute__((format(printf,2,3)));
|
int pm_printf(pmloglevel_t level, const char *format, ...) __attribute__((format(printf,2,3)));
|
||||||
|
Loading…
Reference in New Issue
Block a user