From c9608ac4da5f304c4af7e8e4ca5352f92b2c0758 Mon Sep 17 00:00:00 2001 From: Vern Burton Date: Fri, 23 Feb 2018 18:49:14 -0600 Subject: [PATCH 1/7] adding boolean functions for git status --- lib/git/status.rb | 24 ++++++++++++++++++++---- tests/units/test_status.rb | 17 ++++++++++++++--- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/git/status.rb b/lib/git/status.rb index d59bc777..3e5cfbf7 100644 --- a/lib/git/status.rb +++ b/lib/git/status.rb @@ -9,19 +9,35 @@ def initialize(base) end def changed - @files.select { |k, f| f.type == 'M' } + @files.select { |_k, f| f.type == 'M' } + end + + def changed?(file) + changed.member?(file) end def added - @files.select { |k, f| f.type == 'A' } + @files.select { |_k, f| f.type == 'A' } + end + + def added?(file) + added.member?(file) end def deleted - @files.select { |k, f| f.type == 'D' } + @files.select { |_k, f| f.type == 'D' } + end + + def deleted?(file) + deleted.member?(file) end def untracked - @files.select { |k, f| f.untracked } + @files.select { |_k, f| f.untracked } + end + + def untracked? + untracked.member?(file) end def pretty diff --git a/tests/units/test_status.rb b/tests/units/test_status.rb index 6479b628..9c3475b9 100644 --- a/tests/units/test_status.rb +++ b/tests/units/test_status.rb @@ -12,16 +12,27 @@ def setup def test_dot_files_status in_temp_dir do |path| git = Git.clone(@wdir, 'test_dot_files_status') - + create_file('test_dot_files_status/test_file_1', 'content tets_file_1') create_file('test_dot_files_status/.test_file_2', 'content test_file_2') - + git.add('test_file_1') git.add('.test_file_2') - + assert(git.status.added.assoc('test_file_1')) assert(git.status.added.assoc('.test_file_2')) end end + def test_added_boolean + in_temp_dir do |path| + git = Git.clone(@wdir, 'test_dot_files_status') + + create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + + git.add('test_file_1') + + assert(git.status.added?('test_file_1')) + end + end end From 082c4a7c298d7aee7623f0d427558f524b73d3ee Mon Sep 17 00:00:00 2001 From: Vern Burton Date: Fri, 23 Feb 2018 19:08:28 -0600 Subject: [PATCH 2/7] adding file to untracked?; adding tests for the reminder of the new functions --- lib/git/status.rb | 2 +- tests/units/test_status.rb | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/git/status.rb b/lib/git/status.rb index 3e5cfbf7..5315388c 100644 --- a/lib/git/status.rb +++ b/lib/git/status.rb @@ -36,7 +36,7 @@ def untracked @files.select { |_k, f| f.untracked } end - def untracked? + def untracked?(file) untracked.member?(file) end diff --git a/tests/units/test_status.rb b/tests/units/test_status.rb index 9c3475b9..066abb0e 100644 --- a/tests/units/test_status.rb +++ b/tests/units/test_status.rb @@ -35,4 +35,42 @@ def test_added_boolean assert(git.status.added?('test_file_1')) end end + + def test_changed_boolean + in_temp_dir do |path| + git = Git.clone(@wdir, 'test_dot_files_status') + + create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + + git.add('test_file_1') + git.commit('message') + update_file('test_dot_files_status/test_file_1', 'update_content tets_file_1') + + assert(git.status.changed?('test_file_1')) + end + end + + def test_deleted_boolean + in_temp_dir do |path| + git = Git.clone(@wdir, 'test_dot_files_status') + + create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + + git.add('test_file_1') + git.commit('message') + delete_file('test_dot_files_status/test_file_1') + + assert(git.status.deleted?('test_file_1')) + end + end + + def test_untracked_boolean + in_temp_dir do |path| + git = Git.clone(@wdir, 'test_dot_files_status') + + create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + + assert(git.status.untracked?('test_file_1')) + end + end end From 3d1e9790dabd846cb6c796bd4312bde2391d47e9 Mon Sep 17 00:00:00 2001 From: Vern Burton Date: Sat, 24 Feb 2018 06:43:28 -0600 Subject: [PATCH 3/7] adding false test cases to new functions Signed-off-by: Vern Burton --- tests/units/test_status.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/units/test_status.rb b/tests/units/test_status.rb index 066abb0e..76f7ea25 100644 --- a/tests/units/test_status.rb +++ b/tests/units/test_status.rb @@ -29,10 +29,12 @@ def test_added_boolean git = Git.clone(@wdir, 'test_dot_files_status') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + create_file('test_dot_files_status/test_file_2', 'content tets_file_2') git.add('test_file_1') assert(git.status.added?('test_file_1')) + assert !git.status.added?('test_file_2') end end @@ -41,12 +43,15 @@ def test_changed_boolean git = Git.clone(@wdir, 'test_dot_files_status') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + create_file('test_dot_files_status/test_file_2', 'content tets_file_2') git.add('test_file_1') + git.add('test_file_2') git.commit('message') update_file('test_dot_files_status/test_file_1', 'update_content tets_file_1') assert(git.status.changed?('test_file_1')) + assert !git.status.changed?('test_file_2') end end @@ -55,12 +60,14 @@ def test_deleted_boolean git = Git.clone(@wdir, 'test_dot_files_status') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + create_file('test_dot_files_status/test_file_2', 'content tets_file_2') git.add('test_file_1') git.commit('message') delete_file('test_dot_files_status/test_file_1') assert(git.status.deleted?('test_file_1')) + assert !git.status.deleted?('test_file_2') end end @@ -69,8 +76,11 @@ def test_untracked_boolean git = Git.clone(@wdir, 'test_dot_files_status') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') + create_file('test_dot_files_status/test_file_2', 'content tets_file_2') + git.add('test_file_2') assert(git.status.untracked?('test_file_1')) + assert !git.status.untracked?('test_file_2') end end end From 75860ea30c139e7bc59afc0a6c1db9a03bb24208 Mon Sep 17 00:00:00 2001 From: Vern Burton Date: Mon, 26 Feb 2018 19:36:10 -0600 Subject: [PATCH 4/7] fixing thread safety to pass travis for jruby --- tests/units/test_thread_safty.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/units/test_thread_safty.rb b/tests/units/test_thread_safty.rb index fd2dd2c0..401659a5 100644 --- a/tests/units/test_thread_safty.rb +++ b/tests/units/test_thread_safty.rb @@ -10,18 +10,18 @@ def setup def test_git_init_bare dirs = [] threads = [] - - 5.times do + + 5.times do dirs << Dir.mktmpdir end - + dirs.each do |dir| threads << Thread.new do Git.init(dir, :bare => true) end end - threads.each {|thread| thread.join} + threads.each(&:join) dirs.each do |dir| Git.bare("#{dir}/.git").ls_files From 17a3bfc5da3c0d0e2eb9eaf16c42a1604633f6da Mon Sep 17 00:00:00 2001 From: Per Lundberg Date: Wed, 28 Feb 2018 08:46:55 +0200 Subject: [PATCH 5/7] Use parentheses in method calls --- tests/units/test_status.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/units/test_status.rb b/tests/units/test_status.rb index 76f7ea25..f088616d 100644 --- a/tests/units/test_status.rb +++ b/tests/units/test_status.rb @@ -34,7 +34,7 @@ def test_added_boolean git.add('test_file_1') assert(git.status.added?('test_file_1')) - assert !git.status.added?('test_file_2') + assert(!git.status.added?('test_file_2')) end end From fb4ba018c3415aa44dffe3e028350d83d3e3f71c Mon Sep 17 00:00:00 2001 From: Per Lundberg Date: Wed, 28 Feb 2018 08:47:47 +0200 Subject: [PATCH 6/7] More of the same --- tests/units/test_status.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/units/test_status.rb b/tests/units/test_status.rb index f088616d..0cb863da 100644 --- a/tests/units/test_status.rb +++ b/tests/units/test_status.rb @@ -51,7 +51,7 @@ def test_changed_boolean update_file('test_dot_files_status/test_file_1', 'update_content tets_file_1') assert(git.status.changed?('test_file_1')) - assert !git.status.changed?('test_file_2') + assert(!git.status.changed?('test_file_2')) end end @@ -67,7 +67,7 @@ def test_deleted_boolean delete_file('test_dot_files_status/test_file_1') assert(git.status.deleted?('test_file_1')) - assert !git.status.deleted?('test_file_2') + assert(!git.status.deleted?('test_file_2')) end end @@ -80,7 +80,7 @@ def test_untracked_boolean git.add('test_file_2') assert(git.status.untracked?('test_file_1')) - assert !git.status.untracked?('test_file_2') + assert(!git.status.untracked?('test_file_2')) end end end From 751fe3fbc016117ee1d493a8258245c1b82950e6 Mon Sep 17 00:00:00 2001 From: Vern Burton Date: Wed, 28 Feb 2018 20:19:13 -0600 Subject: [PATCH 7/7] adding yard documents to the functions that I added and have knowledge about fixing rubocop - broke method to make line count while breaking up function into functional zone - fixed heredoc spacing - removed redundant self - rescue should not be used as a modifer, moved to begin/rescue --- lib/git/status.rb | 172 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 119 insertions(+), 53 deletions(-) diff --git a/lib/git/status.rb b/lib/git/status.rb index 5315388c..23050e08 100644 --- a/lib/git/status.rb +++ b/lib/git/status.rb @@ -1,48 +1,102 @@ module Git - + # + # A class for git status + # class Status include Enumerable - + def initialize(base) @base = base construct_status end - + + # + # Returns an Enumerable containing files that have changed from the + # git base directory + # + # @return [Enumerable] def changed @files.select { |_k, f| f.type == 'M' } end + # + # Determines whether the given file has been changed. + # File path starts at git base directory + # + # @param file [String] The name of the file. + # @example Check if lib/git.rb has changed. + # changed?('lib/git.rb') + # @return [Boolean] def changed?(file) changed.member?(file) end - + + # + # Returns an Enumerable containing files that have been added. + # File path starts at git base directory + # + # @return [Enumerable] def added @files.select { |_k, f| f.type == 'A' } end + # + # Determines whether the given file has been added to the repository + # File path starts at git base directory + # + # @param file [String] The name of the file. + # @example Check if lib/git.rb is added. + # added?('lib/git.rb') + # @return [Boolean] def added?(file) added.member?(file) end + # + # Returns an Enumerable containing files that have been deleted. + # File path starts at git base directory + # + # @return [Enumerable] def deleted @files.select { |_k, f| f.type == 'D' } end + # + # Determines whether the given file has been deleted from the repository + # File path starts at git base directory + # + # @param file [String] The name of the file. + # @example Check if lib/git.rb is deleted. + # deleted?('lib/git.rb') + # @return [Boolean] def deleted?(file) deleted.member?(file) end - + + # + # Returns an Enumerable containing files that are not tracked in git. + # File path starts at git base directory + # + # @return [Enumerable] def untracked @files.select { |_k, f| f.untracked } end + # + # Determines whether the given file has is tracked by git. + # File path starts at git base directory + # + # @param file [String] The name of the file. + # @example Check if lib/git.rb is an untracked file. + # untracked?('lib/git.rb') + # @return [Boolean] def untracked?(file) untracked.member?(file) end - + def pretty out = '' - self.each do |file| + each do |file| out << pretty_file(file) end out << "\n" @@ -50,26 +104,27 @@ def pretty end def pretty_file(file) - < file, :untracked => true} - end - end - - # find modified in tree - @base.lib.diff_files.each do |path, data| - @files[path] ? @files[path].merge!(data) : @files[path] = data - end - - # find added but not committed - new files - @base.lib.diff_index('HEAD').each do |path, data| - @files[path] ? @files[path].merge!(data) : @files[path] = data - end - - @files.each do |k, file_hash| - @files[k] = StatusFile.new(@base, file_hash) + + def construct_status + @files = @base.lib.ls_files + + fetch_untracked + fetch_modified + fetch_added + + @files.each do |k, file_hash| + @files[k] = StatusFile.new(@base, file_hash) + end + end + + def fetch_untracked + ignore = @base.lib.ignored_files + + Dir.chdir(@base.dir.path) do + Dir.glob('**/*', File::FNM_DOTMATCH) do |file| + next if @files[file] || File.directory?(file) || + ignore.include?(file) || file =~ %r{^.git\/.+} + + @files[file] = { path: file, untracked: true } end end - + end + + def fetch_modified + # find modified in tree + @base.lib.diff_files.each do |path, data| + @files[path] ? @files[path].merge!(data) : @files[path] = data + end + end + + def fetch_added + # find added but not committed - new files + @base.lib.diff_index('HEAD').each do |path, data| + @files[path] ? @files[path].merge!(data) : @files[path] = data + end + end end - end