Index: subversion/libsvn_subr/subst.c
===================================================================
--- subversion/libsvn_subr/subst.c	(revision 19)
+++ subversion/libsvn_subr/subst.c	(revision 23)
@@ -374,6 +374,19 @@
   for (i = 0; i < keyword_tokens->nelts; ++i)
     {
       const char *keyword = APR_ARRAY_IDX(keyword_tokens, i, const char *);
+      const char *eq;
+      char *realkeyword;
+ 
+      eq = strchr(keyword, '=');
+      if (eq != NULL)
+        {
+          realkeyword = apr_pstrmemdup(pool, keyword, eq - keyword);
+          keyword = eq + 1;
+        }
+      else
+        {
+          realkeyword = NULL;
+        }
 
       if ((! strcmp(keyword, SVN_KEYWORD_REVISION_LONG))
           || (! strcmp(keyword, SVN_KEYWORD_REVISION_MEDIUM))
@@ -382,12 +395,20 @@
           svn_string_t *revision_val;
 
           revision_val = keyword_printf("%r", rev, url, 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,
-                       APR_HASH_KEY_STRING, revision_val);
-          apr_hash_set(*kw, SVN_KEYWORD_REVISION_SHORT,
-                       APR_HASH_KEY_STRING, revision_val);
+          if (realkeyword == NULL)
+            {
+              apr_hash_set (*kw, SVN_KEYWORD_REVISION_LONG,
+                            APR_HASH_KEY_STRING, revision_val);
+              apr_hash_set (*kw, SVN_KEYWORD_REVISION_MEDIUM,
+                            APR_HASH_KEY_STRING, revision_val);
+              apr_hash_set (*kw, SVN_KEYWORD_REVISION_SHORT,
+                            APR_HASH_KEY_STRING, revision_val);
+            }
+          else
+            {
+              apr_hash_set (*kw, realkeyword,
+                            APR_HASH_KEY_STRING, revision_val);
+            }
         }
       else if ((! strcmp(keyword, SVN_KEYWORD_DATE_LONG))
                || (! strcasecmp(keyword, SVN_KEYWORD_DATE_SHORT)))
@@ -395,10 +416,18 @@
           svn_string_t *date_val;
 
           date_val = keyword_printf("%D", rev, url, 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,
-                       APR_HASH_KEY_STRING, date_val);
+          if (realkeyword == NULL)
+            {
+              apr_hash_set (*kw, SVN_KEYWORD_DATE_LONG,
+                            APR_HASH_KEY_STRING, date_val);
+              apr_hash_set (*kw, SVN_KEYWORD_DATE_SHORT,
+                            APR_HASH_KEY_STRING, date_val);
+            }
+          else
+            {
+              apr_hash_set (*kw, realkeyword,
+                            APR_HASH_KEY_STRING, date_val);
+            }
         }
       else if ((! strcmp(keyword, SVN_KEYWORD_AUTHOR_LONG))
                || (! strcasecmp(keyword, SVN_KEYWORD_AUTHOR_SHORT)))
@@ -406,10 +435,18 @@
           svn_string_t *author_val;
 
           author_val = keyword_printf("%a", rev, url, 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,
-                       APR_HASH_KEY_STRING, author_val);
+          if (realkeyword == NULL)
+            {
+              apr_hash_set (*kw, SVN_KEYWORD_AUTHOR_LONG,
+                            APR_HASH_KEY_STRING, author_val);
+              apr_hash_set (*kw, SVN_KEYWORD_AUTHOR_SHORT,
+                            APR_HASH_KEY_STRING, author_val);
+            }
+          else
+            {
+              apr_hash_set (*kw, realkeyword,
+                            APR_HASH_KEY_STRING, author_val);
+            }
         }
       else if ((! strcmp(keyword, SVN_KEYWORD_URL_LONG))
                || (! strcasecmp(keyword, SVN_KEYWORD_URL_SHORT)))
@@ -417,10 +454,18 @@
           svn_string_t *url_val;
 
           url_val = keyword_printf("%u", rev, url, 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,
-                       APR_HASH_KEY_STRING, url_val);
+          if (realkeyword == NULL)
+            {
+              apr_hash_set (*kw, SVN_KEYWORD_URL_LONG,
+                            APR_HASH_KEY_STRING, url_val);
+              apr_hash_set (*kw, SVN_KEYWORD_URL_SHORT,
+                            APR_HASH_KEY_STRING, url_val);
+            }
+          else
+            {
+              apr_hash_set (*kw, realkeyword,
+                            APR_HASH_KEY_STRING, url_val);
+            }
         }
       else if ((! strcasecmp(keyword, SVN_KEYWORD_ID)))
         {
@@ -428,8 +473,16 @@
 
           id_val = keyword_printf("%b %r %d %a", rev, url, date, author,
                                   pool);
-          apr_hash_set(*kw, SVN_KEYWORD_ID,
-                       APR_HASH_KEY_STRING, id_val);
+          if (realkeyword == NULL)
+            {
+              apr_hash_set (*kw, SVN_KEYWORD_ID,
+                            APR_HASH_KEY_STRING, id_val);
+            }
+          else
+            {
+              apr_hash_set (*kw, realkeyword,
+                            APR_HASH_KEY_STRING, id_val);
+            }
         }
     }
 
