mirror of
https://github.com/sbrow/envr.git
synced 2026-06-27 10:38:33 -04:00
99 lines
2.1 KiB
Odin
99 lines
2.1 KiB
Odin
package main
|
|
|
|
import "core:encoding/json"
|
|
import "core:fmt"
|
|
import "core:os"
|
|
import "core:terminal"
|
|
import "core:text/table"
|
|
|
|
SyncEntry :: struct {
|
|
path: string `json:"path"`,
|
|
status: string `json:"status"`,
|
|
}
|
|
|
|
// TODO: Check for quiet failures.
|
|
// TODO: Support --format -f flags
|
|
cmd_sync :: proc(cmd: ^Command) {
|
|
db, db_ok := db_open(cmd.config_path)
|
|
if !db_ok {
|
|
return
|
|
}
|
|
defer db_close(&db)
|
|
|
|
files, list_ok := db_list(&db)
|
|
if !list_ok {
|
|
return
|
|
}
|
|
|
|
results := make([]SyncEntry, len(files), context.temp_allocator)
|
|
|
|
for &file, i in files {
|
|
result, err := db_sync(&db, &file)
|
|
|
|
status: string
|
|
if err != .None {
|
|
status = sync_error_message(err)
|
|
} else if .BackedUp in result {
|
|
status = .DirUpdated in result ? "Moved & Backed Up" : "Backed Up"
|
|
} else if .Restored in result {
|
|
status = .DirUpdated in result ? "Moved & Restored" : "Restored"
|
|
} else if .DirUpdated in result {
|
|
status = "Moved"
|
|
} else {
|
|
status = "OK"
|
|
}
|
|
|
|
results[i] = SyncEntry {
|
|
path = file.path,
|
|
status = status,
|
|
}
|
|
}
|
|
|
|
if terminal.is_terminal(os.stdout) {
|
|
t: table.Table
|
|
table.init(&t, context.temp_allocator, context.temp_allocator)
|
|
table.padding(&t, 1, 1)
|
|
|
|
table.aligned_header_of_values(
|
|
&t,
|
|
.Center,
|
|
COLOR_TABLE_HEADING + "File" + ANSI_RESET,
|
|
COLOR_TABLE_HEADING + "Status" + ANSI_RESET,
|
|
)
|
|
|
|
for res in results {
|
|
table.row(&t, res.path, res.status)
|
|
}
|
|
|
|
table.write_decorated_table(cmd.out, &t, decorations, ansi_aware_width)
|
|
} else {
|
|
data, marshal_err := json.marshal(results[:], allocator = context.temp_allocator)
|
|
if marshal_err != nil {
|
|
fmt.wprintf(cmd.err, "Error marshaling JSON: %v\n", marshal_err, flush = false)
|
|
return
|
|
}
|
|
fmt.wprintln(cmd.out, string(data), flush = false)
|
|
}
|
|
}
|
|
|
|
sync_error_message :: proc(e: SyncError) -> string {
|
|
switch e {
|
|
case .None:
|
|
return ""
|
|
case .DirMissing:
|
|
return "directory missing"
|
|
case .MultipleDirs:
|
|
return "multiple directories found"
|
|
case .GitRootFailed:
|
|
return "failed to find git roots"
|
|
case .WriteFailed:
|
|
return "failed to write file"
|
|
case .ReadFailed:
|
|
return "failed to read file"
|
|
case .DbFailed:
|
|
return "failed to update database"
|
|
}
|
|
return "unknown error"
|
|
}
|
|
|