From: Matthew Ogilvie <mmogilvi_git@miniinfo.net>
To: git@vger.kernel.org
Cc: Matthew Ogilvie <mmogilvi_git@miniinfo.net>
Subject: [PATCH 13/20] cvsserver: define a tag name character escape mechanism
Date: Sat, 13 Oct 2012 23:42:26 -0600 [thread overview]
Message-ID: <1350193353-19210-14-git-send-email-mmogilvi_git@miniinfo.net> (raw)
In-Reply-To: <1350193353-19210-1-git-send-email-mmogilvi_git@miniinfo.net>
CVS tags are officially only allowed to use [-_0-9A-Za-f]. Git
refs commonly uses other characters, especially [./]. Such characters
need to be escaped from CVS in order to be referenced.
This just defines functions to escape/unescape names. The functions
are not used yet.
Signed-off-by: Matthew Ogilvie <mmogilvi_git@miniinfo.net>
---
git-cvsserver.perl | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 91 insertions(+)
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index 1d929df..4eecc0b 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -3807,6 +3807,97 @@ sub gethistorydense
return $result;
}
+=head2 escapeRefName
+
+Apply an escape mechanism to compensate for characters that
+git ref names can have that CVS tags can not.
+
+=cut
+sub escapeRefName
+{
+ my($self,$refName)=@_;
+
+ # CVS officially only allows [-_A-Za-z0-9] in tag names (or in
+ # many contexts it can also be a CVS revision number).
+ #
+ # Git tags commonly use '/' and '.' as well, but also handle
+ # anything else just in case:
+ #
+ # = "_-s-" For '/'.
+ # = "_-p-" For '.'.
+ # = "_-u-" For underscore, in case someone wants a literal "_-" in
+ # a tag name.
+ # = "_-xx-" Where "xx" is the hexadecimal representation of the
+ # desired ASCII character byte. (for anything else)
+
+ if(! $refName=~/^[1-9][0-9]*(\.[1-9][0-9]*)*$/)
+ {
+ $refName=~s/_-/_-u--/g;
+ $refName=~s/\./_-p-/g;
+ $refName=~s%/%_-s-%g;
+ $refName=~s/[^-_a-zA-Z0-9]/sprintf("_-%02x-",$1)/eg;
+ }
+}
+
+=head2 unescapeRefName
+
+Undo an escape mechanism to compensate for characters that
+git ref names can have that CVS tags can not.
+
+=cut
+sub unescapeRefName
+{
+ my($self,$refName)=@_;
+
+ # see escapeRefName() for description of escape mechanism.
+
+ $refName=~s/_-([spu]|[0-9a-f][0-9a-f])-/unescapeRefNameChar($1)/eg;
+
+ # allowed tag names
+ # TODO: Perhaps use git check-ref-format, with an in-process cache of
+ # validated names?
+ if( !( $refName=~m%^[^-][-a-zA-Z0-9_/.]*$% ) ||
+ ( $refName=~m%[/.]$% ) ||
+ ( $refName=~/\.lock$/ ) ||
+ ( $refName=~m%\.\.|/\.|[[\\:?*~]|\@\{% ) ) # matching }
+ {
+ # Error:
+ $log->warn("illegal refName: $refName");
+ $refName=undef;
+ }
+ return $refName;
+}
+
+sub unescapeRefNameChar
+{
+ my($char)=@_;
+
+ if($char eq "s")
+ {
+ $char="/";
+ }
+ elsif($char eq "p")
+ {
+ $char=".";
+ }
+ elsif($char eq "u")
+ {
+ $char="_";
+ }
+ elsif($char=~/^[0-9a-f][0-9a-f]$/)
+ {
+ $char=chr(hex($char));
+ }
+ else
+ {
+ # Error case: Maybe it has come straight from user, and
+ # wasn't supposed to be escaped? Restore it the way we got it:
+ $char="_-$char-";
+ }
+
+ return $char;
+}
+
=head2 in_array()
from Array::PAT - mimics the in_array() function
--
1.7.10.2.484.gcd07cc5
next prev parent reply other threads:[~2012-10-14 5:58 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-14 5:42 [PATCH 00/20] git-cvsserver: add support for cvs "-r" refs Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 01/20] cvsserver t9400: add basic 'cvs log' test Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 02/20] cvsserver: removed unused sha1Or-k mode from kopts_from_path Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 03/20] cvsserver: add comments about database schema/usage Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 04/20] cvsserver update: comment about how we shouldn't remove a user-modified file Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 05/20] cvsserver: remove unused functions _headrev and gethistory Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 06/20] cvsserver: clean up client request handler map comments Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 07/20] cvsserver: split up long lines in req_{status,diff,log} Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 08/20] cvsserver: use whole CVS rev number in-process; don't strip "1." prefix Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 09/20] cvsserver: cvs add: do not expand directory arguments Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 10/20] cvsserver status: provide real sticky info Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 11/20] cvsserver: factor out git-log parsing logic Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 12/20] cvsserver: cleanup extra slashes in filename arguments Matthew Ogilvie
2012-10-14 5:42 ` Matthew Ogilvie [this message]
2012-10-14 5:42 ` [PATCH 14/20] cvsserver: add misc commit lookup, file meta data, and file listing functions Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 15/20] cvsserver: implement req_Sticky and related utilities Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 16/20] cvsserver: generalize getmeta() to recognize commit refs Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 17/20] cvsserver: Add version awareness to argsfromdir Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 18/20] cvsserver: support -r and sticky tags for most operations Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 19/20] cvsserver: add t9402 to test branch and tag refs Matthew Ogilvie
2012-10-14 5:42 ` [PATCH 20/20] cvsserver Documentation: new cvs ... -r support Matthew Ogilvie
2012-10-16 19:25 ` [PATCH 00/20] git-cvsserver: add support for cvs "-r" refs Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1350193353-19210-14-git-send-email-mmogilvi_git@miniinfo.net \
--to=mmogilvi_git@miniinfo.net \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).