summaryrefslogtreecommitdiff
path: root/cmd/main.go
blob: 887b5067eb1f16aacad650a2e5aba3709bc79c28 (plain)
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
package main

import (
	"fmt"
	"log"
	"os"
	"time"

	"gscp/internal/config"
	"gscp/internal/local"
	"gscp/internal/remote"
	"gscp/internal/transfer"
)

func main() {
	// Parse command-line arguments
	cfg := config.ParseArgs()

	if cfg.Verbose {
		log.Printf("Starting parallel SCP with configuration:")
		log.Printf("  Destination: %s", cfg.Dest)
		log.Printf("  Remote User: %s", cfg.RemoteUser)
		log.Printf("  Remote Host: %s", cfg.RemoteHost)
		log.Printf("  Remote Path: %s", cfg.RemotePath)
		log.Printf("  Parallelism: %d", cfg.Parallelism)
		log.Printf("  Lock Dir: %s", cfg.LockDir)
		log.Printf("  Cipher: %s", cfg.CipherOption)
	}

	// Create lock directory if it doesn't exist
	err := os.MkdirAll(cfg.LockDir, 0755)
	if err != nil {
		log.Fatalf("Failed to create lock directory: %v", err)
	}

	// Get remote file list
	remoteFiles, err := remote.GetFiles(cfg)
	if err != nil {
		log.Fatalf("Failed to get remote files: %v", err)
	}
	if cfg.Verbose {
		log.Printf("Found %d remote files", len(remoteFiles))
	}

	// Get local file list
	localFiles, err := local.GetFiles(cfg.Dest)
	if err != nil {
		log.Fatalf("Failed to get local files: %v", err)
	}
	if cfg.Verbose {
		log.Printf("Found %d local files", len(localFiles))
	}

	// Compute diff (files that exist on remote but not on local)
	diffFiles := transfer.GetDiffFiles(remoteFiles, localFiles)
	if cfg.Verbose {
		log.Printf("Found %d files to copy", len(diffFiles))
	}

	// If only listing files, print them and exit
	if cfg.OnlyListFiles {
		for _, file := range diffFiles {
			fmt.Println(file)
		}
		return
	}

	// Copy files in parallel
	start := time.Now()
	copiedFiles := transfer.CopyFilesInParallel(diffFiles, cfg)
	elapsed := time.Since(start)
	log.Printf("Done! Copied %d/%d files in %s", copiedFiles, len(diffFiles), elapsed)
}