[PATCH v3 16/17] ui-shared: add helper for generating non-urlencoded links

Andy Green andy at warmcat.com
Wed Jun 20 02:07:21 CEST 2018



On 06/20/2018 05:55 AM, John Keeping wrote:
> On Tue, Jun 19, 2018 at 05:02:47PM +0800, Andy Green wrote:
>> We are going to have to produce plain links in the next patch.
>> But depending on config, the links are not simple.
>>
>> Reproduce the logic in repolink() to generate correctly-
>> formatted links in a strbuf, without urlencoding, in a reusable
>> helper cgit_repo_create_url().
>>
>> Signed-off-by: Andy Green <andy at warmcat.com>
>> ---
>>   ui-shared.c |   30 ++++++++++++++++++++++++++++++
>>   ui-shared.h |    3 +++
>>   2 files changed, 33 insertions(+)
>>
>> diff --git a/ui-shared.c b/ui-shared.c
>> index 21bbded..79c39a8 100644
>> --- a/ui-shared.c
>> +++ b/ui-shared.c
>> @@ -221,6 +221,36 @@ void cgit_index_link(const char *name, const char *title, const char *class,
>>   	site_link(NULL, name, title, class, pattern, sort, ofs, always_root);
>>   }
>>   
>> +char *cgit_repo_create_url(struct strbuf *sb_pre, struct strbuf *sb_post,
>> +			    const char *page, const char *head, const char *path)
>> +{
>> +	const char *delim = "?";
>> +	struct strbuf *sb = sb_pre;
> 
> Does this variable serve any point?  Why not rename the parameter?

OK.

>> +
>> +	if (ctx.cfg.virtual_root)
>> +		strbuf_addf(sb_pre, "%s%s", ctx.cfg.virtual_root, ctx.repo->url);
> 
> NIT: I think we normally put the braces in around a oneline if with a
> multi-line else clause.

OK.

>> +	else {
>> +		strbuf_addstr(sb_pre, ctx.cfg.script_name);
>> +		strbuf_addf(sb_post, "?url=%s", ctx.repo->url);
>> +		sb = sb_post;
>> +		delim = "&";

These shouldn't've been left urlencoded... I changed both to "&".

>> +	}
>> +
>> +	if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
>> +		strbuf_addch(sb, '/');
> 
> Maybe add a blank line here since these if blocks are unrelated.

OK.

>> +	if (page) {
>> +		strbuf_addf(sb, "%s/", page);
>> +		if (path)
>> +			strbuf_addstr(sb, path);
>> +	}
>> +
>> +	if (head && ctx.repo->defbranch && strcmp(head, ctx.repo->defbranch)) {
>> +		strbuf_addf(sb_post, "%sh=%s", delim, head);
>> +		delim = "&";
>> +	}
>> +	return fmt("%s", delim);
> 
> delim is always a character constant, so I think we can just return it
> as "const char *" here.  This also avoids any worry about the lifetime
> of fmt()'s result.

I just copied this exit stuff from repolink... I agree return the const 
char * to rodata pointer is better.

Thanks for the review.

-Andy

>> +}
>> +
>>   static char *repolink(const char *title, const char *class, const char *page,
>>   		      const char *head, const char *path)
>>   {
>> diff --git a/ui-shared.h b/ui-shared.h
>> index c105b3b..679d2f2 100644
>> --- a/ui-shared.h
>> +++ b/ui-shared.h
>> @@ -59,6 +59,9 @@ extern void cgit_object_link(struct object *obj);
>>   
>>   extern void cgit_submodule_link(const char *class, char *path,
>>   				const char *rev);
>> +extern char *cgit_repo_create_url(struct strbuf *sb_pre, struct strbuf *sb_post,
>> +				  const char *page, const char *head,
>> +				  const char *path);
>>   
>>   extern void cgit_print_layout_start(void);
>>   extern void cgit_print_layout_end(void);


More information about the CGit mailing list