dtas 0.0.0 → 0.1.I
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Documentation/dtas-console.txt +15 -0
- data/Documentation/dtas-player_protocol.txt +5 -3
- data/Documentation/dtas-sourceedit.txt +14 -7
- data/GIT-VERSION-GEN +3 -3
- data/INSTALL +3 -3
- data/README +6 -5
- data/Rakefile +16 -7
- data/bin/dtas-console +48 -3
- data/bin/dtas-cueedit +1 -1
- data/bin/dtas-sinkedit +12 -28
- data/bin/dtas-sourceedit +15 -30
- data/lib/dtas.rb +1 -1
- data/lib/dtas/command.rb +0 -5
- data/lib/dtas/compat_onenine.rb +2 -2
- data/lib/dtas/disclaimer.rb +4 -3
- data/lib/dtas/edit_client.rb +48 -0
- data/lib/dtas/format.rb +2 -9
- data/lib/dtas/player.rb +64 -28
- data/lib/dtas/player/client_handler.rb +39 -20
- data/lib/dtas/process.rb +16 -15
- data/lib/dtas/replaygain.rb +19 -3
- data/lib/dtas/sink.rb +1 -2
- data/lib/dtas/source.rb +1 -141
- data/lib/dtas/source/av.rb +29 -0
- data/lib/dtas/source/av_ff_common.rb +127 -0
- data/lib/dtas/source/{command.rb → cmd.rb} +1 -1
- data/lib/dtas/source/ff.rb +30 -0
- data/lib/dtas/source/file.rb +94 -0
- data/lib/dtas/source/{mp3.rb → mp3gain.rb} +1 -1
- data/lib/dtas/source/sox.rb +114 -0
- data/lib/dtas/unix_client.rb +1 -9
- data/test/player_integration.rb +5 -17
- data/test/test_format.rb +10 -14
- data/test/test_format_change.rb +4 -8
- data/test/test_player_integration.rb +50 -62
- data/test/test_process.rb +33 -0
- data/test/test_rg_integration.rb +45 -35
- data/test/test_sink_pipe_size.rb +20 -0
- data/test/test_sink_tee_integration.rb +2 -4
- data/test/{test_source.rb → test_source_av.rb} +16 -16
- data/test/test_source_sox.rb +115 -0
- metadata +23 -12
- data/.rsync_doc +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1f118957182ff09d25d1da7f0ae4fda9c867e21
|
4
|
+
data.tar.gz: a42b9ef9d642cd13bb32a24cf2571a315acb8842
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2becf89b867d7183a554c00eed34cf1a8a5f468b051173e072894072b3711fb4c5df40cb2d551c7bf07501fe55e82ac2a3922f93a286ab889fb7cdb853c78974
|
7
|
+
data.tar.gz: 6898c1eb14d91ea620f306abec3620c42258ec3d964d40fdd382ec74590cc81b955012047dd8748d88989b9e62a25de3d35f71c175a0ae7985f9aeb084c084ee
|
data/.gitignore
CHANGED
@@ -29,6 +29,9 @@ Key bindings are inspired partially by mplayer(1)
|
|
29
29
|
- SPACE - toggle play/pause state of the playback
|
30
30
|
- 'p'/'P' - decrease/increase timer resolution
|
31
31
|
- BACKSPACE - seek to the beginning of the track
|
32
|
+
- 9/0 - decrease/increase ReplayGain preamp
|
33
|
+
- 'f'/'F' - decrease/increase ReplayGain fallback_gain value
|
34
|
+
- 'r'/'R' - cycle forward/backwards through ReplayGain modes
|
32
35
|
- Ctrl-C - exit dtas-console
|
33
36
|
|
34
37
|
# ENVIRONMENT
|
@@ -36,6 +39,18 @@ Key bindings are inspired partially by mplayer(1)
|
|
36
39
|
DTAS_PLAYER_SOCK - the path to the dtas-player control socket.
|
37
40
|
This defaults to ~/.dtas/player.sock
|
38
41
|
|
42
|
+
# CAVEATS
|
43
|
+
|
44
|
+
Increasing timer resolution increases the number of CPU wakeups and
|
45
|
+
power consumption. This defeats the efforts of dtas-player
|
46
|
+
configurations which use large buffers (especially in the sink) to
|
47
|
+
reduce wakeups and power consumption.
|
48
|
+
|
49
|
+
In rare cases (or poorly-configured systems), increased wakeups from
|
50
|
+
dtas-console will also increase contention with the sound card,
|
51
|
+
negatively affecting audio quality even if CPU utilization is not
|
52
|
+
a problem.
|
53
|
+
|
39
54
|
# SEE ALSO
|
40
55
|
|
41
56
|
dtas-player(1), dtas-player_protocol(7), dtas-ctl(1), dtas-sinkedit(1),
|
@@ -8,7 +8,7 @@ dtas-player_protocol - protocol for controling dtas-player
|
|
8
8
|
# DESCRIPTION
|
9
9
|
|
10
10
|
This gives a specification of the dtas-player protocol over a local Unix
|
11
|
-
SOCK_SEQPACKET
|
11
|
+
SOCK_SEQPACKET socket. The dtas-player protocol should NOT be
|
12
12
|
considered stable at this point and compatibility will break.
|
13
13
|
|
14
14
|
Inspiration is taken from MPRIS and MPRIS 2.0 specifications (e.g.
|
@@ -33,6 +33,7 @@ dtas-sinkedit(1), and dtas-enq(1) also implement this protocol.
|
|
33
33
|
- ENVVALUE - must be a suitable environment variable (setenv(3))
|
34
34
|
- COMMAND, this may be quoted string passed to sh -c "",
|
35
35
|
variable/argument expansion will be performed by the shell
|
36
|
+
- SOURCENAME - "sox" or "av", more backends may be supported in the future
|
36
37
|
- FILENAME - an expanded pathname relative to / is recommended since
|
37
38
|
dtas-player and the client may run in different directories
|
38
39
|
|
@@ -167,14 +168,15 @@ For little-endian machines, $ECAFMT defaults to: -fs32_le,2,44100
|
|
167
168
|
+ nonblock=BOOLEAN - drop audio data to avoid holding back other sinks
|
168
169
|
+ pipe_size=UNSIGNED - set the size of the pipe for the sink (Linux-only)
|
169
170
|
|
170
|
-
* source cat - dump the current source command and env in YAML
|
171
|
+
* source SOURCENAME cat - dump the current source command and env in YAML
|
171
172
|
|
172
|
-
* source ed SOURCEARGS - edit the source
|
173
|
+
* source ed SOURCENAME SOURCEARGS - edit the source parameters.
|
173
174
|
This changes here will immediately restart the source process.
|
174
175
|
See the code for dtas-sourceedit(1) for an example of using this.
|
175
176
|
+ command=COMMAND - change the command-line used to decode audio
|
176
177
|
+ env.ENVNAME=ENVVALUE - set ENVNAME to ENVVALUE for the source process
|
177
178
|
+ env#ENVNAME - unset ENVNAME in the source process (only)
|
179
|
+
+ tryorder=INTEGER - lower values are tried first
|
178
180
|
|
179
181
|
* watch - adds the client to the passive watch list for notifications.
|
180
182
|
It is recommended clients issue no further commands and open
|
@@ -3,23 +3,30 @@
|
|
3
3
|
|
4
4
|
# NAME
|
5
5
|
|
6
|
-
dtas-sourceedit - edit
|
6
|
+
dtas-sourceedit - edit parameters of a source decoder
|
7
7
|
|
8
8
|
# SYNOPSYS
|
9
9
|
|
10
|
-
dtas-sourceedit
|
10
|
+
dtas-sourceedit {sox | av | ff}
|
11
11
|
|
12
12
|
# DESCRIPTION
|
13
13
|
|
14
|
-
dtas-sourceedit spawns an editor to allow editing of a
|
15
|
-
See dtas-player_protocol(7) for details on
|
14
|
+
dtas-sourceedit spawns an editor to allow editing of a source as a YAML file.
|
15
|
+
See dtas-player_protocol(7) for details on SOURCEARGS.
|
16
16
|
|
17
17
|
# EXAMPLES
|
18
18
|
|
19
|
-
Invoking dtas-sourceedit will spawn your favorite text editor on
|
20
|
-
given SINKNAME:
|
19
|
+
Invoking dtas-sourceedit will spawn your favorite text editor on "sox":
|
21
20
|
|
22
|
-
$ dtas-sourceedit
|
21
|
+
$ dtas-sourceedit sox
|
22
|
+
|
23
|
+
To change the way dtas-player calls avconv (part of libav):
|
24
|
+
|
25
|
+
$ dtas-sourceedit av
|
26
|
+
|
27
|
+
To change the way dtas-player calls ffmpeg (lightly-tested):
|
28
|
+
|
29
|
+
$ dtas-sourceedit ff
|
23
30
|
|
24
31
|
# ENVIRONMENT
|
25
32
|
|
data/GIT-VERSION-GEN
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
4
4
|
CONSTANT = "DTAS::VERSION"
|
5
5
|
RVF = "lib/dtas/version.rb"
|
6
|
-
DEF_VER = "v0.
|
6
|
+
DEF_VER = "v0.1.I"
|
7
7
|
vn = DEF_VER
|
8
8
|
|
9
9
|
# First see if there is a version file (included in release tarballs),
|
@@ -22,9 +22,9 @@ if File.exist?(".git")
|
|
22
22
|
end
|
23
23
|
|
24
24
|
vn = vn.sub!(/\Av/, "")
|
25
|
-
new_ruby_version = "#{CONSTANT} = '#{vn}'
|
25
|
+
new_ruby_version = "#{CONSTANT} = '#{vn}' # :nodoc:\n"
|
26
26
|
cur_ruby_version = File.read(RVF) rescue nil
|
27
27
|
if new_ruby_version != cur_ruby_version
|
28
|
-
File.open(RVF, "w") { |fp| fp.write(
|
28
|
+
File.open(RVF, "w") { |fp| fp.write(new_ruby_version) }
|
29
29
|
end
|
30
30
|
puts vn if $0 == __FILE__
|
data/INSTALL
CHANGED
@@ -40,10 +40,10 @@ Debian users can install sox, mp3gain, and flac dependencies easily:
|
|
40
40
|
|
41
41
|
Grab the latest tarball from our HTTP site:
|
42
42
|
|
43
|
-
http://dtas.80x24.org/2013/dtas-0.
|
43
|
+
http://dtas.80x24.org/2013/dtas-0.1.I.tar.gz
|
44
44
|
|
45
|
-
$ tar zxvf dtas-0.
|
46
|
-
$ cd dtas-0.
|
45
|
+
$ tar zxvf dtas-0.1.I.tar.gz
|
46
|
+
$ cd dtas-0.1.I
|
47
47
|
$ ruby setup.rb
|
48
48
|
|
49
49
|
GNU/Linux users may optionally install "io_splice" and
|
data/README
CHANGED
@@ -40,17 +40,18 @@ Users of dtas-player will also be interested in the following scripts:
|
|
40
40
|
* dtas-xdelay - alternative sink for dtas-player
|
41
41
|
|
42
42
|
All scripts have some documentation in the Documentation/ directory or
|
43
|
-
manpages distributed with the gem.
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
manpages distributed with the gem. Documentation is also available on
|
44
|
+
http://dtas.80x24.org/$COMMAND.txt in plain-text form.
|
45
|
+
|
46
|
+
dtas exposes no public APIs outside of command-line and YAML text. dtas is
|
47
|
+
aimed at users familiar with the *nix command-line and editing text files.
|
48
|
+
Familiarity with the Ruby programming language is absolutely NOT required.
|
47
49
|
|
48
50
|
Coming:
|
49
51
|
|
50
52
|
* MPRIS/MPRIS 2.0 bridge for partial dtas-player control
|
51
53
|
* tracklist support in dtas-player (maybe?)
|
52
54
|
* whatever command-line tools come to mind...
|
53
|
-
* native ffmpeg/avconv/gst support in dtas-player
|
54
55
|
* better error handling, many bugfixes, etc...
|
55
56
|
* better documentation
|
56
57
|
|
data/Rakefile
CHANGED
@@ -59,9 +59,20 @@ h = Hoe.spec('dtas') do |p|
|
|
59
59
|
end
|
60
60
|
|
61
61
|
task :rsync_docs do
|
62
|
-
dest = "80x24.org:/srv/dtas/"
|
63
|
-
|
64
|
-
|
62
|
+
dest = ENV["RSYNC_DEST"] || "80x24.org:/srv/dtas/"
|
63
|
+
top = %w(INSTALL NEWS README COPYING)
|
64
|
+
files = []
|
65
|
+
Dir['Documentation/*.txt'].to_a.concat(top).each do |txt|
|
66
|
+
gz = "#{txt}.gz"
|
67
|
+
tmp = "#{gz}.#$$"
|
68
|
+
sh("gzip -9 < #{txt} > #{tmp}")
|
69
|
+
st = File.stat(txt)
|
70
|
+
File.utime(st.atime, st.mtime, tmp) # make nginx gzip_static happy
|
71
|
+
File.rename(tmp, gz)
|
72
|
+
files << txt
|
73
|
+
files << gz
|
74
|
+
end
|
75
|
+
sh("rsync --chmod=Fugo=r -av #{files.join(' ')} #{dest}")
|
65
76
|
end
|
66
77
|
|
67
78
|
task :coverage do
|
@@ -81,8 +92,7 @@ task tarball: "pkg/#{base}" do
|
|
81
92
|
Dir.chdir("pkg") do
|
82
93
|
tgz = "#{base}.tar.gz"
|
83
94
|
tmp = "#{tmp}.#$$"
|
84
|
-
|
85
|
-
system(cmd) or abort "#{cmd}: #$?"
|
95
|
+
sh "tar cf - #{base} | gzip -9 > #{tmp}"
|
86
96
|
File.rename(tmp, tgz)
|
87
97
|
end
|
88
98
|
end
|
@@ -90,8 +100,7 @@ end
|
|
90
100
|
task dist: [ :tarball, :package ] do
|
91
101
|
Dir.chdir("pkg") do
|
92
102
|
%w(dtas-linux dtas-mpris).each do |gem|
|
93
|
-
|
94
|
-
system(cmd) or abort "#{cmd}: #$?"
|
103
|
+
sh "gem build ../#{gem}.gemspec"
|
95
104
|
end
|
96
105
|
end
|
97
106
|
end
|
data/bin/dtas-console
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
#
|
6
6
|
# Note: no idea what I'm doing, especially w.r.t. curses
|
7
7
|
require 'dtas/unix_client'
|
8
|
+
require 'dtas/rg_state'
|
8
9
|
require 'curses'
|
9
10
|
require 'yaml'
|
10
11
|
|
@@ -14,6 +15,14 @@ c = DTAS::UNIXClient.new
|
|
14
15
|
cur = YAML.load(c.req('current'))
|
15
16
|
readable = [ w, $stdin ]
|
16
17
|
|
18
|
+
# current rg mode
|
19
|
+
rg_mode = DTAS::RGState::RG_MODE.keys.unshift("off")
|
20
|
+
if (rg = cur["rg"]) && (rg = rg["mode"])
|
21
|
+
rg_mode_i = rg_mode.index(cur["rg"]["mode"])
|
22
|
+
else
|
23
|
+
rg_mode_i = 0
|
24
|
+
end
|
25
|
+
|
17
26
|
def update_tfmt(prec)
|
18
27
|
prec == 0 ? '%H:%M:%S' : "%H:%M:%S.%#{prec}N"
|
19
28
|
end
|
@@ -69,6 +78,24 @@ def show_events(lineno, screen, events)
|
|
69
78
|
end
|
70
79
|
end
|
71
80
|
|
81
|
+
def fmt_to_s(f)
|
82
|
+
r = [ f['rate'], f['channels'], f['type'], f['bits'] ]
|
83
|
+
r.compact!
|
84
|
+
r.join(',')
|
85
|
+
end
|
86
|
+
|
87
|
+
def rg_string(rg, current)
|
88
|
+
rv = "rg mode=#{rg['mode']||'off'}"
|
89
|
+
defaults = DTAS::RGState::RG_DEFAULT
|
90
|
+
# don't show things that are too rare
|
91
|
+
%w(preamp fallback_gain).each do |param|
|
92
|
+
val = rg[param] || defaults[param]
|
93
|
+
rv << " #{param}=#{val}"
|
94
|
+
end
|
95
|
+
env = current && current["env"] and rv << " / RGFX='#{env['RGFX']}'"
|
96
|
+
rv
|
97
|
+
end
|
98
|
+
|
72
99
|
begin
|
73
100
|
Curses.init_screen
|
74
101
|
Curses.nonl
|
@@ -79,6 +106,7 @@ begin
|
|
79
106
|
screen.keypad(true)
|
80
107
|
loop do
|
81
108
|
lineno = -1
|
109
|
+
pfmt = cur['format']
|
82
110
|
if current = cur['current']
|
83
111
|
Curses.setpos(lineno += 1, 0)
|
84
112
|
Curses.clrtoeol
|
@@ -89,13 +117,16 @@ begin
|
|
89
117
|
rate = current_format['rate'].to_f
|
90
118
|
elapsed += nr / rate
|
91
119
|
total = " [#{Time.at(current['samples'] / rate).strftime(tfmt)}]"
|
120
|
+
fmt = "(#{fmt_to_s(current_format)} > #{fmt_to_s(pfmt)})"
|
92
121
|
else
|
93
122
|
total = ""
|
123
|
+
fmt = fmt_to_s(pfmt)
|
124
|
+
fmt = "(#{fmt} > #{fmt})"
|
94
125
|
end
|
95
126
|
|
96
127
|
Curses.setpos(lineno += 1, 0)
|
97
128
|
Curses.clrtoeol
|
98
|
-
Curses.addstr("#{Time.at(elapsed).strftime(tfmt)}#{total}")
|
129
|
+
Curses.addstr("#{Time.at(elapsed).strftime(tfmt)}#{total} #{fmt}")
|
99
130
|
else
|
100
131
|
Curses.setpos(lineno += 1, 0)
|
101
132
|
Curses.clrtoeol
|
@@ -104,6 +135,11 @@ begin
|
|
104
135
|
Curses.clrtoeol
|
105
136
|
end
|
106
137
|
|
138
|
+
rgs = rg_string(cur["rg"] || {}, current)
|
139
|
+
Curses.setpos(lineno += 1, 0)
|
140
|
+
Curses.clrtoeol
|
141
|
+
Curses.addstr(rgs)
|
142
|
+
|
107
143
|
show_events(lineno, screen, events)
|
108
144
|
|
109
145
|
Curses.refresh # draw and wait
|
@@ -119,8 +155,8 @@ begin
|
|
119
155
|
when $stdin
|
120
156
|
# keybindings taken from mplayer / vi
|
121
157
|
case key = Curses.getch
|
122
|
-
when "j" then c.req_ok("seek
|
123
|
-
when "k" then c.req_ok("seek
|
158
|
+
when "j" then c.req_ok("seek -5")
|
159
|
+
when "k" then c.req_ok("seek +5")
|
124
160
|
when Curses::KEY_DOWN then c.req_ok("seek -60")
|
125
161
|
when Curses::KEY_UP then c.req_ok("seek +60")
|
126
162
|
when Curses::KEY_LEFT then c.req_ok("seek -10")
|
@@ -129,8 +165,17 @@ begin
|
|
129
165
|
# yes, some of us have long audio files
|
130
166
|
when Curses::KEY_PPAGE then c.req_ok("seek +600")
|
131
167
|
when Curses::KEY_NPAGE then c.req_ok("seek -600")
|
168
|
+
when "9" then c.req_ok("rg preamp-=1")
|
169
|
+
when "0" then c.req_ok("rg preamp+=1")
|
170
|
+
when "F" then c.req_ok("rg fallback_gain+=1")
|
171
|
+
when "f" then c.req_ok("rg fallback_gain-=1")
|
132
172
|
when " "
|
133
173
|
c.req("play_pause")
|
174
|
+
when "r" # cycle through replaygain modes
|
175
|
+
rg_mode_i >= 1 and c.req_ok("rg mode=#{rg_mode[rg_mode_i -= 1]}")
|
176
|
+
when "R"
|
177
|
+
rg_mode_i < (rg_mode.size - 1) and
|
178
|
+
c.req_ok("rg mode=#{rg_mode[rg_mode_i += 1]}")
|
134
179
|
when "p" # lower precision of time display
|
135
180
|
if prec_nr >= 1
|
136
181
|
prec_nr -= 1
|
data/bin/dtas-cueedit
CHANGED
data/bin/dtas-sinkedit
CHANGED
@@ -2,20 +2,16 @@
|
|
2
2
|
# -*- encoding: binary -*-
|
3
3
|
# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
|
4
4
|
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
5
|
-
require 'dtas/
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
usage = "#$0 SINKNAME"
|
5
|
+
require 'dtas/edit_client'
|
6
|
+
include DTAS::EditClient
|
7
|
+
c = client_socket
|
8
|
+
sinks = c.req('sink ls') || "(unknown)"
|
9
|
+
usage = "Usage: #{DTAS_PROGNAME} SINKNAME\n" \
|
10
|
+
"available SINKNAME values: #{sinks}"
|
12
11
|
ARGV.size == 1 or abort usage
|
13
12
|
name = ARGV[0]
|
14
13
|
|
15
|
-
tmp =
|
16
|
-
tmp.sync = true
|
17
|
-
tmp.binmode
|
18
|
-
|
14
|
+
tmp = tmpyaml
|
19
15
|
buf = c.req(%W(sink cat #{name}))
|
20
16
|
abort(buf) if buf =~ /\AERR/
|
21
17
|
orig = YAML.load(buf)
|
@@ -27,32 +23,20 @@ tmp.rewind
|
|
27
23
|
sink = YAML.load(tmp.read)
|
28
24
|
|
29
25
|
cmd = %W(sink ed #{name})
|
30
|
-
|
31
|
-
env.each do |k,v|
|
32
|
-
cmd << (v.nil? ? "env##{k}" : "env.#{k}=#{v}")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# remove deleted env
|
37
|
-
if orig_env = orig["env"]
|
38
|
-
env ||= {}
|
39
|
-
deleted_keys = orig_env.keys - env.keys
|
40
|
-
deleted_keys.each { |k| cmd << "env##{k}" }
|
41
|
-
end
|
26
|
+
update_cmd_env(cmd, orig, sink)
|
42
27
|
|
28
|
+
# both of these default to false
|
43
29
|
%w(nonblock active).each do |field|
|
44
|
-
|
45
|
-
cmd << "#{field}=#{sink[field] ? 'true' : 'false'}"
|
46
|
-
end
|
30
|
+
cmd << "#{field}=#{sink[field] ? 'true' : 'false'}"
|
47
31
|
end
|
48
32
|
|
49
33
|
%w(prio pipe_size).each do |field|
|
50
34
|
value = sink[field] and cmd << "#{field}=#{value}"
|
51
35
|
end
|
52
36
|
|
37
|
+
# nil OK
|
53
38
|
%w(command).each do |field|
|
54
|
-
|
55
|
-
cmd << "#{field}=#{value}"
|
39
|
+
cmd << "#{field}=#{sink[field]}"
|
56
40
|
end
|
57
41
|
|
58
42
|
c.req_ok(cmd)
|
data/bin/dtas-sourceedit
CHANGED
@@ -2,21 +2,17 @@
|
|
2
2
|
# -*- encoding: binary -*-
|
3
3
|
# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
|
4
4
|
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
name = ARGV[0]
|
5
|
+
require 'dtas/edit_client'
|
6
|
+
include DTAS::EditClient
|
7
|
+
c = client_socket
|
8
|
+
sources = c.req('source ls') || "(unknown)"
|
9
|
+
usage = "Usage: #{DTAS_PROGNAME} SOURCENAME\n" \
|
10
|
+
"available SOURCENAME values: #{sources}"
|
11
|
+
ARGV.size <= 1 or abort usage
|
12
|
+
name = ARGV[0] || "sox"
|
14
13
|
|
15
|
-
tmp =
|
16
|
-
|
17
|
-
tmp.binmode
|
18
|
-
|
19
|
-
buf = c.req(%W(source cat))
|
14
|
+
tmp = tmpyaml
|
15
|
+
buf = c.req(%W(source cat #{name}))
|
20
16
|
abort(buf) if buf =~ /\AERR/
|
21
17
|
orig = YAML.load(buf)
|
22
18
|
|
@@ -26,23 +22,12 @@ system(cmd) or abort "#{cmd} failed: #$?"
|
|
26
22
|
tmp.rewind
|
27
23
|
source = YAML.load(tmp.read)
|
28
24
|
|
29
|
-
cmd = %W(source ed)
|
30
|
-
|
31
|
-
env.each do |k,v|
|
32
|
-
cmd << (v.nil? ? "env##{k}" : "env.#{k}=#{v}")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# remove deleted env
|
37
|
-
if orig_env = orig["env"]
|
38
|
-
env ||= {}
|
39
|
-
deleted_keys = orig_env.keys - env.keys
|
40
|
-
deleted_keys.each { |k| cmd << "env##{k}" }
|
41
|
-
end
|
25
|
+
cmd = %W(source ed #{name})
|
26
|
+
update_cmd_env(cmd, orig, source)
|
42
27
|
|
43
|
-
|
44
|
-
|
45
|
-
cmd << "#{field}=#{
|
28
|
+
# nil OK
|
29
|
+
%w(tryorder command).each do |field|
|
30
|
+
cmd << "#{field}=#{source[field]}"
|
46
31
|
end
|
47
32
|
|
48
33
|
c.req_ok(cmd)
|