Fossil SCM

Add the "tools/co-rsync.tcl" script for syncing one checkout directory into another. Requires rsync on both local and remote.

drh 2021-02-06 09:17 trunk
Commit 1c33969bf4f87ceb0364b24d3445de719d4747adc713b48956cc6e188a5fbebd
1 file changed +72
--- a/tools/co-rsync.tcl
+++ b/tools/co-rsync.tcl
@@ -0,0 +1,72 @@
1
+#!/bin/sh
2
+#
3
+# This is a TCL script that tries to sync the changes in a local
4
+# Fossil checkout to another machine. The changes are gathered into
5
+# a tarball, then sent via ssh to the remote and unpacked.
6
+#
7
+# Usage:
8
+#
9
+# co-rsync.tcl REMOTE
10
+#
11
+# Where REMOTE is the root of the remote repository into which changes
12
+# are to be moved.
13
+#
14
+# Use Case:
15
+#
16
+# Sometimes while in the middle of an edit it is useful to transfer
17
+# the incomplete changes to another machine for testing. This could
18
+# be accomplished using scp, but doing it that was is tedious if many
19
+# files in multiple directories have changed. This command does all
20
+# the necessary transfer using a single command.
21
+#
22
+# A Tcl comment, whose contents don't matter \
23
+exec tclsh "$0" "$@"
24
+
25
+# Begin by changing directories to the root of the check-out.
26
+#
27
+set remote {}
28
+set dryrun 0
29
+proc usage {} {
30
+ puts stderr "Usage: $::argv0 REMOTE"
31
+ puts stderr "Options:"
32
+ puts stderr " --dryrun No-op but print what would have happened"
33
+ exit 1
34
+}
35
+foreach arg $argv {
36
+ if {$arg=="--dryrun" || $arg=="--dry-run"} {
37
+ set dryrun 1
38
+ continue
39
+ }
40
+ if {$remote!=""} {
41
+ usage
42
+ }
43
+ set remote $arg
44
+}
45
+if {$remote==""} usage
46
+
47
+set in [open {|fossil status} rb]
48
+set status [read $in]
49
+if {[catch {close $in} msg]} {
50
+ puts stderr $msg
51
+ exit 1
52
+}
53
+set root {}
54
+regexp {local-root: +([^\n]+)} $status all root
55
+if {$root==""} {
56
+ puts stderr "not in a fossil check-out"
57
+ exit 1
58
+}
59
+cd $root
60
+set tmpname filelist-
61
+for {set i 0} {$i<3} {incr i} {
62
+ append tmpname [format %08x [expr {int(rand()*0xffffffff)}]]
63
+}
64
+set out [open $tmpname wb]
65
+puts $out [exec fossil changes --no-classify --no-merge]
66
+close $out
67
+set cmd "rsync -v --files-from=$tmpname . $remote"
68
+puts $cmd
69
+if {!$dryrun} {
70
+ exec {*}$cmd
71
+}
72
+file delete $tmpname
--- a/tools/co-rsync.tcl
+++ b/tools/co-rsync.tcl
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/tools/co-rsync.tcl
+++ b/tools/co-rsync.tcl
@@ -0,0 +1,72 @@
1 #!/bin/sh
2 #
3 # This is a TCL script that tries to sync the changes in a local
4 # Fossil checkout to another machine. The changes are gathered into
5 # a tarball, then sent via ssh to the remote and unpacked.
6 #
7 # Usage:
8 #
9 # co-rsync.tcl REMOTE
10 #
11 # Where REMOTE is the root of the remote repository into which changes
12 # are to be moved.
13 #
14 # Use Case:
15 #
16 # Sometimes while in the middle of an edit it is useful to transfer
17 # the incomplete changes to another machine for testing. This could
18 # be accomplished using scp, but doing it that was is tedious if many
19 # files in multiple directories have changed. This command does all
20 # the necessary transfer using a single command.
21 #
22 # A Tcl comment, whose contents don't matter \
23 exec tclsh "$0" "$@"
24
25 # Begin by changing directories to the root of the check-out.
26 #
27 set remote {}
28 set dryrun 0
29 proc usage {} {
30 puts stderr "Usage: $::argv0 REMOTE"
31 puts stderr "Options:"
32 puts stderr " --dryrun No-op but print what would have happened"
33 exit 1
34 }
35 foreach arg $argv {
36 if {$arg=="--dryrun" || $arg=="--dry-run"} {
37 set dryrun 1
38 continue
39 }
40 if {$remote!=""} {
41 usage
42 }
43 set remote $arg
44 }
45 if {$remote==""} usage
46
47 set in [open {|fossil status} rb]
48 set status [read $in]
49 if {[catch {close $in} msg]} {
50 puts stderr $msg
51 exit 1
52 }
53 set root {}
54 regexp {local-root: +([^\n]+)} $status all root
55 if {$root==""} {
56 puts stderr "not in a fossil check-out"
57 exit 1
58 }
59 cd $root
60 set tmpname filelist-
61 for {set i 0} {$i<3} {incr i} {
62 append tmpname [format %08x [expr {int(rand()*0xffffffff)}]]
63 }
64 set out [open $tmpname wb]
65 puts $out [exec fossil changes --no-classify --no-merge]
66 close $out
67 set cmd "rsync -v --files-from=$tmpname . $remote"
68 puts $cmd
69 if {!$dryrun} {
70 exec {*}$cmd
71 }
72 file delete $tmpname

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button