-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathiterator
More file actions
executable file
·131 lines (116 loc) · 3.51 KB
/
iterator
File metadata and controls
executable file
·131 lines (116 loc) · 3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/bash
set -e
VERSION='0.1.0'
REPO='potrepka/iterator'
BINARY='iterator'
auto_update() {
local self
self=$(realpath "$0")
local remote_version
remote_version=$(curl -fsSL "https://api.github.com/repos/$REPO/releases/latest" 2>/dev/null \
| grep '"tag_name"' | sed -E 's/.*"tag_name": *"v?([^"]*)".*/\1/' || true)
if [ -n "$remote_version" ] && [ "$remote_version" != "$VERSION" ]; then
echo "Updating $BINARY ($VERSION -> $remote_version)..."
local tmp
tmp=$(mktemp)
if curl -fsSL "https://raw.githubusercontent.com/$REPO/v$remote_version/$BINARY" -o "$tmp" 2>/dev/null; then
mv "$tmp" "$self"
chmod +x "$self"
echo "Updated. Re-running..."
exec "$self" "$@"
else
rm -f "$tmp"
fi
fi
}
auto_update "$@"
require_val() {
local flag="$1" val="$2"
if [ -z "$val" ] || [[ "$val" == --* ]]; then
echo "Missing value for $flag"
exit 1
fi
}
require_int() {
local flag="$1" val="$2"
require_val "$flag" "$val"
if ! [[ "$val" =~ ^[0-9]+$ ]]; then
echo "$flag requires a non-negative integer, got: $val"
exit 1
fi
}
PR=''
TERMINAL='opencode run'
PROMPT=''
OUTPUT=''
SEARCH=8
FIX=128
REPEAT=4
VERBOSE=0
while [[ $# -gt 0 ]]; do
case $1 in
--terminal) require_val "$1" "$2"; TERMINAL="$2"; shift 2 ;;
--verbose) VERBOSE=1; shift ;;
--prompt) require_val "$1" "$2"; PROMPT="$2"; shift 2 ;;
--output) require_val "$1" "$2"; OUTPUT="$2"; shift 2 ;;
--search) require_int "$1" "$2"; SEARCH="$2"; shift 2 ;;
--fix) require_int "$1" "$2"; FIX="$2"; shift 2 ;;
--repeat) require_int "$1" "$2"; REPEAT="$2"; shift 2 ;;
*)
if [ -z "$PR" ]; then
PR="$1"; shift
else
echo "Unknown argument: $1"; exit 1
fi
;;
esac
done
if [ -z "$PR" ]; then
echo "Usage: iterator PR [OPTIONS]"
exit 1
fi
BRANCH=$(git branch --show-current 2>/dev/null || true)
if [ -z "$BRANCH" ]; then
echo "Not in a git repository or no branch checked out"
exit 1
fi
[ -z "$PROMPT" ] && PROMPT='/review $PR'
[ -z "$OUTPUT" ] && OUTPUT='bugs/$BRANCH.md'
PROMPT="${PROMPT//\$PR/$PR}"
PROMPT="${PROMPT//\$BRANCH/$BRANCH}"
OUTPUT="${OUTPUT//\$PR/$PR}"
OUTPUT="${OUTPUT//\$BRANCH/$BRANCH}"
mkdir -p "$(dirname "$OUTPUT")"
run_terminal() {
if [ "$VERBOSE" -eq 1 ]; then
$TERMINAL "$1"
else
$TERMINAL "$1" > /dev/null 2>&1 < /dev/null
fi
}
echo "PR=$PR"
echo "BRANCH=$BRANCH"
echo "TERMINAL=$TERMINAL"
echo "PROMPT=$PROMPT"
echo "OUTPUT=$OUTPUT"
echo "SEARCH=$SEARCH"
echo "FIX=$FIX"
echo "REPEAT=$REPEAT"
echo "VERBOSE=$VERBOSE"
for ((r=1; r<=REPEAT; r++)); do
echo "=== Round $r/$REPEAT ==="
echo "--- Search ---"
for ((s=1; s<=SEARCH; s++)); do
echo " Search $s/$SEARCH"
run_terminal "$PROMPT
Please compare these bugs with $OUTPUT to find duplicates, and add the non-duplicates to $OUTPUT." || { rc=$?; echo " Search $s failed (exit $rc), continuing..."; }
done
echo "--- Fix ---"
fix=1
while [ -f "$OUTPUT" ] && [ "$fix" -le "$FIX" ]; do
echo " Fix $fix"
run_terminal "Please identify the easiest bug in $OUTPUT to fix, and fix it. Then remove it from $OUTPUT, and if $OUTPUT is empty, delete the file. Then commit and push." || { rc=$?; echo " Fix $fix failed (exit $rc), continuing..."; }
fix=$((fix + 1))
done
done
echo "Done."