Решение на Пета задача от Борис Монев

Обратно към всички решения

Към профила на Борис Монев

Резултати

  • 1 точка от тестове
  • 0 бонус точки
  • 1 точка общо
  • 7 успешни тест(а)
  • 23 неуспешни тест(а)

Код

require 'digest'
require 'date'
class Class
alias init new
end
class ObjectAdd
def initialize(name, object)
@name = name
@object = object
@victory = true
end
def message
"Added #{@name} to stage."
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class CommitMessage
def initialize(message, count)
@victory = (count != 0)
@count = count
@message = message
end
def message
if @victory
"#{@message}\n\t#{@count} objects changed"
else
"Nothing to commit, working directory clean."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class RemoveMessage
def initialize(name, object)
@victory = (object != false)
@object = object
@name = name
end
def result
@object
end
def message
if @victory
"Added #{@name} for removal."
else
"Object #{@name} is not committed."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class CheckoutCommit
def initialize(comit_hash, object)
@victory = (object != false)
@hash = comit_hash
@object = object
end
def message
if @victory
"HEAD is now at #{@hash}."
else
"Commit #{@hash} does not exist."
end
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class LastCommit
def initialize(name, message, commit)
@victory = (commit != false)
@object = commit
@message = message
@name = name
end
def message
if @victory
"#{@message}"
else
"Branch #{@name} does not have any commits yet."
end
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class CreateBranch
def initialize(name, condition)
@victory = condition
@name = name
end
def message
if @victory
"Created branch #{@name}."
else
"Branch #{@name} already exists."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class CheckoutBranch
def initialize(name, condition)
@victory = condition
@name = name
end
def message
if @victory
"Switched to branch #{@name}."
else
"Branch #{@name} does not exist."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class RemoveBranch
def initialize(name, condition, exists)
@victory = (condition != false) and (exists != false)
@exists = exists
@name = name
end
def message
if @victory
"Removed branch #{@name}."
elsif (@exists == false)
"Branch #{@name} does not exist."
else
"Cannot remove current branch."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class BranchList
def initialize(names, current_index)
@victory = true
@names = names
@index = current_index
end
def message
message = @names.map { |n| " " + n }
message[@index][1] = "*"
message.join"\n"
end
def success?
@victory
end
def error?
! @victory
end
end
class BranchLog
def initialize(name, commits)
@victory = commits.any?
@name = name
@commits = commits
end
def message
if @victory
m = @commits.map{|n| "Commit #{n.hash}\nDate: #{n.date}\n\n\t#{n.message}"}
m.join"\n\n"
else
"Branch #{@name} does not have any commits yet."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class GetMessage
def initialize(name, object)
@victory = (object != nil)
@name = name
@object = object
end
def message
if @victory
"Found object #{@name}."
else
"Object #{@name} is not committed."
end
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class ObjectStore
class Commit
def initialize (objects = {}, message)
@objects , @message = objects, message
@date = Time.new
@date = @date.strftime("%a %b %d %k:%M:%S %Y %z")
@commit_hash = Digest::SHA1.hexdigest(@date + @message)
end
def get_object(name)
@objects[name]
end
def date
@date
end
def message
@message
end
def objects
@objects.values
end
def get_names
@objects.keys
end
def remove(name)
@objects.delete(name)
end
def hash
@commit_hash
end
end
class Branch
def initialize(name = nil)
@name = name
@commits = []
@storage = {}
@removed = 0
end
def name
@name
end
def create(branch_name)
if @branches.any? { |n| n.name == branch_name }
CreateBranch.new(branch_name, false)
else
@name = branch_name
@branches.push(self)
CreateBranch.new(branch_name, true)
end
end
def add(name, object)
@storage.merge!(name => object)
end
def commit(message)
return 0 if @storage.empty? and (@removed == 0)
helper = @storage.invert.invert
count, @removed = @removed, 0
@storage.clear
@commits.push(Commit.new(helper, message))
count + helper.size
end
def get_commits
@commits
end
def remove_object(name)
commit = @commits.last
return false if ! commit.get_names.include?(name)
@removed += 1
commit.delete(name)
end
def checkout_commit(commit_hash)
return false if @commits.none? { |n| n.hash == commit_hash }
length = @commits.find_index { |n| n.hash == commit_hash } + 1
@commits = @commits.take(length)
@commits.last
end
def checkout(branch_name)
if @branches.none? { |n| n.name == branch_name }
CheckoutBranch.new(branch_name, false)
else
index = @branches.find_index { |n| n.name == branch_name }
@current_branch = @branches[index]
CheckoutBranch.new(branch_name, true)
end
end
def remove(branch_name)
if @branches.none? { |n| n.name == branch_name }
RemoveBranch.new(branch_name, true, false)
elsif @current_branch.name == branch_name
RemoveBranch.new(branch_name, false, true)
else
index = @branches.find_index { |n| n.name == branch_name }
@branches.delete_at(index)
RemoveBranch.new(branch_name, true, true)
end
end
def list
branch_names = @branches.map { |n| n.name }.sort
index = branch_names.find_index { |name| name == @current_branch.name }
BranchList.new(branch_names,index)
end
end
def initialize
@branches = []
@branches.push(Branch.new('master'))
@current_branch = @branches.first
end
def add(name, object)
@current_branch.add(name, object)
ObjectAdd.new(name, object)
end
def commit(message)
count = @current_branch.commit(message)
CommitMessage.new(message, count)
end
def remove(name)
RemoveMessage.new(name, @current_branch.remove_object(name))
end
def checkout(commit_hash)
result = @current_branch.checkout_commit(commit_hash)
CheckoutCommit(commit_hash, result)
end
def branch
Branch.new
end
def log
BranchLog(@current_branch.name, @current_branch.get_commits)
end
def head
if @current_branch.get_commits.empty?
LastCommit.new(@current_branch.name, 0, false)
else
head = @current_branch.get_commits.last
LastCommit.new(@current_branch.name, head.message, head)
end
end
def get(name)
commits = @current_branch.get_commits.reverse
index = commits.find_index { |n| n.get_names.include?(name) }
if index == nil
GetMessage.new(name, nil)
else
object = commits[index].get_object(name)
GetMessage.new(name, object)
end
end
end

Лог от изпълнението

.F.FF.F.FFFFFFFFFFFFFF...FFFFF

Failures:

  1) ObjectStore can commit objects
     Failure/Error: (result == nil || actual.result == result) &&
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6a8bd5d0>
     # /tmp/d20160111-5693-nf7dx/spec.rb:7:in `block (3 levels) in <top (required)>'
     # /tmp/d20160111-5693-nf7dx/spec.rb:30:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) ObjectStore can remove objects
     Failure/Error: expect(repo.remove("object1")).to be_success("Added object1 for removal.", "content1")
     NoMethodError:
       undefined method `delete' for #<ObjectStore::Commit:0x007f2f6aa8ca28>
     # /tmp/d20160111-5693-nf7dx/solution.rb:374:in `remove_object'
     # /tmp/d20160111-5693-nf7dx/solution.rb:431:in `remove'
     # /tmp/d20160111-5693-nf7dx/spec.rb:43:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) ObjectStore can commit changes which include only removed objects
     Failure/Error: repo.remove("object2")
     NoMethodError:
       undefined method `delete' for #<ObjectStore::Commit:0x007f2f6aa71660>
     # /tmp/d20160111-5693-nf7dx/solution.rb:374:in `remove_object'
     # /tmp/d20160111-5693-nf7dx/solution.rb:431:in `remove'
     # /tmp/d20160111-5693-nf7dx/spec.rb:52:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) ObjectStore can show head
     Failure/Error: last_commit = repo.commit("There we go").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6aa3f408>
     # /tmp/d20160111-5693-nf7dx/spec.rb:68:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) ObjectStore can show log of changes for a single commit
     Failure/Error: commit = repo.commit("So cool!").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6aa1dbf0>
     # /tmp/d20160111-5693-nf7dx/spec.rb:81:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  6) ObjectStore can show log of changes for a single commit
     Failure/Error: commit = repo.commit("So cool!").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6aa04240>
     # /tmp/d20160111-5693-nf7dx/spec.rb:90:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  7) ObjectStore can show log of changes for multiple commits
     Failure/Error: commit1 = repo.commit("First commit").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6a9dd370>
     # /tmp/d20160111-5693-nf7dx/spec.rb:98:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  8) ObjectStore shows the log for the current branch only
     Failure/Error: commit1 = repo.commit("First commit").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6a9d4860>
     # /tmp/d20160111-5693-nf7dx/spec.rb:114:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  9) ObjectStore cannot show log for empty repository
     Failure/Error: expect(repo.log).to be_error("Branch master does not have any commits yet.")
     NoMethodError:
       undefined method `BranchLog' for #<ObjectStore:0x007f2f6a9c7278>
     # /tmp/d20160111-5693-nf7dx/solution.rb:444:in `log'
     # /tmp/d20160111-5693-nf7dx/spec.rb:133:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  10) ObjectStore can list branches
     Failure/Error: repo.branch.create("develop")
     NoMethodError:
       undefined method `any?' for nil:NilClass
     # /tmp/d20160111-5693-nf7dx/solution.rb:344:in `create'
     # /tmp/d20160111-5693-nf7dx/spec.rb:138:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  11) ObjectStore can create branches
     Failure/Error: expect(repo.branch.create("develop")).to be_success("Created branch develop.")
     NoMethodError:
       undefined method `any?' for nil:NilClass
     # /tmp/d20160111-5693-nf7dx/solution.rb:344:in `create'
     # /tmp/d20160111-5693-nf7dx/spec.rb:145:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  12) ObjectStore cannot create branch if already exists
     Failure/Error: expect(repo.branch.create("master")).to be_error("Branch master already exists.")
     NoMethodError:
       undefined method `any?' for nil:NilClass
     # /tmp/d20160111-5693-nf7dx/solution.rb:344:in `create'
     # /tmp/d20160111-5693-nf7dx/spec.rb:150:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  13) ObjectStore can switch branches
     Failure/Error: first_commit = repo.commit("First commit").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6a9a29f0>
     # /tmp/d20160111-5693-nf7dx/spec.rb:156:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  14) ObjectStore cannot switch to nonexisting branch
     Failure/Error: expect(repo.branch.checkout("develop")).to be_error("Branch develop does not exist.")
     NoMethodError:
       undefined method `none?' for nil:NilClass
     # /tmp/d20160111-5693-nf7dx/solution.rb:385:in `checkout'
     # /tmp/d20160111-5693-nf7dx/spec.rb:168:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  15) ObjectStore can remove branch
     Failure/Error: repo.branch.create("develop")
     NoMethodError:
       undefined method `any?' for nil:NilClass
     # /tmp/d20160111-5693-nf7dx/solution.rb:344:in `create'
     # /tmp/d20160111-5693-nf7dx/spec.rb:173:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  16) ObjectStore cannot remove current branch
     Failure/Error: expect(repo.branch.remove("master")).to be_error("Cannot remove current branch.")
     NoMethodError:
       undefined method `none?' for nil:NilClass
     # /tmp/d20160111-5693-nf7dx/solution.rb:395:in `remove'
     # /tmp/d20160111-5693-nf7dx/spec.rb:179:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  17) ObjectStore cannot remove nonexisting branch
     Failure/Error: expect(repo.branch.remove("develop")).to be_error("Branch develop does not exist.")
     NoMethodError:
       undefined method `none?' for nil:NilClass
     # /tmp/d20160111-5693-nf7dx/solution.rb:395:in `remove'
     # /tmp/d20160111-5693-nf7dx/spec.rb:184:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  18) ObjectStore can be initialized with block
     Failure/Error: expect(repo.head).to be_success("Second commit", $second_commit)
       expected #<LastCommit:0x007f2f6a8ee068 @victory=false, @object=false, @message=0, @name="master"> to be success "Second commit" and nil
     # /tmp/d20160111-5693-nf7dx/spec.rb:195:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  19) ObjectStore can checkout commits
     Failure/Error: first_commit = repo.commit("First commit").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6a6c9198>
     # /tmp/d20160111-5693-nf7dx/spec.rb:220:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  20) ObjectStore cannot checkout commits with nonexisting hashes
     Failure/Error: expect(repo.checkout("[not-present]")).to be_error("Commit [not-present] does not exist.")
     NoMethodError:
       undefined method `CheckoutCommit' for #<ObjectStore:0x007f2f6a6c58b8>
     # /tmp/d20160111-5693-nf7dx/solution.rb:436:in `checkout'
     # /tmp/d20160111-5693-nf7dx/spec.rb:231:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  21) ObjectStore cannot checkout commits in empty repository
     Failure/Error: expect(repo.checkout("[not-present]")).to be_error("Commit [not-present] does not exist.")
     NoMethodError:
       undefined method `CheckoutCommit' for #<ObjectStore:0x007f2f6a6be568>
     # /tmp/d20160111-5693-nf7dx/solution.rb:436:in `checkout'
     # /tmp/d20160111-5693-nf7dx/spec.rb:236:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  22) ObjectStore can show the objects in a repo after overwriting an object
     Failure/Error: first_commit = repo.commit("First commit").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6a6b0878>
     # /tmp/d20160111-5693-nf7dx/spec.rb:242:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  23) ObjectStore can show the objects of a repo after removing an object
     Failure/Error: first_commit = repo.commit("First commit").result
     NoMethodError:
       undefined method `result' for #<CommitMessage:0x007f2f6b560940>
     # /tmp/d20160111-5693-nf7dx/spec.rb:258:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01934 seconds
30 examples, 23 failures

Failed examples:

rspec /tmp/d20160111-5693-nf7dx/spec.rb:26 # ObjectStore can commit objects
rspec /tmp/d20160111-5693-nf7dx/spec.rb:38 # ObjectStore can remove objects
rspec /tmp/d20160111-5693-nf7dx/spec.rb:46 # ObjectStore can commit changes which include only removed objects
rspec /tmp/d20160111-5693-nf7dx/spec.rb:63 # ObjectStore can show head
rspec /tmp/d20160111-5693-nf7dx/spec.rb:77 # ObjectStore can show log of changes for a single commit
rspec /tmp/d20160111-5693-nf7dx/spec.rb:86 # ObjectStore can show log of changes for a single commit
rspec /tmp/d20160111-5693-nf7dx/spec.rb:95 # ObjectStore can show log of changes for multiple commits
rspec /tmp/d20160111-5693-nf7dx/spec.rb:111 # ObjectStore shows the log for the current branch only
rspec /tmp/d20160111-5693-nf7dx/spec.rb:131 # ObjectStore cannot show log for empty repository
rspec /tmp/d20160111-5693-nf7dx/spec.rb:136 # ObjectStore can list branches
rspec /tmp/d20160111-5693-nf7dx/spec.rb:143 # ObjectStore can create branches
rspec /tmp/d20160111-5693-nf7dx/spec.rb:148 # ObjectStore cannot create branch if already exists
rspec /tmp/d20160111-5693-nf7dx/spec.rb:153 # ObjectStore can switch branches
rspec /tmp/d20160111-5693-nf7dx/spec.rb:166 # ObjectStore cannot switch to nonexisting branch
rspec /tmp/d20160111-5693-nf7dx/spec.rb:171 # ObjectStore can remove branch
rspec /tmp/d20160111-5693-nf7dx/spec.rb:177 # ObjectStore cannot remove current branch
rspec /tmp/d20160111-5693-nf7dx/spec.rb:182 # ObjectStore cannot remove nonexisting branch
rspec /tmp/d20160111-5693-nf7dx/spec.rb:187 # ObjectStore can be initialized with block
rspec /tmp/d20160111-5693-nf7dx/spec.rb:217 # ObjectStore can checkout commits
rspec /tmp/d20160111-5693-nf7dx/spec.rb:227 # ObjectStore cannot checkout commits with nonexisting hashes
rspec /tmp/d20160111-5693-nf7dx/spec.rb:234 # ObjectStore cannot checkout commits in empty repository
rspec /tmp/d20160111-5693-nf7dx/spec.rb:239 # ObjectStore can show the objects in a repo after overwriting an object
rspec /tmp/d20160111-5693-nf7dx/spec.rb:253 # ObjectStore can show the objects of a repo after removing an object

История (3 версии и 0 коментара)

Борис обнови решението на 22.11.2015 23:29 (преди над 8 години)

+require 'digest'
+require 'date'
+
+class Class
+ alias init new
+end
+
+class ObjectAdd
+
+ def initialize(name, object)
+ @name = name
+ @object = object
+ @victory = true
+ end
+
+ def message
+ "Added #{@name} to stage."
+ end
+
+ def result
+ @object
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class CommitMessage
+ def initialize(message, count)
+ @victory = (count != 0)
+ @count = count
+ @message = message
+ end
+
+ def message
+ if @victory
+ "#{@message}\n\t#{@count} objects changed"
+ else
+ "Nothing to commit, working directory clean."
+ end
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class RemoveMessage
+
+ def initialize(name, object)
+ @victory = (object != false)
+ @object = object
+ @name = name
+ end
+
+ def result
+ @object
+ end
+
+ def message
+ if @victory
+ "Added #{@name} for removal."
+ else
+ "Object #{@name} is not committed."
+ end
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class CheckoutCommit
+ def initialize(comit_hash, object)
+ @victory = (object != false)
+ @hash = comit_hash
+ @object = object
+ end
+
+ def message
+ if @victory
+ "HEAD is now at #{@hash}."
+ else
+ "Commit #{hash} does not exist."
+ end
+ end
+
+ def result
+ @object
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class LastCommit
+ def initialize(name, message, commit)
+ @victory = (commit != false)
+ @object = commit
+ @message = message
+ @name = name
+ end
+
+ def message
+ if @victory
+ "#{message}"
+ else
+ "Branch #{name} does not have any commits yet."
+ end
+ end
+
+ def result
+ @object
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class CreateBranch
+ def initialize(name, condition)
+ @victory = condition
+ @name = name
+ end
+
+ def message
+ if @victory
+ "Created branch #{name}."
+ else
+ "Branch #{name} already exists."
+ end
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class CheckoutBranch
+ def initialize(name, condition)
+ @victory = condition
+ @name = name
+ end
+
+ def message
+ if @victory
+ "Switched to branch #{name}."
+ else
+ "Branch #{name} does not exist."
+ end
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class RemoveBranch
+ def initialize(name, condition, exists)
+ @victory = (condition != false) and (exists != false)
+ @exists = exists
+ @name = name
+ end
+
+ def message
+ if @victory
+ "Removed branch #{name}."
+ elsif (@exists == false)
+ "Branch #{name} does not exist."
+ else
+ "Cannot remove current branch."
+ end
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class BranchList
+ def initialize(names, current_index)
+ @victory = true
+ @names = names
+ @index = current_index
+ end
+
+ def message
+ message = @names.map { |n| " " + n }
+ message[@index][1] = "*"
+ message.join"\n"
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class BranchLog
+ def initialize(name, commits)
+ @victory = commits.any?
+ @name = name
+ @commits = commits
+ end
+
+ def message
+ if @victory
+ m = @commits.map{|n| "Commit #{n.hash}\nDate: #{n.date}\n\n\t#{n.message}"}
+ m.join"\n\n"
+ else
+ "Branch #{@name} does not have any commits yet."
+ end
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
+
+class ObjectStore
+
+ class Commit
+
+ def initialize (objects = {}, message)
+ @objects , @message = objects, message
+ @date = Time.new
+ @date = @date.strftime("%a %b %d %k:%M:%S %Y %z")
+ @commit_hash = Digest::SHA1.hexdigest(@date + @message)
+ end
+
+ def date
+ @date
+ end
+
+ def message
+ @message
+ end
+
+ def objects
+ @objects.values
+ end
+
+ def get_names
+ @objects.keys
+ end
+
+ def remove(name)
+ @objects.delete(name)
+ end
+
+ def hash
+ @commit_hash
+ end
+
+ end
+
+ class Branch
+
+ def initialize(name = nil)
+ @name = name
+ @commits = []
+ @storage = {}
+ @removed = 0
+ end
+
+ def name
+ @name
+ end
+
+ def create(branch_name)
+ if @branches.any? { |n| n.name == branch_name }
+ CreateBranch.new(branch_name, false)
+ else
+ @name = branch_name
+ @branches.push(self)
+ CreateBranch.new(branch_name, true)
+ end
+ end
+
+ def add(name, object)
+ @storage.merge!(name => object)
+ end
+
+ def commit(message)
+ return false if @storage.empty? and (@removed == 0)
+ helper = @storage.invert.invert
+ count, @removed = @removed, 0
+ @storage.clear
+ @commits.push(Commit.new(helper, message))
+ count + helper.size
+ end
+
+ def get_commits
+ @commits
+ end
+
+ def remove_object(name)
+ commit = @commits.last
+ return false if ! commit.get_names.include?(name)
+ @removed += 1
+ commit.delete(name)
+ end
+
+ def checkout_commit(commit_hash)
+ return false if @commits.none? { |n| n.hash == commit_hash }
+ length = @commits.find_index { |n| n.hash == commit_hash } + 1
+ @commits = @commits.take(length)
+ @comits.last
+ end
+
+ def checkout(branch_name)
+ if @branches.none? { |n| n.name == branch_name }
+ CheckoutBranch.new(branch_name, false)
+ else
+ index = @branches.find_index { |n| n.name == branch_name }
+ @current_branch = @branches[index]
+ CheckoutBranch.new(branch_name, true)
+ end
+ end
+
+ def remove(branch_name)
+ if @branches.none? { |n| n.name == branch_name }
+ RemoveBranch.new(branch_name, true, false)
+ elsif @current_branch.name == branch_name
+ RemoveBranch.new(branch_name, false, true)
+ else
+ index = @branches.find_index { |n| n.name == branch_name }
+ @branches.delete_at(index)
+ RemoveBranch.new(branch_name, true, true)
+ end
+ end
+
+ def list
+ branch_names = @branches.map { |n| n.name }.sort
+ index = branch_names.find_index { |name| name == @current_branch.name }
+ BranchList.new(branch_names,index)
+ end
+
+ end
+
+ def initialize
+ @branches = []
+ @branches.push(Branch.new('master'))
+ @current_branch = @branches.first
+ end
+
+ def add(name, object)
+ @current_branch.add(name, object)
+ ObjectAdd.new(name, object)
+ end
+
+ def commit(message)
+ count
+ if (@current_branch.commit(message) == false)
+ count = 0
+ else
+ count = @current_branch.commit(message)
+ end
+ CommitMessage.new(message, count)
+ end
+
+ def remove(name)
+ RemoveMessage.new(name, @current_branch.remove_object(name))
+ end
+
+ def checkout(commit_hash)
+ if @current_branch.checkout_commit(commit_hash)
+ end
+
+ def branch
+ Branch.new
+ end
+
+ def log
+ BranchLog(@current_branch.name, @current_branch.get_commits)
+ end
+
+ def head
+ if @current_branch.get_commits.empty?
+ LastCommit.new(@current_branch.name, 0, false)
+ else
+ head = @current_branch.get_commits.last
+ LastCommit.new(@current_branch.name, head.message, head)
+ end
+ end
+end
+end

Борис обнови решението на 22.11.2015 23:33 (преди над 8 години)

require 'digest'
require 'date'
class Class
alias init new
end
class ObjectAdd
def initialize(name, object)
@name = name
@object = object
@victory = true
end
def message
"Added #{@name} to stage."
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class CommitMessage
def initialize(message, count)
@victory = (count != 0)
@count = count
@message = message
end
def message
if @victory
"#{@message}\n\t#{@count} objects changed"
else
"Nothing to commit, working directory clean."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class RemoveMessage
def initialize(name, object)
@victory = (object != false)
@object = object
@name = name
end
def result
@object
end
def message
if @victory
"Added #{@name} for removal."
else
"Object #{@name} is not committed."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class CheckoutCommit
def initialize(comit_hash, object)
@victory = (object != false)
@hash = comit_hash
@object = object
end
def message
if @victory
"HEAD is now at #{@hash}."
else
- "Commit #{hash} does not exist."
+ "Commit #{@hash} does not exist."
end
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class LastCommit
def initialize(name, message, commit)
@victory = (commit != false)
@object = commit
@message = message
@name = name
end
def message
if @victory
- "#{message}"
+ "#{@message}"
else
- "Branch #{name} does not have any commits yet."
+ "Branch #{@name} does not have any commits yet."
end
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class CreateBranch
def initialize(name, condition)
@victory = condition
@name = name
end
def message
if @victory
- "Created branch #{name}."
+ "Created branch #{@name}."
else
- "Branch #{name} already exists."
+ "Branch #{@name} already exists."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class CheckoutBranch
def initialize(name, condition)
@victory = condition
@name = name
end
def message
if @victory
- "Switched to branch #{name}."
+ "Switched to branch #{@name}."
else
- "Branch #{name} does not exist."
+ "Branch #{@name} does not exist."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class RemoveBranch
def initialize(name, condition, exists)
@victory = (condition != false) and (exists != false)
@exists = exists
@name = name
end
def message
if @victory
- "Removed branch #{name}."
+ "Removed branch #{@name}."
elsif (@exists == false)
- "Branch #{name} does not exist."
+ "Branch #{@name} does not exist."
else
"Cannot remove current branch."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class BranchList
def initialize(names, current_index)
@victory = true
@names = names
@index = current_index
end
def message
message = @names.map { |n| " " + n }
message[@index][1] = "*"
message.join"\n"
end
def success?
@victory
end
def error?
! @victory
end
end
class BranchLog
def initialize(name, commits)
@victory = commits.any?
@name = name
@commits = commits
end
def message
if @victory
m = @commits.map{|n| "Commit #{n.hash}\nDate: #{n.date}\n\n\t#{n.message}"}
m.join"\n\n"
else
"Branch #{@name} does not have any commits yet."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class ObjectStore
class Commit
def initialize (objects = {}, message)
@objects , @message = objects, message
@date = Time.new
@date = @date.strftime("%a %b %d %k:%M:%S %Y %z")
@commit_hash = Digest::SHA1.hexdigest(@date + @message)
end
def date
@date
end
def message
@message
end
def objects
@objects.values
end
def get_names
@objects.keys
end
def remove(name)
@objects.delete(name)
end
def hash
@commit_hash
end
end
class Branch
def initialize(name = nil)
@name = name
@commits = []
@storage = {}
@removed = 0
end
def name
@name
end
def create(branch_name)
if @branches.any? { |n| n.name == branch_name }
CreateBranch.new(branch_name, false)
else
@name = branch_name
@branches.push(self)
CreateBranch.new(branch_name, true)
end
end
def add(name, object)
@storage.merge!(name => object)
end
def commit(message)
return false if @storage.empty? and (@removed == 0)
helper = @storage.invert.invert
count, @removed = @removed, 0
@storage.clear
@commits.push(Commit.new(helper, message))
count + helper.size
end
def get_commits
@commits
end
def remove_object(name)
commit = @commits.last
return false if ! commit.get_names.include?(name)
@removed += 1
commit.delete(name)
end
def checkout_commit(commit_hash)
return false if @commits.none? { |n| n.hash == commit_hash }
length = @commits.find_index { |n| n.hash == commit_hash } + 1
@commits = @commits.take(length)
@comits.last
end
def checkout(branch_name)
if @branches.none? { |n| n.name == branch_name }
CheckoutBranch.new(branch_name, false)
else
index = @branches.find_index { |n| n.name == branch_name }
@current_branch = @branches[index]
CheckoutBranch.new(branch_name, true)
end
end
def remove(branch_name)
if @branches.none? { |n| n.name == branch_name }
RemoveBranch.new(branch_name, true, false)
elsif @current_branch.name == branch_name
RemoveBranch.new(branch_name, false, true)
else
index = @branches.find_index { |n| n.name == branch_name }
@branches.delete_at(index)
RemoveBranch.new(branch_name, true, true)
end
end
def list
branch_names = @branches.map { |n| n.name }.sort
index = branch_names.find_index { |name| name == @current_branch.name }
BranchList.new(branch_names,index)
end
end
def initialize
@branches = []
@branches.push(Branch.new('master'))
@current_branch = @branches.first
end
def add(name, object)
@current_branch.add(name, object)
ObjectAdd.new(name, object)
end
def commit(message)
count
if (@current_branch.commit(message) == false)
count = 0
else
count = @current_branch.commit(message)
end
CommitMessage.new(message, count)
end
def remove(name)
RemoveMessage.new(name, @current_branch.remove_object(name))
end
def checkout(commit_hash)
if @current_branch.checkout_commit(commit_hash)
end
def branch
Branch.new
end
def log
BranchLog(@current_branch.name, @current_branch.get_commits)
end
def head
if @current_branch.get_commits.empty?
LastCommit.new(@current_branch.name, 0, false)
else
head = @current_branch.get_commits.last
LastCommit.new(@current_branch.name, head.message, head)
end
end
end
end

Борис обнови решението на 23.11.2015 02:16 (преди над 8 години)

require 'digest'
require 'date'
class Class
alias init new
end
class ObjectAdd
def initialize(name, object)
@name = name
@object = object
@victory = true
end
def message
"Added #{@name} to stage."
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class CommitMessage
def initialize(message, count)
@victory = (count != 0)
- @count = count
- @message = message
+ @count = count
+ @message = message
end
def message
if @victory
- "#{@message}\n\t#{@count} objects changed"
- else
- "Nothing to commit, working directory clean."
- end
+ "#{@message}\n\t#{@count} objects changed"
+ else
+ "Nothing to commit, working directory clean."
+ end
end
def success?
@victory
end
def error?
! @victory
end
end
class RemoveMessage
def initialize(name, object)
@victory = (object != false)
- @object = object
- @name = name
+ @object = object
+ @name = name
end
def result
@object
end
def message
if @victory
- "Added #{@name} for removal."
+ "Added #{@name} for removal."
else
- "Object #{@name} is not committed."
- end
+ "Object #{@name} is not committed."
+ end
end
def success?
@victory
end
def error?
! @victory
end
end
class CheckoutCommit
def initialize(comit_hash, object)
@victory = (object != false)
@hash = comit_hash
- @object = object
+ @object = object
end
def message
if @victory
- "HEAD is now at #{@hash}."
- else
- "Commit #{@hash} does not exist."
- end
+ "HEAD is now at #{@hash}."
+ else
+ "Commit #{@hash} does not exist."
+ end
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class LastCommit
def initialize(name, message, commit)
@victory = (commit != false)
- @object = commit
- @message = message
+ @object = commit
+ @message = message
@name = name
end
def message
if @victory
- "#{@message}"
- else
- "Branch #{@name} does not have any commits yet."
+ "#{@message}"
+ else
+ "Branch #{@name} does not have any commits yet."
end
end
def result
@object
end
def success?
@victory
end
def error?
! @victory
end
end
class CreateBranch
def initialize(name, condition)
@victory = condition
- @name = name
+ @name = name
end
def message
if @victory
- "Created branch #{@name}."
- else
- "Branch #{@name} already exists."
- end
+ "Created branch #{@name}."
+ else
+ "Branch #{@name} already exists."
+ end
end
def success?
@victory
end
def error?
! @victory
end
end
class CheckoutBranch
def initialize(name, condition)
@victory = condition
- @name = name
+ @name = name
end
def message
if @victory
- "Switched to branch #{@name}."
- else
- "Branch #{@name} does not exist."
- end
+ "Switched to branch #{@name}."
+ else
+ "Branch #{@name} does not exist."
+ end
end
def success?
@victory
end
def error?
! @victory
end
end
class RemoveBranch
def initialize(name, condition, exists)
@victory = (condition != false) and (exists != false)
- @exists = exists
- @name = name
+ @exists = exists
+ @name = name
end
def message
if @victory
"Removed branch #{@name}."
elsif (@exists == false)
"Branch #{@name} does not exist."
else
"Cannot remove current branch."
end
end
def success?
@victory
end
def error?
! @victory
end
end
class BranchList
def initialize(names, current_index)
@victory = true
- @names = names
- @index = current_index
+ @names = names
+ @index = current_index
end
def message
message = @names.map { |n| " " + n }
message[@index][1] = "*"
message.join"\n"
end
def success?
@victory
end
def error?
! @victory
end
end
class BranchLog
def initialize(name, commits)
@victory = commits.any?
- @name = name
- @commits = commits
+ @name = name
+ @commits = commits
end
def message
if @victory
m = @commits.map{|n| "Commit #{n.hash}\nDate: #{n.date}\n\n\t#{n.message}"}
m.join"\n\n"
else
"Branch #{@name} does not have any commits yet."
end
end
def success?
@victory
end
def error?
! @victory
end
end
+class GetMessage
+ def initialize(name, object)
+ @victory = (object != nil)
+ @name = name
+ @object = object
+ end
+
+ def message
+ if @victory
+ "Found object #{@name}."
+ else
+ "Object #{@name} is not committed."
+ end
+ end
+
+ def result
+ @object
+ end
+
+ def success?
+ @victory
+ end
+
+ def error?
+ ! @victory
+ end
+end
class ObjectStore
class Commit
def initialize (objects = {}, message)
@objects , @message = objects, message
- @date = Time.new
- @date = @date.strftime("%a %b %d %k:%M:%S %Y %z")
- @commit_hash = Digest::SHA1.hexdigest(@date + @message)
+ @date = Time.new
+ @date = @date.strftime("%a %b %d %k:%M:%S %Y %z")
+ @commit_hash = Digest::SHA1.hexdigest(@date + @message)
end
+ def get_object(name)
+ @objects[name]
+ end
+
def date
@date
end
def message
@message
end
def objects
@objects.values
end
def get_names
@objects.keys
end
def remove(name)
@objects.delete(name)
end
def hash
@commit_hash
end
end
class Branch
def initialize(name = nil)
@name = name
@commits = []
@storage = {}
- @removed = 0
+ @removed = 0
end
- def name
- @name
- end
+ def name
+ @name
+ end
def create(branch_name)
- if @branches.any? { |n| n.name == branch_name }
- CreateBranch.new(branch_name, false)
- else
+ if @branches.any? { |n| n.name == branch_name }
+ CreateBranch.new(branch_name, false)
+ else
@name = branch_name
@branches.push(self)
CreateBranch.new(branch_name, true)
- end
+ end
end
def add(name, object)
@storage.merge!(name => object)
end
def commit(message)
- return false if @storage.empty? and (@removed == 0)
+ return 0 if @storage.empty? and (@removed == 0)
helper = @storage.invert.invert
count, @removed = @removed, 0
@storage.clear
@commits.push(Commit.new(helper, message))
count + helper.size
end
def get_commits
@commits
end
def remove_object(name)
commit = @commits.last
return false if ! commit.get_names.include?(name)
@removed += 1
commit.delete(name)
end
def checkout_commit(commit_hash)
return false if @commits.none? { |n| n.hash == commit_hash }
length = @commits.find_index { |n| n.hash == commit_hash } + 1
@commits = @commits.take(length)
- @comits.last
+ @commits.last
end
def checkout(branch_name)
if @branches.none? { |n| n.name == branch_name }
CheckoutBranch.new(branch_name, false)
- else
+ else
index = @branches.find_index { |n| n.name == branch_name }
@current_branch = @branches[index]
CheckoutBranch.new(branch_name, true)
end
end
def remove(branch_name)
if @branches.none? { |n| n.name == branch_name }
RemoveBranch.new(branch_name, true, false)
elsif @current_branch.name == branch_name
RemoveBranch.new(branch_name, false, true)
else
index = @branches.find_index { |n| n.name == branch_name }
- @branches.delete_at(index)
- RemoveBranch.new(branch_name, true, true)
+ @branches.delete_at(index)
+ RemoveBranch.new(branch_name, true, true)
end
end
def list
branch_names = @branches.map { |n| n.name }.sort
index = branch_names.find_index { |name| name == @current_branch.name }
BranchList.new(branch_names,index)
end
end
def initialize
@branches = []
@branches.push(Branch.new('master'))
@current_branch = @branches.first
end
def add(name, object)
@current_branch.add(name, object)
ObjectAdd.new(name, object)
end
def commit(message)
- count
- if (@current_branch.commit(message) == false)
- count = 0
- else
- count = @current_branch.commit(message)
- end
+ count = @current_branch.commit(message)
CommitMessage.new(message, count)
end
def remove(name)
RemoveMessage.new(name, @current_branch.remove_object(name))
end
def checkout(commit_hash)
- if @current_branch.checkout_commit(commit_hash)
+ result = @current_branch.checkout_commit(commit_hash)
+ CheckoutCommit(commit_hash, result)
end
def branch
Branch.new
end
def log
- BranchLog(@current_branch.name, @current_branch.get_commits)
+ BranchLog(@current_branch.name, @current_branch.get_commits)
end
def head
if @current_branch.get_commits.empty?
- LastCommit.new(@current_branch.name, 0, false)
- else
- head = @current_branch.get_commits.last
- LastCommit.new(@current_branch.name, head.message, head)
- end
+ LastCommit.new(@current_branch.name, 0, false)
+ else
+ head = @current_branch.get_commits.last
+ LastCommit.new(@current_branch.name, head.message, head)
+ end
end
-end
+
+ def get(name)
+ commits = @current_branch.get_commits.reverse
+ index = commits.find_index { |n| n.get_names.include?(name) }
+ if index == nil
+ GetMessage.new(name, nil)
+ else
+ object = commits[index].get_object(name)
+ GetMessage.new(name, object)
+ end
+ end
end