Skip to content
Browse files

added support for powershell, changed BatchFileEditor to ScriptFileEd…

…itor, changed pik.bat to allow for C:\Program Files installation, changed switch to use, made switch an alias of use (RVM Compat)
  • Loading branch information...
1 parent c8ff61b commit a9af53561f50c5c59d44f8d7c1a40e2bf99de0a5 @vertiginous committed
View
2 README.rdoc
@@ -78,7 +78,7 @@ So I run:
=== Install pik using the installer
- If you want to install to a machine that doesn't have Ruby installed yet, you can download the latest msi file from github[http://github.com/vertiginous/pik/downloads]. Or, just run:
+If you want to install to a machine that doesn't have Ruby installed yet, you can download the latest msi file from github[http://github.com/vertiginous/pik/downloads]. Or, just run:
>msiexec /i http://github.com/downloads/vertiginous/pik/pik-n.n.n.msi
View
23 Rakefile
@@ -24,11 +24,11 @@ ENV['SPEC_OPTS']= '-O spec/spec.opts'
lib = FileList["lib/**/*.rb"]
-file 'tools/pik/pik_runner.exy', :needs => ['tools/pik/pik_runner'] + lib do
- Dir.chdir 'tools/pik' do
- sh('ruby -rexerb/mkexy pik_runner -v')
+file 'tools/pik_runner.exy', :needs => ['tools/pik_runner'] + lib do
+ Dir.chdir 'tools' do
+ sh('ruby -rexerb/mkexy pik_runner pik.bat -v')
end
- exy = YAML.load(File.read('tools/pik/pik_runner.exy'))
+ exy = YAML.load(File.read('tools/pik_runner.exy'))
zlib1 = {
'file' => File.join(RbConfig::CONFIG['bindir'], 'zlib1.dll'),
'type' => 'extension-library'
@@ -36,28 +36,28 @@ file 'tools/pik/pik_runner.exy', :needs => ['tools/pik/pik_runner'] + lib do
exy['file']['zlib1.dll'] = zlib1
exy['resource'] = EXE_VERSION
- File.open('tools/pik/pik_runner.exy', 'w+'){ |f| f.puts YAML.dump(exy) }
+ File.open('tools/pik_runner.exy', 'w+'){ |f| f.puts YAML.dump(exy) }
end
-file 'tools/pik/pik_runner.exe', :needs => ['tools/pik/pik_runner.exy'] do
- Dir.chdir 'tools/pik' do
+file 'tools/pik_runner.exe', :needs => ['tools/pik_runner.exy'] do
+ Dir.chdir 'tools' do
sh('ruby -S exerb pik_runner.exy')
sh('upx -9 pik_runner.exe') unless ENV['QUICK']
end
end
-task :build, :needs => 'tools/pik/pik_runner.exe'
+task :build, :needs => 'tools/pik_runner.exe'
task :install, :needs => :build do
sh('ruby bin/pik_install C:\\bin')
end
task :clobber_exe do
- rm_rf 'tools/pik/pik_runner.exe'
+ rm_rf 'tools/pik_runner.exe'
end
task :clobber_exy, :needs => :clobber_exe do
- rm_rf 'tools/pik/pik_runner.exy'
+ rm_rf 'tools/pik_runner.exy'
end
task :rebuild, :needs => [:clobber_exy, :build]
@@ -130,6 +130,7 @@ Cucumber::Rake::Task.new(:features) do |t|
t.cucumber_opts = "features -f html -o ../pik_cucumber.html -f progress"
end
+desc "generate a guid"
task :guid do
puts
puts UUID.new.generate.upcase
@@ -140,7 +141,7 @@ directory 'pkg'
@package = 'pik'
msi_file = "pkg/#{@package}-#{Pik::VERSION}.msi"
-file msi_file, :needs => 'tools/pik/pik_runner.exe'
+file msi_file, :needs => 'tools/pik_runner.exe'
task :installer, :needs => [msi_file, :light]
View
11 bin/pik_install
@@ -29,13 +29,10 @@ install_dir = ARGV.first
tools_dir = File.join(File.dirname(__FILE__), '..', 'tools')
puts "Installing to #{install_dir}\n\n"
-cp File.join(tools_dir, 'pik.bat'), install_dir ,
- :verbose => true
-
-mkdir_p File.join(install_dir, 'pik'), :verbose => true
-cp File.join(tools_dir, 'pik', 'pik_runner.exe'),
- File.join(install_dir, 'pik') ,
- :verbose => true
+cp File.join(tools_dir, 'pik.bat'), install_dir, :verbose => true
+cp File.join(tools_dir, 'pik.ps1'), install_dir, :verbose => true
+cp File.join(tools_dir, 'pik'), install_dir, :verbose => true
+cp File.join(tools_dir, 'pik_runner.exe'), install_dir, :verbose => true
puts "\npik is installed"
View
4 features/support/env.rb
@@ -35,11 +35,11 @@
REAL_PATH = SearchPath.new(ENV['PATH']).replace(RbConfig::CONFIG['bindir'], 'C:\temp\more spaces in path\ruby\Ruby-186-p398-2\bin').join
OTHER_RUBY = 'c:\\temp\\more spaces in path\\ruby\\Ruby-191-p378-1\\bin'
-ENV['HOME'] = "C:\\temp\\path with spaces"
+ENV['USERPROFILE'] = "C:\\temp\\path with spaces"
ENV['http_proxy'] = "http://localhost:9292"
PIK_LOG = 'log\\output.log'
-TEST_PIK_HOME = Pathname.new( ENV['HOME'] || ENV['USERPROFILE'] ) + '.pik'
+TEST_PIK_HOME = Pathname.new( ENV['USERPROFILE'] ) + '.pik'
FAKE_PIK_HOME = 'c:/temp/path with spaces/.pik'
PID_FILE = 'c:/temp/proxy/proxy.pid'
View
47 features/use_command.feature
@@ -0,0 +1,47 @@
+Feature: use command
+ In order to switch from one ruby version to another
+ A developer
+ Wants an interface to the program
+ So that she can easily update the path and other environment variables.
+
+ Scenario Outline: Switching versions with use command
+ Given I have added "<version>" to pik
+ When I run "pik use <patterns> -v" and check the path
+ Then I should see "<version>"
+ And the path should point to it.
+ And the GEM_HOME might get set.
+
+ Examples:
+ | version | patterns |
+ | IronRuby 0.9.2.0 on .NET 2.0.0.0 | iron 92 |
+ | jruby 1.5.1 (ruby 1.8.7 patchlevel 249) | jruby 1.5 |
+ | ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32] | 186 398 |
+ | ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32] | 191 p3 |
+
+ Scenario Outline: Switching versions with pattern only
+ Given I have added "<version>" to pik
+ When I run "pik <patterns>" and check the path
+ Then the path should point to it.
+ And the GEM_HOME might get set.
+
+ Examples:
+ | version | patterns |
+ | IronRuby 0.9.2.0 on .NET 2.0.0.0 | iron 92 |
+ | jruby 1.5.1 (ruby 1.8.7 patchlevel 249) | jruby 1.5 |
+ | ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32] | 186 398 |
+ | ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32] | 191 p3 |
+
+ Scenario Outline: Switching versions with no ruby in the path
+ Given I have added "<version>" to pik
+ And there is no ruby version in the path
+ When I run "pik <patterns>" and check the path
+ Then the path should point to it.
+ And the GEM_HOME might get set.
+
+ Examples:
+ | version | patterns |
+ | IronRuby 0.9.2.0 on .NET 2.0.0.0 | iron 92 |
+ | jruby 1.5.1 (ruby 1.8.7 patchlevel 249) | jruby 1.5 |
+ | ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32] | 186 398 |
+ | ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32] | 191 p3 |
+
View
47 lib/pik.rb
@@ -1,7 +1,3 @@
-module Pik
- VERSION = '0.2.7'
-end
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'vendor/lib'))
@@ -12,24 +8,16 @@ module Pik
require 'open-uri'
require 'rbconfig'
-ENV['GEM_HOME'] = nil
-ENV['GEM_PATH'] = nil
-# real_home = ENV['HOME']
-# ENV['HOME'] = "nul"
-
-# require 'rubygems'
-
-# ENV['HOME'] = real_home
-
require 'hpricot'
require 'highline'
-require 'pik/pik'
-require 'pik/batch_file'
require 'pik/core_ext/pathname'
+require 'pik/scripts/script_file'
+require 'pik/scripts/batch_file'
+require 'pik/scripts/ps_file'
require 'pik/commands'
require 'pik/commands/config_file_editor'
-require 'pik/commands/batch_file_editor'
+require 'pik/commands/script_file_editor'
require 'pik/commands/command'
require 'pik/commands/devkit_command'
require 'pik/commands/install_command'
@@ -37,7 +25,7 @@ module Pik
require 'pik/commands/add_command'
require 'pik/commands/help_command'
require 'pik/commands/info_command'
-require 'pik/commands/switch_command'
+require 'pik/commands/use_command'
require 'pik/commands/run_command'
require 'pik/commands/remove_command'
require 'pik/commands/config_command'
@@ -54,14 +42,27 @@ module Pik
require 'pik/windows_env'
require 'pik/which'
-PIK_HOME = Pathname.new( ENV['HOME'] || ENV['USERPROFILE'] ) + '.pik'
+module Pik
+ VERSION = '0.2.7'
+ Scripts = {'.cmd' => BatchFile, '.bat' => BatchFile, '.ps1' => PsFile}
-if defined? ExerbRuntime
- PIK_BATCH = Pathname.new(ARGV.shift).ruby
-else
- pik_exe = Pathname.new($0).expand_path + '..'
- PIK_BATCH = pik_exe.dirname + "#{pik_exe.basename}.bat"
+ def self.print_error(error)
+ puts "\nThere was an error."
+ puts " Error: #{error.message}\n\n"
+ puts error.backtrace.map{|m| " in: #{m}" }
+ puts
+ end
+
end
+
Pik::Commands.deprecate(:checkup => "The checkup command is deprecated, using the info command instead.")
Pik::Commands.deprecate(:cu => "The cu command is deprecated, using the info command instead.")
+
+PIK_HOME = Pathname.new( ENV['USERPROFILE'] ) + '.pik'
+
+if defined?(ExerbRuntime) || $0 =~ /pik_runner/
+ PIK_SCRIPT = Pathname.new(ARGV.shift).ruby
+ SCRIPT_LANG = Pik::Scripts[PIK_SCRIPT.extname]
+ SCRIPT_FILE = SCRIPT_LANG.new(PIK_HOME + 'pik')
+end
View
70 lib/pik/batch_file.rb
@@ -1,70 +0,0 @@
-
-class BatchFile
-
- def self.open(file)
- bf = new(file, :open)
- yield bf if block_given?
- bf
- end
-
- attr_accessor :file_data, :file_name, :ruby_dir
-
- def initialize(file, mode=:new)
- @rubyw_exe = 'rubyw.exe'
- @ruby_exe = 'ruby.exe'
- @file = Pathname.new(file)
- case mode
- when :open
- @file_data = File.read(@file).split("\n")
- when :new
- @file_data = [header]
- end
- yield self if block_given?
- end
-
- def path
- @file
- end
-
- def header
- string = "@ECHO OFF\n\n"
- string << ":: This batch file generated by Pik, the\n"
- string << ":: Ruby Manager for Windows\n"
- end
-
- def ftype(files={ 'rbfile' => @ruby_exe, 'rbwfile' => @rubyw_exe })
- files.sort.each do |filetype, open_with|
- @file_data << "FTYPE #{filetype}=#{open_with} \"%1\" %*\n"
- end
- self
- end
-
- def call(bat)
- @file_data << "CALL #{bat}\n"
- self
- end
-
- def set(items)
- items.each{|k,v| @file_data << "SET #{k}=#{v}" }
- self
- end
-
- def echo(string='.')
- string = ' ' + string unless string == '.'
- @file_data << "ECHO#{string}"
- self
- end
-
- def remove_line(re)
- @file_data.reject!{ |i| i =~ re }
- end
-
- def to_s
- @file_data.join("\n")
- end
-
- def write
- File.open(@file, 'w+'){|f| f.puts self.to_s }
- end
-
-end
View
29 lib/pik/commands/command.rb
@@ -9,7 +9,7 @@ class VersionUnknown < StandardError
end
class Command
-
+
attr_reader :config
attr_reader :options
@@ -48,13 +48,13 @@ def self.names
@names ||= [cmd_name]
end
- def self.clean_gem_batch
- BatchFile.open(PIK_BATCH) do |gem_bat|
- # remove old calls to .pik/pik batches
- gem_bat.remove_line( /call.+pik.+bat/i )
- gem_bat.write
- end
- end
+ # def self.clean_gem_batch
+ # BatchFile.open(PIK_SCRIPT) do |gem_bat|
+ # # remove old calls to .pik/pik batches
+ # gem_bat.remove_line( /call.+pik.+bat/i )
+ # gem_bat.write
+ # end
+ # end
def self.choose_from(patterns, config)
if patterns.empty?
@@ -85,11 +85,11 @@ def initialize(args=ARGV, config_=nil)
@config = config_ || ConfigFile.new
@hl = HighLine.new
add_sigint_handler
- options.program_name = "#{PIK_BATCH.basename('.*')} #{self.class.names.join('|')}"
+ options.program_name = "#{PIK_SCRIPT.basename('.*')} #{self.class.names.join('|')}"
command_options
parse_options
create(PIK_HOME) unless PIK_HOME.exist?
- delete_old_pik_batches
+ delete_old_pik_script
end
def close
@@ -162,10 +162,11 @@ def create(home)
home.mkpath
end
- def delete_old_pik_batches( cutoff=(Time.now - (2 * 60 * 60)) )
- Dir[(PIK_HOME + "*.bat").to_ruby.to_s].each do |f|
- File.delete(f) if File.ctime(f) < cutoff
- end
+ def delete_old_pik_script #s ( cutoff=(Time.now - (2 * 60 * 60)) )
+ # Dir[(PIK_HOME + "*#{SCRIPT_FILE.extname}").to_ruby.to_s].each do |f|
+ # File.delete(f) if File.ctime(f) < cutoff
+ # end
+ SCRIPT_FILE.path.delete if SCRIPT_FILE.path.exist?
end
def sh(cmd)
View
1 lib/pik/commands/config_command.rb
@@ -3,7 +3,6 @@ module Pik
class Config < Command
it "Adds/modifies configuration options."
- include BatchFileEditor
include ConfigFileEditor
attr_accessor :global
View
8 lib/pik/commands/default_command.rb
@@ -7,15 +7,15 @@ class Default < Command
attr_accessor :verbose
- include BatchFileEditor
+ include ScriptFileEditor
def execute
sys = WindowsEnv.system
usr = WindowsEnv.user
new_path = [sys['PATH'],usr['PATH']].compact.join(';')
- @batch.set('PATH' => new_path )
- @batch.set('GEM_PATH' => usr['GEM_PATH'] || sys['GEM_PATH'] )
- @batch.set('GEM_HOME' => usr['GEM_HOME'] || sys['GEM_HOME'] )
+ @script.set('PATH' => new_path )
+ @script.set('GEM_PATH' => usr['GEM_PATH'] || sys['GEM_PATH'] )
+ @script.set('GEM_HOME' => usr['GEM_HOME'] || sys['GEM_HOME'] )
echo_ruby_version(Which::Ruby.find(new_path)) if verbose
end
View
6 lib/pik/commands/devkit_command.rb
@@ -27,7 +27,7 @@ def write_batch_files(path)
end
def write_make(path)
- BatchFile.new(path + 'make.bat') do |b|
+ Pik::BatchFile.new(path + 'make.bat') do |b|
b.file_data << 'setlocal'
b.set(:DEVKIT => config.global[:devkit])
b.set(:PATH => "%DEVKIT%\\gcc\\3.4.5\\bin;%DEVKIT%\\msys\\1.0.11\\bin")
@@ -37,7 +37,7 @@ def write_make(path)
end
def write_sh(path)
- BatchFile.new(path + 'sh.bat') do |b|
+ Pik::BatchFile.new(path + 'sh.bat') do |b|
b.file_data << 'setlocal'
b.set(:DEVKIT => config.global[:devkit])
b.set(:PATH => "%DEVKIT%\\gcc\\3.4.5\\bin;%DEVKIT%\\msys\\1.0.11\\bin")
@@ -47,7 +47,7 @@ def write_sh(path)
end
def write_gcc(path)
- BatchFile.new(path + 'gcc.bat') do |b|
+ Pik::BatchFile.new(path + 'gcc.bat') do |b|
b.file_data << 'setlocal'
b.set(:DEVKIT => config.global[:devkit])
b.set(:PATH => "%DEVKIT%\\gcc\\3.4.5\\bin;%PATH%")
View
4 lib/pik/commands/install_command.rb
@@ -14,7 +14,7 @@ class Install < Command
def initialize(args=ARGV, config_=nil)
super
@download_dir = config.global[:download_dir] || PIK_HOME + 'downloads'
- @install_root = config.global[:install_dir] || PIK_BATCH.dirname + 'pik'
+ @install_root = config.global[:install_dir] || PIK_HOME + 'rubies'
FileUtils.mkdir_p @download_dir.to_s
end
@@ -79,7 +79,7 @@ def download_seven_zip
if @hl.agree(question){|answer| answer.default = 'yes' }
uri = 'http://downloads.sourceforge.net/sevenzip/7za465.zip'
file = download(uri)
- Zip.fake_unzip(file.to_s, /\.exe|\.dll$/, PIK_BATCH.dirname.to_s)
+ Zip.fake_unzip(file.to_s, /\.exe|\.dll$/, PIK_SCRIPT.dirname.to_s)
else
raise QuitError
end
View
38 lib/pik/commands/batch_file_editor.rb → lib/pik/commands/script_file_editor.rb
@@ -1,24 +1,18 @@
module Pik
- module BatchFileEditor
+ module ScriptFileEditor
- attr_reader :batch
+ attr_reader :script
def initialize(args=ARGV,config=nil)
super
- batch_file = File.join(PIK_HOME, "#{File.basename($0)}_#{$$}.bat")
- @batch = BatchFile.new( batch_file )
- editors << @batch
- end
-
- def close
- update_gem_batch
- super
+ @script = SCRIPT_FILE
+ editors << @script
end
def set(items)
items.each do |k, v|
- @batch.set(k => v)
+ @script.set(k => v)
WindowsEnv.user.set(k => v) if global
end
end
@@ -35,32 +29,20 @@ def switch_path_to(other)
# if the new version has a GEM_HOME, add it's bin dir to the path
new_path.add(Pathname.new(other[:gem_home]) + 'bin') if other[:gem_home]
- @batch.set('PATH' => new_path.join )
+ @script.set('PATH' => new_path.join )
end
def switch_gem_home_to(gem_home)
gem_home = Pathname(gem_home).to_windows rescue nil
- @batch.set('GEM_PATH' => gem_home )
- @batch.set('GEM_HOME' => gem_home )
+ @script.set('GEM_PATH' => gem_home )
+ @script.set('GEM_HOME' => gem_home )
end
def echo_ruby_version(path, verb='')
rb = Which::Ruby.exe(path).basename
- @batch.file_data << "for /f \"delims=\" %%a in ('#{rb} -v') do @echo #{verb} %%a "
- end
-
- def echo_running_with_ruby_version(path)
- echo_ruby_version('Running with')
- end
-
- def update_gem_batch
- BatchFile.open(PIK_BATCH) do |gem_bat|
- # call new .pik/pik batch
- gem_bat.call(%Q("#{@batch.path.to_windows}")) if @batch
- gem_bat.write
- end
+ @script.call "#{rb} -v"
end
-
+
end
end
View
4 lib/pik/commands/update_command.rb
@@ -4,11 +4,11 @@ class Update < Command
aka :up
it "updates pik."
- include BatchFileEditor
+ include ScriptFileEditor
def execute
sh "#{Which::Gem.exe} install pik"
- @batch.call("pik_install #{PIK_BATCH.dirname}")
+ @batch.call("pik_install #{PIK_SCRIPT.dirname}")
end
end
View
6 lib/pik/commands/switch_command.rb → lib/pik/commands/use_command.rb
@@ -1,10 +1,10 @@
module Pik
- class Switch < Command
+ class Use < Command
- aka :sw, :use
+ aka :switch, :sw
it "Switches ruby versions based on patterns."
- include BatchFileEditor
+ include ScriptFileEditor
attr_accessor :global
attr_accessor :gem_home
View
10 lib/pik/pik.rb
@@ -1,10 +0,0 @@
-module Pik
-
- def self.print_error(error)
- puts "\nThere was an error."
- puts " Error: #{error.message}\n\n"
- puts error.backtrace.map{|m| " in: #{m}" }
- puts
- end
-
-end
View
32 lib/pik/scripts/batch_file.rb
@@ -0,0 +1,32 @@
+module Pik
+
+ class BatchFile < ScriptFile
+
+ def extname
+ ".bat"
+ end
+
+ def header
+ string = "@ECHO OFF\n\n"
+ string << ":: This batch file generated by Pik, the\n"
+ string << ":: Ruby Manager for Windows\n"
+ end
+
+ def call(bat)
+ @file_data << "CALL #{bat}\n"
+ self
+ end
+
+ def set(items)
+ items.each{|k,v| @file_data << "SET #{k}=#{v}" }
+ self
+ end
+
+ def unset(*items)
+ items.flatten.each{|k| @file_data << "SET #{k}=" }
+ self
+ end
+
+ end
+
+end
View
33 lib/pik/scripts/ps_file.rb
@@ -0,0 +1,33 @@
+module Pik
+
+ class PsFile < ScriptFile
+
+ attr_accessor :file_data, :file_name, :ruby_dir
+
+ def extname
+ ".ps1"
+ end
+
+ def header
+ string = "# This powshell script generated by Pik, the\n"
+ string << "# Ruby Manager for Windows\n"
+ end
+
+ def call(exe)
+ @file_data << "#{exe}\n"
+ self
+ end
+
+ def set(items)
+ items.each{|k,v| @file_data << "$ENV:#{k}=\"#{v}\"" }
+ self
+ end
+
+ def unset(items)
+ items.each{|k| @file_data << "Remove-Item ENV:#{k}" }
+ self
+ end
+
+ end
+
+end
View
45 lib/pik/scripts/script_file.rb
@@ -0,0 +1,45 @@
+module Pik
+
+ class ScriptFile
+
+ attr_accessor :file_data, :file_name, :ruby_dir
+
+ def initialize(file) #, mode=:new)
+ @file = Pathname.new(file.to_s + extname)
+ @file_data = [header]
+ yield self if block_given?
+ end
+
+ def path
+ @file
+ end
+
+ def extname
+ raise
+ end
+
+ def echo(string='.')
+ string = ' ' + string unless string == '.'
+ @file_data << "ECHO#{string}"
+ self
+ end
+
+ def remove_line(re)
+ @file_data.reject!{ |i| i =~ re }
+ end
+
+ def to_s
+ @file_data.join("\n")
+ end
+
+ def write
+ File.open(@file, 'w+'){|f| f.puts self.to_s }
+ end
+
+ def << (cmd)
+ @file_data << cmd
+ end
+
+ end
+
+end
View
3 tools/pik.bat
@@ -1,2 +1,3 @@
@ECHO OFF
-"%~dpn0\%~n0_runner.exe" "%~f0" %*
+"%~dp0pik_runner.exe" "%~f0" %*
+IF EXIST "%USERPROFILE%\.pik\pik.bat" (call "%USERPROFILE%\.pik\pik.bat")
View
3 tools/pik.ps1
@@ -0,0 +1,3 @@
+pik_runner.exe $MyInvocation.MyCommand.Definition $args
+if(test-path -path "$ENV:USERPROFILE\.pik\pik.ps1"){& $ENV:USERPROFILE\.pik\pik.ps1}
+
View
6 tools/pik/pik_runner → tools/pik_runner
@@ -1,14 +1,12 @@
#!/usr/bin/env ruby
-lib = File.join(File.dirname(__FILE__), '..', '..', 'lib')
+lib = File.join(File.dirname(__FILE__), '..', 'lib')
require File.join(lib, 'pik')
include Pik
args = ARGV
-Command.clean_gem_batch
-
begin
config = ConfigFile.new
@@ -21,7 +19,7 @@ begin
c
elsif (choice = Command.choose_from(args_minus_opts, config))
args = [choice] + args
- Switch
+ Use
end
if config.empty? && command != Pik::Add

0 comments on commit a9af535

Please sign in to comment.
Something went wrong with that request. Please try again.