Skip to content

Instantly share code, notes, and snippets.

@aaronjensen
Created July 22, 2015 22:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaronjensen/cb741e89b709d15d34d5 to your computer and use it in GitHub Desktop.
Save aaronjensen/cb741e89b709d15d34d5 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
PATH = File.expand_path('../..', __FILE__)
PACKAGES_TXT = File.join(PATH, "packages.txt")
def package_list
"apm list --installed --bare --dev false"
end
def main
installed = parse_package_list(`#{package_list}`)
packages_txt = parse_package_list(File.read(PACKAGES_TXT))
packages_to_remove(packages_txt, installed).each do |name, _|
puts "Found package \"#{name}\" that is not in packages.txt."
puts "If you installed this and want to keep it, type \"keep\": "
line = readline.chomp
next if line == "keep"
system("apm uninstall #{name}")
end
# Install only updated or missing packages
packages_to_install(packages_txt, installed).each do |name, version|
system("apm install #{name}@#{version}")
end
# Write new packages.txt
`#{package_list} > #{PACKAGES_TXT}`
puts "Done!"
end
def packages_to_remove(packages_txt, installed)
installed.reject { |name, _| packages_txt.key?(name) }
end
def packages_to_install(packages_txt, installed)
packages_txt.select { |name, version|
!installed.key?(name) ||
Gem::Version.new(version) > Gem::Version.new(installed[name])
}
end
def parse_package_list(list)
Hash[list.lines
.map(&:strip)
.reject(&:empty?)
.map { |line| parse_package(line.strip) }]
end
def parse_package(line)
name, version = line.split("@")
[name, version]
end
main if __FILE__ == $PROGRAM_NAME
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment