From: Andre Noll Date: Fri, 25 Nov 2011 12:13:35 +0000 (+0100) Subject: Merge branch 't/generic_match_count' X-Git-Tag: v0.4.9~3 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=4867d9a4948aadde4dd59436e1c5fb0fc141ba89;hp=3b447b02e2d74d596ecf6f5f764bf847653d407c Merge branch 't/generic_match_count' --- diff --git a/NEWS b/NEWS index d4a58fd1..0b8b33e8 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,9 @@ use the DMIX plugin. - Simplified and unified receiver code. - Makefile cleanups. + - Commands which print a list of matching audio files now + emit a meaningful error message if no audio file matched the + given pattern(s). -------------------------------------- 0.4.8 (2011-08-19) "nested assignment" diff --git a/afs.c b/afs.c index 3f378051..78d8571f 100644 --- a/afs.c +++ b/afs.c @@ -363,7 +363,10 @@ static int action_if_pattern_matches(struct osl_row *row, void *data) continue; if (ret) return -E_FNMATCH; - return pmd->action(pmd->table, row, name, pmd->data); + ret = pmd->action(pmd->table, row, name, pmd->data); + if (ret >= 0) + pmd->num_matches++; + return ret; } return 1; } diff --git a/afs.h b/afs.h index f54aa87c..2fdefa70 100644 --- a/afs.h +++ b/afs.h @@ -181,6 +181,8 @@ struct pattern_match_data { struct osl_object patterns; /** Data pointer passed to the action function. */ void *data; + /** Gets increased by one for each match. */ + unsigned num_matches; /** For each matching row, this function will be called. */ int (*action)(struct osl_table *table, struct osl_row *row, const char *name, void *data); }; diff --git a/aft.c b/aft.c index 3d22e242..f6d0c4b3 100644 --- a/aft.c +++ b/aft.c @@ -1364,8 +1364,11 @@ static void com_ls_callback(int fd, const struct osl_object *query) prepare_ls_row)); if (ret < 0) goto out; - if (!opts->num_matching_paths) + if (opts->num_matching_paths == 0) { + if (opts->num_patterns > 0) + para_printf(&b, "no matches\n"); goto out; + } ret = sort_matching_paths(opts); if (ret < 0) goto out; @@ -2020,8 +2023,6 @@ struct touch_action_data { struct com_touch_options *cto; /** Message buffer. */ struct para_buffer pb; - /** How many audio files matched the given pattern. */ - unsigned num_matches; }; static int touch_audio_file(__a_unused struct osl_table *table, @@ -2068,7 +2069,6 @@ static int touch_audio_file(__a_unused struct osl_table *table, if (tad->cto->amp >= 0) new_afsi.amp = tad->cto->amp; } - tad->num_matches++; save_afsi(&new_afsi, &obj); /* in-place update */ aced.aft_row = row; aced.old_afsi = &old_afsi; @@ -2100,9 +2100,8 @@ static void com_touch_callback(int fd, const struct osl_object *query) ret = for_each_matching_row(&pmd); if (ret < 0) ret2 = para_printf(&tad.pb, "%s\n", para_strerror(-ret)); - else - if (!tad.num_matches) - ret2 = para_printf(&tad.pb, "no matches\n"); + else if (pmd.num_matches == 0) + ret2 = para_printf(&tad.pb, "no matches\n"); if (ret2 >= 0 && tad.pb.offset) pass_buffer_as_shm(tad.pb.buf, tad.pb.offset, &fd); free(tad.pb.buf); @@ -2198,8 +2197,6 @@ struct com_rm_action_data { uint32_t flags; /** Message buffer. */ struct para_buffer pb; - /** Number of audio files removed. */ - unsigned num_removed; }; static int remove_audio_file(__a_unused struct osl_table *table, @@ -2217,8 +2214,6 @@ static int remove_audio_file(__a_unused struct osl_table *table, ret = osl(osl_del_row(audio_file_table, row)); if (ret < 0) para_printf(&crd->pb, "%s: %s\n", name, para_strerror(-ret)); - else - crd->num_removed++; return ret; } @@ -2248,11 +2243,11 @@ static void com_rm_callback(int fd, const struct osl_object *query) para_printf(&crd.pb, "%s\n", para_strerror(-ret)); return; } - if (!crd.num_removed && !(crd.flags & RM_FLAG_FORCE)) + if ((pmd.num_matches == 0) && !(crd.flags & RM_FLAG_FORCE)) ret = para_printf(&crd.pb, "no matches -- nothing removed\n"); - else { - if (crd.flags & RM_FLAG_VERBOSE) - ret = para_printf(&crd.pb, "removed %u files\n", crd.num_removed); + else if (crd.flags & RM_FLAG_VERBOSE) { + ret = para_printf(&crd.pb, "removed %u files\n", + pmd.num_matches); } if (ret >= 0 && crd.pb.offset) pass_buffer_as_shm(crd.pb.buf, crd.pb.offset, &fd); @@ -2321,8 +2316,6 @@ enum cpsi_flags { struct cpsi_action_data { /** command line flags (see \ref cpsi_flags). */ unsigned flags; - /** Number of audio files changed. */ - unsigned num_copied; /** Message buffer. */ struct para_buffer pb; /** Values are copied from here. */ @@ -2354,7 +2347,6 @@ static int copy_selector_info(__a_unused struct osl_table *table, if (cad->flags & CPSI_FLAG_COPY_ATTRIBUTES) target_afsi.attributes = cad->source_afsi.attributes; save_afsi(&target_afsi, &target_afsi_obj); /* in-place update */ - cad->num_copied++; if (cad->flags & CPSI_FLAG_VERBOSE) { ret = para_printf(&cad->pb, "copied afsi to %s\n", name); if (ret < 0) @@ -2397,9 +2389,9 @@ out: if (ret < 0) para_printf(&cad.pb, "%s\n", para_strerror(-ret)); else if (cad.flags & CPSI_FLAG_VERBOSE) { - if (cad.num_copied) + if (pmd.num_matches > 0) para_printf(&cad.pb, "copied requested afsi from %s " - "to %u files\n", source_path, cad.num_copied); + "to %u files\n", source_path, pmd.num_matches); else para_printf(&cad.pb, "nothing copied\n"); } diff --git a/blob.c b/blob.c index 707c6c62..2545aea9 100644 --- a/blob.c +++ b/blob.c @@ -156,6 +156,8 @@ static void com_lsblob_callback(struct osl_table *table, ret = for_each_matching_row(&pmd); if (ret < 0) para_printf(&lbad.pb, "%s\n", para_strerror(-ret)); + else if (pmd.num_matches == 0 && pmd.patterns.size > 0) + para_printf(&lbad.pb, "no matches\n"); if (lbad.pb.offset) pass_buffer_as_shm(lbad.pb.buf, lbad.pb.offset, &fd); free(lbad.pb.buf); @@ -203,9 +205,9 @@ static int cat_blob(struct osl_table *table, struct osl_row *row, ret = osl(osl_open_disk_object(table, row, BLOBCOL_DEF, &obj)); if (ret < 0) - return ret; - if (obj.size) - ret = pass_buffer_as_shm(obj.data, obj.size, data); + return (ret == osl(-E_OSL_EMPTY))? 0 : ret; + assert(obj.size > 0); + ret = pass_buffer_as_shm(obj.data, obj.size, data); ret2 = osl(osl_close_disk_object(&obj)); return (ret < 0)? ret : ret2; } @@ -223,6 +225,10 @@ static void com_catblob_callback(struct osl_table *table, int fd, .action = cat_blob }; for_each_matching_row(&pmd); + if (pmd.num_matches == 0) { + char err_msg[] = "no matches\n"; + pass_buffer_as_shm(err_msg, sizeof(err_msg), &fd); + } } static int com_catblob(callback_function *f, struct stream_cipher_context *scc, int argc, @@ -238,8 +244,6 @@ static int com_catblob(callback_function *f, struct stream_cipher_context *scc, struct rmblob_data { /** Message buffer. */ struct para_buffer pb; - /** Number of removed blobs. */ - unsigned num_removed; }; static int remove_blob(struct osl_table *table, struct osl_row *row, @@ -251,7 +255,6 @@ static int remove_blob(struct osl_table *table, struct osl_row *row, para_printf(&rmbd->pb, "%s: %s\n", name, para_strerror(-ret)); return ret; } - rmbd->num_removed++; return 1; } @@ -260,7 +263,6 @@ static void com_rmblob_callback(struct osl_table *table, int fd, { int ret, ret2 = 0; struct rmblob_data rmbd = { - .num_removed = 0, .pb = { .max_size = shm_get_shmmax(), .private_data = &fd, @@ -282,10 +284,10 @@ static void com_rmblob_callback(struct osl_table *table, int fd, if (ret2 < 0) goto out; } - if (!rmbd.num_removed) + if (pmd.num_matches == 0) ret2 = para_printf(&rmbd.pb, "no matches, nothing removed\n"); else { - ret2 = para_printf(&rmbd.pb, "removed %d blobs\n", rmbd.num_removed); + ret2 = para_printf(&rmbd.pb, "removed %d blobs\n", pmd.num_matches); afs_event(BLOB_RENAME, NULL, table); } out: