Fixed a problem with --fake-super not getting the fully tweaked new_mode
[rsync/rsync.git] / support / cull_options
1 #!/usr/bin/perl
2 # This script outputs some perl code that parses all possible options
3 # that the code in options.c might send to the server.  This perl code
4 # is included in the rrsync script.
5 use strict;
6
7 our(%short_no_arg, %short_with_num, %long_opt);
8 our $last_long_opt;
9
10 open(IN, '../options.c') or die "Unable to open ../options.c: $!\n";
11
12 while (<IN>) {
13     if (/\Qargstr[x++]\E = '(.)'/) {
14         $short_no_arg{$1} = 1;
15         undef $last_long_opt;
16     } elsif (/\Qasprintf(\E[^,]+, "-([a-zA-Z0-9])\%l?[ud]"/) {
17         $short_with_num{$1} = 1;
18         undef $last_long_opt;
19     } elsif (/\Qargs[ac++]\E = "--([^"=]+)"/) {
20         $last_long_opt = $1;
21         $long_opt{$1} = 0;
22     } elsif (defined($last_long_opt)
23         && /\Qargs[ac++]\E = ([^["\s]+);/ && $1 ne 'dest_option') {
24         $long_opt{$last_long_opt} = 2;
25         undef $last_long_opt;
26     } elsif (/dest_option = "--([^"]+)"/) {
27         $long_opt{$1} = 2;
28         undef $last_long_opt;
29     } elsif (/\Qasprintf(\E[^,]+, "--([^"=]+)=/ || /\Qargs[ac++]\E = "--([^"=]+)=/) {
30         $long_opt{$1} = 1;
31         undef $last_long_opt;
32     }
33 }
34 close IN;
35
36 my $short_no_arg = join('', sort keys %short_no_arg);
37 my $short_with_num = join('', sort keys %short_with_num);
38
39 print <<EOT;
40
41 # These options are the only options that rsync might send to the server,
42 # and only in the option format that the stock rsync produces.
43
44 # To disable a short-named option, add its letter to this string:
45 our \$short_disabled = 's';
46
47 our \$short_no_arg = '$short_no_arg'; # DO NOT REMOVE ANY
48 our \$short_with_num = '$short_with_num'; # DO NOT REMOVE ANY
49
50 # To disable a long-named option, change its value to a -1.  The values mean:
51 # 0 = the option has no arg; 1 = the arg doesn't need any checking; 2 = only
52 # check the arg when receiving; and 3 = always check the arg.
53 our \%long_opt = (
54 EOT
55
56 foreach my $opt (sort keys %long_opt) {
57     my $val = $long_opt{$opt};
58     $val = 1 if $opt =~ /^(max-|min-)/;
59     $val = 3 if $opt eq 'files-from';
60     $val = '$ro ? -1 : ' . $val if $opt =~ /^remove-/;
61     print "  '$opt' => $val,\n";
62 }
63
64 print ");\n\n";