add bin/add-dir.sh skeleton for further development

We have added `bin/add-dir.sh` which is just a skeleton
script.  For now, most of what is useful are the top level
comments describing what the command will and will NOT do.
These comments are work in progress and will be updated.

Updated `bin/README.md` to reflect these changes.

Changed usage introduction text to `bin/README.md`.

Made a minor comment change to `bin/add-dir.sh`.

The `bin/new-year.sh` toll will create the YYYY directory if needed.

Added `template/` directory for Makefile templates.

The `bin/new-year.sh` tool will create `YYYY/Makefile` from
the `template/Makefile.year` if needed.

The `YYYY/.year` and `YYYY/.filelist` will be created
for the new IOCCC year.

Change `bin/new-year.sh` VERSION from "1.1 2024-07-21"
to "1.2 2024-07-22".

Added a brief description of `bin/add-dir.sh` to `bin/README.md`
and updated `bin/new-year.sh` entry.

Added `make genpath_top` rule that just updates `.top`.
The existing `make genpath` also runs `make genpath_top`.

The `YYYY/README.md` will be created from a template
for the new IOCCC year.

Flag as error if `YYYY/README.md`, or `YYYY/YYYY.tar.bz2` is
missing in `bin/gen-years.sh`.

Warn if `YYYY/README.md`, or `YYYY/YYYY.tar.bz2` is an empty file
in `bin/gen-years.sh`.

Changed `bin/gen-years.sh` VERSION from "1.3.4 2024-07-13"
to "1.3.5 2024-07-23".

Performed `make www` to accomplish the above and to test under macOS.
This commit is contained in:
Landon Curt Noll committed 2024-07-23 12:55:07 -07:00
1 parent 332255fd40
commit 30334f9716
9 files changed
+1378 -60

No files matched your search

+31 -10
View File
@@ -82,7 +82,7 @@ need to do so.
This tool is used my the [Judges](../judges.html) as part of the final
steps to announce a new winning IOCCC entry.
For example:
Usage:
``` <!---sh-->
mkdir -p YYYY/dir
@@ -98,13 +98,13 @@ Here, `YYYY/dir` must the path to the winning IOCCC entry.
Run a command on all winning entries.
For example:
Usage:
``` <!---sh-->
bin/all-run.sh -v 3 bin/quick-readme2index.sh -v 1
```
Or for example:
Alternate usage:
``` <!---sh-->
bin/all-run.sh -v 3 bin/readme2index.sh -v 1
@@ -117,13 +117,13 @@ Or for example:
Run a command on all IOCCC years.
For example:
Usage:
``` <!---sh-->
bin/all-years.sh -v 1 bin/gen-year-index.sh -v 1
```
Or for example:
Alternate usage:
``` <!---sh-->
bin/all-years.sh -v 1 bin/chk-entry.sh
@@ -137,7 +137,7 @@ Or for example:
Check an entry directory to verify that both the files in its manifest
(`.entry.json`) exist and that no other files exist.
For example:
Usage:
``` <!---sh-->
bin/chk-entry.sh 2020/ferguson1
@@ -167,7 +167,7 @@ title
This tool updates `.entry.json` files entries whose content is modified.
For example:
Usage:
``` <!---sh-->
bin/csv2entry.sh -v 1
@@ -218,6 +218,28 @@ that the `.entry.json` contains a manifest (or any of the other required JSON
content).
<div id="cvt-submission">
### [cvt-submission.sh](%%REPO_URL%%/bin/cvt-submission.sh)
</div>
Given a submission (that has won the IOCCC), with a `.auth.json`
and `.info.json` and NO `.entry.json` file, we convert the
`.auth.json` and `.info.json` into a new `.entry.json` file.
We will also form, as needed, new `author/author_handle.json`
files for new authors, and update `author/author_handle.json`
for authors who won previously.
Usage:
``` <!---sh-->
bin/cvt-submission.sh -v 1 YYYY/dir
```
Here, `YYYY/dir` is the path of the submission under the `YYYY`
year directory.
<div id="entry2csv">
### [entry2csv.sh](%%REPO_URL%%/bin/entry2csv.sh)
</div>
@@ -257,7 +279,7 @@ from the `TOPDIR`.
Generate a list of files in an entry's manifest (the `.entry.json` file).
For example:
Usage:
``` <!---sh-->
awk -f bin/filelist.entry.json.awk 2020/ferguson1/.entry.json
@@ -579,10 +601,9 @@ the [md2html tool](index.html#md2html).
This tool is used my the [Judges](../judges.html) as part of the final
steps to announce a new set of winning IOCCC entries.
For example:
Usage:
``` <!---sh-->
mkdir -p YYYY
bin/new-year.sh -v 1 YYYY
```
+2 -2
View File
@@ -357,7 +357,7 @@ fi
#
if [[ -z $NOOP ]]; then
# append entry directory path to .top
# append entry directory path to .year
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: appending YYYY_DIR: $YYYY_DIR to: $DOT_YEAR" 1>&2
@@ -377,7 +377,7 @@ if [[ -z $NOOP ]]; then
exit 11
fi
# firewall
# firewall - verify YYYY_DIR in .year
#
if grep -E -q "^$YYYY_DIR$" "$DOT_YEAR"; then
if [[ $V_FLAG -ge 1 ]]; then
+390
View File
@@ -0,0 +1,390 @@
#!/usr/bin/env bash
#
# cvt-submission.sh - convert a submission into an entry
#
# Given a submission (that has won the IOCCC), with a `.auth.json`
# and `.info.json` and NO `.entry.json` file, we convert the
# `.auth.json` and `.info.json` into a new `.entry.json` file.
#
# We will form, as needed, new `author/author_handle.json`
# files for new authors, and update `author/author_handle.json`
# for authors who won previously.
#
# There are functions that this tool will NOT do:
#
# * This tool will not remove `.auth.json`
# * This tool will not remove `.info.json`
# * This tool will not remove `remarks.md`
# * This tool will not verify that Makefile has the required rules
# * This will will not form `README.md` author notes from `remarks.md`
# * This will will not add this entry to the year level Makefile
#
# Copyright (c) 2024 by Landon Curt Noll. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby granted,
# provided that the above copyright, this permission notice and text
# this comment, and the disclaimer below appear in all of the following:
#
# supporting documentation
# source copies
# source works derived from this source
# binaries derived from this source or from derived source
#
# LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
# EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# chongo (Landon Curt Noll, http://www.isthe.com/chongo/index.html) /\oo/\
#
# Share and enjoy! :-)
# firewall - run only with a bash that is version 5.1.8 or later
#
# The "/usr/bin/env bash" command must result in using a bash that
# is version 5.1.8 or later.
#
# We could relax this version and insist on version 4.2 or later. Versions
# of bash between 4.2 and 5.1.7 might work. However, to be safe, we will require
# bash version 5.1.8 or later.
#
# WHY 5.1.8 and not 4.2? This safely is done because macOS Homebrew bash we
# often use is "version 5.2.26(1)-release" or later, and the RHEL Linux bash we
# use often use is "version 5.1.8(1)-release" or later. These versions are what
# we initially tested. We recommend you either upgrade bash or install a newer
# version of bash and adjust your $PATH so that "/usr/bin/env bash" finds a bash
# that is version 5.1.8 or later.
#
# NOTE: The macOS shipped, as of 2024 March 15, a version of bash is something like
# bash "version 3.2.57(1)-release". That macOS shipped version of bash
# will NOT work. For users of macOS we recommend you install Homebrew,
# (see https://brew.sh), and then run "brew install bash" which will
# typically install it into /opt/homebrew/bin/bash, and then arrange your $PATH
# so that "/usr/bin/env bash" finds "/opt/homebrew/bin" (or whatever the
# Homebrew bash is).
#
# NOTE: And while MacPorts might work, we noticed a number of subtle differences
# with some of their ported tools to suggest you might be better off
# with installing Homebrew (see https://brew.sh). No disrespect is intended
# to the MacPorts team as they do a commendable job. Nevertheless we ran
# into enough differences with MacPorts environments to suggest you
# might find a better experience with this tool under Homebrew instead.
#
if [[ -z ${BASH_VERSINFO[0]} ||
${BASH_VERSINFO[0]} -lt 5 ||
${BASH_VERSINFO[0]} -eq 5 && ${BASH_VERSINFO[1]} -lt 1 ||
${BASH_VERSINFO[0]} -eq 5 && ${BASH_VERSINFO[1]} -eq 1 && ${BASH_VERSINFO[2]} -lt 8 ]]; then
echo "$0: ERROR: bash version needs to be >= 5.1.8: $BASH_VERSION" 1>&2
echo "$0: Warning: bash version >= 4.2 might work but 5.1.8 was the minimum we tested" 1>&2
echo "$0: Notice: For macOS users: install Homebrew (see https://brew.sh), then run" \
""brew install bash" and then modify your \$PATH so that \"#!/usr/bin/env bash\"" \
"finds the Homebrew installed (usually /opt/homebrew/bin/bash) version of bash" 1>&2
exit 4
fi
# setup bash file matching
#
# We must declare arrays with -ag or -Ag, and we need loops to "export" modified variables.
# This requires a bash with a version 4.2 or later. See the larger comment above about bash versions.
#
shopt -s nullglob # enable expanded to nothing rather than remaining unexpanded
shopt -u failglob # disable error message if no matches are found
shopt -u dotglob # disable matching files starting with .
shopt -u nocaseglob # disable strict case matching
shopt -u extglob # enable extended globbing patterns
shopt -s globstar # enable ** to match all files and zero or more directories and subdirectories
# set variables referenced in the usage message
#
export VERSION="1.0 2024-07-22"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
GIT_TOOL=$(type -P git)
export GIT_TOOL
if [[ -z "$GIT_TOOL" ]]; then
echo "$0: FATAL: git tool is not installed or not in \$PATH" 1>&2
exit 5
fi
"$GIT_TOOL" rev-parse --is-inside-work-tree >/dev/null 2>&1
status="$?"
if [[ $status -eq 0 ]]; then
TOPDIR=$("$GIT_TOOL" rev-parse --show-toplevel)
fi
export TOPDIR
export REPO_URL="https://github.com/ioccc-src/temp-test-ioccc/blob/master"
#
export NOOP=
export DO_NOT_PROCESS=
# usage
#
export USAGE="usage: $0 [-h] [-v level] [-V] [-d topdir] [-n] [-N] YYYY/dir
-h print help message and exit
-v level set verbosity level (def level: 0)
-V print version string and exit
-d topdir set topdir (def: $TOPDIR)
-n go thru the actions, but do not update any files (def: do the action)
-N do not process anything, just parse arguments (def: process something)
YYYY/dir path from topdir to entry directory
Exit codes:
0 all OK
1 invalid year
2 -h and help string printed or -V and version string printed
3 command line error
4 bash version is too old
5 some internal tool is not found or not an executable file
6 problems found with or in the topdir or topdir/YYYY directory
>= 10 internal error
$NAME version: $VERSION"
# parse command line
#
while getopts :hv:Vd:nN flag; do
case "$flag" in
h) echo "$USAGE" 1>&2
exit 2
;;
v) V_FLAG="$OPTARG"
;;
V) echo "$VERSION"
exit 2
;;
d) TOPDIR="$OPTARG"
;;
n) NOOP="-n"
;;
N) DO_NOT_PROCESS="-N"
;;
\?) echo "$0: ERROR: invalid option: -$OPTARG" 1>&2
echo 1>&2
print_usage 1>&2
exit 3
;;
:) echo "$0: ERROR: option -$OPTARG requires an argument" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
*) echo "$0: ERROR: unexpected value from getopts: $flag" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
esac
done
# remove the options
#
shift $(( OPTIND - 1 ));
#
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: file argument count: $#" 1>&2
fi
#
# verify arg count and parse args
#
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: expected 1 arg, found: $#" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
fi
export ENTRY_PATH="$1"
# verify that we have a topdir directory
#
REPO_NAME=$(basename "$REPO_URL")
export REPO_NAME
if [[ -z $TOPDIR ]]; then
echo "$0: ERROR: cannot find top of git repo directory" 1>&2
echo "$0: Notice: if needed: $GIT_TOOL clone $REPO_URL; cd $REPO_NAME" 1>&2
exit 6
fi
if [[ ! -e $TOPDIR ]]; then
echo "$0: ERROR: TOPDIR does not exist: $TOPDIR" 1>&2
echo "$0: Notice: if needed: $GIT_TOOL clone $REPO_URL; cd $REPO_NAME" 1>&2
exit 6
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: TOPDIR is not a directory: $TOPDIR" 1>&2
echo "$0: Notice: if needed: $GIT_TOOL clone $REPO_URL; cd $REPO_NAME" 1>&2
exit 6
fi
# cd to topdir
#
if [[ ! -e $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to non-existent path: $TOPDIR" 1>&2
exit 6
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to a non-directory: $TOPDIR" 1>&2
exit 6
fi
export CD_FAILED
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: about to: cd $TOPDIR" 1>&2
fi
cd "$TOPDIR" || CD_FAILED="true"
if [[ -n $CD_FAILED ]]; then
echo "$0: ERROR: cd $TOPDIR failed" 1>&2
exit 6
fi
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: now in directory: $(/bin/pwd)" 1>&2
fi
# verify we have a non-empty readable .top file
#
export TOP_FILE=".top"
if [[ ! -e $TOP_FILE ]]; then
echo "$0: ERROR: .top does not exist: $TOP_FILE" 1>&2
exit 6
fi
if [[ ! -f $TOP_FILE ]]; then
echo "$0: ERROR: .top is not a regular file: $TOP_FILE" 1>&2
exit 6
fi
if [[ ! -r $TOP_FILE ]]; then
echo "$0: ERROR: .top is not an readable file: $TOP_FILE" 1>&2
exit 6
fi
if [[ ! -s $TOP_FILE ]]; then
echo "$0: ERROR: .top is not a non-empty readable file: $TOP_FILE" 1>&2
exit 6
fi
# verify that we have an bin subdirectory
#
export BIN_PATH="$TOPDIR/bin"
if [[ ! -d $BIN_PATH ]]; then
echo "$0: ERROR: bin is not a directory under topdir: $BIN_PATH" 1>&2
exit 6
fi
export BIN_DIR="bin"
# verify that ENTRY_PATH is a entry directory
#
if [[ ! -d $ENTRY_PATH ]]; then
echo "$0: ERROR: arg is not a directory: $ENTRY_PATH" 1>&2
exit 3
fi
if [[ ! -w $ENTRY_PATH ]]; then
echo "$0: ERROR: arg is not a writable directory: $ENTRY_PATH" 1>&2
exit 3
fi
export YEAR_DIR=${ENTRY_PATH%%/*}
if [[ -z $YEAR_DIR ]]; then
echo "$0: ERROR: arg not in YYYY/dir form: $ENTRY_PATH" 1>&2
exit 3
fi
export ENTRY_DIR=${ENTRY_PATH#*/}
if [[ -z $ENTRY_DIR ]]; then
echo "$0: ERROR: arg: $ENTRY_PATH not in $YEAR_DIR/dir form: $ENTRY_PATH" 1>&2
exit 3
fi
if [[ $ENTRY_DIR = */* ]]; then
echo "$0: ERROR: dir from arg: $ENTRY_PATH contains a /: $ENTRY_DIR" 1>&2
exit 3
fi
if [[ ! -d $YEAR_DIR ]]; then
echo "$0: ERROR: YYYY from arg: $ENTRY_PATH is not a directory: $YEAR_DIR" 1>&2
exit 3
fi
export ENTRY_ID="${YEAR_DIR}_${ENTRY_DIR}"
export DOT_YEAR="$YEAR_DIR/.year"
# Now that we have moved to topdir, form and verify YYYY_DIR is a writable directory
export YYYY_DIR="$YEAR_DIR/$ENTRY_DIR"
if [[ ! -e $YYYY_DIR ]]; then
echo "$0: ERROR: YYYY/dir from arg: $ENTRY_PATH does not exist: $YYYY_DIR" 1>&2
exit 7
fi
if [[ ! -d $YYYY_DIR ]]; then
echo "$0: ERROR: YYYY/dir from arg: $ENTRY_PATH is not a directory: $YYYY_DIR" 1>&2
exit 7
fi
if [[ ! -w $YYYY_DIR ]]; then
echo "$0: ERROR: YYYY/dir from arg: $ENTRY_PATH is not a writable directory: $YYYY_DIR" 1>&2
exit 7
fi
# print running info if verbose
#
# If -v 3 or higher, print exported variables in order that they were exported.
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: VERSION=$VERSION" 1>&2
echo "$0: debug[3]: NAME=$NAME" 1>&2
echo "$0: debug[3]: V_FLAG=$V_FLAG" 1>&2
echo "$0: debug[3]: GIT_TOOL=$GIT_TOOL" 1>&2
echo "$0: debug[3]: TOPDIR=$TOPDIR" 1>&2
echo "$0: debug[3]: REPO_URL=$REPO_URL" 1>&2
echo "$0: debug[3]: NOOP=$NOOP" 1>&2
echo "$0: debug[3]: DO_NOT_PROCESS=$DO_NOT_PROCESS" 1>&2
echo "$0: debug[3]: ENTRY_PATH=$ENTRY_PATH" 1>&2
echo "$0: debug[3]: REPO_NAME=$REPO_NAME" 1>&2
echo "$0: debug[3]: CD_FAILED=$CD_FAILED" 1>&2
echo "$0: debug[3]: TOP_FILE=$TOP_FILE" 1>&2
echo "$0: debug[3]: BIN_PATH=$BIN_PATH" 1>&2
echo "$0: debug[3]: BIN_DIR=$BIN_DIR" 1>&2
echo "$0: debug[3]: YEAR_DIR=$YEAR_DIR" 1>&2
echo "$0: debug[3]: ENTRY_DIR=$ENTRY_DIR" 1>&2
echo "$0: debug[3]: ENTRY_ID=$ENTRY_ID" 1>&2
echo "$0: debug[3]: DOT_YEAR=$DOT_YEAR" 1>&2
echo "$0: debug[3]: YYYY_DIR=$YYYY_DIR" 1>&2
fi
# -N stops early before any processing is performed
#
if [[ -n $DO_NOT_PROCESS ]]; then
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: arguments parsed, -N given, exiting 0" 1>&2
fi
exit 0
fi
# verify that YEAR is already in .top
#
if ! grep -E -q "^$YEAR_DIR$" "$TOP_FILE"; then
echo "$0: ERROR: YEAR_DIR: $YEAR_DIR not found in: $TOP_FILE" 1>&2
echo "$0: notice: consider running: bin/new-year.sh $YEAR_DIR -v 1" 1>&2
exit 10
fi
# case: without -n
#
if [[ -z $NOOP ]]; then
: # XXX - add code here - XXX #
# case: with -n
#
elif [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: -n disabled adding YYYY_DIR: $YYYY_DIR to $DOT_YEAR" 1>&2
fi
# All Done!!! All Done!!! -- Jessica Noll, Age 2
#
exit 0
+27 -1
View File
@@ -85,7 +85,7 @@ shopt -s globstar # enable ** to match all files and zero or more directories an
# set variables referenced in the usage message
#
export VERSION="1.3.4 2024-07-13"
export VERSION="1.3.5 2024-07-22"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
@@ -663,6 +663,19 @@ for YYYY in $("$TAC_TOOL" "$TOP_FILE"); do
continue
fi
# Verify $YYYY/$YYYY.tar.bz2
#
if [[ ! -e $YYYY/$YYYY.tar.bz2 ]]; then
echo "$0: ERROR: compressed tarball for YYYY: $YYYY is missing: $YYYY/$YYYY.tar.bz2" 1>&2
EXIT_CODE="6" # exit 6
echo "$0: Warning: EXIT_CODE set to: $EXIT_CODE" 1>&2
continue
fi
if [[ ! -s $YYYY/$YYYY.tar.bz2 ]]; then
echo "$0: Warning: compressed tarball for YYYY: $YYYY is empty: $YYYY/$YYYY.tar.bz2" 1>&2
echo "$0: notice: continuing the processing of YYYY: $YYYY" 1>&2
fi
# write leading markdown for this IOCCC year
#
{
@@ -795,6 +808,19 @@ for YYYY in $("$TAC_TOOL" "$TOP_FILE"); do
continue
fi
# Verify $YYYY_DIR/README.md
#
if [[ ! -e $YYYY_DIR/README.md ]]; then
echo "$0: ERROR: README.md for YYYY: $YYYY is missing: $YYYY_DIR/README.md" 1>&2
EXIT_CODE="7" # exit 7
echo "$0: Warning: EXIT_CODE set to: $EXIT_CODE" 1>&2
continue
fi
if [[ ! -s $YYYY_DIR/README.md ]]; then
echo "$0: Warning: README.md for YYYY/dir: $YYYY_DIR/README.md is empty: $YYYY_DIR/README.md" 1>&2
echo "$0: notice: continuing the processing of YYYY: $YYYY" 1>&2
fi
# output markdown for this entry
#
echo "* <div id=\"${YEAR_DIR}_${ENTRY_DIR}\"><a class=\"normal\" href=\"$YYYY_DIR/index.html\">$YYYY_DIR</a> - $AWARD</div>"
+23 -11
View File
@@ -438,7 +438,7 @@ need to do so.</p>
</div>
<p>This tool is used my the <a href="../judges.html">Judges</a> as part of the final
steps to announce a new winning IOCCC entry.</p>
<p>For example:</p>
<p>Usage:</p>
<pre><code> mkdir -p YYYY/dir
bin/add-dir.sh YYYY/dir</code></pre>
<p>Here, <code>YYYY/dir</code> must the path to the winning IOCCC entry.</p>
@@ -446,24 +446,24 @@ steps to announce a new winning IOCCC entry.</p>
<h3 id="all-run.sh"><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/bin/all-run.sh">all-run.sh</a></h3>
</div>
<p>Run a command on all winning entries.</p>
<p>For example:</p>
<p>Usage:</p>
<pre><code> bin/all-run.sh -v 3 bin/quick-readme2index.sh -v 1</code></pre>
<p>Or for example:</p>
<p>Alternate usage:</p>
<pre><code> bin/all-run.sh -v 3 bin/readme2index.sh -v 1</code></pre>
<div id="all-years">
<h3 id="all-years.sh"><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/bin/all-years.sh">all-years.sh</a></h3>
</div>
<p>Run a command on all IOCCC years.</p>
<p>For example:</p>
<p>Usage:</p>
<pre><code> bin/all-years.sh -v 1 bin/gen-year-index.sh -v 1</code></pre>
<p>Or for example:</p>
<p>Alternate usage:</p>
<pre><code> bin/all-years.sh -v 1 bin/chk-entry.sh</code></pre>
<div id="chk-entry">
<h3 id="chk-entry.sh"><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/bin/chk-entry.sh">chk-entry.sh</a></h3>
</div>
<p>Check an entry directory to verify that both the files in its manifest
(<code>.entry.json</code>) exist and that no other files exist.</p>
<p>For example:</p>
<p>Usage:</p>
<pre><code> bin/chk-entry.sh 2020/ferguson1</code></pre>
<p>If you wish to run it on all entries, we recommend that this tool be invoked via
the top level <code>Makefile</code>:</p>
@@ -481,7 +481,7 @@ the top level <code>Makefile</code>:</p>
title</li>
</ul>
<p>This tool updates <code>.entry.json</code> files entries whose content is modified.</p>
<p>For example:</p>
<p>Usage:</p>
<pre><code> bin/csv2entry.sh -v 1</code></pre>
<p>There is no requirement to sort the CSV files, nor convert
them to UNIX format, nor append a final newline to the file.</p>
@@ -518,6 +518,19 @@ semantic checks</strong>. For example, this tool does <strong>NOT</strong> verif
the <code>.entry.json</code> file matches the files in the <code>YYYY/dir directory</code>, or even
that the <code>.entry.json</code> contains a manifest (or any of the other required JSON
content).</p>
<div id="cvt-submission">
<h3 id="cvt-submission.sh"><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/bin/cvt-submission.sh">cvt-submission.sh</a></h3>
</div>
<p>Given a submission (that has won the IOCCC), with a <code>.auth.json</code>
and <code>.info.json</code> and NO <code>.entry.json</code> file, we convert the
<code>.auth.json</code> and <code>.info.json</code> into a new <code>.entry.json</code> file.</p>
<p>We will also form, as needed, new <code>author/author_handle.json</code>
files for new authors, and update <code>author/author_handle.json</code>
for authors who won previously.</p>
<p>Usage:</p>
<pre><code> bin/cvt-submission.sh -v 1 YYYY/dir</code></pre>
<p>Here, <code>YYYY/dir</code> is the path of the submission under the <code>YYYY</code>
year directory.</p>
<div id="entry2csv">
<h3 id="entry2csv.sh"><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/bin/entry2csv.sh">entry2csv.sh</a></h3>
</div>
@@ -546,7 +559,7 @@ from the <code>TOPDIR</code>.</p>
<h3 id="filelist.entry.json.awk"><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/bin/filelist.entry.json.awk">filelist.entry.json.awk</a></h3>
</div>
<p>Generate a list of files in an entry’s manifest (the <code>.entry.json</code> file).</p>
<p>For example:</p>
<p>Usage:</p>
<pre><code> awk -f bin/filelist.entry.json.awk 2020/ferguson1/.entry.json</code></pre>
<p>In this case the command will list all the files of the
<a href="../2020/ferguson1/index.html">2020/ferguson1</a> winning entry.</p>
@@ -718,9 +731,8 @@ the <a href="index.html#md2html">md2html tool</a>.</p>
</div>
<p>This tool is used my the <a href="../judges.html">Judges</a> as part of the final
steps to announce a new set of winning IOCCC entries.</p>
<p>For example:</p>
<pre><code> mkdir -p YYYY
bin/new-year.sh -v 1 YYYY</code></pre>
<p>Usage:</p>
<pre><code> bin/new-year.sh -v 1 YYYY</code></pre>
<p>Here, <code>YYYY</code> must be a new 4-digit IOCCC year.</p>
<div id="output-index-inventory">
<h3 id="output-index-inventory.sh"><a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/bin/output-index-inventory.sh">output-index-inventory.sh</a></h3>
+180 -25
View File
@@ -2,8 +2,7 @@
#
# new-year.sh - add a new IOCCC year
#
# We update .top with a new 4-digit IOCCC year if such a sub-directory exists
# and the IOCCC year is not already in the .top file.
# We update the ${YEAR} make variable in the top level `Makefile`.
#
# Copyright (c) 2024 by Landon Curt Noll. All Rights Reserved.
#
@@ -88,7 +87,7 @@ shopt -s globstar # enable ** to match all files and zero or more directories an
# set variables referenced in the usage message
#
export VERSION="1.1 2024-07-21"
export VERSION="1.2 2024-07-21"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
@@ -105,6 +104,7 @@ if [[ $status -eq 0 ]]; then
fi
export TOPDIR
export REPO_URL="https://github.com/ioccc-src/temp-test-ioccc/blob/master"
export TEMPLATE="template"
#
export NOOP=
export DO_NOT_PROCESS=
@@ -225,14 +225,6 @@ fi
# cd to topdir
#
if [[ ! -e $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to non-existent path: $TOPDIR" 1>&2
exit 6
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to a non-directory: $TOPDIR" 1>&2
exit 6
fi
export CD_FAILED
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: about to: cd $TOPDIR" 1>&2
@@ -269,7 +261,7 @@ fi
# verify we have a non-empty readable Makefile
#
export MAKE_FILE="Makefile"
if [[ ! -e $MAKE_FILE ]]; then
echo "$0: ERROR: .top does not exist: $MAKE_FILE" 1>&2
@@ -300,6 +292,7 @@ if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: GIT_TOOL=$GIT_TOOL" 1>&2
echo "$0: debug[3]: TOPDIR=$TOPDIR" 1>&2
echo "$0: debug[3]: REPO_URL=$REPO_URL" 1>&2
echo "$0: debug[3]: TEMPLATE=$TEMPLATE" 1>&2
echo "$0: debug[3]: NOOP=$NOOP" 1>&2
echo "$0: debug[3]: DO_NOT_PROCESS=$DO_NOT_PROCESS" 1>&2
echo "$0: debug[3]: YEAR=$YEAR" 1>&2
@@ -319,6 +312,168 @@ if [[ -n $DO_NOT_PROCESS ]]; then
fi
# Create YYYY directory if needed
#
if [[ -z $NOOP ]]; then
# case: YYYY does not exist
#
if [[ ! -e $YEAR ]]; then
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: about to: mkdir -p $YEAR" 1>&2
fi
mkdir -p "$YEAR"
status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: mkdir -p $YEAR failed," \
"error code: $status" 1>&2
exit 10
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: created directory: $YEAR" 1>&2
fi
# case: YYYY exists but is not a directory
#
elif [[ ! -d $YEAR ]]; then
echo "$0: ERROR: exists but is not a directory: $YEAR" 1>&2
exit 11
fi
elif [[ $V_FLAG -ge 3 && ! -d $YEAR ]]; then
echo "$0: debug[3]: -n disabled creating missing directory: $YEAR" 1>&2
fi
# Add the template Makefile if there is no YYYY/Makefile file
#
export YEAR_MAKEFILE="$YEAR/Makefile"
if [[ -z $NOOP ]]; then
# case: YYYY/Makefile does not exist
#
if [[ ! -e $YEAR_MAKEFILE ]]; then
# verify that the template directory exists
#
if [[ ! -d $TEMPLATE ]]; then
echo "$0: ERROR: YYYY/Makefile: $YEAR_MAKEFILE does not exist and" \
"template is missing: $TEMPLATE" 1>&2
exit 12
fi
# verify that the YYYY/Makefile template is a file
#
export YEAR_MAKEFILE_TEMPLATE="$TEMPLATE/Makefile.year"
if [[ ! -f $YEAR_MAKEFILE_TEMPLATE ]]; then
echo "$0: ERROR: YYYY/Makefile: $YEAR_MAKEFILE does not exist and" \
"template Makefile is missing: $YEAR_MAKEFILE_TEMPLATE" 1>&2
exit 13
fi
# form year Makefile
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: about to: sed -e ... $YEAR_MAKEFILE_TEMPLATE > $YEAR_MAKEFILE" 0>&2
fi
sed -e "s/%%YEAR%%/$YEAR/g" "$YEAR_MAKEFILE_TEMPLATE" > "$YEAR_MAKEFILE"
status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: sed -e .. $YEAR_MAKEFILE_TEMPLATE > $YEAR_MAKEFILE filed," \
"error code: $status" 1>&2
exit 14
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: updated Makefile: $MAKE_FILE" 1>&2
fi
# case: YYYY exists but is not a file
#
elif [[ ! -d $YEAR ]]; then
echo "$0: ERROR: YYYY/Makefile exists but is not a file: $YEAR_MAKEFILE" 1>&2
exit 15
fi
elif [[ $V_FLAG -ge 3 && ! -f $YEAR_MAKEFILE ]]; then
echo "$0: debug[3]: -n disabled creating Makefile: $YEAR_MAKEFILE" 1>&2
fi
# form an empty YYYY/.year file if needed
#
export YEAR_FILE="$YEAR/.year"
if [[ -z $NOOP ]]; then
# case: .year file does not exist
#
if [[ ! -e $YEAR_FILE ]]; then
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: about to: touch $YEAR_FILE" 1>&2
fi
touch "$YEAR_FILE"
status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: touch $YEAR_FILE filed," \
"error code: $status" 1>&2
exit 16
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: created: $YEAR_FILE" 1>&2
fi
elif [[ ! -f $YEAR_FILE ]]; then
echo "$0: ERROR: .year exists but is not a file: $YEAR_FILE" 1>&2
exit 17
fi
elif [[ $V_FLAG -ge 3 && ! -e $YEAR_FILE ]]; then
echo "$0: debug[3]: -n disabled creating .year: $YEAR_FILE" 1>&2
fi
# form an empty YYYY/.filelist file if needed
#
export YEAR_FILELIST="$YEAR/.filelist"
if [[ -z $NOOP ]]; then
# case: .filelist does not exist
#
if [[ ! -e $YEAR_FILELIST ]]; then
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: about to: touch $YEAR_FILELIST" 1>&2
fi
touch "$YEAR_FILELIST"
status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: touch $YEAR_FILELIST filed," \
"error code: $status" 1>&2
exit 18
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: created: $YEAR_FILELIST" 1>&2
fi
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: about to: make genfilelist YEARS=$YEAR" 1>&2
fi
make genfilelist YEARS="$YEAR"
status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: make genfilelist YEARS=$YEAR filed," \
"error code: $status" 1>&2
exit 19
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: updated: $YEAR_FILELIST" 1>&2
fi
elif [[ ! -f $YEAR_FILE ]]; then
echo "$0: ERROR: .filelist exists but is not a file: $YEAR_FILELIST" 1>&2
exit 20
fi
elif [[ $V_FLAG -ge 3 && ! -e $YEAR_FILELIST ]]; then
echo "$0: debug[3]: -n disabled creating .filelist: $YEAR_FILELIST" 1>&2
fi
# create a temporary Makefile
#
export TMP_MAKEFILE=".tmp.$NAME.MAKEFILE.$$.tmp"
@@ -329,13 +484,13 @@ trap 'rm -f $TMP_MAKEFILE; exit' 0 1 2 3 15
rm -f "$TMP_MAKEFILE"
if [[ -e $TMP_MAKEFILE ]]; then
echo "$0: ERROR: cannot remove temporary Makefile: $TMP_MAKEFILE" 1>&2
exit 10
exit 21
fi
echo '# author_handle,entry_id,entry_id,entry_id,…,,,,,,,,,,,,,,,' > \
"$TMP_MAKEFILE"
if [[ ! -e $TMP_MAKEFILE ]]; then
echo "$0: ERROR: cannot create temporary Makefile: $TMP_MAKEFILE" 1>&2
exit 11
exit 22
fi
@@ -350,18 +505,18 @@ status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: make new_year NEW_YEAR=\"$YEAR\" >> \"$TMP_MAKEFILE\" failed," \
"error code: $status" 1>&2
exit 12
exit 23
fi
sed -n -e '/^# END - DO NOT REMOVE THIS LINE - make new_year also uses this #/,$p' "$MAKE_FILE" >> "$TMP_MAKEFILE"
# Update Makefile if different and not -n
# Update Makefile if is changes and not -n
#
if [[ -z $NOOP ]]; then
if cmp -s "$TMP_MAKEFILE" "$MAKE_FILE"; then
# case: author_wins.csv did not change
# case: Makefile did not change
#
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: Makefile file did not change: $MAKE_FILE" 1>&2
@@ -384,28 +539,28 @@ if [[ -z $NOOP ]]; then
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: mv -f -- $TMP_MAKEFILE $MAKE_FILE filed," \
"error code: $status" 1>&2
exit 13
exit 24
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: updated Makefile: $MAKE_FILE" 1>&2
fi
if [[ ! -s $MAKE_FILE ]]; then
echo "$0: ERROR: not a non-empty Makefile: $MAKE_FILE" 1>&2
exit 14
exit 25
fi
# update .top and friends
# update .top
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: about to run: make genpath >/dev/null" 1>&2
echo "$0: debug[3]: about to: make genpath_top >/dev/null" 1>&2
fi
make genpath >/dev/null
make genpath_top >/dev/null
status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: make genpath >/dev/null failed," \
echo "$0: ERROR: make -fC$YEAR genpath_top >/dev/null failed," \
"error code: $status" 1>&2
exit 15
exit 26
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: updated .top and friends" 1>&2
echo "$0: debug[1]: updated .top" 1>&2
fi
fi