reposh 0.1.2 → 0.1.6

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.
data/README CHANGED
@@ -1,33 +1,49 @@
1
-
2
- = reposh
3
-
4
- Simple VCS Manager Shell
5
-
6
- == Description
7
-
8
- http://mono.kmc.gr.jp/~yhara/w/?Reposh
9
- http://rubyforge.org/projects/reposh/
10
-
11
- == Installation
12
-
13
- === Archive Installation
14
-
15
- rake install
16
-
17
- === Gem Installation
18
-
19
- gem install reposh
20
-
21
-
22
- == Features/Problems
23
-
24
- * vim-like keybind
25
-
26
- == Synopsis
27
-
28
-
29
- == Copyright
30
-
31
- Author:: yhara <yhara at kmc.gr.jp>
32
- Copyright:: Copyright (c) 2008 yhara
33
- License:: Ruby's Licence
1
+ == Reposh - what's this?
2
+
3
+ Without reposh, you type like this:
4
+ $ svk di
5
+ $ svk ci
6
+ $ svk st
7
+ $ ls
8
+ but this is not DRY :)
9
+
10
+ With reposh, you can omit typing all 'svk's:
11
+ $ reposh
12
+ Welcome to reposh x.y.z (mode: svk)
13
+ > di
14
+ > ci
15
+ > # just push [Enter] for 'svk status'
16
+ > :ls # start with ':' to run shell commands
17
+
18
+ == How to use
19
+
20
+ (1) write /home/(your name)/.reposh.yaml
21
+ (2) cd to your working directory
22
+ (3) reposh.rb [Enter]
23
+
24
+ == Options
25
+
26
+ see reposh.rb --help
27
+
28
+ == Commands
29
+
30
+ * exit, quit, ^D(^Z)
31
+ * Quit reposh
32
+ * :ls ~/
33
+ * Run "ls ~/" by shell
34
+ * [Enter]
35
+ * Equals to "status" (you can change this by .reposh.yaml)
36
+ * %reload
37
+ * Reload reposh.rb (for reposh developper)
38
+ * Some more commands starts with % are supported: see source
39
+
40
+ All other commands are passed to vcs system.
41
+
42
+ == Configuration
43
+
44
+ see sample.reposh.yaml
45
+
46
+ == Contact
47
+
48
+ http://mono.kmc.gr.jp/~yhara/w?Reposh
49
+
data/bin/reposh CHANGED
@@ -1,173 +1,6 @@
1
- #!/usr/bin/env ruby#
1
+ #!/usr/bin/env ruby
2
2
  # reposh.rb - Reposh - Simple VCS Manager Shell
3
- # usage:
4
- # read bottom of this file
5
- #
6
- require 'readline'
7
- require 'yaml'
8
- require 'optparse'
9
-
10
- class Reposh
11
- VERSION = "0.1.2"
12
- CONF_DEFAULT = { "system" => {
13
- "default" => {
14
- "binpath" => nil,
15
- "prompt" => "> ",
16
- "default_cmd" => "status",
17
- },
18
- "darcs" => {
19
- "default_cmd" => "whatsnew --summary",
20
- }
21
- }}
22
-
23
- def initialize
24
- end
25
-
26
- def run
27
- parse_option(ARGV)
28
- @conf_path ||= File.join(ENV["HOME"], ".reposh.yaml")
29
- @system_name ||= guess_system
30
-
31
- @conf = load_config(@conf_path)
32
- @binpath = get_conf("binpath") || @system_name
33
- @prompt = get_conf("prompt")
34
- @default_cmd = get_conf("default_cmd")
35
- run_loop
36
- end
37
-
38
- def parse_option(args)
39
- o = OptionParser.new{|opt|
40
- opt.on("-c confpath",
41
- "path to .reposh.yaml"){|path|
42
- @confpath = path
43
- }
44
- opt.on("-s system",
45
- "vcs command name (eg. svn, svk, hg)"){|sys|
46
- @system_name = sys
47
- }
48
- opt.on("-h", "--help",
49
- "show this message"){
50
- puts opt
51
- exit
52
- }
53
- opt.on("-v", "--version",
54
- "show version information"){
55
- puts VERSION
56
- exit
57
- }
58
- }
59
- o.parse(args)
60
- end
61
-
62
- def load_config(path)
63
- if File.exist?(path)
64
- YAML.load(File.read(path))
65
- else
66
- CONF_DEFAULT
67
- end
68
- end
69
-
70
- def guess_system
71
- case
72
- when File.directory?(".hg")
73
- "hg"
74
- when File.directory?("_darcs")
75
- "darcs"
76
- when File.directory?(".svn")
77
- "svn"
78
- else
79
- "svk"
80
- end
81
- end
82
-
83
- def get_conf(prop)
84
- value = (@conf["system"][@system_name] and @conf["system"][@system_name][prop])
85
- value ||= (CONF_DEFAULT["system"][@system_name] && CONF_DEFAULT["system"][@system_name][prop])
86
- value ||= CONF_DEFAULT["system"]["default"][prop]
87
- end
88
-
89
- def run_loop
90
- puts "Welcome to reposh #{VERSION} (mode: #{@system_name})"
91
- loop do
92
- cmd = Readline.readline(@prompt, true)
93
- cmd = @default_cmd if cmd == ""
94
-
95
- case cmd
96
- when "%reload"
97
- load __FILE__
98
- when "%env"
99
- require 'pp'
100
- pp ENV
101
- when "%version"
102
- puts VERSION
103
- when nil, "exit", "quit"
104
- puts ""
105
- exit
106
- when /^:(.*)/
107
- puts $1
108
- execute $1
109
- else
110
- execute "#{@binpath} #{cmd}"
111
- end
112
- end
113
- end
114
-
115
- def execute(cmd)
116
- result = system(cmd)
117
- if (not result) and ($?.nil? or $?.exitstatus == 127)
118
- puts "error: failed to exec '#{cmd}'"
119
- end
120
- end
121
- end
122
3
 
4
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '../lib')
5
+ require 'reposh'
123
6
  Reposh.new.run
124
-
125
- =begin
126
- == Reposh - what's this?
127
- Without reposh:
128
- $ svk st
129
- $ svk di
130
- $ svk ci
131
- $ ls
132
-
133
- With reposh:
134
- $ reposh
135
- > st
136
- > di
137
- > ci
138
- > :ls
139
-
140
- == How to use
141
- (1) write /home/(your name)/.reposh.yaml
142
- (2) cd to your working directory
143
- (3) reposh.rb [Enter]
144
-
145
- == Options
146
- see reposh.rb --help
147
-
148
- == Commands
149
- * exit, quit, ^D(^Z)
150
- * Quit reposh
151
- * :ls ~/
152
- * Run "ls ~/" by shell
153
- * [Enter]
154
- * Equals to "status" (you can change this by .reposh.yaml)
155
- * %reload
156
- * Reload reposh.rb (for reposh developper)
157
- * Some more commands starts with % are supported: see source
158
-
159
- All other commands are passed to vcs system.
160
-
161
- == Sample .reposh.yaml
162
- system:
163
- default:
164
- prompt: "> "
165
- svn:
166
- binpath: svn
167
- svk:
168
- binpath: c:/prog/svk/bin/svk.bat
169
- prompt: "svk > "
170
- default_cmd: "status"
171
- hg:
172
- binpath: hg
173
- =end
data/lib/reposh.rb CHANGED
@@ -1,4 +1,230 @@
1
+ require 'readline'
2
+ require 'yaml'
3
+ require 'optparse'
4
+
5
+ class Hash
6
+ def recursive_merge(other)
7
+ self.merge(other) do |key, my_val, other_val|
8
+ # for values of a same key
9
+ if my_val.is_a? Hash and other_val.is_a? Hash
10
+ my_val.recursive_merge(other_val) # XXX: hang-ups for cyclic hash?
11
+ else
12
+ other_val
13
+ end
14
+ end
15
+ end
16
+ end
1
17
 
2
18
  class Reposh
19
+ VERSION = "0.1.6"
20
+ CONF_DEFAULT = {
21
+ "global" => {
22
+ "editing_mode" => nil,
23
+ "custom_commands" => [],
24
+ "pathext" => [],
25
+ },
26
+ "system" => {
27
+ "default" => {
28
+ "binpath" => nil,
29
+ "prompt" => "> ",
30
+ "default_cmd" => "status",
31
+ },
32
+ "darcs" => {
33
+ "default_cmd" => "whatsnew --summary",
34
+ }
35
+ }
36
+ }
37
+
38
+ def run
39
+ parse_option(ARGV)
40
+ @conf_path ||= File.join(ENV["HOME"], ".reposh.yaml")
41
+ @system_name ||= guess_system
42
+
43
+ @conf = load_config(@conf_path)
44
+ @editing_mode = @conf["global"]["editing_mode"]
45
+ pathext = @conf["global"]["pathext"]
46
+ @prompt = get_conf(@system_name, "prompt")
47
+ binpath = get_conf(@system_name, "binpath") || @system_name
48
+ default_cmd = get_conf(@system_name, "default_cmd")
49
+
50
+ @commands = Commands.new(binpath, default_cmd, pathext)
51
+ @commands.register_custom_commands(@conf["global"]["custom_commands"])
52
+
53
+ run_loop
54
+ end
55
+
56
+ def parse_option(args)
57
+ o = OptionParser.new{|opt|
58
+ opt.on("-c confpath",
59
+ "path to .reposh.yaml"){|path|
60
+ @confpath = path
61
+ }
62
+ opt.on("-s system",
63
+ "vcs command name (eg. svn, svk, hg)"){|sys|
64
+ @system_name = sys
65
+ }
66
+ opt.on("-h", "--help",
67
+ "show this message"){
68
+ puts opt
69
+ exit
70
+ }
71
+ opt.on("-v", "--version",
72
+ "show version information"){
73
+ puts VERSION
74
+ exit
75
+ }
76
+ }
77
+ o.parse(args)
78
+ end
79
+
80
+ def load_config(path)
81
+ if File.exist?(path)
82
+ config_hash = YAML.load(File.read(path))
83
+ CONF_DEFAULT.recursive_merge(config_hash)
84
+ else
85
+ CONF_DEFAULT
86
+ end
87
+ end
88
+
89
+ def guess_system
90
+ case
91
+ when File.directory?(".hg")
92
+ "hg"
93
+ when File.directory?("_darcs")
94
+ "darcs"
95
+ when File.directory?(".svn")
96
+ "svn"
97
+ else
98
+ "svk"
99
+ end
100
+ end
101
+
102
+ def get_conf(system, prop)
103
+ (@conf["system"][system] and @conf["system"][system][prop]) or @conf["system"]["default"][prop]
104
+ end
105
+
106
+ def run_loop
107
+ if @editing_mode == "vi"
108
+ Readline.vi_editing_mode
109
+ end
110
+
111
+ puts "Welcome to reposh #{VERSION} (mode: #{@system_name})"
112
+ loop do
113
+ cmd = Readline.readline(@prompt, true)
114
+ @commands.dispatch(cmd, @system_name)
115
+ end
116
+ end
117
+
118
+ class Commands
119
+ def initialize(binpath, default_cmd, pathext)
120
+ @binpath, @default_cmd, @pathext = binpath, default_cmd, pathext
121
+ @commands = []
122
+ register_builtin_commands
123
+ end
124
+
125
+ def register_builtin_commands
126
+ # default command
127
+ register(/.*/){|match|
128
+ cmd = (match[0] == "") ? @default_cmd : match[0]
129
+ execute "#{@binpath} #{cmd}"
130
+ }
131
+
132
+ # system commands
133
+ register("%reload"){
134
+ load __FILE__
135
+ }
136
+ register("%env"){
137
+ require 'pp'
138
+ pp ENV
139
+ }
140
+ register("%version"){
141
+ puts VERSION
142
+ }
143
+ register(/\A%ruby (.*)/){|match|
144
+ puts "reposh: result is " + eval(match[1]).inspect
145
+ }
146
+ @trace_mode = false
147
+ register("%trace"){
148
+ @trace_mode = (not @trace_mode)
149
+ puts "set trace_mode to #{@trace_mode}"
150
+ }
151
+
152
+ # exit commands
153
+ exit_task = lambda{
154
+ puts ""
155
+ exit
156
+ }
157
+ register(nil, &exit_task)
158
+ register("exit", &exit_task)
159
+ register("quit", &exit_task)
160
+
161
+ # shell execution command
162
+ register(/^:(.*)/){|match|
163
+ execute match[1]
164
+ }
165
+ end
166
+
167
+ def register_custom_commands(commands)
168
+ commands.each do |hash|
169
+ if hash["for"]
170
+ systems = hash["for"].split(/,/).map{|s| s.strip}
171
+ else
172
+ systems = nil
173
+ end
174
+ register(Regexp.new(hash["pattern"]), systems){|match|
175
+ cmd = hash["rule"].
176
+ gsub(/\{system\}/, @binpath).
177
+ gsub(/\{\$(\d+)\}/){ match[$1.to_i] }
178
+ puts cmd
179
+ execute cmd
180
+ }
181
+ end
182
+ end
183
+
184
+ def register(pattern, systems = nil, &task)
185
+ @commands.unshift [pattern, systems, task]
186
+ end
187
+
188
+ def dispatch(cmd, sys)
189
+ @commands.each do |pattern, systems, task|
190
+ next if systems && !systems.include?(sys)
191
+
192
+ if (match = match?(pattern, cmd))
193
+ return task.call(match)
194
+ end
195
+ end
196
+ raise "must not happen"
197
+ end
198
+
199
+ def match?(pat, value)
200
+ case pat
201
+ when Regexp
202
+ pat.match(value)
203
+ when nil
204
+ value == nil
205
+ else
206
+ pat.strip == value
207
+ end
208
+ end
209
+
210
+ def execute(cmd)
211
+ stat = false
212
+ ([""] + @pathext).each do |ext|
213
+ command = add_ext(cmd, ext)
214
+ puts command if @trace_mode
215
+ result = system(command)
216
+ return if result
217
+ stat = $?
218
+ end
219
+ puts "reposh: failed to exec '#{cmd}': status #{stat.exitstatus}"
220
+ end
221
+
222
+ def add_ext(cmd, ext)
223
+ exe, *args = cmd.split(' ')
224
+ "#{exe}#{ext} #{args.join ' '}"
225
+ end
226
+
227
+ end
3
228
 
4
229
  end
230
+
@@ -0,0 +1,25 @@
1
+ global:
2
+ editing_mode: vi # default is: emacs
3
+ # pathext: [".bat", ".cmd"] # for windows users
4
+ custom_commands:
5
+ # > ignore_of lib => svn propedit svn:ignore lib
6
+ - pattern: \Aignore_of (.*)
7
+ rule: "{system} propedit svn:ignore {$1}"
8
+ for: svn, svk
9
+ # > ignore lib/*.o => svn propset svn:ignore *.o lib
10
+ - pattern: \Aignore (.*)[\\/]([^\\/]+)
11
+ rule: "{system} propset svn:ignore {$2} {$1}"
12
+ for: svn, svk
13
+
14
+ # settings for each vcs
15
+ system:
16
+ default: # for all vcs
17
+ prompt: "> "
18
+ svn:
19
+ binpath: svn
20
+ svk:
21
+ binpath: c:/prog/svk/bin/svk.bat # path to svk
22
+ prompt: "svk > " # prompt
23
+ default_cmd: "status" # used when you just type [Enter]
24
+ hg:
25
+ binpath: hg
metadata CHANGED
@@ -1,52 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reposh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
- - ujihisa
8
- autorequire: ""
7
+ - yhara (Yutaka HARA)
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-02-04 00:00:00 +09:00
12
+ date: 2008-06-23 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Reposh - Simple VCS Manager Shell
17
- email: ujihisa@gmail.com
16
+ description:
17
+ email: yhara,at,kmc,gr,jp
18
18
  executables:
19
19
  - reposh
20
20
  extensions: []
21
21
 
22
- extra_rdoc_files:
23
- - README
24
- - ChangeLog
22
+ extra_rdoc_files: []
23
+
25
24
  files:
26
25
  - README
27
- - ChangeLog
28
- - Rakefile
26
+ - sample.reposh.yaml
29
27
  - bin/reposh
30
- - bin/reposh.bat
31
- - test/reposh_test.rb
32
- - test/test_helper.rb
33
28
  - lib/reposh.rb
34
- has_rdoc: true
35
- homepage: http://reposh.rubyforge.org
29
+ has_rdoc: false
30
+ homepage: http://mono.kmc.gr.jp/~yhara/
36
31
  post_install_message:
37
- rdoc_options:
38
- - --title
39
- - reposh documentation
40
- - --charset
41
- - utf-8
42
- - --opname
43
- - index.html
44
- - --line-numbers
45
- - --main
46
- - README
47
- - --inline-source
48
- - --exclude
49
- - ^(examples|extras)/
32
+ rdoc_options: []
33
+
50
34
  require_paths:
51
35
  - lib
52
36
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -64,9 +48,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
48
  requirements: []
65
49
 
66
50
  rubyforge_project: reposh
67
- rubygems_version: 1.0.1
51
+ rubygems_version: 1.1.1
68
52
  signing_key:
69
53
  specification_version: 2
70
- summary: Reposh - Simple VCS Manager Shell
71
- test_files:
72
- - test/test_helper.rb
54
+ summary: Simple VCS Shell
55
+ test_files: []
56
+
data/ChangeLog DELETED
@@ -1,4 +0,0 @@
1
- == 0.1.2 / 2008-01-31
2
-
3
- * initial release
4
-
data/Rakefile DELETED
@@ -1,133 +0,0 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'rake/clean'
4
- require 'rake/testtask'
5
- require 'rake/packagetask'
6
- require 'rake/gempackagetask'
7
- require 'rake/rdoctask'
8
- require 'rake/contrib/rubyforgepublisher'
9
- require 'rake/contrib/sshpublisher'
10
- require 'fileutils'
11
-
12
- require 'rubyforge'
13
- include FileUtils
14
-
15
- NAME = "reposh"
16
- AUTHOR = "ujihisa"
17
- EMAIL = "ujihisa@gmail.com"
18
- DESCRIPTION = "Reposh - Simple VCS Manager Shell"
19
- RUBYFORGE_PROJECT = "reposh"
20
- HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
21
- BIN_FILES = %w(reposh)
22
- VERS = "0.1.2"
23
-
24
- REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
25
- CLEAN.include ['**/.*.sw?', '*.gem', '.config']
26
- RDOC_OPTS = [
27
- '--title', "#{NAME} documentation",
28
- "--charset", "utf-8",
29
- "--opname", "index.html",
30
- "--line-numbers",
31
- "--main", "README",
32
- "--inline-source",
33
- ]
34
-
35
- task :default => [:test]
36
- task :package => [:clean]
37
-
38
- Rake::TestTask.new("test") do |t|
39
- t.libs << "test"
40
- t.pattern = "test/**/*_test.rb"
41
- t.verbose = true
42
- end
43
-
44
- spec = Gem::Specification.new do |s|
45
- s.name = NAME
46
- s.version = VERS
47
- s.platform = Gem::Platform::RUBY
48
- s.has_rdoc = true
49
- s.extra_rdoc_files = ["README", "ChangeLog"]
50
- s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
51
- s.summary = DESCRIPTION
52
- s.description = DESCRIPTION
53
- s.author = AUTHOR
54
- s.email = EMAIL
55
- s.homepage = HOMEPATH
56
- s.executables = BIN_FILES
57
- s.rubyforge_project = RUBYFORGE_PROJECT
58
- s.bindir = "bin"
59
- s.require_path = "lib"
60
- s.autorequire = ""
61
- s.test_files = Dir["test/test_*.rb"]
62
-
63
- #s.add_dependency('activesupport', '>=1.3.1')
64
- #s.required_ruby_version = '>= 1.8.2'
65
-
66
- s.files = %w(README ChangeLog Rakefile) +
67
- Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
68
- Dir.glob("ext/**/*.{h,c,rb}") +
69
- Dir.glob("examples/**/*.rb") +
70
- Dir.glob("tools/*.rb")
71
-
72
- s.extensions = FileList["ext/**/extconf.rb"].to_a
73
- end
74
-
75
- Rake::GemPackageTask.new(spec) do |p|
76
- p.need_tar = true
77
- p.gem_spec = spec
78
- end
79
-
80
- task :install do
81
- name = "#{NAME}-#{VERS}.gem"
82
- sh %{rake package}
83
- sh %{sudo gem install pkg/#{name}}
84
- end
85
-
86
- task :uninstall => [:clean] do
87
- sh %{sudo gem uninstall #{NAME}}
88
- end
89
-
90
-
91
- Rake::RDocTask.new do |rdoc|
92
- rdoc.rdoc_dir = 'html'
93
- rdoc.options += RDOC_OPTS
94
- rdoc.template = "resh"
95
- #rdoc.template = "#{ENV['template']}.rb" if ENV['template']
96
- if ENV['DOC_FILES']
97
- rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
98
- else
99
- rdoc.rdoc_files.include('README', 'ChangeLog')
100
- rdoc.rdoc_files.include('lib/**/*.rb')
101
- rdoc.rdoc_files.include('ext/**/*.c')
102
- end
103
- end
104
-
105
- desc "Publish to RubyForge"
106
- task :rubyforge => [:rdoc, :package] do
107
- require 'rubyforge'
108
- Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'ujihisa').upload
109
- end
110
-
111
- desc 'Package and upload the release to rubyforge.'
112
- task :release => [:clean, :package] do |t|
113
- v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
114
- abort "Versions don't match #{v} vs #{VERS}" unless v == VERS
115
- pkg = "pkg/#{NAME}-#{VERS}"
116
-
117
- rf = RubyForge.new
118
- puts "Logging in"
119
- rf.login
120
-
121
- c = rf.userconfig
122
- # c["release_notes"] = description if description
123
- # c["release_changes"] = changes if changes
124
- c["preformatted"] = true
125
-
126
- files = [
127
- "#{pkg}.tgz",
128
- "#{pkg}.gem"
129
- ].compact
130
-
131
- puts "Releasing #{NAME} v. #{VERS}"
132
- rf.add_release RUBYFORGE_PROJECT, NAME, VERS, *files
133
- end
data/bin/reposh.bat DELETED
@@ -1 +0,0 @@
1
- @ruby d:/proj/reposh/reposh %*
data/test/reposh_test.rb DELETED
@@ -1,8 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- require "test/unit"
4
- class ReposhTest < Test::Unit::TestCase
5
- def test_todo
6
- assert false, 'please write test'
7
- end
8
- end
data/test/test_helper.rb DELETED
@@ -1,3 +0,0 @@
1
- require 'test/unit'
2
- require File.dirname(__FILE__) + '/../lib/reposh'
3
-