7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# File 'lib/versionable_database.rb', line 7
def versionify(options = {})
options.reverse_merge!(:version_directory => "#{RAILS_ROOT}/versions")
send(:include, VersionableDatabase::InstanceMethods)
after_destroy :version!
after_save :version!
self.instance_eval do
def commit!(message = Time.now.to_s)
response = `cd #{self.version_dir} && git add . && git commit -am '#{message}'`
logger.debug("#### START VERSIONING ####")
logger.debug(response)
logger.debug("#### END VERSIONING ####")
end
def version
File.open(self.version_file, 'w+') { |file| file.write(self.all.to_yaml) }
end
def version_dir
@@version_dir
end
def version_dir=(directory)
@@version_dir = directory
end
def version_dir_name
@@version_dir_name
end
def version_dir_name=(directory_name)
@@version_dir_name = directory_name
end
def version_file
File.join(self.version_dir, self.class_name.tableize, self.version_file_name)
end
def version_file_name
"#{self.class_name.tableize}.yml"
end
def unversion!
File.delete(version_file)
self.all.map(&:unversion!)
self.commit!("No longer version controlling #{self.class_name}.")
end
private
def create_version_directories!
Dir.mkdir(self.version_dir) unless File.exists?(self.version_dir)
Dir.mkdir(File.join(self.version_dir, self.class_name.tableize)) unless File.exists?(File.join(self.version_dir, self.class_name.tableize))
end
def initialize_git_repository!
unless File.exists?(File.join(self.version_dir, '.git'))
response = `cd #{self.version_dir} && git init`
logger.debug("#### START INITIALIZING GIT REPOSITORY ####")
logger.debug(response)
logger.debug("#### END INITIALIZING GIT REPOSITORY ####")
end
end
def setup_complete?
File.exists?(self.version_dir) &&
File.exists?(File.join(self.version_dir, self.class_name.tableize)) &&
File.exists?(File.join(self.version_dir, '.git'))
end
def setup!(options)
self.version_dir = options[:version_directory]
self.version_dir_name = options[:version_directory].split('/').last
unless setup_complete?
create_version_directories!
initialize_git_repository!
STDOUT.puts "***************** IMPORTANT *****************"
STDOUT.puts "Versionable has created a new direcotry in #{self.version_dir} where files will be written to and stored."
STDOUT.puts "Since you may not want Git tracking the files Versionable creates, you may want to add #{self.version_dir_name}/* to your .gitignore file."
STDOUT.puts "If you don't already have a .gitignore file in #{RAILS_ROOT} (#{File.exists?(File.join(RAILS_ROOT, '.gitignore')) ? "and you do" : "which you don't"}) you may want to create one now."
end
end
end
setup!(options)
end
|