feat(writer): 🎉 Enhance script execution order and add symlink skipping
All checks were successful
All checks were successful
* Update script execution to sort by Priority, Sequence, and Name. * Add functionality to skip symbolic links during directory scanning. * Improve documentation to reflect changes in execution order and features. * Add tests for symlink skipping and ensure correct script sorting.
This commit is contained in:
@@ -39,8 +39,8 @@ Example filenames (hyphen format):
|
||||
1-002-create-posts.sql # Priority 1, Sequence 2
|
||||
10-10-create-newid.pgsql # Priority 10, Sequence 10
|
||||
|
||||
Both formats can be mixed in the same directory.
|
||||
Scripts are executed in order: Priority (ascending), then Sequence (ascending).`,
|
||||
Both formats can be mixed in the same directory and subdirectories.
|
||||
Scripts are executed in order: Priority (ascending), Sequence (ascending), Name (alphabetical).`,
|
||||
}
|
||||
|
||||
var scriptsListCmd = &cobra.Command{
|
||||
@@ -48,8 +48,8 @@ var scriptsListCmd = &cobra.Command{
|
||||
Short: "List SQL scripts from a directory",
|
||||
Long: `List SQL scripts from a directory and show their execution order.
|
||||
|
||||
The scripts are read from the specified directory and displayed in the order
|
||||
they would be executed (Priority ascending, then Sequence ascending).
|
||||
The scripts are read recursively from the specified directory and displayed in the order
|
||||
they would be executed: Priority (ascending), then Sequence (ascending), then Name (alphabetical).
|
||||
|
||||
Example:
|
||||
relspec scripts list --dir ./migrations`,
|
||||
@@ -61,10 +61,10 @@ var scriptsExecuteCmd = &cobra.Command{
|
||||
Short: "Execute SQL scripts against a database",
|
||||
Long: `Execute SQL scripts from a directory against a PostgreSQL database.
|
||||
|
||||
Scripts are executed in order: Priority (ascending), then Sequence (ascending).
|
||||
Scripts are executed in order: Priority (ascending), Sequence (ascending), Name (alphabetical).
|
||||
Execution stops immediately on the first error.
|
||||
|
||||
The directory is scanned recursively for files matching the patterns:
|
||||
The directory is scanned recursively for all subdirectories and files matching the patterns:
|
||||
{priority}_{sequence}_{name}.sql or .pgsql (underscore format)
|
||||
{priority}-{sequence}-{name}.sql or .pgsql (hyphen format)
|
||||
|
||||
@@ -75,7 +75,7 @@ PostgreSQL Connection String Examples:
|
||||
postgresql://user:pass@host/dbname?sslmode=require
|
||||
|
||||
Examples:
|
||||
# Execute migration scripts
|
||||
# Execute migration scripts from a directory (including subdirectories)
|
||||
relspec scripts execute --dir ./migrations \
|
||||
--conn "postgres://user:pass@localhost:5432/mydb"
|
||||
|
||||
@@ -149,7 +149,7 @@ func runScriptsList(cmd *cobra.Command, args []string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Sort scripts by Priority then Sequence
|
||||
// Sort scripts by Priority, Sequence, then Name
|
||||
sortedScripts := make([]*struct {
|
||||
name string
|
||||
priority int
|
||||
@@ -186,7 +186,10 @@ func runScriptsList(cmd *cobra.Command, args []string) error {
|
||||
if sortedScripts[i].priority != sortedScripts[j].priority {
|
||||
return sortedScripts[i].priority < sortedScripts[j].priority
|
||||
}
|
||||
return sortedScripts[i].sequence < sortedScripts[j].sequence
|
||||
if sortedScripts[i].sequence != sortedScripts[j].sequence {
|
||||
return sortedScripts[i].sequence < sortedScripts[j].sequence
|
||||
}
|
||||
return sortedScripts[i].name < sortedScripts[j].name
|
||||
})
|
||||
|
||||
fmt.Fprintf(os.Stderr, "Found %d script(s) in execution order:\n\n", len(sortedScripts))
|
||||
@@ -242,7 +245,7 @@ func runScriptsExecute(cmd *cobra.Command, args []string) error {
|
||||
fmt.Fprintf(os.Stderr, " ✓ Found %d script(s)\n\n", len(schema.Scripts))
|
||||
|
||||
// Step 2: Execute scripts
|
||||
fmt.Fprintf(os.Stderr, "[2/2] Executing scripts in order (Priority → Sequence)...\n\n")
|
||||
fmt.Fprintf(os.Stderr, "[2/2] Executing scripts in order (Priority → Sequence → Name)...\n\n")
|
||||
|
||||
writer := sqlexec.NewWriter(&writers.WriterOptions{
|
||||
Metadata: map[string]any{
|
||||
|
||||
Reference in New Issue
Block a user