summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Davison <wayne@opencoder.net>2022-11-16 00:06:05 -0800
committerWayne Davison <wayne@opencoder.net>2022-11-16 00:10:09 -0800
commitab0d5021ed1c9b4c1b74f5d80b7c6668d8989ba5 (patch)
treedab48bd1db50e069e86cc39600827b81c6bdee4a
parent740289652347573508688d7fb3e7e48d697f8742 (diff)
downloadrsync-ab0d5021ed1c9b4c1b74f5d80b7c6668d8989ba5.tar.gz
Convert a few more scripts to python3.
-rwxr-xr-xsupport/files-to-excludes58
-rwxr-xr-xsupport/idmap45
-rwxr-xr-xsupport/json-rsync-version2
-rwxr-xr-xsupport/mapfrom15
-rwxr-xr-xsupport/mapto15
5 files changed, 80 insertions, 55 deletions
diff --git a/support/files-to-excludes b/support/files-to-excludes
index a28955cb..a47d7f8a 100755
--- a/support/files-to-excludes
+++ b/support/files-to-excludes
@@ -1,27 +1,37 @@
-#!/usr/bin/env perl
-# This script takes an input of filenames and outputs a set of
-# include/exclude directives that can be used by rsync to copy
-# just the indicated files using an --exclude-from=FILE option.
-use strict;
+#!/usr/bin/env python3
+# This script takes an input of filenames and outputs a set of include/exclude
+# directives that can be used by rsync to copy just the indicated files using
+# an --exclude-from=FILE or -f'. FILE' option. To be able to delete files on
+# the receiving side, either use --delete-excluded or change the exclude (-)
+# rules to hide filter rules (H) that only affect the sending side.
-my %hash;
+import os, fileinput, argparse
-while (<>) {
- chomp;
- s#^/+##;
- my $path = '/';
- while (m#([^/]+/)/*#g) {
- $path .= $1;
- print "+ $path\n" unless $hash{$path}++;
- }
- if (m#([^/]+)$#) {
- print "+ $path$1\n";
- } else {
- delete $hash{$path};
- }
-}
+def main():
+ paths = set()
+ for line in fileinput.input(args.files):
+ dirs = line.strip().lstrip('/').split('/')
+ if not dirs:
+ continue
+ for j in range(1, len(dirs)):
+ if dirs[j] == '':
+ continue
+ path = '/' + '/'.join(dirs[:j]) + '/'
+ if path not in paths:
+ print('+', path)
+ paths.add(path)
+ print('+', '/' + '/'.join(dirs))
-foreach (sort keys %hash) {
- print "- $_*\n";
-}
-print "- /*\n";
+ for path in sorted(paths):
+ print('-', path + '*')
+ print('-', '/*')
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description="Transform a list of files into a set of include/exclude rules.", add_help=False)
+ parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.")
+ parser.add_argument("files", metavar="FILE", default='-', nargs='*', help="The file(s) that hold the pathnames to translate. Defaults to stdin.")
+ args = parser.parse_args()
+ main()
+
+# vim: sw=4 et
diff --git a/support/idmap b/support/idmap
new file mode 100755
index 00000000..b212aaf6
--- /dev/null
+++ b/support/idmap
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+# This helper script makes it easy to use a passwd or group file to map values
+# in a LOCAL transfer. For instance, if you mount a backup that does not have
+# the same passwd setup as the local machine, you can do a copy to/from the
+# backup area as follows and get the differing ID values mapped just like a
+# remote transfer to/from the backed-up machine would do:
+#
+# rsync -av --usermap=`idmap --to /mnt/backup/etc/passwd` \
+# --groupmap=`idmap --to /mnt/backup/etc/group` \
+# /some/src/ /mnt/backup/some/dest/
+#
+# rsync -av --usermap=`idmap --from /mnt/backup/etc/passwd` \
+# --groupmap=`idmap --from /mnt/backup/etc/group` \
+# /mnt/backup/some/src/ /some/dest/
+
+import re, fileinput, argparse
+
+NAME_ID_RE = re.compile(r'^(\w+):[^:]+:(\d+)')
+
+def main():
+ maps = [ ]
+ for line in fileinput.input(args.files):
+ m = NAME_ID_RE.match(line)
+ if not m:
+ continue
+ if args.to:
+ pair = (m[1], m[2])
+ else:
+ pair = (m[2], m[1])
+ maps.append(':'.join(pair))
+ print(','.join(maps))
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description="Output usermap or groupmap args for rsync.", add_help=False)
+ action = parser.add_argument_group()
+ action = parser.add_mutually_exclusive_group(required=True)
+ action.add_argument("--from", action="store_true", help="Output the map for use on the sending side.")
+ action.add_argument("--to", action="store_true", help="Output the map for use on the receiving side.")
+ parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.")
+ parser.add_argument("files", metavar="FILE", default='-', nargs='*', help="The file(s) that hold the name & id pairs. Defaults to stdin.")
+ args = parser.parse_args()
+ main()
+
+# vim: sw=4 et
diff --git a/support/json-rsync-version b/support/json-rsync-version
index 31fed7f1..b01e1e49 100755
--- a/support/json-rsync-version
+++ b/support/json-rsync-version
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/bin/env python3
import sys, argparse, subprocess, json
diff --git a/support/mapfrom b/support/mapfrom
deleted file mode 100755
index 88946bc0..00000000
--- a/support/mapfrom
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env perl
-# This helper script makes it easy to use a passwd or group file to map
-# values in a LOCAL transfer. For instance, if you mount a backup that
-# does not have the same passwd setup as the local machine, you can do
-# a copy FROM the backup area as follows and get the differing ID values
-# mapped just like a remote transfer FROM the backed-up machine would do:
-#
-# rsync -av --usermap=`mapfrom /mnt/backup/etc/passwd` \
-# --groupmap=`mapfrom /mnt/backup/etc/group` \
-# /mnt/backup/some/src/ /some/dest/
-
-while (<>) {
- push @_, "$2:$1" if /^(\w+):[^:]+:(\d+)/;
-}
-print join(',', @_), "\n";
diff --git a/support/mapto b/support/mapto
deleted file mode 100755
index 95887523..00000000
--- a/support/mapto
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env perl
-# This helper script makes it easy to use a passwd or group file to map
-# values in a LOCAL transfer. For instance, if you mount a backup that
-# does not have the same passwd setup as the local machine, you can do
-# a copy TO the backup area as follows and get the differing ID values
-# mapped just like a remote transfer TO the backed-up machine would do:
-#
-# rsync -av --usermap=`mapto /mnt/backup/etc/passwd` \
-# --groupmap=`mapto /mnt/backup/etc/group` \
-# /some/src/ /mnt/backup/some/dest/
-
-while (<>) {
- push @_, "$1:$2" if /^(\w+):[^:]+:(\d+)/;
-}
-print join(',', @_), "\n";