Extract release version number from tag, if applicable

This commit is contained in:
Scott Bezek 2022-03-14 21:59:03 -07:00
parent 916854c611
commit 1f7bf8a92a
7 changed files with 54 additions and 28 deletions

View File

@ -21,22 +21,22 @@ jobs:
- name: Export JLCPCB fabrication files [view_base] - name: Export JLCPCB fabrication files [view_base]
run: | run: |
./electronics/scripts/export_jlcpcb.py electronics/view_base/view_base.kicad_pcb ./electronics/scripts/export_jlcpcb.py --release-prefix releases/view_base/ electronics/view_base/view_base.kicad_pcb
cp -r electronics/build/view_base-jlc electronics/build/outputs cp -r electronics/build/view_base-jlc electronics/build/outputs
- name: Export PCB overview PDF [view_base] - name: Export PCB overview PDF [view_base]
run: | run: |
./electronics/scripts/generate_pdf.py electronics/view_base/view_base.kicad_pcb ./electronics/scripts/generate_pdf.py --release-prefix releases/view_base/ electronics/view_base/view_base.kicad_pcb
cp electronics/build/view_base-pcb-packet.pdf electronics/build/outputs cp electronics/build/view_base-pcb-packet.pdf electronics/build/outputs
env: env:
PYTHONUNBUFFERED: 1 PYTHONUNBUFFERED: 1
- name: Render PCB 3D [view_base] - name: Render PCB 3D [view_base]
run: | run: |
./electronics/scripts/export_3d.py electronics/view_base/view_base.kicad_pcb --suffix front --width 1024 --height 1024 --skip-virtual --color-soldermask 1 1 1 --color-silk 0.1 0.1 0.1 transform z+ z+ rx+ rx+ rz- ry- ry- mu ./electronics/scripts/export_3d.py electronics/view_base/view_base.kicad_pcb --suffix front --width 1024 --height 1024 --skip-virtual --color-soldermask 1 1 1 --color-silk 0.1 0.1 0.1 --release-prefix releases/view_base/ transform z+ z+ rx+ rx+ rz- ry- ry- mu
cp electronics/build/view_base-front-3d.png electronics/build/outputs cp electronics/build/view_base-front-3d.png electronics/build/outputs
./scripts/annotate_image.sh electronics/build/outputs/view_base-front-3d.png ./scripts/annotate_image.sh electronics/build/outputs/view_base-front-3d.png
./electronics/scripts/export_3d.py electronics/view_base/view_base.kicad_pcb --suffix back --width 1024 --height 1024 --skip-virtual --color-soldermask 1 1 1 --color-silk 0.1 0.1 0.1 transform z+ z+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ rx+ rx+ rz- ry+ ry+ mu ./electronics/scripts/export_3d.py electronics/view_base/view_base.kicad_pcb --suffix back --width 1024 --height 1024 --skip-virtual --color-soldermask 1 1 1 --color-silk 0.1 0.1 0.1 --release-prefix releases/view_base/ transform z+ z+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ rx+ rx+ rz- ry+ ry+ mu
cp electronics/build/view_base-back-3d.png electronics/build/outputs cp electronics/build/view_base-back-3d.png electronics/build/outputs
./scripts/annotate_image.sh electronics/build/outputs/view_base-back-3d.png ./scripts/annotate_image.sh electronics/build/outputs/view_base-back-3d.png
env: env:
@ -44,22 +44,22 @@ jobs:
- name: Export JLCPCB fabrication files [view_screen] - name: Export JLCPCB fabrication files [view_screen]
run: | run: |
./electronics/scripts/export_jlcpcb.py electronics/view_screen/view_screen.kicad_pcb ./electronics/scripts/export_jlcpcb.py --release-prefix releases/view_screen/ electronics/view_screen/view_screen.kicad_pcb
cp -r electronics/build/view_screen-jlc electronics/build/outputs cp -r electronics/build/view_screen-jlc electronics/build/outputs
- name: Export PCB overview PDF [view_screen] - name: Export PCB overview PDF [view_screen]
run: | run: |
./electronics/scripts/generate_pdf.py electronics/view_screen/view_screen.kicad_pcb ./electronics/scripts/generate_pdf.py --release-prefix releases/view_screen/ electronics/view_screen/view_screen.kicad_pcb
cp electronics/build/view_screen-pcb-packet.pdf electronics/build/outputs cp electronics/build/view_screen-pcb-packet.pdf electronics/build/outputs
env: env:
PYTHONUNBUFFERED: 1 PYTHONUNBUFFERED: 1
- name: Render PCB 3D [view_screen] - name: Render PCB 3D [view_screen]
run: | run: |
./electronics/scripts/export_3d.py electronics/view_screen/view_screen.kicad_pcb --suffix front --width 1024 --height 1024 --skip-virtual transform z+ z+ rx+ rx+ rz- ry- ry- mu ./electronics/scripts/export_3d.py electronics/view_screen/view_screen.kicad_pcb --suffix front --width 1024 --height 1024 --skip-virtual --release-prefix releases/view_screen/ transform z+ z+ rx+ rx+ rz- ry- ry- mu
cp electronics/build/view_screen-front-3d.png electronics/build/outputs cp electronics/build/view_screen-front-3d.png electronics/build/outputs
./scripts/annotate_image.sh electronics/build/outputs/view_screen-front-3d.png ./scripts/annotate_image.sh electronics/build/outputs/view_screen-front-3d.png
./electronics/scripts/export_3d.py electronics/view_screen/view_screen.kicad_pcb --suffix back --width 1024 --height 1024 --skip-virtual transform z+ z+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ rx+ rx+ rz- ry+ ry+ mu ./electronics/scripts/export_3d.py electronics/view_screen/view_screen.kicad_pcb --suffix back --width 1024 --height 1024 --skip-virtual --release-prefix releases/view_screen/ transform z+ z+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ ry+ rx+ rx+ rz- ry+ ry+ mu
cp electronics/build/view_screen-back-3d.png electronics/build/outputs cp electronics/build/view_screen-back-3d.png electronics/build/outputs
./scripts/annotate_image.sh electronics/build/outputs/view_screen-back-3d.png ./scripts/annotate_image.sh electronics/build/outputs/view_screen-back-3d.png
env: env:

View File

@ -137,7 +137,7 @@ def _pcbnew_export_3d(output_file, width, height, transforms):
time.sleep(2) time.sleep(2)
def export_3d(filename, suffix, width, height, transforms, raytrace, virtual, color_soldermask, color_silk, color_board, color_copper): def export_3d(filename, suffix, width, height, transforms, raytrace, virtual, color_soldermask, color_silk, color_board, color_copper, release_prefix):
pcb_file = os.path.abspath(filename) pcb_file = os.path.abspath(filename)
output_dir = os.path.join(electronics_root, 'build') output_dir = os.path.join(electronics_root, 'build')
file_util.mkdir_p(output_dir) file_util.mkdir_p(output_dir)
@ -167,7 +167,7 @@ def export_3d(filename, suffix, width, height, transforms, raytrace, virtual, co
apply_color('CopperColor', color_copper) apply_color('CopperColor', color_copper)
with patch_config(os.path.expanduser('~/.config/kicad/pcbnew'), settings): with patch_config(os.path.expanduser('~/.config/kicad/pcbnew'), settings):
with versioned_file(pcb_file): with versioned_file(pcb_file, release_prefix):
with recorded_xvfb(screencast_output_file, width=width, height=height, colordepth=24): with recorded_xvfb(screencast_output_file, width=width, height=height, colordepth=24):
with PopenContext(['pcbnew', pcb_file], close_fds=True) as pcbnew_proc: with PopenContext(['pcbnew', pcb_file], close_fds=True) as pcbnew_proc:
_pcbnew_export_3d(output_file, width, height, transforms) _pcbnew_export_3d(output_file, width, height, transforms)
@ -186,6 +186,7 @@ if __name__ == '__main__':
parser.add_argument('--color-silk', type=float, nargs=3, help='Silkscreen color as 3 floats from 0-1', default=[1, 1, 1]) parser.add_argument('--color-silk', type=float, nargs=3, help='Silkscreen color as 3 floats from 0-1', default=[1, 1, 1])
parser.add_argument('--color-board', type=float, nargs=3, help='PCB substrate color as 3 floats from 0-1', default=[0.764705882, 0.729411765, 0.607843137]) parser.add_argument('--color-board', type=float, nargs=3, help='PCB substrate color as 3 floats from 0-1', default=[0.764705882, 0.729411765, 0.607843137])
parser.add_argument('--color-copper', type=float, nargs=3, help='Copper color as 3 floats from 0-1', default=[0.7, 0.7, 0.7]) parser.add_argument('--color-copper', type=float, nargs=3, help='Copper color as 3 floats from 0-1', default=[0.7, 0.7, 0.7])
parser.add_argument('--release-prefix', type=str, required=True, help='Tag prefix to check if this is a tagged/versioned release. E.g. "releases/" for tags like "releases/v1.0"')
# Use subparsers to for an optional nargs="*" choices argument (workaround for https://bugs.python.org/issue9625) # Use subparsers to for an optional nargs="*" choices argument (workaround for https://bugs.python.org/issue9625)
subparsers = parser.add_subparsers(dest='which') subparsers = parser.add_subparsers(dest='which')
@ -196,4 +197,4 @@ if __name__ == '__main__':
transforms = args.transform if args.which == 'transform' else [] transforms = args.transform if args.which == 'transform' else []
export_3d(args.pcb, args.suffix, args.width, args.height, transforms, not args.skip_raytrace, not args.skip_virtual, args.color_soldermask, args.color_silk, args.color_board, args.color_copper) export_3d(args.pcb, args.suffix, args.width, args.height, transforms, not args.skip_raytrace, not args.skip_virtual, args.color_soldermask, args.color_silk, args.color_board, args.color_copper, args.release_prefix)

View File

@ -33,13 +33,13 @@ logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def export_jlcpcb(pcb, schematic, alt_fields): def export_jlcpcb(pcb, schematic, alt_fields, release_prefix):
pcb_file = os.path.abspath(pcb) pcb_file = os.path.abspath(pcb)
output_dir = os.path.join(electronics_root, 'build', os.path.splitext(os.path.basename(pcb_file))[0] + '-jlc') output_dir = os.path.join(electronics_root, 'build', os.path.splitext(os.path.basename(pcb_file))[0] + '-jlc')
file_util.mkdir_p(output_dir) file_util.mkdir_p(output_dir)
with versioned_file(pcb_file): with versioned_file(pcb_file, release_prefix):
command = [ command = [
'kikit', 'kikit',
'fab', 'fab',
@ -66,5 +66,6 @@ if __name__ == '__main__':
parser.add_argument('pcb') parser.add_argument('pcb')
parser.add_argument('--assembly-schematic') parser.add_argument('--assembly-schematic')
parser.add_argument('--alt-fields', nargs='+') parser.add_argument('--alt-fields', nargs='+')
parser.add_argument('--release-prefix', type=str, required=True, help='Tag prefix to check if this is a tagged/versioned release. E.g. "releases/" for tags like "releases/v1.0"')
args = parser.parse_args() args = parser.parse_args()
export_jlcpcb(args.pcb, args.assembly_schematic, args.alt_fields) export_jlcpcb(args.pcb, args.assembly_schematic, args.alt_fields, args.release_prefix)

View File

@ -83,24 +83,30 @@ def recorded_xvfb(video_filename, **xvfb_args):
screencast_proc.terminate() screencast_proc.terminate()
def get_versioned_contents(filename): def get_versioned_contents(filename, release_search_prefix):
with open(filename, 'r') as f: with open(filename, 'r') as f:
original_contents = f.read() original_contents = f.read()
date = rev_info.git_date() date = rev_info.git_date()
date_long = rev_info.git_date(short=False) date_long = rev_info.git_date(short=False)
rev = rev_info.git_short_rev() rev = rev_info.git_short_rev()
logger.info('Replacing placeholders with %s and %s' % (date, rev)) logger.info('Replacing placeholders with %s and %s' % (date, rev))
release_version = 'v#.#'
if release_search_prefix:
tag_version = rev_info.git_release_version(release_search_prefix)
if tag_version:
release_version = tag_version
return original_contents, original_contents \ return original_contents, original_contents \
.replace('Date ""', 'Date "%s"' % date_long) \ .replace('Date ""', 'Date "%s"' % date_long) \
.replace('DATE: YYYY-MM-DD TIME TZ', 'DATE: %s' % date_long) \ .replace('DATE: YYYY-MM-DD TIME TZ', 'DATE: %s' % date_long) \
.replace('DATE: YYYY-MM-DD', 'DATE: %s' % date) \ .replace('DATE: YYYY-MM-DD', 'DATE: %s' % date) \
.replace('Rev ""', 'Rev "%s"' % rev) \ .replace('Rev ""', 'Rev "%s"' % rev) \
.replace('COMMIT: deadbeef', 'COMMIT: %s' % rev) .replace('COMMIT: deadbeef', 'COMMIT: %s' % rev) \
.replace('v#.#', release_version)
@contextmanager @contextmanager
def versioned_file(filename): def versioned_file(filename, release_search_prefix):
original_contents, versioned_contents = get_versioned_contents(filename) original_contents, versioned_contents = get_versioned_contents(filename, release_search_prefix)
with open(filename, 'w') as temp_schematic: with open(filename, 'w') as temp_schematic:
logger.debug('Writing to %s', filename) logger.debug('Writing to %s', filename)
temp_schematic.write(versioned_contents) temp_schematic.write(versioned_contents)

View File

@ -29,21 +29,21 @@ logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def run(pcb_file): def run(pcb_file, release_prefix):
output_directory = os.path.join(electronics_root, 'build') output_directory = os.path.join(electronics_root, 'build')
temp_dir = os.path.join(output_directory, 'temp_pdfs') temp_dir = os.path.join(output_directory, 'temp_pdfs')
shutil.rmtree(temp_dir, ignore_errors=True) shutil.rmtree(temp_dir, ignore_errors=True)
try: try:
os.makedirs(temp_dir) os.makedirs(temp_dir)
plot_to_directory(pcb_file, output_directory, temp_dir) plot_to_directory(pcb_file, output_directory, temp_dir, release_prefix)
finally: finally:
shutil.rmtree(temp_dir, ignore_errors=True) shutil.rmtree(temp_dir, ignore_errors=True)
def plot_to_directory(pcb_file, output_directory, temp_dir): def plot_to_directory(pcb_file, output_directory, temp_dir, release_prefix):
board_name = os.path.splitext(os.path.basename(pcb_file))[0] board_name = os.path.splitext(os.path.basename(pcb_file))[0]
with pcb_util.get_plotter(pcb_file, temp_dir) as plotter: with pcb_util.get_plotter(pcb_file, temp_dir, release_prefix) as plotter:
plotter.plot_options.SetDrillMarksType(pcbnew.PCB_PLOT_PARAMS.NO_DRILL_SHAPE) plotter.plot_options.SetDrillMarksType(pcbnew.PCB_PLOT_PARAMS.NO_DRILL_SHAPE)
plotter.plot_options.SetExcludeEdgeLayer(False) plotter.plot_options.SetExcludeEdgeLayer(False)
@ -74,7 +74,8 @@ def plot_to_directory(pcb_file, output_directory, temp_dir):
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser('Generate a pdf of the PCB') parser = argparse.ArgumentParser('Generate a pdf of the PCB')
parser.add_argument('--release-prefix', type=str, required=True, help='Tag prefix to check if this is a tagged/versioned release. E.g. "releases/" for tags like "releases/v1.0"')
parser.add_argument('pcb_file') parser.add_argument('pcb_file')
args = parser.parse_args() args = parser.parse_args()
run(args.pcb_file) run(args.pcb_file, args.release_prefix)

View File

@ -29,8 +29,8 @@ logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@contextmanager @contextmanager
def versioned_board(filename): def versioned_board(filename, release_search_prefix):
_, versioned_contents = get_versioned_contents(filename) _, versioned_contents = get_versioned_contents(filename, release_search_prefix)
with tempfile.NamedTemporaryFile(suffix='.kicad_pcb', mode='w') as temp_pcb: with tempfile.NamedTemporaryFile(suffix='.kicad_pcb', mode='w') as temp_pcb:
logger.debug('Writing to %s', temp_pcb.name) logger.debug('Writing to %s', temp_pcb.name)
temp_pcb.write(versioned_contents) temp_pcb.write(versioned_contents)
@ -41,8 +41,8 @@ def versioned_board(filename):
yield board yield board
@contextmanager @contextmanager
def get_plotter(pcb_filename, build_directory): def get_plotter(pcb_filename, build_directory, release_prefix):
with versioned_board(pcb_filename) as board: with versioned_board(pcb_filename, release_prefix) as board:
yield Plotter(board, build_directory) yield Plotter(board, build_directory)
@ -104,9 +104,10 @@ class Plotter(object):
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Test pcb util') parser = argparse.ArgumentParser(description='Test pcb util')
parser.add_argument('--release-prefix', type=str, required=True, help='Tag prefix to check if this is a tagged/versioned release. E.g. "releases/" for tags like "releases/v1.0"')
parser.add_argument('input_file', help='Input .kicad_pcb file') parser.add_argument('input_file', help='Input .kicad_pcb file')
args = parser.parse_args() args = parser.parse_args()
with versioned_board(args.input_file) as board: with versioned_board(args.input_file, args.release_prefix) as board:
logger.info('Loaded %s', board.GetFileName()) logger.info('Loaded %s', board.GetFileName())
for module in board.GetModules(): for module in board.GetModules():
logger.info('Module %s: %s', module.GetReference(), module.GetValue()) logger.info('Module %s: %s', module.GetReference(), module.GetValue())

View File

@ -30,3 +30,19 @@ def git_date(short=True):
return iso return iso
except Exception: except Exception:
raise RuntimeError("Could not read git commit date. Make sure you have git installed and you're working with a git clone of the repository.") raise RuntimeError("Could not read git commit date. Make sure you have git installed and you're working with a git clone of the repository.")
def git_release_version(search_prefix):
try:
tags = subprocess.check_output([
'git',
'tag',
'--points-at',
'HEAD',
]).decode('utf-8').splitlines()
for tag in tags:
if tag.startswith(search_prefix):
return tag[len(search_prefix):]
return None
except Exception:
raise RuntimeError("Could not read git release tags. Make sure you have git installed and you're working with a git clone of the repository.")