gill 1.0.0.rc.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/gill/git.rb CHANGED
@@ -1,72 +1,42 @@
1
- require 'tempfile'
2
1
  module Gill
3
2
 
4
3
  class Git
5
- # Include the gill cache convenience methods.
6
- include Config::Cache
7
4
  include Helper
5
+ include Settings
8
6
 
9
- # Initialize a new gill git instance.
10
- #
11
- # @param [String] category
12
- # The category for the new cloned repository
13
- #
14
- # @param [String] folder
15
- # The folder name in which the cloned repository will be stored
16
- #
17
- # @param [String] repo
18
- # The git uri for the repository
19
- #
20
- def initialize(category,folder,repo)
7
+ attr_reader :category, :category_path, :repo_name, :repo_path
8
+
9
+ def initialize(category,repo_name,repo_uri)
21
10
 
22
- @repo, @category, @folder = repo, category, folder
11
+ @repo_uri, @category, @repo_name = repo_uri, category, repo_name
23
12
 
24
13
  if @category
25
14
  @category_path = File.join(Gill.config.source_path, @category)
26
15
  else
27
- # If passed only a repository uri.
28
- # Set the category name to misc by default.
29
- # TODO: Add the default repo sub-folder name to the gill configuration file.
30
- @category = basename(Gill.config.default_path)
16
+ @category = basename(Gill.config.default_path).to_s
31
17
  @category_path = File.join(Gill.config.source_path, @category)
32
18
  end
33
19
 
34
- if @folder
35
- @folder_path = File.join(@category_path, @folder)
36
- else
37
- @folder_path = @category_path
38
- end
39
-
40
- end
41
-
42
- # Update A Repository
43
- #
44
- # @param [String] branch
45
- # The branch to git pull
46
- #
47
- def update(branch='master')
48
- raise(CategoryMissing, "Unknown Category: `#{@folder}`") unless File.directory?(@category_path)
49
- raise(RepositoryMissing, "Unknown Repository: `#{@folder}`") unless File.directory?(@folder_path)
50
- Dir.chdir(@folder_path)
51
- STDOUT.puts "Updating #{@folder} repository."
52
- if system('git', 'pull', 'origin', branch)
53
- STDOUT.puts "#{@folder.capitalize} updated successfully."
20
+ if @repo_name
21
+ @repo_path = File.join(@category_path, @repo_name)
54
22
  else
55
- STDOUT.puts "Failed to update #{@folder.capitalize} successfully."
23
+ @repo_path = @category_path
56
24
  end
25
+
26
+ # Used for updating cloned repositories.
27
+ @matches = []
57
28
  end
58
29
 
59
- # Update the gill cache after cloning a new repository.
60
- def build_cache
61
- updated_cache = Gill.config.cache
30
+ def update_cache
31
+ cache = Gill.config.cache
62
32
 
63
- if updated_cache[:"#{@category}"]
64
- updated_cache[:"#{@category}"] = updated_cache[:"#{@category}"].merge!({:"#{@folder}" => { :repo => @repo, :path => @folder_path }})
33
+ if cache[:categories].has_key?(@category.to_sym)
34
+ cache[:categories][@category.to_sym] = cache[:categories][@category.to_sym].merge!({@repo_name.to_sym => { :repo => @repo_uri, :path => @repo_path }})
65
35
  else
66
- updated_cache.merge!({:"#{@category}" => {:"#{@folder}" => { :repo => @repo, :path => @folder_path }}})
36
+ cache[:categories].merge!(@category.to_sym => { @repo_name.to_sym => { :repo => @repo_uri, :path => @repo_path }})
67
37
  end
68
38
 
69
- rebuild_cache(updated_cache,Gill.config.cache_path)
39
+ Gill.config.write_cache(cache)
70
40
  end
71
41
 
72
42
  # Create the repository category folder if it does not exist.
@@ -74,29 +44,42 @@ module Gill
74
44
  # @param [Boolean] make_folder
75
45
  # Pass false to ignore the creation of the passed gill folder
76
46
  #
77
- def build_type_folder(make_folder=true)
47
+ def build_category_folder
78
48
  unless File.directory?(@category_path)
79
49
  FileUtils.mkdir_p(@category_path)
80
50
  end
81
51
  end
52
+
53
+ def update
54
+
55
+ paths = Dir[File.join(Gill.config.source_path,'**',@repo_name)]
56
+
57
+ paths.each do |path|
58
+
59
+ if Gill.config.paths.include?(path)
60
+
61
+ ask "Update #{blue(basename(path))} => #{green(path)}?", :default => true do
62
+ Dir.chdir(path)
63
+ system('git', 'pull', 'origin', 'master')
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
82
70
 
83
71
  #
84
72
  # Clone the passed repository uri name.
85
73
  #
86
74
  def clone
87
-
88
- if File.directory?(@folder_path)
89
-
90
- raise(DirectoryError, "destination path '#{@folder_path}' already exists and is not an empty directory.")
91
-
75
+ if File.directory?(@repo_path)
76
+ raise(DirectoryError, red("destination path '#{@repo_path}' already exists and is not an empty directory."))
92
77
  else
93
-
94
- build_type_folder
95
- build_cache if system('git', 'clone', @repo, @folder_path)
96
-
78
+ build_category_folder
79
+ update_cache if system('git', 'clone', @repo_uri, @repo_path)
97
80
  end
98
81
  end
99
82
 
100
- end
101
83
 
84
+ end
102
85
  end
data/lib/gill/helper.rb CHANGED
@@ -1,12 +1,35 @@
1
1
  module Gill
2
+
2
3
  module Helper
3
-
4
+
5
+ def green(msg)
6
+ "\e[32m#{msg}\e[0m"
7
+ end
8
+
9
+ def blue(msg)
10
+ "\e[34m#{msg}\e[0m"
11
+ end
12
+
13
+ def red(msg)
14
+ "\e[31m#{msg}\e[0m"
15
+ end
16
+
17
+ def gill_error(msg)
18
+ STDERR.puts red("#{msg}")
19
+ exit -1
20
+ end
21
+
4
22
  def basename(path)
5
23
  Pathname.new(path).basename
6
24
  end
7
25
 
26
+ def parent(path)
27
+ Pathname.new(path).parent
28
+ end
29
+
8
30
  def folder_empty?(folder)
9
- Dir.enum_for(:foreach, folder).any? {|n| /\A\.\.?\z/ !~ n}
31
+ return true unless Dir.enum_for(:foreach, folder).any? {|n| /\A\.\.?\z/ !~ n}
32
+ false
10
33
  end
11
34
 
12
35
  # Prompt the use for input
@@ -34,13 +57,13 @@ module Gill
34
57
  if input[/([Yy]|[Yy]es)$/i]
35
58
  yield
36
59
  elsif input[/([Nn]|[Nn]o)$/i]
37
- exit -1
60
+ return
38
61
  else
39
62
  yield if default
40
63
  end
41
64
  end
42
65
  end
43
66
 
44
-
45
67
  end
46
- end
68
+
69
+ end
data/lib/gill/import.rb CHANGED
@@ -4,11 +4,11 @@ module Gill
4
4
 
5
5
  class Import
6
6
  # Include the gill cache convenience methods.
7
- include Config::Cache
8
7
  include Helper
8
+ include Settings
9
9
 
10
10
  def initialize
11
- @updated_cache = Gill.config.cache || {}
11
+ @updated_cache = Gill.config.cache
12
12
  STDOUT.puts "Please wait..."
13
13
  end
14
14
 
@@ -48,10 +48,12 @@ module Gill
48
48
  git_uri = git_uri_for(path)
49
49
 
50
50
  if repo_in_root(basename)
51
+
51
52
  ask "Do you want to move #{basename(Gill.config.source_path)}/#{basename(repo_name)} to #{basename(Gill.config.source_path)}/#{basename(Gill.config.default_path)}/#{basename(repo_name)}?", :default => false do
52
- move_root_repos_to_default_path(path,File.join(Gill.config.source_path, 'misc', repo_name))
53
- add(basename(Gill.config.default_path),repo_name,git_uri,File.join(Gill.config.source_path, 'misc', repo_name))
53
+ move_root_repos_to_default_path(path,File.join(Gill.config.source_path, basename(Gill.config.default_path), repo_name))
54
+ add(basename(Gill.config.default_path),repo_name,git_uri,File.join(Gill.config.source_path, basename(Gill.config.default_path), repo_name))
54
55
  end
56
+
55
57
  else
56
58
  add(basename,repo_name,git_uri,path)
57
59
  end
@@ -77,19 +79,19 @@ module Gill
77
79
 
78
80
  def add(category,repo_name,git_uri,path)
79
81
 
80
- if @updated_cache.has_key?(category.to_s.downcase.to_sym)
82
+ if @updated_cache[:categories].has_key?(category.to_s.downcase.to_sym)
81
83
 
82
- @updated_cache[category.to_s.downcase.to_sym].merge!({repo_name.to_sym => {:repo => git_uri, :path => path}})
84
+ @updated_cache[:categories][category.to_s.downcase.to_sym].merge!({repo_name.to_sym => {:repo => git_uri, :path => path}})
83
85
 
84
86
  else
85
- @updated_cache[category.to_s.downcase.to_sym] = { repo_name.to_sym => { :repo => git_uri, :path => path }}
87
+ @updated_cache[:categories][category.to_s.downcase.to_sym] = { repo_name.to_sym => { :repo => git_uri, :path => path }}
86
88
  end
87
89
 
88
90
  end
89
91
 
90
92
  def update_cache
91
- STDOUT.puts "Import Completed Successfully."
92
- rebuild_cache(@updated_cache, Gill.config.cache_path)
93
+ STDOUT.puts green("Import Completed Successfully.")
94
+ Gill.config.write_cache(@updated_cache)
93
95
  end
94
96
 
95
97
  def repo_in_root(folder)
data/lib/gill/remove.rb CHANGED
@@ -1,113 +1,76 @@
1
1
  module Gill
2
2
 
3
3
  class Remove
4
-
5
- # include the cache methods
6
- include Config::Cache
7
-
8
- # include all helper methods
9
4
  include Helper
5
+ include Settings
10
6
 
11
- # Initialize a remove object.
12
- #
13
- # @param [String] args
14
- # The string to be parsed for the remove object.
15
- #
16
7
  def initialize(args)
17
- data = args.split('#')
18
- # Raise ArgumentError if passed the incorrect amount of arguments.
19
- raise(ArgumentError, 'Wrong number of arguments.') if data.length != 2
20
- @source = Gill.config.source_path
21
- @category = data.first
22
- @folder = data.last
8
+ @args = args.split(/\#/)
9
+ @category, @repo_name = @args.first, @args.last
10
+ @category_path = File.join(Gill.config.source_path, @category)
11
+ @repo_path = File.join(@category_path, @repo_name)
12
+ @parent_folders = []
23
13
  end
24
14
 
25
- #
26
- # remove the repository from the gill cache.
27
- #
28
- def remove_cache
29
- updated_cache = Gill.config.cache
30
-
31
- if updated_cache[@category.to_sym]
32
- updated_cache[@category.to_sym].delete(@folder.to_sym)
15
+ def remove_repo
16
+ remove_repository_files if category_exists? && repo_exists?
17
+ end
33
18
 
34
- if updated_cache[@category.to_sym].empty?
35
- updated_cache.delete(@category.to_sym)
36
- rebuild_cache(updated_cache, Gill.config.cache_path)
37
- return true
19
+ private
38
20
 
39
- else
21
+ def clean_cache
22
+ Gill.config.clean_cache
23
+ end
40
24
 
41
- rebuild_cache(updated_cache, Gill.config.cache_path)
42
- return false
25
+ def cached_repo_path
26
+ Gill.config.categories[@category.to_sym][@repo_name.to_sym][:path]
27
+ end
43
28
 
29
+ def category_exists?
30
+ return true if File.directory?(@category_path)
31
+ if Gill.config.categories.has_key?(@category_path.to_sym)
32
+ return true if File.directory?(cached_repo_path)
44
33
  end
34
+ raise(CategoryMissing, red("Unknown Category: #{@category}"))
35
+ end
45
36
 
37
+ def repo_exists?
38
+ return true if File.directory?(@repo_path) || File.directory?(cached_repo_path)
39
+ raise(RepositoryMissing, red("Unknown Repository: #{@category}"))
46
40
  end
47
- end
48
41
 
49
- #
50
- # Return true if the passed key and value exists.
51
- #
52
- # @param [Hash] args
53
- # A key and value to check the existence of.
54
- #
55
- # @return [Boolean] valid
56
- # Return true if the passed key and value exists in the gill cache file.
57
- #
58
- def keys_exist(args={})
59
- @valid = true
60
- args.each do |key,value|
61
- @valid = false if !Gill.config.cache[key.to_sym]
62
- @valid = false if !Gill.config.cache[key.to_sym][value.to_sym]
42
+ def known_category?(key)
43
+ return true if Gill.config.repos.has_key?(key.to_s.to_sym)
44
+ false
63
45
  end
64
- @valid
65
- end
66
46
 
67
- #
68
- # Return true or false if the passed folder contains any files and/or sub-folders.
69
- #
70
- def category_folder_empty?
71
- Dir.enum_for(:foreach, @type_folder).any? {|n| /\A\.\.?\z/ !~ n}
72
- end
73
-
74
- #
75
- # Check Cache - Raise exceptions
76
- #
77
- def check_gill_cache_and_folders
78
- raise(CategoryMissing, "Unknown Category: `#{@folder}`") unless File.directory?(@type_folder)
79
- raise(RepositoryMissing, "Unknown Repository: `#{@folder}`") unless File.directory?(@repo_name)
80
- raise(CacheError, 'The gill cache appears to be empty.') if Gill.config.cache.empty?
81
- raise(DirectoryError, "The directory #{@repo_name} does not exist or was not cloned with gill.") unless keys_exist(:"#{@category}" => @folder)
82
- end
83
-
84
- #
85
- # Remove the gill category folder.
86
- #
87
- def remove_gill_category_folder
88
- unless category_folder_empty?
89
- ask "The `#{@category}` directory is empty. Would you like to remove it?", :default => false do
90
- STDOUT.puts "#{@category.capitalize} directory removed successfully."
91
- FileUtils.rm_rf(@type_folder)
47
+ def find_parents_for_repo(path)
48
+ unless basename(path).to_s == basename(Gill.config.source_path).to_s
49
+ @parent_folders << path if known_category?(basename(path))
50
+ find_parents_for_repo(parent(path))
92
51
  end
93
52
  end
94
- end
95
53
 
96
- #
97
- # remove all files and folders associated with the remove object.
98
- #
99
- def remove_repo
100
- instance_variable_set(:@type_folder, File.join(@source,@category))
101
- instance_variable_set(:@repo_name, File.join(@source,@category,@folder))
102
- check_gill_cache_and_folders
103
-
104
- ask "Are you sure you want to remove #{@folder}?", :default => false do
105
- STDOUT.puts "#{@folder.capitalize} removed successfully."
106
- FileUtils.rm_rf(@repo_name)
107
- remove_gill_category_folder
108
- remove_cache
54
+ def remove_repository_files
55
+ find_parents_for_repo(cached_repo_path)
56
+
57
+ ask "Are you sure you want to remove the repository: #{@repo_name}?", :default => false do
58
+ STDOUT.puts green("#{@repo_name.capitalize} removed successfully.")
59
+ FileUtils.rm_rf(cached_repo_path)
60
+ end
61
+
62
+ @parent_folders.each do |path|
63
+ if folder_empty?(path)
64
+ unless basename(path).to_s == basename(Gill.config.default_path).to_s
65
+ ask "Would you like to remove the empty parent folder: #{basename(path)}?", :default => false do
66
+ STDOUT.puts green("#{path.to_s.capitalize} removed successfully.")
67
+ FileUtils.rm_rf(path)
68
+ end
69
+ end
70
+ end
71
+ end
109
72
  end
110
- end
111
73
 
112
74
  end
75
+
113
76
  end
data/lib/gill/version.rb CHANGED
@@ -1,4 +1,3 @@
1
1
  module Gill
2
- # Gill Version
3
- VERSION = "1.0.0.rc.4" unless defined?(::Gill::VERSION)
2
+ VERSION = '1.0.0'
4
3
  end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Settings::Config do
4
+
5
+ before(:all) do
6
+ Gill.config = Settings::Config.new('/tmp')
7
+ end
8
+
9
+ after(:all) do
10
+ FileUtils.rm_rf('/tmp/source')
11
+ FileUtils.rm_rf('/tmp/.gillrc')
12
+ FileUtils.rm_rf('/tmp/.gillcache')
13
+ end
14
+
15
+ it "should have a source path ok /tmp/source" do
16
+ Gill.config.source_path.should == '/tmp/source'
17
+ end
18
+
19
+ it "should have a default path of /tmp/source/misc" do
20
+ Gill.config.default_path.should == '/tmp/source/misc'
21
+ end
22
+
23
+ it "should have a cache path of /tmp/.gillcache" do
24
+ Gill.config.cache_path.should == '/tmp/.gillcache'
25
+ end
26
+
27
+ it "should have a configuration path of /tmp/.gillrc" do
28
+ Gill.config.settings_path.should == '/tmp/.gillrc'
29
+ end
30
+
31
+ it "should have created a .gillcache file." do
32
+ File.should exist(Gill.config.cache_path)
33
+ end
34
+
35
+ it "should have created a .gillrc file." do
36
+ File.should exist(Gill.config.settings_path)
37
+ end
38
+
39
+ it "should have created a source folder." do
40
+ File.should exist(Gill.config.source_path)
41
+ end
42
+
43
+ it "should have created a default repository location folder." do
44
+ File.should exist(Gill.config.default_path)
45
+ end
46
+
47
+ end