README | 4 +++- dsc | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++-- t/add-get-del.t | 4 ++-- t/export.t | 35 +++++++++++++++++++++++++++++++++++ t/reorder.t | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ t/revert.t | 9 +++++++++ diff --git a/README b/README index a68bed62ad2dd5b77b6f37ed61d3f96f15d7948355d3a5de90dc179a9028cb65..874b408c882494596852676bd043f2ed6c07a1b1bc5a826b63b97a9790261b7f 100644 --- a/README +++ b/README @@ -47,7 +47,9 @@ invoked to the list-options directory, then all of them are executed. If apply is invoked for the directory, then all option's in it are applied. -Option having "*" name is treated like a dynamic list. +Option having "*" name is treated like a dynamic list. All list's +entries (subdirectories contain .order file with decimal integer +specifying its order). By default all options you set are saved in the stash. "commit" command will move it to the saved directory. "diff" allows you to see the diff --git a/dsc b/dsc index bf47344874fe4155c383d7b3546ee60fa18c90627bf0f8889f42b3685a93f38a..da6b9d0e9ca189c1190ef6538f1353248bdfef2b9cf7cd56a0eabde4268fe77d 100755 --- a/dsc +++ b/dsc @@ -20,6 +20,7 @@ puts -nonewline stderr {Usage: dsc list [-v] [prefix] -- list all available options dsc add opt -- add /*/ section dsc del opt -- delete /*/ section + dsc reorder opt p -- change order of option to "p" in /*/ section dsc del "" -- delete the whole configuration, useful for import dsc has opt -- check if specified /*/ option exists dsc set opt value -- set option's value @@ -48,7 +49,7 @@ $DSC_CSUM_ON_COMMIT=1 -- create $DSC_SAVED.csum file during commit There are two kinds of options: * array/list ones, which are identified with /*/ in "list"'s - output. "add", "del", "get opt/*" commands apply + output. "add", "del", "get opt/*", "reorder" commands apply * ordinary scalar ones, which can be "set", "get opt" } exit 1 @@ -80,6 +81,35 @@ set ents [lmap d $ents {if {[file type $root/$d] == $typ} {set d} {continue}}] return [lsort $ents] } +proc sortByOrder {a b} { + set a [lindex $a 0] + set b [lindex $b 0] + if {$a < $b} {return -1} + if {$a > $b} {return 1} + return 0 +} + +proc list-opt-ordered {opt} { + set l [list] + foreach e [readents $::Stash/$opt directory] { + set order 0 + if {![catch {set fh [open $::Stash/$opt/$e/.order]}]} { + set order $(+[read $fh]) + close $fh + } + lappend l [list $order $e] + } + return [lmap i [lsort -command sortByOrder $l] {lindex $i 1}] +} + +proc list-opt-reorder {opt l} { + for {set i 0} {$i < [llength $l]} {incr i} { + set fh [open $::Stash/$opt/[lindex $l $i]/.order w] + puts $fh $i + close $fh + } +} + proc walk {root typ} { set rv [list] set root [string trimright $root /] @@ -208,9 +238,25 @@ assure-all-list-params-exist $opt 1 set dir [file dirname $opt] set tail [run-checker $opt [file tail $opt]] set tail [string trimright $tail "\n"] + set l [list-opt-ordered $dir] file mkdir $Stash/$dir/$tail + lappend l $tail + list-opt-reorder $dir $l puts $dir/$tail } + reorder { + set p 0 + if {[llength $argv] > 2} { + set p $(+[lindex $argv 2]) + } + set dir [file dirname $opt] + set l [list-opt-ordered $dir] + set opt [file tail $opt] + set i [lsearch $l $opt] + set l [lreplace $l $i $i] + set l [linsert $l $p $opt] + list-opt-reorder $dir $l + } del { if {$opt != ""} { assure-exists $opt @@ -249,7 +295,7 @@ set opt [file dirname $opt] if {![file exists $Stash/$opt]} { exit } - foreach dir [readents $Stash/$opt directory] { + foreach dir [list-opt-ordered $opt] { puts $dir } exit @@ -380,6 +426,15 @@ } puts "-- .dirs --" foreach fn $dirs { puts [string range $fn [string length $Saved]+1 end] + } + foreach fn $dirs { + if {[catch {set fh [open $fn/.order]}]} { + continue + } + set order $(+[read $fh]) + close $fh + puts "-- [string range $fn [string length $Saved]+1 end]/.order --" + puts $order } foreach dir $dirs { foreach fn [walk $dir file] { diff --git a/t/add-get-del.t b/t/add-get-del.t index 2712daae59d4044955e8d75d2ed6cfca22d5902f8ef5982d86b01cfcf7c011e5..7b0bbf99b6c724a35dea3b1f01e548d1b0a747f5ed0cef238d0efa3381cd8148 100755 --- a/t/add-get-del.t +++ b/t/add-get-del.t @@ -18,9 +18,9 @@ test_expect_success "baz add" "dsc add srv/baz" test_expect_success "baz exists" "[ -d $DSC_STASH/srv/baz ]" test_expect_success "baz has" "dsc has srv/baz" test_expect_success "get *" "dsc get srv/* >out" -echo bar >expected +echo foo >expected +echo bar >>expected echo baz >>expected -echo foo >>expected test_expect_success "get * out" "test_cmp out expected" test_expect_success "foo del" "dsc del srv/foo" test_expect_success "foo !exists" "! [ -d $DSC_STASH/srv/foo ]" diff --git a/t/export.t b/t/export.t index 922b99d28799489b1c0f31a9f4ef757d18d2021da8049822c22fe326d01fee90..2c720b5d9e32a02ba3f48ab0348aff566ec66b048853fb153d03424e702ad106 100755 --- a/t/export.t +++ b/t/export.t @@ -49,12 +49,33 @@ +net/foo/addr +net/foo/addr/2001:DB8::1:1234 +net/foo/addr/2001:DB8::2:1234 +sys +--- net/bar/.order ++++ net/bar/.order ++1 +--- net/bar/addr/2001:DB8::1:2345/.order ++++ net/bar/addr/2001:DB8::1:2345/.order ++0 --- net/bar/addr/2001:DB8::1:2345/prefixlen +++ net/bar/addr/2001:DB8::1:2345/prefixlen +80 +--- net/bar/addr/2001:DB8::2:2345/.order ++++ net/bar/addr/2001:DB8::2:2345/.order ++1 +--- net/baz/.order ++++ net/baz/.order ++2 +--- net/foo/.order ++++ net/foo/.order ++0 +--- net/foo/addr/2001:DB8::1:1234/.order ++++ net/foo/addr/2001:DB8::1:1234/.order ++0 --- net/foo/addr/2001:DB8::1:1234/prefixlen +++ net/foo/addr/2001:DB8::1:1234/prefixlen +80 +--- net/foo/addr/2001:DB8::2:1234/.order ++++ net/foo/addr/2001:DB8::2:1234/.order ++1 --- net/foo/addr/2001:DB8::2:1234/prefixlen +++ net/foo/addr/2001:DB8::2:1234/prefixlen +126 @@ -87,6 +108,20 @@ net/foo/addr net/foo/addr/2001:DB8::1:1234 net/foo/addr/2001:DB8::2:1234 sys +-- net/bar/.order -- +1 +-- net/bar/addr/2001:DB8::1:2345/.order -- +0 +-- net/bar/addr/2001:DB8::2:2345/.order -- +1 +-- net/baz/.order -- +2 +-- net/foo/.order -- +0 +-- net/foo/addr/2001:DB8::1:1234/.order -- +0 +-- net/foo/addr/2001:DB8::2:1234/.order -- +1 -- net/bar/addr/2001:DB8::1:2345/prefixlen -- 80 -- net/foo/mtu -- diff --git a/t/reorder.t b/t/reorder.t new file mode 100755 index 0000000000000000000000000000000000000000..34525061fbcbe35cdf54bd3dfc6970eb3170b621aebcc8ba1411203d66c0360b --- /dev/null +++ b/t/reorder.t @@ -0,0 +1,65 @@ +#!/bin/sh + +test_description="$(basename $0)" +. $SHARNESS_TEST_SRCDIR/sharness.sh +. $SHARNESS_TEST_DIRECTORY/setup.rc + +test_expect_success "1st" "dsc add net/1st" +test_expect_success "2nd" "dsc add net/2nd" +test_expect_success "3rd" "dsc add net/3rd" +cat >expected <out" +test_expect_success "cmp" "test_cmp out expected" +test_expect_success "commit" "dsc commit" + +test_expect_success "2 -> 1" "dsc reorder net/2nd" +cat >expected <out" +test_expect_success "cmp" "test_cmp out expected" + +test_expect_success "1 -> 3" "dsc reorder net/1st 2" +cat >expected <out" +test_expect_success "cmp" "test_cmp out expected" + +test_expect_success "3 -> 1" "dsc reorder net/3rd 0" +cat >expected <out" +test_expect_success "cmp" "test_cmp out expected" +test_expect_success "diff" "dsc diff >out" +test_expect_success "non empty" "[ -s out ]" + +test_expect_success "revert" "dsc revert net" +test_expect_success "diff" "dsc diff >out" +test_expect_success "empty" "! [ -s out ]" + +test_expect_success "2 -> 1" "dsc reorder net/2nd" +test_expect_success "commit" "dsc commit" +test_expect_success "export" "dsc export >out" +test_expect_success "del" 'dsc del ""' +test_expect_success "import" "dsc import out" +cat >expected <out" +test_expect_success "cmp" "test_cmp out expected" + +test_done diff --git a/t/revert.t b/t/revert.t index ea5de3853ba9336e58b6c823155962a265218077673c95afe6444c931f64ccea..c3bba99c3fc740815111491a26fa59575fde7a959b676241a63a9cbfa84b04c7 100755 --- a/t/revert.t +++ b/t/revert.t @@ -24,6 +24,9 @@ +++ dirs +net +net/foo sys +--- net/foo/.order ++++ net/foo/.order ++0 --- net/foo/mtu +++ net/foo/mtu +2000 @@ -43,6 +46,9 @@ +++ dirs +net +net/foo sys +--- net/foo/.order ++++ net/foo/.order ++0 --- net/foo/mtu +++ net/foo/mtu +2000 @@ -58,6 +64,9 @@ +++ dirs +net +net/foo sys +--- net/foo/.order ++++ net/foo/.order ++0 EOF test_expect_success "cmp" "test_cmp out expected"