diff --git a/Makefile.in b/Makefile.in index d7ddbc41e..4d6eadc60 100644 --- a/Makefile.in +++ b/Makefile.in @@ -95,6 +95,7 @@ rsync$(EXEEXT): $(OBJS) $(OBJS): $(HEADERS) $(CHECK_OBJS): $(HEADERS) +options.o: latest-year.h flist.o: rounding.h diff --git a/authenticate.c b/authenticate.c index 67c417cc5..169331e54 100644 --- a/authenticate.c +++ b/authenticate.c @@ -2,7 +2,7 @@ * Support rsync daemon authentication. * * Copyright (C) 1998-2000 Andrew Tridgell - * Copyright (C) 2002-2019 Wayne Davison + * Copyright (C) 2002-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/checksum.c b/checksum.c index b7ea748ff..a6f1cd9c7 100644 --- a/checksum.c +++ b/checksum.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2004-2019 Wayne Davison + * Copyright (C) 2004-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/cleanup.c b/cleanup.c index 51130cafa..fbf7c60b1 100644 --- a/cleanup.c +++ b/cleanup.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2002 Martin Pool - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/clientserver.c b/clientserver.c index 692a4047a..3970f507f 100644 --- a/clientserver.c +++ b/clientserver.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998-2001 Andrew Tridgell * Copyright (C) 2001-2002 Martin Pool - * Copyright (C) 2002-2019 Wayne Davison + * Copyright (C) 2002-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/connection.c b/connection.c index 628186103..1039115cf 100644 --- a/connection.c +++ b/connection.c @@ -2,6 +2,7 @@ * Support the max connections option. * * Copyright (C) 1998 Andrew Tridgell + * Copyright (C) 2006-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/flist.c b/flist.c index 7d7d2c0ff..5a29d6e91 100644 --- a/flist.c +++ b/flist.c @@ -4,7 +4,7 @@ * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2002-2019 Wayne Davison + * Copyright (C) 2002-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/generator.c b/generator.c index 12ad037d7..1955bc81c 100644 --- a/generator.c +++ b/generator.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2002 Martin Pool - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/latest-year.h b/latest-year.h new file mode 100644 index 000000000..ddbf2b5ef --- /dev/null +++ b/latest-year.h @@ -0,0 +1 @@ +#define LATEST_YEAR "2020" diff --git a/lib/md5.c b/lib/md5.c index 4baa9638e..c979d10cc 100644 --- a/lib/md5.c +++ b/lib/md5.c @@ -2,6 +2,7 @@ * RFC 1321 compliant MD5 implementation * * Copyright (C) 2001-2003 Christophe Devine + * Copyright (C) 2007-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/loadparm.c b/loadparm.c index 534e7b63f..eaa15d7de 100644 --- a/loadparm.c +++ b/loadparm.c @@ -11,13 +11,12 @@ * * You should have received a copy of the GNU General Public License along * with this program; if not, visit the http://fsf.org website. - */ - -/* This is based on loadparm.c from Samba, written by Andrew Tridgell + * + * This is based on loadparm.c from Samba, written by Andrew Tridgell * and Karl Auer. Some of the changes are: * * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison */ /* Load parameters. diff --git a/log.c b/log.c index b9bab8110..3c6b1b9b3 100644 --- a/log.c +++ b/log.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998-2001 Andrew Tridgell * Copyright (C) 2000-2001 Martin Pool - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/main.c b/main.c index 9af9e5d3e..3b37796db 100644 --- a/main.c +++ b/main.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2001 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/options.c b/options.c index 99d3627ad..4ec8d4c8a 100644 --- a/options.c +++ b/options.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998-2001 Andrew Tridgell * Copyright (C) 2000, 2001, 2002 Martin Pool - * Copyright (C) 2002-2019 Wayne Davison + * Copyright (C) 2002-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include "rsync.h" #include "itypes.h" +#include "latest-year.h" #include #include @@ -614,7 +615,7 @@ static void print_rsync_version(enum logcode f) rprintf(f, "%s version %s protocol version %d%s\n", RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION, subprotocol); - rprintf(f, "Copyright (C) 1996-2019 by Andrew Tridgell, Wayne Davison, and others.\n"); + rprintf(f, "Copyright (C) 1996-" LATEST_YEAR " by Andrew Tridgell, Wayne Davison, and others.\n"); rprintf(f, "Web site: http://rsync.samba.org/\n"); rprintf(f, "Capabilities:\n"); rprintf(f, " %d-bit files, %d-bit inums, %d-bit timestamps, %d-bit long ints,\n", diff --git a/progress.c b/progress.c index d1cf8caa4..21763611a 100644 --- a/progress.c +++ b/progress.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/receiver.c b/receiver.c index adfa80471..afc8932cb 100644 --- a/receiver.c +++ b/receiver.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/rounding.c b/rounding.c index c4c29b312..bf2ecd315 100644 --- a/rounding.c +++ b/rounding.c @@ -1,7 +1,7 @@ /* * A pre-compilation helper program to aid in the creation of rounding.h. * - * Copyright (C) 2007-2019 Wayne Davison + * Copyright (C) 2007-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/rsync.c b/rsync.c index b8d9acb90..f4af49457 100644 --- a/rsync.c +++ b/rsync.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/rsync.h b/rsync.h index b1d16b378..3f239f062 100644 --- a/rsync.h +++ b/rsync.h @@ -2,7 +2,7 @@ * Copyright (C) 1996, 2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/sender.c b/sender.c index 27c511ef6..4f34cded3 100644 --- a/sender.c +++ b/sender.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2019 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/support/git-set-file-times b/support/git-set-file-times index 53550b740..6fe641a39 100755 --- a/support/git-set-file-times +++ b/support/git-set-file-times @@ -1,43 +1,76 @@ -#!/usr/bin/perl -use strict; -use warnings; - -# Sets mtime and atime of files to the latest commit time in git. -# -# This is useful after the first clone of the rsync repository BEFORE you -# do any building. It is also safe if you have done a "make distclean". - -my %ls; -my $commit_time; -my $prefix = @ARGV && $ARGV[0] =~ s/^--prefix=// ? shift : ''; - -my $top_dir = `git rev-parse --show-toplevel`; -exit 1 unless $top_dir; -chomp($top_dir); - -chdir $top_dir or die "Failed to chdir to $top_dir\: $!\n"; - -$/ = "\0"; -open FH, '-|', qw( git ls-files -z ) or die "Failed to fork: $!"; -while () { - chomp; - $ls{$_} = $_; -} -close FH; - -$/ = "\n"; -open FH, '-|', qw( git log -r --name-only --no-color --pretty=raw -z ), @ARGV or die "Failed to fork: $!"; -while () { - chomp; - if (/^committer .*? (\d+) (?:[\-\+]\d+)$/) { - $commit_time = $1; - } elsif (s/\0\0commit [a-f0-9]{40}$// || s/\0$//) { - my @files = delete @ls{split(/\0/, $_)}; - @files = grep { defined $_ } @files; - next unless @files; - map { s/^/$prefix/ } @files; - utime $commit_time, $commit_time, @files; - } - last unless %ls; -} -close FH; +#!/usr/bin/python3 + +import os, re, argparse, subprocess +from datetime import datetime + +NULL_COMMIT_RE = re.compile(r'\0\0commit [a-f0-9]{40}$|\0$') + +def main(): + if not args.git_dir: + cmd = 'git rev-parse --show-toplevel 2>/dev/null || echo .' + top_dir = subprocess.check_output(cmd, shell=True).decode('utf-8').strip() + args.git_dir = os.path.join(top_dir, '.git') + if not args.prefix: + os.chdir(top_dir) + + git = [ 'git', '--git-dir=' + args.git_dir ] + + if args.tree: + cmd = git + 'ls-tree -z -r --name-only'.split() + [ args.tree ] + else: + cmd = git + 'ls-files -z'.split() + + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) + out = proc.communicate()[0].decode('utf-8') + ls = set(out.split('\0')) + ls.discard('') + + cmd = git + 'log -r --name-only --no-color --pretty=raw --no-renames -z'.split() + if args.tree: + cmd.append(args.tree) + cmd += ['--'] + args.files + + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) + for line in proc.stdout: + line = line.decode('utf-8').strip() + m = re.match(r'^committer .*? (\d+) [-+]\d+$', line) + if m: + commit_time = int(m[1]) + elif NULL_COMMIT_RE.search(line): + line = NULL_COMMIT_RE.sub('', line) + files = set(fn for fn in line.split('\0') if fn in ls) + if not files: + continue + for fn in files: + if args.prefix: + fn = args.prefix + fn + mtime = os.lstat(fn).st_mtime + if args.list: + if args.list > 1: + ts = str(commit_time).rjust(10) + else: + ts = datetime.utcfromtimestamp(commit_time).strftime("%Y-%m-%d %H:%M:%S") + chg = '.' if mtime == commit_time else '*' + print(chg, ts, fn) + elif mtime != commit_time: + if not args.quiet: + print(f"Setting {fn}") + os.utime(fn, (commit_time, commit_time), follow_symlinks = False) + ls -= files + if not ls: + break + proc.communicate() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Set the times of the current git checkout to their last-changed time.") + parser.add_argument('--git-dir', metavar='GIT_DIR', help="The git dir to query (defaults to affecting the current git checkout).") + parser.add_argument('--tree', metavar='TREE-ISH', help="The tree-ish to query (defaults to the current branch).") + parser.add_argument('--prefix', metavar='PREFIX_STR', help="Prepend the PREFIX_STR to each filename we tweak.") + parser.add_argument('--quiet', '-q', action='store_true', help="Don't output the changed-file information.") + parser.add_argument('--list', '-l', action='count', help="List the files and their dates instead of changing them. Repeat for Unix Time instead of human reable.") + parser.add_argument('files', metavar='FILE', nargs='*', help="Specify a subset of checked-out files to tweak.") + args = parser.parse_args() + main() + +# vim: sw=4 et diff --git a/support/year-tweak b/support/year-tweak new file mode 100755 index 000000000..aff72aa47 --- /dev/null +++ b/support/year-tweak @@ -0,0 +1,93 @@ +#!/usr/bin/python3 + +# This uses the output from "support/git-set-file-times --list" to discern +# the last-modified year of each *.c & *.h file and updates the copyright +# year if it isn't set right. + +import sys, os, re, argparse, subprocess +from datetime import datetime + +MAINTAINER_NAME = 'Wayne Davison' +MAINTAINER_SUF = ' ' + MAINTAINER_NAME + "\n" + +def main(): + latest_year = '2000' + + proc = subprocess.Popen('support/git-set-file-times --list'.split(), stdout=subprocess.PIPE, encoding='utf-8') + for line in proc.stdout: + m = re.match(r'^\S\s+(?P\d\d\d\d)\S+\s+\S+\s+(?P.+)', line) + if not m: + print("Failed to parse line from git-set-file-times:", line) + sys.exit(1) + m = argparse.Namespace(**m.groupdict()) + if m.year > latest_year: + latest_year = m.year + if not re.search(r'\.(c|h|[1-9])$', m.fn) or m.fn.startswith('zlib/'): + continue + maybe_edit_copyright_year(m.fn, m.year) + proc.communicate() + + fn = 'latest-year.h' + with open(fn, 'r', encoding='utf-8') as fh: + old_txt = fh.read() + + txt = f'#define LATEST_YEAR "{latest_year}"\n' + if txt != old_txt: + print(f"Updating {fn} with year {latest_year}") + with open(fn, 'w', encoding='utf-8') as fh: + fh.write(txt) + + +def maybe_edit_copyright_year(fn, year): + opening_lines = [ ] + copyright_line = None + + with open(fn, 'r', encoding='utf-8') as fh: + for line in fh: + opening_lines.append(line) + if not re.search(r'\S', line): + break + m = re.match(r'^(?P
.*Copyright\s+\S+\s+)(?P\d\d\d\d(?:-\d\d\d\d)?(,\s+\d\d\d\d)*)(?P.+)', line)
+            if not m:
+                continue
+            copyright_line = argparse.Namespace(**m.groupdict())
+            copyright_line.lineno = len(opening_lines)
+            copyright_line.is_maintainer_line = MAINTAINER_NAME in copyright_line.suf
+            copyright_line.txt = line
+            if copyright_line.is_maintainer_line:
+                break
+
+        if not copyright_line:
+            return
+
+        if copyright_line.is_maintainer_line:
+            cyears = copyright_line.year.split('-')
+            if year == cyears[0]:
+                cyears = [ year ]
+            else:
+                cyears = [ cyears[0], year ]
+            txt = copyright_line.pre + '-'.join(cyears) + MAINTAINER_SUF
+            if txt == copyright_line.txt:
+                return
+            opening_lines[copyright_line.lineno - 1] = txt
+        else:
+            if fn.startswith('lib/'):
+                return
+            txt = copyright_line.pre + year + MAINTAINER_SUF
+            opening_lines[copyright_line.lineno - 1] += txt
+
+        remaining_txt = fh.read()
+
+    print(f"Updating {fn} with year {year}")
+
+    with open(fn, 'w', encoding='utf-8') as fh:
+        fh.write(''.join(opening_lines))
+        fh.write(remaining_txt)
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description="Grab the year of last mod for our c & h files and make sure the Copyright comment is up-to-date.")
+    args = parser.parse_args()
+    main()
+
+# vim: sw=4 et
diff --git a/uidlist.c b/uidlist.c
index 98d229527..e0c0d74b9 100644
--- a/uidlist.c
+++ b/uidlist.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1996 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2004-2019 Wayne Davison
+ * Copyright (C) 2004-2020 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/util.c b/util.c
index aaf540376..ec80b43bd 100644
--- a/util.c
+++ b/util.c
@@ -4,7 +4,7 @@
  * Copyright (C) 1996-2000 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
  * Copyright (C) 2001, 2002 Martin Pool 
- * Copyright (C) 2003-2019 Wayne Davison
+ * Copyright (C) 2003-2020 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/util2.c b/util2.c
index b46677c04..488d673a0 100644
--- a/util2.c
+++ b/util2.c
@@ -4,7 +4,7 @@
  * Copyright (C) 1996-2000 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
  * Copyright (C) 2001, 2002 Martin Pool 
- * Copyright (C) 2003-2019 Wayne Davison
+ * Copyright (C) 2003-2020 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by