CasperSecurity

Current Path : /usr/share/rsync/scripts/
Upload File :
Current File : //usr/share/rsync/scripts/git-set-file-times

#!/usr/bin/env 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, encoding='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, encoding='utf-8')
    out = proc.communicate()[0]
    ls = set(out.split('\0'))
    ls.discard('')

    if not args.tree:
        # All modified files keep their current mtime.
        proc = subprocess.Popen(git + 'status -z --no-renames'.split(), stdout=subprocess.PIPE, encoding='utf-8')
        out = proc.communicate()[0]
        for fn in out.split('\0'):
            if fn == '' or (fn[0] != 'M' and fn[1] != 'M'):
                continue
            fn = fn[3:]
            if args.list:
                mtime = os.lstat(fn).st_mtime
                print_line(fn, mtime, mtime)
            ls.discard(fn)

    cmd = git + 'log -r --name-only --format=%x00commit%x20%H%n%x00commit_time%x20%ct%n --no-renames -z'.split()
    if args.tree:
        cmd.append(args.tree)
    cmd += ['--'] + args.files

    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, encoding='utf-8')
    for line in proc.stdout:
        line = line.strip()
        m = re.match(r'^\0commit_time (\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:
                    print_line(fn, mtime, commit_time)
                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()


def print_line(fn, mtime, commit_time):
    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)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Set the times of the files in the current git checkout to their last-changed time.", add_help=False)
    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 (defaults to the top of current checkout).")
    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 files & times instead of changing them. Repeat for Unix timestamp instead of human readable.")
    parser.add_argument('files', metavar='FILE', nargs='*', help="Specify a subset of checked-out files to tweak.")
    parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.")
    args = parser.parse_args()
    main()

# vim: sw=4 et
Hacker Blog, Shell İndir, Sql İnjection, XSS Attacks, LFI Attacks, Social Hacking, Exploit Bot, Proxy Tools, Web Shell, PHP Shell, Alfa Shell İndir, Hacking Training Set, DDoS Script, Denial Of Service, Botnet, RFI Attacks, Encryption
Telegram @BIBIL_0DAY