X-Git-Url: https://git.phdru.name/?p=git-scripts.git;a=blobdiff_plain;f=set-commit-date.py;h=7f481f36960251b382b9d0b756fed9563e521619;hp=dc6a5fb732d93a0499323e9197305797a24172d8;hb=HEAD;hpb=a78cda4ceab33318042626138aaf727a2fa871c0 diff --git a/set-commit-date.py b/set-commit-date.py index dc6a5fb..c0aaa8c 100755 --- a/set-commit-date.py +++ b/set-commit-date.py @@ -5,23 +5,44 @@ # Adapted from https://git.wiki.kernel.org/index.php/ExampleScripts#Setting_the_timestamps_of_the_files_to_the_commit_timestamp_of_the_commit_which_last_touched_them # noqa +import argparse import os +import sys import subprocess +git_root = subprocess.check_output(['git', 'rev-parse', '--show-toplevel'], + universal_newlines=True).rstrip('\n') +os.chdir(git_root) + +parser = argparse.ArgumentParser(description='Set commit date') +parser.add_argument('-a', '--author', '--author-date', + action='store_true') +parser.add_argument('-c', '--committer', '--committer-date', + action='store_true') +args = parser.parse_args() + +if args.author and args.committer: + parser.print_help() + sys.exit("Use only one of `-a' or `-c' but not both") + +if args.author: + date_format = 'a' +else: + date_format = 'c' # This is the default + separator = '----- GIT LOG SEPARATOR -----' git_log = subprocess.Popen(['git', 'log', '-m', '--first-parent', - '--name-only', '--no-color', - '--format=%s%%n%%ct' % separator], + '--name-status', '--no-color', + '--format=%s%%n%%%st' % (separator, date_format)], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) -filenames = set() +changed_files = set() +deleted_files = set() + # stages: 1 - start of commit, 2 - timestamp, 3 - empty line, 4 - files stage = 1 -while True: - line = git_log.stdout.readline() - if not line: # EOF - break +for line in git_log.stdout: line = line.strip() if (stage in (1, 4)) and (line == separator): # Start of a commit stage = 2 @@ -35,10 +56,17 @@ while True: stage = 4 assert line == '', line elif stage == 4: - filename = line - if filename not in filenames: - filenames.add(filename) - if os.path.exists(filename): + if line.startswith('A') or line.startswith('M') \ + or line.startswith('D'): + filename = line.split(None, 2)[1] + elif line.startswith('R'): + filename = line.split(None, 3)[2] # renamed to + if line.startswith('D') and filename not in changed_files: + # The file was not readded + deleted_files.add(filename) + if filename not in deleted_files and filename not in changed_files: + changed_files.add(filename) + if os.path.exists(filename) and not os.path.islink(filename): os.utime(filename, (time, time)) else: raise ValueError("stage: %d, line: %s" % (stage, line))