OK, here are the results of my recent work on keywords as hash.
Firstly, I've split the whole thing into 4 individually committable
sections:
1. include & libsvn_subr
2. libsvn_wc
3. libsvn_client
4. cmdline client & tests
At the moment, I am *only* working on section 1.
I've incorporated Justin's changes, and also made *MANY* of my own. (So
please could John and Justin re-review this)
First: a summary of the changes I've made:
Log message: overhauled. Several missing entries added.
svn_subst.h: Many tweaks to documentation comments. Most moderately minor,
but I've made notable changes to John's changes to the
svn_subst_translate_stream2 doc.
svn_types.h: Do not remove the large comment linking to mail messages. The
current patches don't do everything suggested there, yet.
subst.c: MANY... enumerated per function:
keyword_printf: Simplify some rather obscure code controlling the loop, and
remove one variable as a result. Fix a bug: If the format string had ended
with a % character, then the null terminator would not be noticed, and the
loop would continue on through random memory.
Alter the behaviour of unrecognized %? sequences - retain the % in the
output, instead of stripping it.
keywords_to_keyhash: Rename to kwstruct_to_kwhash. Document why we need to
check for NULL. Convert NULL to NULL, not to an empty hash, because NULL is
a special signifier for svn_subst_translate_stream and friends.
keyhash_to_keywords: Inline at its only callsite. Rewrite to accurately
mimic 1.1 behaviour.
svn_subst_build_keywords2: Remove special-casing from the "date" case -
keyword_printf already handles this special case! Silly to do it twice!
translate_keyword: Make code clearer.
svn_subst_keywords_differ: Why convert both structures to hashes, when we
have a nice pre-written piece of code to compare them directly? Let's just
leave this function alone.
svn_subst_keywords_differ2: Was quite crazy. Made it actually do what it's
supposed to.
And now, the edited log message:
[[[
Revise keywords API - represent keywords as a hash for better extensibility.
Implement printf-like format characters for keyword expansion. Change all
other libraries to use new keyword hash functions from libsvn_subst.
Includes a new keyword, UUID, and tests for same.
See issue #890 for details.
Based on a patch by John Peacock <jpeacock rowman com>.
This is phase 1 of 4: libsvn_subr.
* subversion/includes/svn_subst.h:
(svn_subst_keywords_t): Deprecated.
(svn_subst_build_keywords2): Interface change.
A new argument const char *uuid, and produce hash instead of struct.
(svn_subst_build_keywords): Deprecated.
(svn_subst_keywords_differ2): Interface change.
A new argument apr_pool_t *pool and use hash instead of struct.
(svn_subst_keywords_differ): Deprecated.
(svn_subst_translate_stream2): Interface change; hash instead of struct.
(svn_subst_translate_stream): Deprecated.
(svn_subst_copy_and_translate3): Interface change; hash instead of
struct.
(svn_subst_copy_and_translate2): Deprecated.
(svn_subst_translate_cstring2): Interface change; hash instead of struct.
(svn_subst_translate_cstring): Deprecated.
* subversion/includes/svn_types.h:
(SVN_KEYWORD_UUID_LONG, SVN_KEYWORD_UUID_SHORT):
New defines - long and short names of a new keyword.
(SVN_KEYWORD_REVISION_FORMAT, SVN_KEYWORD_DATE_FORMAT)
(SVN_KEYWORD_AUTHOR_FORMAT, SVN_KEYWORD_URL_FORMAT)
(SVN_KEYWORD_UUID_FORMAT, SVN_KEYWORD_ID_FORMAT):
New defines - format strings for keyword expansion.
* subversion/libsvn_subr/svn_subst.c:
(keyword_printf): New private function;
printf-style formatting of keywords based on format strings.
(kwstruct_to_kwhash): New private function;
convert keywords struct into keywords hash.
(svn_subst_build_keywords): Convert to API compatibility wrapper.
(svn_subst_build_keywords2): Build keywords using keyword_printf().
(translate_keyword): Interface changes. Also, look up the keyword in the
passed in buffer, instead of trying to translate all possibilities.
(svn_subst_keywords_differ): Retain unchanged for API compatibility.
(svn_subst_keywords_differ2): New function;
compare two hashes instead of comparing individual structure elements.
(svn_subst_translate_stream): Convert to API compatibility wrapper.
(svn_subst_translate_stream2): Change interface only.
(svn_subst_translate_cstring): Convert to API compatibility wrapper.
(svn_subst_translate_cstring2): Update function call to new API version.
(svn_subst_copy_and_translate2): Convert to API combatibility wrapper.
(svn_subst_copy_and_translate3): Update function call to new API version.
(svn_subst_translate_string): Update function call to new API version.
(svn_subst_detranslate_string): Update function call to new API version.
]]]
Diff attached.
Passes testsuite.
Max.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Tue Mar 22 00:52:46 2005