On Mon, Feb 27, 2017 at 02:29:18PM +0100, René Scharfe wrote:
> Am 25.02.2017 um 20:04 schrieb brian m. carlson:
> >>> So I think that the current scope left is best estimated by the
> >>> following command:
> >>>
> >>>   git grep -P 'unsigned char\s+(\*|.*20)' | grep -v '^Documentation'
> >>>
> >>> So there are approximately 1200 call sites left, which is quite a bit of
> >>> work.  I estimate between the work I've done and other people's
> >>> refactoring work (such as the refs backend refactor), we're about 40%
> >>> done.
> > 
> > As a note, I've been working on this pretty much nonstop since the
> > collision announcement was made.  After another 27 commits, I've got it
> > down from 1244 to 1119.
> > 
> > I plan to send another series out sometime after the existing series has
> > hit next.  People who are interested can follow the object-id-part*
> > branches at https://github.com/bk2204/git.
> 
> Perhaps the following script can help a bit; it converts local and static
> variables in specified files.  It's just a simplistic parser which can get
> at least shadowing variables, strings and comments wrong, so its results
> need to be reviewed carefully.
> 
> I failed to come up with an equivalent Coccinelle patch so far. :-/
> 
> René
> 
> 
> #!/bin/sh
> while test $# -gt 0
> do
>       file="$1"
>       tmp="$file.new"
>       test -f "$file" &&
>       perl -e '
>               use strict;
>               my %indent;
>               my %old;
>               my %new;
>               my $in_struct = 0;
>               while (<>) {
>                       if (/^(\s*)}/) {
>                               my $len = length $1;
>                               foreach my $key (keys %indent) {
>                                       if ($len < length($indent{$key})) {
>                                               delete $indent{$key};
>                                               delete $old{$key};
>                                               delete $new{$key};
>                                       }
>                               }
>                               $in_struct = 0;
>                       }
>                       if (!$in_struct and /^(\s*)(static )?unsigned char 
> (\w+)\[20\];$/) {
>                               my $prefix = "$1$2";
>                               my $name = $3;
>                               $indent{$.} = $1;
>                               $old{$.} = qr/(?<!->)(?<!\.)(?<!-)\b$name\b/;
>                               $name =~ s/sha1/oid/;
>                               print $prefix . "struct object_id " . $name . 
> ";\n";
>                               $new{$.} = $name . ".hash";
>                               next;
>                       }
>                       if (/^(\s*)(static )?struct (\w+ )?\{$/) {
>                               $in_struct = 1;
>                       }
>                       if (!$in_struct and ! /\/\*/) {
>                               foreach my $key (keys %indent) {
>                                       s/$old{$key}/$new{$key}/g;
>                               }
>                       }
>                       print;
>               }
>       ' "$file" >"$tmp" &&
>       mv "$tmp" "$file" ||
>       exit 1
>       shift
> done

I'll see how it works.  I'm currently in New Orleans visiting a friend
until Thursday, so I'll have less time than normal to look at these, but
I'll definitely give it a try.

Most of the issue is not the actual conversion, but finding the right
order in which to convert functions.  For example, the object-id-part8
branch on my GitHub account converts parse_object, but
parse_tree_indirect has to be converted before you can do parse_object.
That leads to another handful of patches that have to be done.
-- 
brian m. carlson / brian with sandals: Houston, Texas, US
+1 832 623 2791 | https://www.crustytoothpaste.net/~bmc | My opinion only
OpenPGP: https://keybase.io/bk2204

Attachment: signature.asc
Description: PGP signature

Reply via email to