class TMBundle

Public Instance Methods

cd(partial_name) click to toggle source
# File lib/tmbundle.rb, line 119
def cd(partial_name)
  bundle = find_bundle(partial_name)
  within bundle do
    term_program = ENV['TERM_PROGRAM'] || 'Terminal.app'
    system 'open', bundle.path, '-a', term_program
  end
end
edit(partial_name) click to toggle source
# File lib/tmbundle.rb, line 7
def edit partial_name
  bundle = find_bundle(partial_name)
  mate bundle.path
rescue NotFound
  return false
end
install(name) click to toggle source
# File lib/tmbundle.rb, line 55
def install name
  require 'tmbundle/bundle_name'
  name = BundleName.new(name)
  install_path = bundles_dir.join(name.install_name).to_s
  success = system('git', 'clone', name.git_url, install_path)
  if not success
    puts "attempting clone of #{name.alt_git_url}"
    success = system('git', 'clone', name.alt_git_url, install_path)
  end
end
list() click to toggle source
# File lib/tmbundle.rb, line 112
def list
  bundles_list.all.each do |bundle|
    puts "- #{bundle.name.ljust(30)} (#{bundle.path})"
  end
end
path(name) click to toggle source
# File lib/tmbundle.rb, line 67
def path name
  puts find_bundle(name).path
rescue NotFound
  return false
end
status(name = nil) click to toggle source
# File lib/tmbundle.rb, line 74
def status name = nil
  justification = 50
  bundles_list.all.each do |bundle|
    within bundle do
      print "- #{bundle.name}...".ljust(justification)
      # puts "-> fetching updates from remote..."
      `git fetch -aq 2> /dev/null`
      fetch_successful = $?.success?
      # puts "-> checking status..."
      branch_info, *changes = `git status -zb`.split("\0")
      branch, remote, branch_status,  = branch_info.scan(/^## (\S+)\.\.\.(\S+)(?: \[(.+)\])?/).flatten
      cd_hint = false

      if changes.any?
        cd_hint = true
        print "✘ #{changes.size} changed/new file#{:s if changes.size != 0}.".ljust(justification)
      else
        case branch_status.to_s
        when /^ahead (\d+)/
          ahead_commits = $1
          cd_hint = true
          print "✘ #{ahead_commits} commits ahead of #{remote}. ".ljust(justification)
        when /^behind (\d+)/
          behind_commits = $1
          cd_hint = true
          print "❍ behind remote (#{remote}) by #{behind_commits}. ".ljust(justification)
        else
          print "✔︎ up-to-date"
        end
      end
      print "$ cd \"#{bundle.path}\" # to enter the bundle directory" if cd_hint
      puts
      puts "#{' '*justification}✘✘✘ Something went wrong while fetching from remote #{remote}" unless fetch_successful
    end
  end
end
update(partial_name = nil) click to toggle source
# File lib/tmbundle.rb, line 15
def update(partial_name = nil)
  bundle = find_bundle(partial_name) if partial_name
  bundles_to_update = bundle ? [bundle] : installed_bundles

  require 'thread'
  signals = Queue.new
  trap('INT') { signals << :int }

  updated = []
  skipped = []
  errored = []

  bundles_to_update.each do |bundle|
    within bundle do
      if not(File.exist?('./.git'))
        puts "------> Skipping #{bundle.name} (not a Git repo, delta bundle?)"
        skipped << bundle
        next
      end

      puts "------> Updating #{bundle.name}..."
      system(*%w[git pull --ff-only])
      success = $? == 0
      updated << bundle if success
      errored << bundle unless success
      puts
      (puts 'Exiting…'; exit) if signals.pop == :int until signals.empty?
    end
  end

  puts
  puts
  puts '------> Summary'
  puts
  puts "Skipped (#{skipped.size})\n- #{skipped.map(&:name).join("\n- ")}\n\n" if skipped.any?
  puts "Updated (#{updated.size})\n- #{updated.map(&:name).join("\n- ")}\n\n" if updated.any?
  puts "Errored (#{errored.size})\n- #{errored.map(&:name).join("\n- ")}\n\n" if errored.any?
end

Private Instance Methods

bundles_dir() click to toggle source
# File lib/tmbundle.rb, line 168
def bundles_dir
  @bundles_dir ||= Pathname('~/Library/Application Support/TextMate/Bundles').expand_path
end
bundles_list() click to toggle source
# File lib/tmbundle.rb, line 164
def bundles_list
  @bundles_list ||= BundlesList.new(bundles_dir)
end
find_bundle(partial_name) click to toggle source
# File lib/tmbundle.rb, line 131
def find_bundle(partial_name)
  matches = installed_bundles.select do |bundle|
    bundle.name =~ /^#{partial_name}/i
  end

  if matches.size > 1
    puts "please be more specific:"
    matches.each_with_index {|m,i| puts " #{i+1}) #{m.name}"}
    print 'Type the number> '
    return(matches[$stdin.gets.to_i-1] || raise(NotFound))
  end

  if matches.empty?
    puts "nothing found"
    raise NotFound
  end

  matches.first
end
installed_bundles() click to toggle source
# File lib/tmbundle.rb, line 160
def installed_bundles
  bundles_list.all
end
mate(*args) click to toggle source
# File lib/tmbundle.rb, line 186
def mate *args
  exec 'mate', *args
end
within(bundle) { || ... } click to toggle source
# File lib/tmbundle.rb, line 154
def within bundle
  Dir.chdir bundle.path do
    yield
  end
end