Thread (10 messages) flat view 10 messages, 5 authors, 2016-06-15

Re: [PATCH] perl: add new module Git::Config for cached 'git config' access

From: Jakub Narebski <hidden>
Date: 2016-06-15 22:46:35

On Wed, 8 Apr 2009, Sam Vilain wrote:
Jakub Narebski wrote:
quoted
By the way, did you take a look how cached 'git config' access and
typecasting is done in gitweb?  See commit b201927 (gitweb: Read
repo config using 'git config -z -l') and following similar commits.
Right ... sure, looks fairly straightforward.  I guess gitweb could 
potentially use this tested module instead of including that code 
itself.  Also various parts of git-svn... anything really.
Well... first, gitweb use of config files is simplified to what, I guess,
you want, because it only considers _reading_ config, and doesn't worry
about writing and (what is I guess most difficult) rewriting config file.

Second, gitweb doesn't even use Git.pm (although "gitweb caching" project
by Lea Wiemann from GSoC 2008 introduced Git::Repo, the alternate OO
interface, and used it in caching gitweb).  This has the advantage of
being slightly easier to install... but we require git anyway, so it
is not much more diffucult requiring perl-Git / Git.pm.
I actually wrote this code because I wanted something a bit nicer for 
writing the mirror-sync initial implementations.  And I wanted to have a 
bit of control over when values get committed, and save work for 
reading, so I wrote this.
Well, you could have written in C instead ;-)
quoted
quoted
Any more gremlins? 
    
I have nor examined your patch in detail; I'll try to do it soon,
but with git config file parsing there lies following traps.

1. In fully qualified variable name section name and variable name
   have to be compared case insensitive (or normalized, i.e.
   lowercased), while subsection part (if it exists) is case sensitive.
I noticed that 'git config' hides this by normalising the case of what 
it outputs with 'git config --list'; do you think anything special is 
required in light of this?
I'm not sure. I was thinking that get() method should normalize its
arguments before comparing... but I am not sure if it is necessary
(or even if it is a good idea).
quoted
2. When coercing type to bool, you need to remember (and test) that
   there are values which are truish (no value, 'true', 'yes', non-zero
   integer usually 1), values which are falsish (empry, 'false', 'no',
   0); other values IIRC are truish too.
Yep, see the Git::Config::boolean mini-package which has a list of 
those.  I think I used the documented legal values, which are 'true', 
'yes' and '1' for affirmative and 'false', 'no' and '0' for negative.  I 
guess I could make that include non-zero integers as well.
They are, from what I understand, empty value, 'false', 'no' and '0' for
negative, all else is positive (which includes no value, 'true', 'yes'
and '1').  But you'd better check the C code yourself.

[...]
quoted
Why not represent it simply as an 'undef'? You can always distinguish 
between not defined and not existing by using 'exists'...
  
I don't like 'undef' being a data value.
Why not? It is IMHO the most natural way.
                                          In this case I was already  
using setting a value to undef to tell the module to remove the key from 
the config file.
Why not use 'delete' to remove hash element, and 'exists' to check
whether it exists?


-- 
Jakub Narebski
Poland
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help