class RepoTimeline

Public Class Methods

find_in_or_above(directory) click to toggle source
# File lib/repo_timetracker/repo_timeline_class.rb, line 11
def find_in_or_above(directory)
  return nil if directory.nil?

  if contains_repo? directory
    directory
  elsif directory.slice!(/\/\w+(\/?)$/)
    find_in_or_above(directory)
  else
    nil
  end
end
load_or_initialize_for(directory_called_from) click to toggle source
# File lib/repo_timetracker/repo_timeline_class.rb, line 4
def load_or_initialize_for(directory_called_from)
  directory = find_in_or_above(directory_called_from)
  return nil if directory.nil?

  RepoTimeline.new(directory)
end
new(repo_directory) click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 8
def initialize(repo_directory)
  @repo_directory = repo_directory.sub(/\/$/, '') #no trailing slash
  @project_name = @repo_directory.slice(/[^\/]*$/)

  @timeline_directory = initialize_timeline_directory_for(@repo_directory)
  @commit_records = load_commit_records
end

Private Class Methods

contains_repo?(directory_path) click to toggle source
# File lib/repo_timetracker/repo_timeline_class.rb, line 27
def contains_repo?(directory_path)
  Dir.glob("#{directory_path}/.git").any?
end

Public Instance Methods

add_event(event_string) click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 16
def add_event(event_string)
  case event_string
  when /git commit --amend/
    amend(event_string)
    
  when /git commit/
    commit(event_string)
    
  else
    staging.generate_new_event(event_string)
  end
end
current_commit_time() click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 29
def current_commit_time
  staging.total_time
end
project_time() click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 33
def project_time
  time = 0
  @commit_records.inject(0) { |total_time, cr| 
    total_time + cr.total_time
  }
end

Private Instance Methods

amend(event_string) click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 53
def amend(event_string)
  last_completed_commit.add_events(staging.get_tail)
  last_completed_commit.generate_new_event(event_string)

  staging.clear_events
  staging.generate_new_event(event_string)
end
commit(event_string) click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 44
def commit(event_string)
  staging.generate_new_event(event_string)

  @commit_records << CommitRecord.create(
                                          @repo_directory, 
                                          event_string
                                          )
end
commit_file_paths() click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 99
def commit_file_paths
  dir_filenames = Dir.entries(@timeline_directory)
  commit_filenames = dir_filenames.select { |f| f.include? '__commit__' }
  commit_filenames.map { |fn| "#{@timeline_directory}/#{fn}" }
end
ensure_gitignored(gitignore_path) click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 91
def ensure_gitignored(gitignore_path)
  FileUtils.touch(gitignore_path)

  unless File.readlines(gitignore_path).grep(/\.repo_timeline/).any?
    `echo '\n.repo_timeline' >> #{gitignore_path}`
  end
end
initialize_timeline_directory_for(repo_directory) click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 81
def initialize_timeline_directory_for(repo_directory)
  timeline_directory = "#{repo_directory}/.repo_timeline"
  gitignore_path = "#{repo_directory}/.gitignore"
  
  ensure_gitignored(gitignore_path)
  FileUtils.mkdir_p(timeline_directory) unless File.directory?(timeline_directory)

  timeline_directory
end
last_completed_commit() click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 69
def last_completed_commit
  @commit_records[-2]
end
load_commit_records() click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 73
def load_commit_records
  if commit_file_paths.empty?
    CommitRecord.create(@repo_directory)
  end

  commit_file_paths.map { |p| CommitRecord.load(p) }
end
staging() click to toggle source
# File lib/repo_timetracker/repo_timeline.rb, line 61
def staging
  if @commit_records.empty?
    @commit_records << CommitRecord.create(@timeline_directory)
  else
    @commit_records.last
  end
end