From d9015da151fff4fe1d844a5c8b3f07f7ecff63e9 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Mon, 20 Dec 2021 13:34:05 -0800 Subject: [PATCH] Add --munge-links rsync option; convert to python. --- packaging/cull_options | 191 ++++++++++++++++++++++++++--------------- 1 file changed, 122 insertions(+), 69 deletions(-) diff --git a/packaging/cull_options b/packaging/cull_options index 7588002b..85311c7c 100755 --- a/packaging/cull_options +++ b/packaging/cull_options @@ -1,85 +1,138 @@ -#!/usr/bin/env perl -# This script outputs some perl code that parses all possible options -# that the code in options.c might send to the server. This perl code -# is included in the rrsync script. -use strict; +#!/usr/bin/env python3 +# This script outputs either perl or python code that parses all possible options +# that the code in options.c might send to the server. The resulting code is then +# included in the rrsync script. -our %short_no_arg; -our %short_with_num = ( '@' => 1 ); -our %long_opt = ( # These include some extra long-args that BackupPC uses: - 'block-size' => 1, - 'daemon' => -1, - 'debug' => 1, - 'fake-super' => 0, - 'fuzzy' => 0, - 'group' => 0, - 'hard-links' => 0, - 'ignore-times' => 0, - 'info' => 1, - 'links' => 0, - 'log-file' => 3, - 'one-file-system' => 0, - 'owner' => 0, - 'perms' => 0, - 'recursive' => 0, - 'times' => 0, - 'write-devices' => -1, -); -our $last_long_opt; +import re, argparse -open(IN, '../options.c') or die "Unable to open ../options.c: $!\n"; +short_no_arg = { } +short_with_num = { '@': 1 }; +long_opt = { # These include some extra long-args that BackupPC uses: + 'block-size': 1, + 'daemon': -1, + 'debug': 1, + 'fake-super': 0, + 'fuzzy': 0, + 'group': 0, + 'hard-links': 0, + 'ignore-times': 0, + 'info': 1, + 'links': 0, + 'log-file': 3, + 'munge-links': 0, + 'no-munge-links': -1, + 'one-file-system': 0, + 'owner': 0, + 'perms': 0, + 'recursive': 0, + 'times': 0, + 'write-devices': -1, + } -while () { - if (/\Qargstr[x++]\E = '([^.ie])'/) { - $short_no_arg{$1} = 1; - undef $last_long_opt; - } elsif (/\Qasprintf(\E[^,]+, "-([a-zA-Z0-9])\%l?[ud]"/) { - $short_with_num{$1} = 1; - undef $last_long_opt; - } elsif (/\Qargs[ac++]\E = "--([^"=]+)"/) { - $last_long_opt = $1; - $long_opt{$1} = 0 unless exists $long_opt{$1}; - } elsif (defined($last_long_opt) - && /\Qargs[ac++]\E = ([^["\s]+);/) { - $long_opt{$last_long_opt} = 2; - undef $last_long_opt; - } elsif (/return "--([^"]+-dest)";/) { - $long_opt{$1} = 2; - undef $last_long_opt; - } elsif (/\Qasprintf(\E[^,]+, "--([^"=]+)=/ || /\Qargs[ac++]\E = "--([^"=]+)=/ || /fmt = .*: "--([^"=]+)=/) { - $long_opt{$1} = 1; - undef $last_long_opt; - } -} -close IN; +def main(): + last_long_opt = None -my $short_no_arg = join('', sort keys %short_no_arg); -my $short_with_num = join('', sort keys %short_with_num); + with open('../options.c') as fh: + for line in fh: + m = re.search(r"argstr\[x\+\+\] = '([^.ie])'", line) + if m: + short_no_arg[m.group(1)] = 1 + last_long_opt = None + continue -print < $val,\n"; -} + print(txt, end='') -print ");\n\n"; + if args.python: + print("long_opt = {") + sep = ':' + else: + print("our %long_opt = (") + sep = ' =>' + + for opt in sorted(long_opt): + if opt.startswith(('min-', 'max-')): + val = 1 + else: + val = long_opt[opt] + print(' ', repr(opt) + sep, str(val) + ',') + + if args.python: + print("}") + else: + print(");") + print('') + + +def str_assign(name, val, comment=None): + comment = ' # ' + comment if comment else '' + if args.python: + return name + ' = ' + repr(val) + comment + "\n" + return 'our $' + name + ' = ' + repr(val) + ';' + comment + "\n" + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Output culled rsync options for rrsync.", add_help=False) + out_group = parser.add_mutually_exclusive_group() + out_group.add_argument('--perl', action='store_true', help="Output perl code (the default).") + out_group.add_argument('--python', action='store_true', help="Output python code.") + parser.add_argument('--help', '-h', action='help', help="Output this help message and exit.") + args = parser.parse_args() + main() + +# vim: sw=4 et