Compare commits

...

16 Commits

Author SHA1 Message Date
cf5751840a fix spelling 2026-01-16 13:03:54 -05:00
5133045b31 add comments and remove left over from reference makefile 2026-01-14 21:51:55 -05:00
fc3d0a2e69 Merge pull request 'rewrite complete' (#1) from rewrite into main
Reviewed-on: #1
2026-01-14 20:39:14 -05:00
3073d4e88f update man page 2026-01-14 20:29:23 -05:00
deca2349cf implement -f 2026-01-14 13:54:35 -05:00
a4f455deec [patch] change format of the git init error 2026-01-14 09:12:58 -05:00
12e838c0f0 fix version format 2026-01-13 20:11:19 -05:00
b54989f0ee fix version 2026-01-13 20:10:44 -05:00
bbc8030dfb add git integration 2026-01-13 20:10:30 -05:00
b3a7d03fcd yait 0.0.1 2026-01-13 19:04:23 -05:00
26b3cb41a3 add dep 2026-01-13 19:01:03 -05:00
09b899d342 move license 2026-01-13 19:00:58 -05:00
4a0c8dd0c6 correct copyright and add small shell 2026-01-12 18:29:29 -05:00
3c36fc3963 remove template system 2026-01-12 17:05:34 -05:00
e175ee2730 commit script after mishap 2026-01-12 16:41:17 -05:00
fd7ac4dd7a update gitignore because it hide the main program 2026-01-12 10:32:16 -05:00
11 changed files with 473 additions and 261 deletions

4
.gitignore vendored
View File

@@ -1,2 +1,2 @@
yait /stuff/
*.o *.tar.gz

View File

View File

@@ -3,12 +3,9 @@ all:
install: install:
cp bin/yait /usr/local/bin cp bin/yait /usr/local/bin
mkdir -p /etc/yait
cp t/default/* /etc/yait
cp yait.1 /usr/local/share/man/man1/yait.1 cp yait.1 /usr/local/share/man/man1/yait.1
chmod 644 /usr/local/share/man/man1/yait.1 chmod 644 /usr/local/share/man/man1/yait.1
uninstall: uninstall:
$(RM) /usr/local/bin/yait $(RM) /usr/local/bin/yait
$(RM) -r /etc/yait
$(RM) /usr/local/share/man/man1/yait.1 $(RM) /usr/local/share/man/man1/yait.1

View File

@@ -12,6 +12,7 @@ Get your project started:
#### Dependencies #### Dependencies
- `git` - source control tool
- `shellcheck` - lint shell scripts **development dependency** - `shellcheck` - lint shell scripts **development dependency**
**Note**: `shellcheck` is used as a pre-commit git hook to for quality **Note**: `shellcheck` is used as a pre-commit git hook to for quality

466
bin/yait Executable file
View File

@@ -0,0 +1,466 @@
#! /bin/sh
# Highly opinionated C and SH project generator
scriptversion="0.3.1"
#
# Copyright (C) 2025-2026 fSD THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
me=$(basename "$0")
version="$me/fSD v$scriptversion
Copyright (C) 2025-2026 fSD.
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."
usage="\
Usage: $me [OPTION]... <version> <dir>
Highly opinionated C and SH project generator
Options:
--help print this help and exit
--version output version information
-x <language> set project type
-d <description> set a description
-S small project creation
-f overwrite existing files
-a <author> set project author
-r initialize Git repository for the project
-q suppress output"
x=c # language
d="Does a thing" # package description
S= # small project creation (bool)
f= # force (bool)
a=$(git config user.name) # author
r= # initialize repository (bool)
q= # surpress output
say() {
if [ -z "$q" ]; then
echo "$me: $*"
fi
}
lsay() {
if [ -z "$q" ]; then
echo " => $*"
fi
}
# main creation routine
create_project() {
name=$1
if ! echo "$name" | grep -qE '^[A-Za-z0-9_-]+$'; then
say "invalid name '$name'"
exit 1
fi
# creates a shell project
shell() {
outfile="$name"
if [ -z "$S" ]; then
if [ -d "$name" ]; then
if ! [ -z "$f" ]; then
rm -rf "$name"
fi
fi
mkdir "$name" || exit 1
cd "$name" || exit 1
cat <<EOF > LICENSE
ISC License
Copyright (c) $(date "+%Y") $a
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
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.
EOF
cat <<EOF > Makefile
all:
@echo "nothing to do"
install:
cp bin/$name /usr/local/bin
cp $name.1 /usr/local/share/man/man1/$name.1
chmod 644 /usr/local/share/man/man1/$name.1
uninstall:
\$(RM) /usr/local/bin/$name
\$(RM) /usr/local/share/man/man1/$name.1
EOF
cat <<EOF > README.md
# $name
YOUR_WEBSITE
$d:
- Feature 1
- Feature 2
* feature 2a
## Install
#### Dependencies
- \`fzf\` - terminal fuzzy finder
**Note**: \`fzf\` is used as an example dependency
\`\`\`bash
git clone YOUR_REPO_URL
cd $name
sudo make install
\`\`\`
## Usage
This tool runs via the command \`$name\`.
- \`$name -k\` -- Does option k
EOF
mkdir bin || exit 1
outfile="bin/$outfile"
fi
cat <<EOF > "$outfile"
#! /bin/sh
# $d
scriptversion="1"
#
#
# Copyright (C) $(date "+%Y") $a
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
me=\$0
version="\$me/$a v\$scriptversion
Copyright (C) $(date "+%Y") $a.
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."
usage="\
Usage: \$me [OPTION]... <arg1> <arg2>
$d
Options:
--help print this help and exit
--version output version information"
say() {
if [ -z "\$q" ]; then
echo "\$me: \$*"
fi
}
lsay() {
if [ -z "\$q" ]; then
echo " => \$*"
fi
}
if ! [ \$# -gt 0 ]; then
echo "\$usage"
exit 0
fi
while [ \$# -gt 0 ]; do
case \$1 in
--help) echo "\$usage"; exit 0 ;;
--version) echo "\$version"; exit 0 ;;
-*) echo "\$me: Unknown option '\$1'." >&2; exit 1 ;;
esac
done
say hello world
EOF
chmod +x "$outfile"
}
# creates a C project
c() {
if [ -d "$name" ]; then
if ! [ -z "$f" ]; then
rm -rf "$name"
fi
fi
mkdir "$name" || exit 1
cd "$name" || exit 1
cat <<EOF > README
$name
$(echo "$name" | sed 's/./=/g')
$d
Requirements
------------
In order to build $name you need the LIBRARY header files.
Instillation
------------
Edit config.mk to match your local setup ($name is installed into
the /usr/local namesapce by default).
Afterwards enter the following command to build and install $name (if
necessary as root):
make clean install
Running $name
$(echo "Running $name" | sed 's/./=/g')
To run $name use the following command:
./$name
Configuration
-------------
The configuration of $name is done by creating a custom config.h
and (re)compiling the source code.
EOF
cat <<EOF > LICENSE
ISC License
Copyright (c) $(date "+%Y") $a
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
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.
EOF
cat <<EOF > Makefile
# $name
# See LICENSE file for copyright and license details.
include config.mk
SRC = $name.c
OBJ = \${SRC:.c=.o}
all: $name
.c.o:
\${CC} -c \${CFLAGS} \$<
\${OBJ}: config.h config.mk
config.h:
cp config.def.h \$@
$name: \${OBJ}
\${CC} -o \$@ \${OBJ} \${LDFLAGS}
clean:
rm -f $name \${OBJ} $name-\${VERSION}.tar.gz
dist: clean
mkdir -p $name-\${VERSION}
cp -R LICENSE Makefile README config.def.h config.mk\
$name.1 \${SRC} $name-\${VERSION}
tar -cf $name-\${VERSION}.tar $name-\${VERSION}
gzip $name-\${VERSION}.tar
rm -rf $name-\${VERSION}
install: all
mkdir -p \${DESTDIR}\${PREFIX}/bin
cp -f $name \${DESTDIR}\${PREFIX}/bin
chmod 755 \${DESTDIR}\${PREFIX}/bin/$name
mkdir -p \${DESTDIR}\${MANPREFIX}/man1
sed "s/VERSION/\${VERSION}/g" < $name.1 > \${DESTDIR}\${MANPREFIX}/man1/$name.1
chmod 644 \${DESTDIR}\${MANPREFIX}/man1/$name.1
uninstall:
rm -f \${DESTDIR}\${PREFIX}/bin/$name\
\${DESTDIR}\${MANPREFIX}/man1/$name.1
.PHONY: all clean dist install uninstall
EOF
cat <<EOF > config.def.h
/* See LICENSE file for copyright and license details. */
EOF
cat <<EOF > config.mk
# $name version
VERSION = 0.1
# Customize below to fit your system
# paths
PREFIX = /usr/local
MANPREFIX = \${PREFIX}/share/man
# includes and libs
INCS =
LIBS =
# flags
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"\${VERSION}\"
CFLAGS = -g -std=c99 -pedantic -Wall -O0 \${INCS} \${CPPFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os \${INCS} \${CPPFLAGS}
LDFLAGS = \${LIBS}
# compiler and linker
CC = cc
EOF
cat <<EOF > arg.h
/*
* Copy me if you can.
* by 20h
*/
#ifndef ARG_H__
#define ARG_H__
extern char *argv0;
/* use main(int argc, char *argv[]) */
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
argv[0] && argv[0][1]\\
&& argv[0][0] == '-';\\
argc--, argv++) {\\
char argc_;\\
char **argv_;\\
int brk_;\\
if (argv[0][1] == '-' && argv[0][2] == '\\0') {\\
argv++;\\
argc--;\\
break;\\
}\\
for (brk_ = 0, argv[0]++, argv_ = argv;\\
argv[0][0] && !brk_;\\
argv[0]++) {\\
if (argv_ != argv)\\
break;\\
argc_ = argv[0][0];\\
switch (argc_)
/* Handles obsolete -NUM syntax */
#define ARGNUM case '0':\\
case '1':\\
case '2':\\
case '3':\\
case '4':\\
case '5':\\
case '6':\\
case '7':\\
case '8':\\
case '9'
#define ARGEND }\\
}
#define ARGC() argc_
#define ARGNUMF(base) (brk_ = 1, estrtol(argv[0], (base)))
#define EARGF(x) ((argv[0][1] == '\\0' && argv[1] == NULL)?\\
((x), abort(), (char *)0) :\\
(brk_ = 1, (argv[0][1] != '\\0')?\\
(&argv[0][1]) :\\
(argc--, argv++, argv[0])))
#define ARGF() ((argv[0][1] == '\\0' && argv[1] == NULL)?\\
(char *)0 :\\
(brk_ = 1, (argv[0][1] != '\\0')?\\
(&argv[0][1]) :\\
(argc--, argv++, argv[0])))
#endif
EOF
cat <<EOF > "$name.c"
/* See LICENSE file for license details. */
#include <stdio.h>
#include <stdlib.h>
#include "arg.h"
#include "config.h"
char *argv0;
static void
usage(void) {
fprintf(stderr, "%s: usage: $name [-v]\\n", argv0);
exit(1);
}
int
main(int argc, char *argv[]) {
ARGBEGIN {
case 'v':
printf("$name/$a version %s\\n", VERSION);
exit(0);
default:
usage();
} ARGEND;
puts("Hello, World!");
return 0;
}
EOF
}
case $x in
sh) shell ;;
*) c ;;
esac
if ! [ -z "$r" ]; then
git init -q || echo "$me: error: could not initilzie git repository" >&2
fi
say "made $name at $(realpath "$name")"
cd ..
}
if ! [ $# -gt 0 ]; then
echo "$usage"
exit 0
fi
while [ $# -gt 0 ]; do
case $1 in
--help) echo "$usage"; exit 0 ;;
--version) echo "$version"; exit 0 ;;
-x) shift; x="$1"; shift ;;
-d) shift; d="$1"; shift ;;
-S) S=true; shift ;;
-f) f=true; shift ;;
-a) shift; a="$1"; shift ;;
-r) r=true; shift ;;
-q) q=true; shift ;;
-*) echo "$me: Unknown option '$1'." >&2; exit 1 ;;
*) create_project "$1"; shift ;;
esac
done

View File

@@ -1,78 +0,0 @@
; C file template
;
;
; This is the default C file template for the yait project init tool. This file
; is auto-generated on install and can be modified to your hearts content. An
; original copy can be found at /etc/yait/
;
@def main
/*
* main.c
*
* {{PACKAGE}}/{{AUTHOR}} 0.0.1
*
* Copying policy
*
* {{PACKAGE}} 0.0.1 can be copied and distributed freely for any
* non-commercial purposes. {{PACKAGE}} 0.0.1 can only be incorporated
* into commercial software with the permission of the current author.
*
* This file contains the main driving routine.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "version.h"
#include "estruct.h"
void usage(int status)
{
printf("Usage: %s REQUIRED POSITIONAL ARGUMENT\n", PROGRAM_NAME);
printf(" or: %s [options]\n\n", PROGRAM_NAME);
fputs(" --help display this help and exit\n", stdout);
fputs(" --version output version information and exit\n", stdout);
exit(status);
}
int main(int argc, char **argv)
{
int carg;
if (argc == 2) {
if (strcmp(argv[1], "--help") == 0) {
usage(EXIT_FAILURE);
}
if (strcmp(argv[1], "--version") == 0) {
version();
exit(EXIT_SUCCESS);
}
}
puts(MESSAGE);
return 0;
}
@end
@def header
#ifndef {{MODULE}}_H_
#define {{MODULE}}_H_
#endif /* {{MODULE}}_H_ */
@end
@def impl
/* {{MODULE}}.c
*
* The routines in this file handle **things**
*
* written by {{AUTHOR}}
*/
#include "{{MODULE}}.h"
@end

View File

@@ -1,12 +0,0 @@
; Gitignore file template
;
;
; This is the default gitignore file template for the yait project init tool. This file
; is auto-generated on install and can be modified to your hearts content. An
; original copy can be found at /etc/yait/
;
; This file is only included when the C project strucutre is used.
;
{{PACKAGE}}
*.o

View File

@@ -1,64 +0,0 @@
; Makefile file template
;
;
; This is the default Makefile file template for the yait project init tool. This file
; is auto-generated on install and can be modified to your hearts content. An
; original copy can be found at /etc/yait/
;
@def C
# Makefile for {{PACKAGE}}
# Make the build silent by default
V =
ifeq ($(strip $(V)),)
E = @echo
Q = @
else
E = @\#
Q =
endif
export E Q
PROGRAM = {{PACKAGE}}
TARBALL = $(PROGRAM).tar
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)
HDR = $(wildcard *.h)
CC = gcc
WARNINGS = -Wall -Wstrict-prototypes
CFLAGS = -O2 $(WARNINGS) -g
DEFINES =
LIBS =
LDFLAGS =
BINDIR = /usr/bin
LIBDIR = /usr/lib
$(PROGRAM): $(OBJ) $(HDR)
$(E) " LINK " $@
$(Q) $(CC) $(LDFLAGS) $(DEFINES) -o $@ $(OBJ) $(LIBS)
clean:
$(E) " CLEAN"
$(Q) rm -f $(PROGRAM) $(OBJ)
install: $(PROGRAM)
cp $(PROGRAM) ${BINDIR}
release: $(PROGRAM)
tar cvf $(TARBALL) $(SRC) $(HDR) Makefile README
.c.o:
$(E) " CC " $@
$(Q) $(CC) $(CFLAGS) $(DEFINES) -c $< -o $@
@end
@def sh
all:
@echo "nothing to do"
install:
cp bin/{{PACKAGE}} /usr/local/bin
@end

View File

@@ -1,48 +0,0 @@
; READMILE file template
;
;
; This is the default README file template for the yait project init tool. This
; file is auto-generated on install and can be modified to your hearts content.
; An original copy can be found at /etc/yait/
;
# {{PACKAGE}}
https://example.com
Tagline about your tool
- Feature 1
- Feature 2
* sub point
## Install
#### Dependencies
@def c
- `c compiler` - C compiler
@end
@def sh
- `sh script` - A valid POSIX shell
@end
**Note**: `tool` is used as a part of the build process. It does many things
such as runs, exists, and consisting of more than -1 bytes
```bash
git clone https://example.com/git-tree
cd {{PACKAGE}}
@def c
make
@end
sudo make install
```
## Usage
This tool runs via the command `{{PACKAGE}}`.
- `{{PACKAGE}} --option1` -- Does a thing.
- `{{PACKAGE}} --option2` -- Does another thing.

View File

@@ -1,49 +0,0 @@
; SH file template
;
;
; This is the default SH file template for the yait project init tool. This file
; is auto-generated on install and can be modified to your hearts content. An
; original copy can be found at /etc/yait/
;
#! /bin/sh
# {{DESCRIPTION}}
scriptversion="1"
#
#
# Copyright (C) {{YEAR}} {{AUTHOR}}
#
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
me=$0
version="$me v$scriptversion
Copyright (C) 2025-2026 vx-clutch.
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."
usage="\
Usage: $me [OPTION]... <version> <dir>
{{DESCRIPTION}}
Options:
--help print this help and exit
--version output version information
"
while [ $# -gt 0 ]; do
case $1 in
--help) echo "$usage"; exit 0 ;;
--version) echo "$version"; exit 0 ;;
-*) echo "$me: Unknown option '$1'." >&2; exit 1 ;;
*) break ;;
esac
done

9
yait.1
View File

@@ -1,7 +1,7 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
.TH YAIT "1" "January 2026" "yait v1" "User Commands" .TH FSD "1" "January 2026" "fSD v0.2.1" "User Commands"
.SH NAME .SH NAME
yait \- manual page for yait v1 fSD \- manual page for fSD v0.2.1
.SH SYNOPSIS .SH SYNOPSIS
.B yait .B yait
[\fI\,OPTION\/\fR]... \fI\,<version> <dir>\/\fR [\fI\,OPTION\/\fR]... \fI\,<version> <dir>\/\fR
@@ -17,6 +17,8 @@ output version information
.TP .TP
\fB\-x\fR <language> \fB\-x\fR <language>
set project type set project type
.HP
\fB\-d\fR <description> set a description
.TP .TP
\fB\-S\fR \fB\-S\fR
small project creation small project creation
@@ -24,9 +26,6 @@ small project creation
\fB\-f\fR \fB\-f\fR
overwrite existing files overwrite existing files
.TP .TP
\fB\-n\fR <name>
set project name
.TP
\fB\-a\fR <author> \fB\-a\fR <author>
set project author set project author
.TP .TP