[PATCH 3/7] ui-plain.c: Use a context structure in walk_tree()
Lukas Fleischer
cgit at cryptocrack.de
Sun Mar 3 22:02:21 CET 2013
On Sun, Mar 03, 2013 at 09:04:28PM +0100, Ferry Huberts wrote:
>
>
> On 03/03/13 18:06, Lukas Fleischer wrote:
> >Do not misuse global variables to save the context. Instead, use the
> >context pointer which was designed to share information between a
> >read_tree_fn and the caller.
> >
> >Signed-off-by: Lukas Fleischer <cgit at cryptocrack.de>
> >---
> > ui-plain.c | 31 ++++++++++++++++++-------------
> > 1 file changed, 18 insertions(+), 13 deletions(-)
> >
> >diff --git a/ui-plain.c b/ui-plain.c
> >index 684d5ea..e5addb9 100644
> >--- a/ui-plain.c
> >+++ b/ui-plain.c
> >@@ -11,8 +11,10 @@
> > #include "html.h"
> > #include "ui-shared.h"
> >
> >-int match_baselen;
> >-int match;
> >+struct walk_tree_context {
> >+ int match_baselen;
> >+ int match;
> >+};
> >
> > static char *get_mimetype_from_file(const char *filename, const char *ext)
> > {
> >@@ -166,18 +168,20 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
> > const char *pathname, unsigned mode, int stage,
> > void *cbdata)
> > {
> >- if (baselen == match_baselen) {
> >+ struct walk_tree_context *walk_tree_ctx = cbdata;
> >+
> >+ if (baselen == walk_tree_ctx->match_baselen) {
> > if (S_ISREG(mode)) {
> > if (print_object(sha1, pathname))
> >- match = 1;
> >+ walk_tree_ctx->match = 1;
> > } else if (S_ISDIR(mode)) {
> > print_dir(sha1, base, baselen, pathname);
> >- match = 2;
> >+ walk_tree_ctx->match = 2;
> > return READ_TREE_RECURSIVE;
> > }
> >- } else if (baselen > match_baselen) {
> >+ } else if (baselen > walk_tree_ctx->match_baselen) {
> > print_dir_entry(sha1, base, baselen, pathname, mode);
> >- match = 2;
> >+ walk_tree_ctx->match = 2;
> > } else if (S_ISDIR(mode)) {
> > return READ_TREE_RECURSIVE;
> > }
> >@@ -199,6 +203,7 @@ void cgit_print_plain(struct cgit_context *ctx)
> > unsigned char sha1[20];
> > struct commit *commit;
> > const char *paths[] = {ctx->qry.path, NULL};
> >+ struct walk_tree_context walk_tree_ctx;
>
> I'd prefer that you initialise the variable here
walk_tree_ctx.match_baselen cannot be initialized here, and setting a
default value doesn't really make sense if it is overwritten in each
code path later.
Setting walk_tree_ctx.match to 0 might make sense, though. I will add
that and resubmit. Thanks!
>
> >
> > if (!rev)
> > rev = ctx->qry.head;
> >@@ -214,15 +219,15 @@ void cgit_print_plain(struct cgit_context *ctx)
> > }
> > if (!paths[0]) {
> > paths[0] = "";
> >- match_baselen = -1;
> >+ walk_tree_ctx.match_baselen = -1;
> > print_dir(commit->tree->object.sha1, "", 0, "");
> >- match = 2;
> >+ walk_tree_ctx.match = 2;
> > }
> > else
> >- match_baselen = basedir_len(paths[0]);
> >- read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, NULL);
> >- if (!match)
> >+ walk_tree_ctx.match_baselen = basedir_len(paths[0]);
> >+ read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, &walk_tree_ctx);
> >+ if (!walk_tree_ctx.match)
> > html_status(404, "Not found", 0);
> >- else if (match == 2)
> >+ else if (walk_tree_ctx.match == 2)
> > print_dir_tail();
> > }
> >
>
> --
> Ferry Huberts
More information about the CGit
mailing list