public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox•com>
To: Michael Cronenworth <mike@cchtml•com>
Cc: git@vger•kernel.org, Matthew Ogilvie <mmogilvi_git@miniinfo•net>
Subject: Re: git-cvsserver strips exec bit
Date: Tue, 10 Sep 2013 13:11:42 -0700	[thread overview]
Message-ID: <xmqqfvtcxwqp.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <xmqqa9jkzk2l.fsf@gitster.dls.corp.google.com> (Junio C. Hamano's message of "Tue, 10 Sep 2013 10:02:26 -0700")

Junio C Hamano <gitster@pobox•com> writes:

> Michael Cronenworth <mike@cchtml•com> writes:
>
>> On git 1.8.1.x (Fedora 18) I was able to use the git-cvsserver to checkout code
>> to package into a tarball. Script files that were in git with 755 masks were
>> checked-out with the same mask. After upgrading the git repository machine to
>> Fedora 19 (1.8.3.1) the behaviour has changed. When I checkout the same script
>> files their mask is now 644. The mask has not changed in git.
>
> Matthew, I do not know if you are still using the git-cvsserver, but
> it seems that the only substantial change to that subsystem between
> the 1.8.1.x and 1.8.3.x is your update.
>
> Especially 2c3af7e7 (cvsserver: factor out git-log parsing logic,
> 2012-10-13) looks interesting.  It has a hunk like this:
>
> -                my $git_perms = "";
> -                $git_perms .= "r" if ( $mode & 4 );
> -                $git_perms .= "w" if ( $mode & 2 );
> -                $git_perms .= "x" if ( $mode & 1 );
> -                $git_perms = "rw" if ( $git_perms eq "" );
> +                my $dbMode = convertToDbMode($mode);
>
> with the definition of convertToDbMode being:
>
> +sub convertToDbMode
> +{
> +    my $mode = shift;
> +    ...
> +    $mode=~/^\d\d(\d)\d{3}$/;
> +    my $userBits=$1;
> +
> +    my $dbMode = "";
> +    $dbMode .= "r" if ( $userBits & 4 );
> +    $dbMode .= "w" if ( $userBits & 2 );
> +    $dbMode .= "x" if ( $userBits & 1 );
> +    $dbMode = "rw" if ( $dbMode eq "" );
> +
> +    return $dbMode;
>
> The $mode in the caller comes from diff-tree output (the post-change
> side of the mode string, like "100755").
>
> Picking the third digit from the left (i.e. "10'0'755"), instead of
> the tail digit (i.e. "10075'5'"), looks strange.
>
> Side note: now I look at it, the original does not make much sense
> for that matter.  "100755" & 4 is different from oct("100755") & 4.

I stopped interacting with CVS quite a long time ago, so I do not
have any way of verifying, but the fix may be just the matter of
something like this.

I am not sure if we want to use the owner bit (i.e. 4th place)
instead of the other bit (i.e. the last place) like this patch does,
though.  The old code in 1.8.1.x would have produced either "r" (for
100644) or "wx" (for 100755); I think that the result of applying
this patch would give us "r" (for 100644) or "rx" (for 100755).

-- >8 --
Subject: cvsserver: pick up the right mode bits

When determining the file mode from either ls-tree or diff-tree
output, we used to grab these octal mode string (typically 100644 or
100755) and then did

	$git_perms .= "r" if ( $mode & 4 );
	$git_perms .= "w" if ( $mode & 2 );
	$git_perms .= "x" if ( $mode & 1 );

which was already wrong, as (100644 & 4) is very different from
oct("100644") & 4.  An earlier refactoring 2c3af7e7 (cvsserver:
factor out git-log parsing logic, 2012-10-13) further changed it to
pick the third octal digit (10*0*644 or 10*0*755) from the left and
then do the above conversion, which does not make sense, either.

Let's use the last digit of the octal mode string to make sure we
get the executable and read bits right.

Signed-off-by: Junio C Hamano <gitster@pobox•com>
---

 git-cvsserver.perl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index a0d796e..b1d7a4c 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -4167,7 +4167,7 @@ sub convertToDbMode
     #  this half-converted form, but it isn't currently worth the
     #  backwards compatibility headaches.
 
-    $mode=~/^\d\d(\d)\d{3}$/;
+    $mode=~/^\d{5}(\d)$/;
     my $userBits=$1;
 
     my $dbMode = "";

  reply	other threads:[~2013-09-10 20:11 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-10 15:23 git-cvsserver strips exec bit Michael Cronenworth
2013-09-10 17:02 ` Junio C Hamano
2013-09-10 20:11   ` Junio C Hamano [this message]
2013-09-10 22:20     ` Michael Cronenworth
2013-09-10 22:22       ` Michael Cronenworth
2013-09-10 22:33         ` Junio C Hamano
2013-09-11 13:12           ` Michael Cronenworth

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqfvtcxwqp.fsf@gitster.dls.corp.google.com \
    --to=gitster@pobox$(echo .)com \
    --cc=git@vger$(echo .)kernel.org \
    --cc=mike@cchtml$(echo .)com \
    --cc=mmogilvi_git@miniinfo$(echo .)net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox