Димитър обнови решението на 22.11.2015 23:27 (преди над 8 години)
+require 'digest/sha1'
+require 'date'
+module CommitOperations
+ def add name, object
+ success = true
+ message = "Added #{name} to stage"
+ result = object
+ if success == true then @count += 1
+ @data[name] = object
+ end
+ Operation.new success, message, result
+ end
+ def remove name
+ success = if @data.key? name then true
+ else false
+ end
+ message = if success then "Added #{name} for removal."
+ else "Object #{name} is not committed."
+ end
+ result = if success then @data.delete name
+ else nil
+ end
+ if success == true then @count += 1
+ end
+ Operation.new success, message, result
+ end
+ def commit message
+ success = if @count > 0 then true
+ else false
+ end
+ message = if success then "#{message}\n\t#{@count} objects changed"
+ else "Nothing to commit, working directory clean."
+ end
+ if success then time = Time.now
+ hash = Digest::SHA1.hexdigest "#{time}#{message}"
+ the_commit = Commit.new hash, message, time, @data
+ @count = 0
+ #result = @commits[hash] = the_commit
+ end
+ Operation.new success, message #, result
+ end
+ def checkout commit_hash
+ success = if @commits.key? commit_hash then true
+ else false
+ end
+ message = if success then "HEAD is now at #{commit_hash}"
+ else "Commit #{commit_hash} does not exist."
+ end
+ result = @commits[commit_hash]
+ Operation.new success, message, result
+ end
+end
+
+module BranchOperations
+ def create branch_name
+ success = if @object_store.branches.key? branch_name then false
+ else true
+ end
+ message = if success == false then "Branch #{branch_name} already exists."
+ else "Created branch #{branch_name}."
+ @object_store.branches[branch_name] =
+ Branch.new branch_name, @object_store
+ end
+ Operation.new success, message
+ end
+ def checkout branch_name
+ success = if @object_store.branches.key? branch_name then true
+ else false
+ end
+ message = if success == true then "Switched to branch #{branch_name}."
+ @object_store.current = branch_name
+ else "Branch #{branch_name} does not exist."
+ end
+ Operation.new success, message
+ end
+ def remove branch_name
+ in_current = false
+ success = if branch_name == @object_store.current then in_current = true
+ false
+ elsif @object_store.branches.key? branch_name then true
+ else false
+ end
+ message = if success then "Removed branch #{branch_name}."
+ @object_store.branches.delete branch_name
+ elsif in_current == true then "Cannot remove current branch."
+ else "Branch #{branch_name} does not exist."
+ end
+ Operation.new success, message
+ end
+ def list
+ message = ""
+ sorted_keys = @object_store.branches.keys.sort{|key1, key2| key1 <=> key2}
+ sorted_keys.each{|key| if key == @object_store.current then
+ message << "* #{key.to_s}\n"
+ else message << " #{key.to_s}\n"
+ end}
+ success = true
+ Operation.new success, message
+ end
+end
+
+class Branch
+ include BranchOperations
+ def initialize name, object_store
+ @name = name
+ @object_store = object_store
+ end
+end
+
+class ObjectStore
+ include CommitOperations
+ def initialize
+ @branches = {}
+ @commits = {}
+ @data = {}
+ @count = 0
+ @current = "master"
+ end
+ attr_accessor :branches, :current
+ def ObjectStore.init &block
+ repo = new
+ repo.instance_eval &block if block_given?
+ repo
+ end
+ def branch
+ if @branches.empty? then @branches["master"] =
+ Branch.new "master", self.clone
+ end
+ @branches[@current]
+ end
+ def log
+ success = if @commits.empty? then false
+ else true
+ end
+ message = if success then @commits.each_value {|commit|
+ puts "Commit #{commit.hash}\nDate: #{commit.date}\n\n\t#{commit.message}"}
+ else "Branch #{@current} does not have any @commits yet"
+ end
+ Operation.new success, message
+ end
+ def head
+ success = if @commits.empty? then false
+ else true
+ end
+ message = if success then @commits[@commits.keys.last].message
+ else "Branch #{@current} does not have any @commits yet"
+ end
+ result = if success then @commits[@commits.keys.last]
+ else result = nil
+ end
+ Operation.new success, message, result
+ end
+ def get name
+ success = if @data.key? name then true
+ else false
+ end
+ message = if success then "Found object #{name}."
+ else "Object #{name} is not committed."
+ end
+ result = if success then @data[name]
+ else result = nil
+ end
+ Operation.new success, message, result
+ end
+end
+
+class Operation
+ def initialize success, message, result = nil
+ @success = success
+ @message = message
+ @result = result
+ end
+ def message
+ @message
+ end
+ def success?
+ @success
+ end
+ def error?
+ if @success == true then false
+ else true
+ end
+ end
+ def result
+ @result
+ end
+end
+
+class Commit
+ def initialize name, message, time, data
+ @name = name
+ @message = message
+ @time = time
+ @data = data
+ end
+ def date
+ @time.strftime('%a %b %d %H:%M %Y %z')
+ end
+ def message
+ @message
+ end
+ def hash
+ @name
+ end
+ def objects
+ objects_array = []
+ @data.each_value{|value| objects_array.insert 0, value}
+ objects_array
+ end
+end
Не бях сигурен дали commit трябва да връща резултат, защото за тестовете трябва, а в условието не. И тъй като дилемата беше голяма закоментирах това което трябва да се добави за да връща резултат :D