Add a helper script for moving needle files
I actually wrote this a while back but have just been keeping it on my local machine till now; figured I'd clean it up a bit and add it to the repo. It's just a little helper for moving needles into subdirectories, it's useful if you do a big needle retake and have dozens of needles you need to put in the right subdirs, saves figuring them out for yourself. Signed-off-by: Adam Williamson <awilliam@redhat.com>
This commit is contained in:
parent
83a394bba2
commit
9d2dabb5f9
101
move-needles.py
Executable file
101
move-needles.py
Executable file
@ -0,0 +1,101 @@
|
||||
#!/bin/python3
|
||||
|
||||
# Copyright (C) 2020 Red Hat
|
||||
#
|
||||
# This file is part of os-autoinst-distri-fedora.
|
||||
#
|
||||
# os-autoinst-distri-fedora is free software; you can redistribute it
|
||||
# and/or modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation, either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Author: Adam Williamson <awilliam@redhat.com>
|
||||
|
||||
"""This is a helper script for moving needles to appropriate subdirectories, by examining their
|
||||
filenames and looking for existing needles with similar filenames. It's convenient if you have
|
||||
to update a bunch of needles for a font change, or something, and don't want to figure out where
|
||||
each one goes by hand.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import datetime
|
||||
import glob
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
|
||||
def process_needles(date, move=False):
|
||||
"""Main function that does all the work. date is the date to look
|
||||
for needles from (as a string in YYYYMMDD format), move (boolean)
|
||||
is whether to actually move them or just do a dry run.
|
||||
"""
|
||||
# we assume all non-template JSON files in the current directory
|
||||
# are needles
|
||||
needles = glob.glob('*json')
|
||||
needles = [needle for needle in needles if not needle.startswith('templates')]
|
||||
for needle in needles:
|
||||
cands = []
|
||||
# strip off the date
|
||||
name = str(needle).replace(f"-{date}.json", "")
|
||||
# now look for any other directory that has needle(s) starting
|
||||
# with the stripped name
|
||||
for (root, dirs, files) in os.walk('.'):
|
||||
if any(file.startswith(name) for file in files) and root != '.':
|
||||
cands.append(root)
|
||||
# if we found exactly one potential target dir, go ahead
|
||||
if len(cands) == 1:
|
||||
print(f"Move {needle} to {cands[0]}")
|
||||
if move:
|
||||
shutil.move(needle, cands[0])
|
||||
sshot = needle.replace('json', 'png')
|
||||
shutil.move(sshot, cands[0])
|
||||
# if we found more than one, just explain
|
||||
elif len(cands) > 1:
|
||||
print(f"Multiple candidates found for {needle}!")
|
||||
for (idx, cand) in enumerate(cands, 1):
|
||||
print(f"{str(idx)}: {cand}")
|
||||
|
||||
def parse_args(args):
|
||||
"""Parse arguments with argparse."""
|
||||
parser = argparse.ArgumentParser(
|
||||
description=(
|
||||
"Helper script for moving needles to appropriate subdirectories."
|
||||
)
|
||||
)
|
||||
parser.add_argument(
|
||||
"-d", "--date", help="Date to work with, in YYYYMMDD format. Script will look for needle "
|
||||
"files with this date in their name and strip it to form the base name to look for other "
|
||||
"instances of). If not specified, script will use today's date in the local timezone",
|
||||
default=datetime.date.today().strftime("%Y%m%d")
|
||||
)
|
||||
parser.add_argument(
|
||||
"-m", "--move", help="If set, actually move files; if not set, do a dry run and only "
|
||||
"report what files would be moved", action="store_true"
|
||||
)
|
||||
return parser.parse_args(args)
|
||||
|
||||
def run(args):
|
||||
"""Parse args and call main function with appropriate options."""
|
||||
args = parse_args(args)
|
||||
process_needles(args.date, args.move)
|
||||
|
||||
def main():
|
||||
"""Main loop."""
|
||||
try:
|
||||
run(args=sys.argv[1:])
|
||||
except KeyboardInterrupt:
|
||||
sys.stderr.write("Interrupted, exiting...\n")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
# vim: set textwidth=100 ts=8 et sw=4:
|
Loading…
Reference in New Issue
Block a user