-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathomi.bat
More file actions
274 lines (224 loc) · 8.42 KB
/
omi.bat
File metadata and controls
274 lines (224 loc) · 8.42 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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
@ECHO OFF
REM Omi - Version Control for FreeDOS
REM Optimized Micro Index - Git-like commands with SQLite storage
REM Read settings from settings.txt
FOR /F "tokens=2 delims==" %%A IN ('FIND "SQLITE=" .\..\settings.txt') DO SET SQLITE=%%A
FOR /F "tokens=2 delims==" %%A IN ('FIND "USERNAME=" .\..\settings.txt') DO SET USERNAME=%%A
FOR /F "tokens=2 delims==" %%A IN ('FIND "PASSWORD=" .\..\settings.txt') DO SET PASSWORD=%%A
FOR /F "tokens=2 delims==" %%A IN ('FIND "REPOS=" .\..\settings.txt') DO SET REPOS=%%A
FOR /F "tokens=2 delims==" %%A IN ('FIND "CURL=" .\..\settings.txt') DO SET CURL=%%A
FOR /F "tokens=2 delims==" %%A IN ('FIND "API_ENABLED=" .\..\settings.txt') DO SET API_ENABLED=%%A
FOR /F "tokens=2 delims==" %%A IN ('FIND "API_RATE_LIMIT=" .\..\settings.txt') DO SET API_RATE_LIMIT=%%A
REM Set defaults
IF "%API_ENABLED%"=="" SET API_ENABLED=1
IF "%API_RATE_LIMIT%"=="" SET API_RATE_LIMIT=60
REM Database file
IF NOT EXIST .omi (
SET OMI_DB=repo.omi
) ELSE (
FOR /F "tokens=2 delims==" %%A IN ('TYPE .omi') DO SET OMI_DB=%%A
)
REM Get command
SET CMD=%1
SHIFT
REM Command dispatcher
IF "%CMD%"=="init" GOTO INIT_DB
IF "%CMD%"=="clone" GOTO CLONE_DB
IF "%CMD%"=="add" GOTO ADD_FILES
IF "%CMD%"=="commit" GOTO COMMIT_FILES
IF "%CMD%"=="push" GOTO PUSH_CHANGES
IF "%CMD%"=="pull" GOTO PULL_CHANGES
IF "%CMD%"=="list" GOTO LIST_REPOS
IF "%CMD%"=="log" GOTO LOG_COMMITS
IF "%CMD%"=="status" GOTO SHOW_STATUS
ECHO Unknown command: %CMD%
ECHO Usage: omi ^<command^> [args]
ECHO Commands: init, clone, add, commit, push, pull, list, log, status
GOTO END
:INIT_DB
ECHO Initializing omi repository...
ECHO OMI_DB=%OMI_DB% > .omi
REM Create database schema with deduplication support
%SQLITE% %OMI_DB% "CREATE TABLE IF NOT EXISTS blobs (hash TEXT PRIMARY KEY, data BLOB, size INTEGER);"
%SQLITE% %OMI_DB% "CREATE TABLE IF NOT EXISTS files (id INTEGER PRIMARY KEY AUTOINCREMENT, filename TEXT, hash TEXT, datetime TEXT, commit_id INTEGER);"
%SQLITE% %OMI_DB% "CREATE TABLE IF NOT EXISTS commits (id INTEGER PRIMARY KEY AUTOINCREMENT, message TEXT, datetime TEXT, user TEXT);"
%SQLITE% %OMI_DB% "CREATE TABLE IF NOT EXISTS staging (filename TEXT PRIMARY KEY, hash TEXT, datetime TEXT);"
%SQLITE% %OMI_DB% "CREATE INDEX IF NOT EXISTS idx_files_hash ON files(hash);"
%SQLITE% %OMI_DB% "CREATE INDEX IF NOT EXISTS idx_files_commit ON files(commit_id);"
%SQLITE% %OMI_DB% "CREATE INDEX IF NOT EXISTS idx_blobs_hash ON blobs(hash);"
ECHO Repository initialized: %OMI_DB%
GOTO END
:CLONE_DB
SET URL=%1
ECHO Cloning from %URL%...
REM For local files, just copy
IF EXIST "%URL%" (
COPY "%URL%" "%OMI_DB%"
ECHO Cloned to %OMI_DB%
ECHO OMI_DB=%OMI_DB% > .omi
) ELSE (
REM Remote clone using curl
FOR %%F IN ("%URL%") DO SET REPO_NAME=%%~nxF
IF "%REPO_NAME%"==" " SET REPO_NAME=%OMI_DB%
ECHO Downloading %REPO_NAME% from %REPOS%...
%CURL% -f -o "%REPO_NAME%" "%REPOS%/?download=%REPO_NAME%"
IF ERRORLEVEL 0 (
ECHO Cloned to %REPO_NAME%
ECHO OMI_DB=%REPO_NAME% > .omi
) ELSE (
ECHO Error: Failed to clone from remote
)
)
GOTO END
:ADD_FILES
SET ARG=%1
ECHO Adding files to staging...
IF "%ARG%"=="--all" (
REM Add all files in directory
FOR %%F IN (*.*) DO (
IF NOT "%%F"=="%OMI_DB%" (
IF NOT "%%F"==".omi" (
CALL :ADD_ONE_FILE "%%F"
)
)
)
) ELSE (
CALL :ADD_ONE_FILE "%ARG%"
)
GOTO END
:ADD_ONE_FILE
SET ADDFILE=%~1
IF NOT EXIST "%ADDFILE%" GOTO :EOF
REM Calculate SHA256 hash
%SQLITE% %OMI_DB% "SELECT lower(hex(sha256(readfile('%ADDFILE%'))));" > _hash.tmp
SET /P HASH=<_hash.tmp
REM Get current datetime in SQLite format
%SQLITE% %OMI_DB% "SELECT datetime('now');" > _date.tmp
SET /P DATETIME=<_date.tmp
REM Add to staging area
%SQLITE% %OMI_DB% "INSERT OR REPLACE INTO staging (filename, hash, datetime) VALUES ('%ADDFILE%', '%HASH%', '%DATETIME%');"
ECHO Staged: %ADDFILE% (hash: %HASH%)
DEL _hash.tmp _date.tmp
GOTO :EOF
:COMMIT_FILES
REM Parse commit message from -m "message"
SET MSG=%~2
IF "%MSG%"=="" SET MSG=No message
ECHO Committing changes...
REM Get current datetime
%SQLITE% %OMI_DB% "SELECT datetime('now');" > _date.tmp
SET /P DATETIME=<_date.tmp
REM Get username
SET USER=%USERNAME%
IF "%USER%"=="" SET USER=unknown
REM Create commit record
%SQLITE% %OMI_DB% "INSERT INTO commits (message, datetime, user) VALUES ('%MSG%', '%DATETIME%', '%USER%'); SELECT last_insert_rowid();" > _commitid.tmp
SET /P COMMIT_ID=<_commitid.tmp
REM Process each staged file
FOR /F "tokens=1,2,3" %%A IN ('%SQLITE% %OMI_DB% "SELECT filename, hash, datetime FROM staging;"') DO (
CALL :COMMIT_ONE_FILE "%%A" "%%B" "%%C" "%COMMIT_ID%"
)
REM Clear staging area
%SQLITE% %OMI_DB% "DELETE FROM staging;"
ECHO Committed successfully (commit #%COMMIT_ID%)
DEL _date.tmp _commitid.tmp
GOTO END
:COMMIT_ONE_FILE
SET FILENAME=%~1
SET HASH=%~2
SET FILEDATETIME=%~3
SET CID=%~4
REM Check if blob with this hash already exists (deduplication)
%SQLITE% %OMI_DB% "SELECT COUNT(*) FROM blobs WHERE hash='%HASH%';" > _count.tmp
SET /P BLOB_EXISTS=<_count.tmp
IF "%BLOB_EXISTS%"=="0" (
REM Blob doesn't exist, store it
%SQLITE% %OMI_DB% "INSERT INTO blobs (hash, data, size) VALUES ('%HASH%', readfile('%FILENAME%'), length(readfile('%FILENAME%')));"
ECHO Stored new blob: %HASH%
) ELSE (
ECHO Blob already exists (deduplicated): %HASH%
)
REM Add file record (always add metadata even if blob exists)
%SQLITE% %OMI_DB% "INSERT INTO files (filename, hash, datetime, commit_id) VALUES ('%FILENAME%', '%HASH%', '%FILEDATETIME%', %CID%);"
DEL _count.tmp
GOTO :EOF
:PUSH_CHANGES
ECHO Pushing %OMI_DB% to remote...
IF NOT EXIST "%OMI_DB%" (
ECHO Error: Database file %OMI_DB% not found
GOTO END
)
REM Check if API is enabled
IF "%API_ENABLED%"=="0" (
ECHO Error: API is disabled
GOTO END
)
REM Check if user has 2FA enabled (users.txt exists and user has OTP URL)
SET HAS_2FA=0
IF EXIST "users.txt" (
FOR /F "tokens=3 delims=:" %%O IN ('FIND "%USERNAME%:" users.txt') DO (
IF NOT "%%O"=="" SET HAS_2FA=1
)
)
REM If 2FA enabled, prompt for OTP
IF "%HAS_2FA%"=="1" (
SET /P OTP_CODE="Enter OTP code (6 digits): "
%CURL% -f -X POST -F "username=%USERNAME%" -F "password=%PASSWORD%" -F "repo_name=%OMI_DB%" -F "repo_file=@%OMI_DB%" -F "otp_code=%OTP_CODE%" -F "action=Upload" "%REPOS%/"
) ELSE (
REM Upload without OTP
%CURL% -f -X POST -F "username=%USERNAME%" -F "password=%PASSWORD%" -F "repo_name=%OMI_DB%" -F "repo_file=@%OMI_DB%" -F "action=Upload" "%REPOS%/"
)
IF ERRORLEVEL 0 (
ECHO Successfully pushed to %REPOS%
) ELSE (
ECHO Error: Failed to push to remote
)
GOTO END
:PULL_CHANGES
ECHO Pulling %OMI_DB% from remote...
FOR %%F IN ("%OMI_DB%") DO SET REPO_NAME=%%~nxF
REM Check if API is enabled
IF "%API_ENABLED%"=="0" (
ECHO Error: API is disabled
GOTO END
)
REM Check if user has 2FA enabled (users.txt exists and user has OTP URL)
SET HAS_2FA=0
IF EXIST "users.txt" (
FOR /F "tokens=3 delims=:" %%O IN ('FIND "%USERNAME%:" users.txt') DO (
IF NOT "%%O"=="" SET HAS_2FA=1
)
)
REM If 2FA enabled, prompt for OTP
IF "%HAS_2FA%"=="1" (
SET /P OTP_CODE="Enter OTP code (6 digits): "
%CURL% -f -X POST -d "username=%USERNAME%" -d "password=%PASSWORD%" -d "repo_name=%REPO_NAME%" -d "otp_code=%OTP_CODE%" -d "action=pull" -o "%OMI_DB%" "%REPOS%/"
) ELSE (
REM Download without OTP
%CURL% -f -X POST -d "username=%USERNAME%" -d "password=%PASSWORD%" -d "repo_name=%REPO_NAME%" -d "action=pull" -o "%OMI_DB%" "%REPOS%/"
)
IF ERRORLEVEL 0 (
ECHO Successfully pulled from %REPOS%
) ELSE (
ECHO Error: Failed to pull from remote
)
GOTO END
:LIST_REPOS
ECHO === Available Repositories on %REPOS% ===
%CURL% -s "%REPOS%/?format=json"
GOTO END
:LOG_COMMITS
SET LIMIT=%1
IF "%LIMIT%"=="" SET LIMIT=20
ECHO === Commit History ===
ECHO.
%SQLITE% %OMI_DB% "SELECT 'Commit: ' || id || ' (' || user || ')' as info, 'Date: ' || datetime, 'Message: ' || message, '' as sep, (SELECT COUNT(*) FROM files WHERE commit_id = commits.id) || ' files' FROM commits ORDER BY id DESC LIMIT %LIMIT%;"
GOTO END
:SHOW_STATUS
ECHO === Staged Files ===
%SQLITE% %OMI_DB% "SELECT filename, datetime FROM staging;"
ECHO.
ECHO === Recent Commits ===
%SQLITE% %OMI_DB% "SELECT id, message, datetime FROM commits ORDER BY id DESC LIMIT 5;"
GOTO END
:END