diff options
Diffstat (limited to 'devel/subversion16/files/extra-patch-enhanced-keyword')
-rw-r--r-- | devel/subversion16/files/extra-patch-enhanced-keyword | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/devel/subversion16/files/extra-patch-enhanced-keyword b/devel/subversion16/files/extra-patch-enhanced-keyword new file mode 100644 index 000000000000..2aa9e352fc11 --- /dev/null +++ b/devel/subversion16/files/extra-patch-enhanced-keyword @@ -0,0 +1,336 @@ +diff -ruN subversion/include/svn_subst.h subversion/include/svn_subst.h +--- subversion/include/svn_subst.h 2009-01-26 14:30:42.000000000 +0300 ++++ subversion/include/svn_subst.h 2009-04-03 21:49:30.541875000 +0400 +@@ -122,16 +122,31 @@ + * Set @a *kw to a new keywords hash filled with the appropriate contents + * given a @a keywords_string (the contents of the svn:keywords + * property for the file in question), the revision @a rev, the @a url, +- * the @a date the file was committed on, and the @a author of the last +- * commit. Any of these can be @c NULL to indicate that the information is +- * not present, or @c 0 for @a date. ++ * the url of the root of the @a repos, the @a date the file was committed ++ * on, and the @a author of the last commit. Any of these can be @c NULL ++ * to indicate that the information is not present, or @c 0 for @a date. + * + * Hash keys are of type <tt>const char *</tt>. + * Hash values are of type <tt>svn_string_t *</tt>. + * + * All memory is allocated out of @a pool. + * +- * @since New in 1.3. ++ * @since New in 1.6 ++ */ ++svn_error_t * ++svn_subst_build_keywords3(apr_hash_t **kw, ++ const char *keywords_string, ++ const char *rev, ++ const char *url, ++ const char *repos, ++ apr_time_t date, ++ const char *author, ++ apr_pool_t *pool); ++ ++/** Similar to svn_subst_build_keywords3() except that it does not ++ * supply the repository location. ++ * ++ * @deprecated Provided for backward compatibility with the 1.3 API. + */ + svn_error_t * + svn_subst_build_keywords2(apr_hash_t **kw, +diff -ruN subversion/libsvn_client/cat.c subversion/libsvn_client/cat.c +--- subversion/libsvn_client/cat.c 2009-02-13 23:37:02.000000000 +0300 ++++ subversion/libsvn_client/cat.c 2009-04-03 21:49:30.557500000 +0400 +@@ -127,10 +127,10 @@ + author = entry->cmt_author; + } + +- SVN_ERR(svn_subst_build_keywords2 ++ SVN_ERR(svn_subst_build_keywords3 + (&kw, keywords->data, + apr_psprintf(pool, fmt, entry->cmt_rev), +- entry->url, tm, author, pool)); ++ entry->url, entry->repos, tm, author, pool)); + } + + /* Our API contract says that OUTPUT will not be closed. The two paths +@@ -160,6 +160,7 @@ + svn_string_t *keywords; + apr_hash_t *props; + const char *url; ++ const char *repos_root_url; + svn_stream_t *output = out; + + /* ### Inconsistent default revision logic in this command. */ +@@ -198,6 +199,8 @@ + &url, path_or_url, NULL, + peg_revision, + revision, ctx, pool)); ++ /* Find the repos root URL */ ++ SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url, pool)); + + /* Make sure the object isn't a directory. */ + SVN_ERR(svn_ra_check_path(ra_session, "", rev, &url_kind, pool)); +@@ -242,10 +245,11 @@ + if (cmt_date) + SVN_ERR(svn_time_from_cstring(&when, cmt_date->data, pool)); + +- SVN_ERR(svn_subst_build_keywords2 ++ SVN_ERR(svn_subst_build_keywords3 + (&kw, keywords->data, + cmt_rev->data, + url, ++ repos_root_url, + when, + cmt_author ? cmt_author->data : NULL, + pool)); +diff -ruN subversion/libsvn_client/commit.c subversion/libsvn_client/commit.c +--- subversion/libsvn_client/commit.c 2009-02-13 18:32:52.000000000 +0300 ++++ subversion/libsvn_client/commit.c 2009-04-03 21:49:30.557500000 +0400 +@@ -118,9 +118,9 @@ + } + + if (keywords_val) +- SVN_ERR(svn_subst_build_keywords2(&keywords, keywords_val->data, ++ SVN_ERR(svn_subst_build_keywords3(&keywords, keywords_val->data, + APR_STRINGIFY(SVN_INVALID_REVNUM), +- "", 0, "", pool)); ++ "", "", 0, "", pool)); + else + keywords = NULL; + +diff -ruN subversion/libsvn_client/export.c subversion/libsvn_client/export.c +--- subversion/libsvn_client/export.c 2009-01-26 14:30:42.000000000 +0300 ++++ subversion/libsvn_client/export.c 2009-04-03 21:49:30.557500000 +0400 +@@ -197,10 +197,10 @@ + author = entry->cmt_author; + } + +- SVN_ERR(svn_subst_build_keywords2 ++ SVN_ERR(svn_subst_build_keywords3 + (&kw, keywords->data, + apr_psprintf(pool, fmt, entry->cmt_rev), +- entry->url, tm, author, pool)); ++ entry->url, entry->repos, tm, author, pool)); + } + + /* For atomicity, we translate to a tmp file and then rename the tmp file +@@ -509,6 +509,7 @@ + /* Any keyword vals to be substituted */ + const char *revision; + const char *url; ++ const char *repos; + const char *author; + apr_time_t date; + +@@ -625,6 +626,7 @@ + fb->edit_baton = eb; + fb->path = full_path; + fb->url = full_url; ++ fb->repos = eb->root_url; + fb->pool = pool; + + *baton = fb; +@@ -790,8 +792,8 @@ + } + + if (fb->keywords_val) +- SVN_ERR(svn_subst_build_keywords2(&final_kw, fb->keywords_val->data, +- fb->revision, fb->url, fb->date, ++ SVN_ERR(svn_subst_build_keywords3(&final_kw, fb->keywords_val->data, ++ fb->revision, fb->url, fb->repos, fb->date, + fb->author, pool)); + + SVN_ERR(svn_subst_copy_and_translate3 +diff -ruN subversion/libsvn_subr/subst.c subversion/libsvn_subr/subst.c +--- subversion/libsvn_subr/subst.c 2009-01-26 14:30:42.000000000 +0300 ++++ subversion/libsvn_subr/subst.c 2009-04-03 21:50:34.276250000 +0400 +@@ -127,8 +127,11 @@ + * %b basename of the URL of this file + * %d short format of date of this revision + * %D long format of date of this revision ++ * %P path relative to root of repos + * %r number of this revision ++ * %R root url of repository + * %u URL of this file ++ * %_ a space + * %% a literal % + * + * All memory is allocated out of @a pool. +@@ -137,12 +140,14 @@ + keyword_printf(const char *fmt, + const char *rev, + const char *url, ++ const char *repos, + apr_time_t date, + const char *author, + apr_pool_t *pool) + { + svn_stringbuf_t *value = svn_stringbuf_ncreate("", 0, pool); + const char *cur; ++ const char *relative; + int n; + + for (;;) +@@ -196,6 +201,23 @@ + svn_stringbuf_appendcstr(value, + svn_time_to_human_cstring(date, pool)); + break; ++ case 'P': /* relative path of this file */ ++ relative = url; ++ if (relative && repos) ++ { ++ int len = strlen(repos); ++ ++ if (strncmp(repos, relative, len) == 0 ++ && relative[len] == '/') ++ relative += len + 1; ++ } ++ if (relative) ++ svn_stringbuf_appendcstr(value, relative); ++ break; ++ case 'R': /* root of repos */ ++ if (repos) ++ svn_stringbuf_appendcstr(value, repos); ++ break; + case 'r': /* number of this revision */ + if (rev) + svn_stringbuf_appendcstr(value, rev); +@@ -204,6 +226,9 @@ + if (url) + svn_stringbuf_appendcstr(value, url); + break; ++ case '_': /* '%_' => a space */ ++ svn_stringbuf_appendbytes(value, " ", 1); ++ break; + case '%': /* '%%' => a literal % */ + svn_stringbuf_appendbytes(value, cur, 1); + break; +@@ -239,8 +264,8 @@ + apr_hash_t *kwhash; + const svn_string_t *val; + +- SVN_ERR(svn_subst_build_keywords2(&kwhash, keywords_val, rev, +- url, date, author, pool)); ++ SVN_ERR(svn_subst_build_keywords3(&kwhash, keywords_val, rev, ++ url, "", date, author, pool)); + + /* The behaviour of pre-1.3 svn_subst_build_keywords, which we are + * replicating here, is to write to a slot in the svn_subst_keywords_t +@@ -279,6 +304,21 @@ + const char *author, + apr_pool_t *pool) + { ++ SVN_ERR(svn_subst_build_keywords3(kw, keywords_val, rev, ++ url, "", date, author, pool)); ++ return SVN_NO_ERROR; ++} ++ ++svn_error_t * ++svn_subst_build_keywords3(apr_hash_t **kw, ++ const char *keywords_val, ++ const char *rev, ++ const char *url, ++ const char *repos, ++ apr_time_t date, ++ const char *author, ++ apr_pool_t *pool) ++{ + apr_array_header_t *keyword_tokens; + int i; + *kw = apr_hash_make(pool); +@@ -289,6 +329,24 @@ + for (i = 0; i < keyword_tokens->nelts; ++i) + { + const char *keyword = APR_ARRAY_IDX(keyword_tokens, i, const char *); ++ apr_array_header_t *keyword_tokens2; ++ ++ keyword_tokens2 = svn_cstring_split(keyword, "=", TRUE /* chop */, pool); ++ if (keyword_tokens2->nelts == 2) ++ { ++ svn_string_t *custom_val; ++ const char *custom_expand; ++ ++ keyword = APR_ARRAY_IDX(keyword_tokens2, 0, const char*); ++ custom_expand = APR_ARRAY_IDX(keyword_tokens2, 1, const char*); ++ if (! strcmp(custom_expand, "%H")) ++ custom_expand = "%P %r %d %a"; ++ else if (! strcmp(custom_expand, "%I")) ++ custom_expand = "%b %r %d %a"; ++ custom_val = keyword_printf(custom_expand, rev, url, repos, date, author, pool); ++ apr_hash_set(*kw, keyword, APR_HASH_KEY_STRING, custom_val); ++ return SVN_NO_ERROR; ++ } + + if ((! strcmp(keyword, SVN_KEYWORD_REVISION_LONG)) + || (! strcmp(keyword, SVN_KEYWORD_REVISION_MEDIUM)) +@@ -296,7 +354,7 @@ + { + svn_string_t *revision_val; + +- revision_val = keyword_printf("%r", rev, url, date, author, pool); ++ revision_val = keyword_printf("%r", rev, url, repos, date, author, pool); + apr_hash_set(*kw, SVN_KEYWORD_REVISION_LONG, + APR_HASH_KEY_STRING, revision_val); + apr_hash_set(*kw, SVN_KEYWORD_REVISION_MEDIUM, +@@ -309,7 +367,7 @@ + { + svn_string_t *date_val; + +- date_val = keyword_printf("%D", rev, url, date, author, pool); ++ date_val = keyword_printf("%D", rev, url, repos, date, author, pool); + apr_hash_set(*kw, SVN_KEYWORD_DATE_LONG, + APR_HASH_KEY_STRING, date_val); + apr_hash_set(*kw, SVN_KEYWORD_DATE_SHORT, +@@ -320,7 +378,7 @@ + { + svn_string_t *author_val; + +- author_val = keyword_printf("%a", rev, url, date, author, pool); ++ author_val = keyword_printf("%a", rev, url, repos, date, author, pool); + apr_hash_set(*kw, SVN_KEYWORD_AUTHOR_LONG, + APR_HASH_KEY_STRING, author_val); + apr_hash_set(*kw, SVN_KEYWORD_AUTHOR_SHORT, +@@ -331,7 +389,7 @@ + { + svn_string_t *url_val; + +- url_val = keyword_printf("%u", rev, url, date, author, pool); ++ url_val = keyword_printf("%u", rev, url, repos, date, author, pool); + apr_hash_set(*kw, SVN_KEYWORD_URL_LONG, + APR_HASH_KEY_STRING, url_val); + apr_hash_set(*kw, SVN_KEYWORD_URL_SHORT, +@@ -341,7 +399,7 @@ + { + svn_string_t *id_val; + +- id_val = keyword_printf("%b %r %d %a", rev, url, date, author, ++ id_val = keyword_printf("%b %r %d %a", rev, url, repos, date, author, + pool); + apr_hash_set(*kw, SVN_KEYWORD_ID, + APR_HASH_KEY_STRING, id_val); +@@ -350,7 +408,7 @@ + { + svn_string_t *header_val; + +- header_val = keyword_printf("%u %r %d %a", rev, url, date, author, ++ header_val = keyword_printf("%u %r %d %a", rev, url, repos, date, author, + pool); + apr_hash_set(*kw, SVN_KEYWORD_HEADER, + APR_HASH_KEY_STRING, header_val); +diff -ruN subversion/libsvn_wc/translate.c subversion/libsvn_wc/translate.c +--- subversion/libsvn_wc/translate.c 2009-02-16 09:25:05.000000000 +0300 ++++ subversion/libsvn_wc/translate.c 2009-04-03 21:49:30.541875000 +0400 +@@ -284,11 +284,12 @@ + + SVN_ERR(svn_wc__entry_versioned(&entry, path, adm_access, FALSE, pool)); + +- SVN_ERR(svn_subst_build_keywords2(keywords, ++ SVN_ERR(svn_subst_build_keywords3(keywords, + list, + apr_psprintf(pool, "%ld", + entry->cmt_rev), + entry->url, ++ entry->repos, + entry->cmt_date, + entry->cmt_author, + pool)); |