git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 00/11 GSoC] gitweb: Split gitweb into modules

From
Pavan Kumar Sunkara <pavan.sss1991@gmail.com>
Date
Jun 22, 2010, 18:34 UTC
Message-ID
<AANLkTim2qOENdcyjbYF8NNmEfMJ-ijhwQY-Pf46JWuiO@mail.gmail.com>
In-Reply-To
<201006221311.05339.jnareb@gmail.com>
2010/6/22 Jakub Narebski <jnareb@gmail.com>:
Show 49 quoted lines
> Thank you very much for providing such detailed cover letter.  It makes
> commenting on this series much easier.
>
>
> On Tue, 22 June 2010 at 03:30:36 +0530, Pavan Kumar Sunkara wrote:
>
>> The patch series is based on 'pu' branch.
>
> You should probably say also which commit (which branch) this depends
> on, rather than blanket 'pu'.
>
>>
>> 10 patches out of the 11 patches in this patch series split gitweb into
>> several small sized modules which is one of the goal of my GSoC's project.
>>
>> The first patch of this patch series is for fixing esc_url function which is
>> previously missed by commit 425e225.
>
> I think it would be better to send this patch separately, standalone
> (not in series), based on 'master' or even 'maint' to have it applied,
> and not being held back by being in this series.  This is pure bugfix
> for a (rare) bug.
>
>>
>> The second patch is produced by my commit amend to Jakub Narebski's
>> initial commit to prepare splitting of gitweb in the message-id:
>> http://mid.gmane.org/1276531710-22945-4-git-send-email-jnareb@gmail.com
>>
>> There is a small ammendment to that patch.
>> $(INSTALL) -m 644 $(mod) '$(DESTDIR_SQ)$(gitwebdir_SQ)/$(mod)'
>> is changed to
>> $(INSTALL) -m 644 $(mod) '$(DESTDIR_SQ)$(gitwebdir_SQ)/$(dir $(mod))';)
>> because it is better if we gave 'dir $(mod)' as the target for install command
>> rather than '$(mod)' because it may cause problems in the future when gitweblibdir
>> is used and the modules are installed elsewhere rather than in /use/share/gitweb.
>
> Thanks for finding it, and for improving it.
>
> Actually, as long as we have only individual files in $(GITWEB_MODULES),
> it should not matter.  The version before changes used
>
>  install [OPTION]... SOURCE DEST
>
> form, and after changes it uses
>
>  install [OPTION]... SOURCE... DIRECTORY
>
> with a single SOURCE.  So I don't think it is strictly necessary, but
> it might be a good improvement anyway.
Thanks.
Show 15 quoted lines
>>
>> The modules created and being used by Gitweb are
>>       Gitweb::Git
>>       Gitweb::Config
>>       Gitweb::Request
>>       Gitweb::Escape
>>       Gitweb::RepoConfig
>>       Gitweb::View
>>       Gitweb::Util
>>       Gitweb::Format
>>       Gitweb::Parse
>
> What I would like to see here is a dependency graph, i.e. which modules
> include (use) which modules, and perhaps also how much this split
> reduces size of main gitweb.perl file.
The dependency is written in individual commits.
Show 29 quoted lines
>>
>> shortlog:
>> =========
>
> Nitpick: I would say "Table of contents", because shortlog it is not ;-)))
>
>>
>> 1. gitweb: fix esc_url
>>
>> The custom CGI escaping done in esc_url failed to escape UTF-8
>> properly. Fix by using CGI::escape on each sequence of matched
>> characters instead of sprintf()ing a custom escaping for each byte.
>>
>> Additionally, the space -> + escape was being escaped due to greedy
>> matching on the first substitution. Fix by adding space to the
>> list of characters not handled on the first substitution.
>>
>> Finally, remove an unnecessary escaping of the + sign.
>>
>> commit 425e225 has missed fixing esc_url.
>
> I would probably write this commit message differently, saying that
> original author (Giuseppe Bilotta) fixed esc_param, but didn't finish
> fixing this bug by not fixing esc_url, and that this commit finishes
> it.  Probably also use "fix esc_url, use CGI::escape" in subject.
> But that's me, not you.
>
> Note: the commit is 452e225, not 425e225 !!!
>                     ^^           ^^
ok.
Show 13 quoted lines
>>
>>
>> 2. gitweb: Prepare for splitting gitweb
>>
>> Prepare gitweb for having been split into modules that are to be
>> installed alongside gitweb in 'lib/' subdirectory, by adding
>>
>>   use lib __DIR__.'/lib';
>>
>> to gitweb.perl (to main gitweb script), and preparing for putting
>> modules (relative path) in $(GITWEB_MODULES) in gitweb/Makefile.
>
> It makes adding modules to install very easy, isn't it?
yes.
Show 14 quoted lines
>> 3. gitweb: Create Gitweb::Git module
>>
>> Create a Gitweb::Git module in  'gitweb/lib/Gitweb/Git.pm'
>> to deal with running git commands (and also processing output
>> of git commands with external programs) from gitweb.
>
> The "processing output of git commands with external programs"
> looks a bit strange to me.  If it is about quote_command()
> subroutine, it is more about shell escaping of commands, or
> about running other programs... but it might be O.K., if what
> you want to say that quote_command() is used in pipe-ing output
> of git commands (e.g. git-archive) to other programs (e.g. gzip).
>
> So take the above comment with a bit of salt...

actually that message has been written by you itself in one of the earlier threads.

Show 30 quoted lines
>>
>> This module is intended as standalone module, which does n>ot require
>> (include) other gitweb' modules to avoid circular dependencies.  That
>> is why it includes $GIT variable, even though this variable is
>> configured during building gitweb.  On the other hand $GIT is more
>> about git configuration, than gitweb configuration.
>>
>> Subroutines moved:
>>       evaluate_git_version
>>       git_cmd
>>       quote_command
>>
>> Update gitweb/Makefile to install Gitweb::Git module alongside gitweb
>
> O.K.
>
>> 4. gitweb: Create Gitweb::Config module
>>
>> Create Gitweb::Config module in 'gitweb/lib/Gitweb/Config.pm'
>> to store all the configuration variables and subroutines
>> regarding the gitweb.perl script.
>>
>> This module depends only on $git_dir from Gitweb::Git and
>> includes most of the configuration related variables and
>> subroutines (Including those required for configuration
>> of gitweb features).
>
> "Most" meaning what?  Which subroutines weren't moved, and why (they
> should not be in Gitweb::Config, they cannot be moved for technical
> reasons)?

Yes, due to either unment dependency or circular dependency problem. But no need to worry as they are very small.

Show 8 quoted lines
>>
>> Subroutines moved:
>>       evaluate_gitweb_config
>>       configure_gitweb_features
>
> I'm not sure if configure_gitweb_features() should be there, as it
> is run-once subroutine, about flow of the main program... but perhaps
> it is O.K. to have it here.
That's what I thought.
Show 31 quoted lines
>>       filter_snapshot_fmts
>>       gitweb_get_feature
>>       gitweb_check_feature
>>
>> Update gitweb/Makefile to install Gitweb::Config module alongside gitweb
>
> O.K.
>
>> 5. gitweb: Create Gitweb::Request module
>>
>> Create a Gitweb::Request module in 'gitweb/lib/Gitweb/Request.pm'
>> to store and handle all the cgi params and related variables
>> regarding the gitweb.perl script.
>>
>> This module is intended as standalone module, which does not require
>> (include) other gitweb' modules to avoid circular dependencies.
>>
>> validate_project and validate_action can't be included in this
>> module due to unmet dependencies.
>
> What unment dependencies?  Can it be worked around by changing their
> signatures to use additional parameters, e.g.:
>
>  sub validate_action {
>        my $input = shift || return undef;
>        my $actions = shift || return undef;
>
>        return undef unless exists $actions->{$input};
>        return $input;
>  }
>

Yes. I think we can but don't you think that we need to import $actions everytime we use validate_action. So, I figured it would be better If i leave it untouched for now.

Show 13 quoted lines
> But I guess it would be very hard to do the same with validate_project.
> Also such change might be out of scope for _this_ series.
>
>>
>> Subroutines moved:
>>       evaluate_uri
>>       evaluate_query_params
>>       validate_pathname
>>       validate_refname
>
> I'm not completly sure if validate_* subroutines should be not separate,
> as they do require more knowledge about setup, and about git repositories
> served, than the rest of Gitweb::Request subroutines...

But they are being used in Gitweb::Request subroutines, so I included them in there.

Show 32 quoted lines
>>
>> Update gitweb/Makefile to install Gitweb::Request module alongside gitweb
>
> O.K.
>
>> 6. gitweb: Create Gitweb::Escape module
>>
>> Create a Gitweb::Escape module in 'gitweb/lib/Gitweb/Escape.pm'
>> to store all the quoting/unquoting and escaping subroutines
>> regarding the gitweb.perl script.
>>
>> This module imports $fallback_encoding variable from
>> Gitweb::Config module to use it in sub 'to_utf8'
>>
>> Subroutines moved:
>>       to_utf8
>>       esc_param
>>       esc_url
>>       esc_html
>>       esc_path
>>       quot_cec
>>       quot_upr
>
> O.K.
>
>>       unquote
>
> Shouldn't unquote be in Gitweb::Parse, as contrary to the rest of
> subroutines is is not about gitweb output escaping/quoting, but
> about processing (parsing) output of git commands?  Perhaps it
> could even be provate to Gitweb::Parse (i.e. not exported by
> default)...

It would result in circular dependency. So, Escape module is best for it's place.

Show 19 quoted lines
>>       untabify
>>
>> Update gitweb/Makefile to install Gitweb::Escape module alongside gitweb
>>
>>
>> 7. gitweb: Create Gitweb::RepoConfig module
>>
>> Create a Gitweb::RepoConfig module in 'gitweb/lib/Gitweb/RepoConfig.pm'
>> to store and handle all the configuration and subroutines
>> related to a single repository regarding the gitweb.perl script.
>>
>> This module depend on several other modules like Git.pm,
>> Config.pm, Request.pm and Escape.pm.
>>
>> It also include subroutines regarding project_list and
>> it's handling.
>
> Why?  Is it to not have too many tiny modules, or is simply there no
> single good place where to put this subroutine?

There is no single good place. Anyhow, as they are regarding project configuration, I thought it would be better place for it.

Show 63 quoted lines
>>
>> Subroutines moved:
>>       check_head_link
>>       check_export_ok
>
> O.K.
>
>>       hash_set_multi
>>       config_to_bool
>>       config_to_int
>>       config_to_multi
>>       git_parse_project_config
>
> Hmmm... I think that in the future all the subroutines dealing with
> reading of gitweb config and making its values available should be
> encapsulated in a separate module... Git::Config perhaps?
>
> But I guess that is for the future commit.
>
>>       git_get_project_config
>>       git_get_project_description
>>       git_get_project_ctags
>>       git_populate_project_tagcloud
>>       git_show_project_tagcloud
>>       git_get_project_url_list
>>       git_get_projects_list
>>       git_get_project_list_from_file
>>       git_get_project_owner
>>       get_file_owner
>
> O.K.
>
>>       project_in_list
>
> Hmmm...
>
>>
>> Update gitweb/Makefile to install Gitweb::RepoConfig module
>> alongside gitweb
>>
>>
>> 8. gitweb: Create Gitweb::View module
>>
>> Create Gitweb::View module in 'gitweb/lib/Gitweb/View.pm'
>> to store the subroutines related to the HTML output
>> for gitweb.
>
> I find that this module looks a bit like a collection of fairly unrelated
> subroutines at very different levels of abstractions.
>
> I guess that you don't want to split gitweb into too many modules,
> and splitting gitweb is more of one of steps to final goal of adding
> write functionality to gitweb, rather than the goal in and of itself.
> Nevertheless it would be good to be able to immediately know from the
> description of module what kind of subroutines should be there.
>
>>
>> This module depends on Git.pm, Config.pm, Request.pm,
>> Escape.pm and RepoConfig.pm. Some subroutines which
>> output HTML but are not included in this module due
>> to unmet dependencies.
>
> Which subroutines and what unmet dependencies?
action specific HTML divs. They include format_* and parse_* subs.
Show 70 quoted lines
>>
>> Subroutines moved:
>
> Perhaps this list should be grouped in categories, either by separating
> groups with empty line, or by putting '*' before first subroutine in
> group, as shown in example below:
>
>>       href
>
> Hmmm... that's the opposte side of Gitweb::Request, crating rather than
> parsing gitweb links...
>
>>       get_feed_info
>
> To be passed to href(); I think it is the only one.
>
>>       chop_str
>>       chop_and_escape_str
>
> Those are pure utility functions.
>
>>     * age_class
>>       age_string
>
> Those are about coloring based on relative time and (age_string - not
> a great name) generating relative time ("nn units ago").
>
>>     * print_local_time
>>       format_local_time
>
> Shouldn't this be in Gitweb::Format?  If not, why?
>
>>     * S_ISGITLINK
>>       mode_str
>>       file_type
>>       file_type_long
>
> Those are all about types of files from git-ls-tree and friends, but
> with single exception of S_ISGITLINK they are about gitweb output side.
>
>>       get_page_title
>>       git_header_html
>>       git_footer_html
>>       die_error
>
> Main parts of page.
>
>>     * git_print_page_nav
>>       format_paging_nav
>>       git_print_header_div
>>       git_print_page_path
>
> Fragments of page (used in most of views).  This decidely belong to
> Gitweb::View.
>
>>     * insert_file
>
> More of utility function.
>
>>     * git_get_link_target
>>       normalize_link_target
>>       git_print_tree_entry
>
> Should it be here?  The *_body subroutines aren't there in Gitweb::View.
> The *_link_target are utility subroutines for git_print_tree_entry.
>
>>       print_sort_th
>>       format_sort_th
>
> Hmmm...
Ok.
Show 42 quoted lines
>>
>> Update 'gitweb/Makefile' to install Gitweb::View alongside gitweb.
>
> I have my doubts...
>
>> 9. gitweb: Create Gitweb::Util module
>>
>> Create Gitweb::Util module in 'gitweb/lib/Gitweb/Util.pm'
>> to store the git utility subroutines related to gitweb.
>>
>> This module include subroutines in various categories
>> such as git utility subs invoking git commands, git
>> utility subs accessing git repository, mimetype related
>> subs and HTML output utility subs.
>>
>> Subroutines moved:
>>       git_get_head_hash
>>       git_get_full_hash
>>       git_get_short_hash
>>       git_get_hash
>>       git_get_type
>>       git_get_hash_by_path
>>       git_get_path_by_hash
>>       git_get_last_activity
>>       git_get_references
>>       git_get_rev_name_tags
>>       git_get_heads_list
>>       git_get_tags_list
>>       mimetype_guess_file
>>       mimetype_guess
>>       blob_mimetype
>>       blob_contenttype
>>       guess_file_syntax
>>       fill_from_file_info
>>       is_deleted
>>       is_patch_split
>
> O.K.
>
>>       run_highlighter
>
> _Perhaps_ with exception of this subroutine.

Well. It was in the utility category in gitweb.perl script. So, I added it in here without giving much thought.

Show 18 quoted lines
>>
>> Update 'gitweb/Makefile' to install Gitweb::Util alongside gitweb.
>>
>>
>> 10. gitweb: Create Gitweb::Format module
>>
>> Create Gitweb::Format module in 'gitweb/lib/Gitweb/Format.pm'
>> to store the subroutines related to formatting of HTML
>> fragments required for gitweb.
>>
>> This module depends on Config.pm, View.pm, Escape.pm,
>> Util.pm and Request.pm. It mainly contain functions returning
>> short HTML fragments or transforming HTML fragments. Also
>> include subroutines regarding avatar formatting.
>
> Why it depends on Gitweb::View, and not the reverse?  I understand why
> it depends on Gitweb::Config and Gitweb::Escape, and I guess it needs
> $cgi from Gitweb::Request (or is it something more?).
$hash, $hash_parent also.
Show 36 quoted lines
>>
>> Subroutines moved:
>>       format_log_line_html
>>       format_ref_marker
>>       format_subject_html
>>       picon_url
>>       gravatar_url
>>       git_get_avatar
>>       format_search_author
>>       format_author_html
>>       format_git_diff_header_line
>>       format_extended_diff_header_line
>>       format_diff_from_to_header
>>       format_diff_cc_simplified
>>       format_diff_line
>>       format_snapshot_links
>
> O.K., I think.
>
>>
>> Update 'gitweb/Makefile' to install Gitweb::Format alongside gitweb.
>>
>>
>> 11. gitweb: Create Gitweb::Parse module
>>
>> Create Gitweb::Parse module in 'gitweb/lib/Gitweb/Parse.pm'
>> to store the subroutines which related to parsing functions
>> required for gitweb.
>>
>> This module depends on Git.pm, Escape.pm, View.pm and Util.pm.
>
> Why it depends on Gitweb::View?  It is a strange dependency.
> I understand depending on Gitweb::Git to some extent, I'm not sure
> if we shouldn't simply move unescape to it instead of requiring
> Gitweb::Escape (unless there is more: to_utf8 perhaps?), and
> I understand that Gitweb::Util has some required subroutines.
for die_error.
Show 62 quoted lines
>>
>> Subroutines moved:
>>       parse_date
>>       parse_tag
>>       parse_commit_text
>>       parse_commit
>>       parse_commits
>>       parse_difftree_raw_line
>>       parsed_difftree_line
>>       parse_ls_tree_line
>>       parse_from_to_diffinfo
>
> O.K.
>
>>
>> Update 'gitweb/Makefile' to install Gitweb::Parse alongside gitweb.
>>
>>
>> Pavan Kumar Sunkara (11):
>>   gitweb: fix esc_url
>>   gitweb: Prepare for splitting gitweb
>>   gitweb: Create Gitweb::Git module
>>   gitweb: Create Gitweb::Config module
>>   gitweb: Create Gitweb::Request module
>>   gitweb: Create Gitweb::Escape module
>>   gitweb: Create Gitweb::RepoConfig module
>>   gitweb: Create Gitweb::View module
>>   gitweb: Create Gitweb::Util module
>>   gitweb: Create Gitweb::Format module
>>   gitweb: Create Gitweb::Parse module
>>
>>  gitweb/Makefile                 |   14 +
>>  gitweb/gitweb.perl              | 3855 +++------------------------------------
>
> Nice!
>
>>  gitweb/lib/Gitweb/Config.pm     |  498 +++++
>>  gitweb/lib/Gitweb/Escape.pm     |  175 ++
>>  gitweb/lib/Gitweb/Format.pm     |  537 ++++++
>>  gitweb/lib/Gitweb/Git.pm        |   48 +
>>  gitweb/lib/Gitweb/Parse.pm      |  378 ++++
>>  gitweb/lib/Gitweb/RepoConfig.pm |  424 +++++
>>  gitweb/lib/Gitweb/Request.pm    |  153 ++
>>  gitweb/lib/Gitweb/Util.pm       |  447 +++++
>>  gitweb/lib/Gitweb/View.pm       | 1022 +++++++++++
>>  11 files changed, 3909 insertions(+), 3642 deletions(-)
>>  create mode 100644 gitweb/lib/Gitweb/Config.pm
>>  create mode 100644 gitweb/lib/Gitweb/Escape.pm
>>  create mode 100644 gitweb/lib/Gitweb/Format.pm
>>  create mode 100644 gitweb/lib/Gitweb/Git.pm
>>  create mode 100644 gitweb/lib/Gitweb/Parse.pm
>>  create mode 100644 gitweb/lib/Gitweb/RepoConfig.pm
>>  create mode 100644 gitweb/lib/Gitweb/Request.pm
>>  create mode 100644 gitweb/lib/Gitweb/Util.pm
>>  create mode 100644 gitweb/lib/Gitweb/View.pm
>
> Keep up good work!
>
> --
> Jakub Narebski
> Poland
>

So, If you can tell me what I need to change in this series, I would like to complete it and send a second version so that you can ack it and junio can merge it soon.

Thanks, Pavan.

Previous: Jakub NarebskiNext: Jakub Narebski
Message 18 of 21 in “gitweb: Split gitweb into modules”
  1. 00/11 gitweb: Split gitweb into modulesPavan Kumar Sunkara, Jun 21, 2010
  2. 01/11 gitweb: fix esc_urlPavan Kumar Sunkara, Jun 21, 2010
  3. 02/11 gitweb: Prepare for splitting gitwebPavan Kumar Sunkara, Jun 21, 2010
  4. 03/11 gitweb: Create Gitweb::Git modulePavan Kumar Sunkara, Jun 21, 2010
  5. 04/11 gitweb: Create Gitweb::Config modulePavan Kumar Sunkara, Jun 21, 2010
  6. 05/11 gitweb: Create Gitweb::Request modulePavan Kumar Sunkara, Jun 21, 2010
  7. 06/11 gitweb: Create Gitweb::Escape modulePavan Kumar Sunkara, Jun 21, 2010
  8. 07/11 gitweb: Create Gitweb::RepoConfig modulePavan Kumar Sunkara, Jun 21, 2010
  9. 08/11 gitweb: Create Gitweb::View modulePavan Kumar Sunkara, Jun 21, 2010
  10. 09/11 gitweb: Create Gitweb::Util modulePavan Kumar Sunkara, Jun 21, 2010
  11. 10/11 gitweb: Create Gitweb::Format modulePavan Kumar Sunkara, Jun 21, 2010
  12. 11/11 gitweb: Create Gitweb::Parse modulePavan Kumar Sunkara, Jun 21, 2010
  13. gitweb: Add support for enabling 'write' featurePavan Kumar Sunkara, Jun 21, 2010
  14. Jakub NarebskiJun 22, 2010
  15. Pavan Kumar SunkaraJun 22, 2010
  16. Jakub NarebskiJun 22, 2010
  17. Jakub NarebskiJun 22, 2010
  18. Pavan Kumar SunkaraJun 22, 2010
  19. Jakub NarebskiJun 22, 2010
  20. Pavan Kumar SunkaraJun 22, 2010
  21. Jakub NarebskiJun 23, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.