gitback 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.md +91 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/lib/gitback.rb +6 -0
- data/lib/gitback/repository.rb +115 -0
- data/test/helper.rb +10 -0
- data/test/test_gitback.rb +7 -0
- metadata +86 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Bryce Thornton
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
Gitback
|
2
|
+
====
|
3
|
+
|
4
|
+
Gitback allows you to version arbitrary files and/or directories in a git
|
5
|
+
repository. You just need to include the gem and write a brief ruby script
|
6
|
+
that indicates the files/directories you'd like to backup. Then, run the
|
7
|
+
script via cron. Gitback will take care of a adding/commiting/pushing whenever
|
8
|
+
your files are modified.
|
9
|
+
|
10
|
+
The typical usage for this is backing up config files.
|
11
|
+
|
12
|
+
|
13
|
+
## Requirements ###############################################################
|
14
|
+
|
15
|
+
* git (http://git-scm.com) tested with 1.6.0.4
|
16
|
+
* grit (http://github.com/mojombo/grit) 2.0.0 or higher
|
17
|
+
|
18
|
+
|
19
|
+
## Install ####################################################################
|
20
|
+
|
21
|
+
$ gem install gitback -s http://gemcutter.org
|
22
|
+
|
23
|
+
## Usage ######################################################################
|
24
|
+
|
25
|
+
Here's a basic example of a script using gitback:
|
26
|
+
|
27
|
+
require 'rubygems'
|
28
|
+
require 'gitback'
|
29
|
+
|
30
|
+
Gitback::Repository.new '/var/config-backup/' do |repo|
|
31
|
+
repo.backup '/opt/nginx/conf/nginx.conf'
|
32
|
+
end
|
33
|
+
|
34
|
+
This will check /opt/nginx/conf/nginx.conf for changes. If the file has
|
35
|
+
changed, gitback will commit a new version.
|
36
|
+
|
37
|
+
This nginx config file would be saved to the following location:
|
38
|
+
|
39
|
+
/var/config-backup/opt/nginx/conf/nginx.conf
|
40
|
+
|
41
|
+
Everything starts with instantiating a new `Gitback::Repository` object. The
|
42
|
+
first parameter is the path to the git repository you'd like to backup to. The
|
43
|
+
second parameter is a block indicating the files/directories you'd like to
|
44
|
+
backup.
|
45
|
+
|
46
|
+
|
47
|
+
### Directory support
|
48
|
+
|
49
|
+
In addition to basic files, directory paths can also be backed up:
|
50
|
+
|
51
|
+
Gitback::Repository.new '/var/config-backup/' do |repo|
|
52
|
+
repo.backup '/opt/nginx/conf/nginx.conf'
|
53
|
+
repo.backup '/etc/mysql/'
|
54
|
+
end
|
55
|
+
|
56
|
+
Notice that '/etc/mysql' is a directory. Gitback will copy everything within
|
57
|
+
that directory into the git repository.
|
58
|
+
|
59
|
+
|
60
|
+
### Namespaces
|
61
|
+
|
62
|
+
Namespaces are also supported. If you'd like to use the same repository for
|
63
|
+
multiple servers you can specify a namespace like this:
|
64
|
+
|
65
|
+
Gitback::Repository.new '/var/config-backup/' do |repo|
|
66
|
+
repo.namespace 'server1.domain.com' do
|
67
|
+
repo.backup '/opt/nginx/conf/nginx.conf'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
This will save the file to the following location:
|
72
|
+
|
73
|
+
/var/config-backup/server1.domain.com/opt/nginx/conf/nginx.conf
|
74
|
+
|
75
|
+
|
76
|
+
### Remote Git Repositories
|
77
|
+
|
78
|
+
Gitback is intended to be used with remote git repositories. If your git
|
79
|
+
repository is tracking a remote branch, gitback will push changes to
|
80
|
+
the remote after each commit.
|
81
|
+
|
82
|
+
|
83
|
+
### Running Via Cron
|
84
|
+
|
85
|
+
There's nothing special about a gitback script. In order for it to backup
|
86
|
+
your files you'll need to run it via the command line. I suggest setting up
|
87
|
+
a cron job to do this for you at regular intervals.
|
88
|
+
|
89
|
+
## Copyright ###################################################################
|
90
|
+
|
91
|
+
Copyright (c) 2010 Bryce Thornton. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "gitback"
|
8
|
+
gem.summary = %Q{A simple ruby library for backing up files to git}
|
9
|
+
gem.description = %Q{Provide a list of files and/or directories and gitback will copy them to your git repo, commit and push when there are changes.}
|
10
|
+
gem.email = "brycethornton@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/brycethornton/gitback"
|
12
|
+
gem.authors = ["Bryce Thornton"]
|
13
|
+
gem.add_dependency "grit", ">= 2.0.0"
|
14
|
+
end
|
15
|
+
Jeweler::GemcutterTasks.new
|
16
|
+
rescue LoadError
|
17
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rake/testtask'
|
21
|
+
Rake::TestTask.new(:test) do |test|
|
22
|
+
test.libs << 'lib' << 'test'
|
23
|
+
test.pattern = 'test/**/test_*.rb'
|
24
|
+
test.verbose = true
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
require 'rcov/rcovtask'
|
29
|
+
Rcov::RcovTask.new do |test|
|
30
|
+
test.libs << 'test'
|
31
|
+
test.pattern = 'test/**/test_*.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
task :rcov do
|
36
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task :test => :check_dependencies
|
41
|
+
|
42
|
+
task :default => :test
|
43
|
+
|
44
|
+
require 'rake/rdoctask'
|
45
|
+
Rake::RDocTask.new do |rdoc|
|
46
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
47
|
+
|
48
|
+
rdoc.rdoc_dir = 'rdoc'
|
49
|
+
rdoc.title = "gitback #{version}"
|
50
|
+
rdoc.rdoc_files.include('README*')
|
51
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
52
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/gitback.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
module Gitback
|
2
|
+
class Repository
|
3
|
+
attr_accessor :remote
|
4
|
+
attr_accessor :branch
|
5
|
+
|
6
|
+
def initialize(repository_path, &block)
|
7
|
+
@repository_path = clean_path(repository_path)
|
8
|
+
|
9
|
+
if File.exists?(@repository_path)
|
10
|
+
prepare_git_repository
|
11
|
+
|
12
|
+
if @repo
|
13
|
+
yield self
|
14
|
+
commit_git_changes
|
15
|
+
end
|
16
|
+
else
|
17
|
+
puts "ERROR: it doesn't look like '#{@repository_path}' exists."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Creates a namespace for files to be stored under
|
22
|
+
# Allows a single repository to be used for many different backups
|
23
|
+
def namespace(name, &block)
|
24
|
+
@namespace = clean_path(name)
|
25
|
+
yield self
|
26
|
+
end
|
27
|
+
|
28
|
+
# Sets up the paths and copies the files into the git repo
|
29
|
+
def backup(file_path)
|
30
|
+
file_path = clean_path(file_path)
|
31
|
+
|
32
|
+
begin
|
33
|
+
dest_path = file_path
|
34
|
+
dest_path = '/' + @namespace + file_path if @namespace
|
35
|
+
dest_path = @repository_path + dest_path
|
36
|
+
|
37
|
+
dirname = File.dirname(dest_path)
|
38
|
+
|
39
|
+
# Make sure the path exists in the repo
|
40
|
+
if !File.exists?(dirname)
|
41
|
+
FileUtils.mkpath(dirname)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Copy the file(s) to the repo
|
45
|
+
if File.exists?(file_path)
|
46
|
+
# We pass remove_destination to avoid issues with symlinks
|
47
|
+
FileUtils.cp_r file_path, dest_path, :remove_destination => true
|
48
|
+
else
|
49
|
+
puts "ERROR: '#{file_path}' doesn't seem to exist."
|
50
|
+
end
|
51
|
+
rescue Errno::EACCES
|
52
|
+
puts "ERROR: '#{file_path}' doesn't seem to be readable and/or writable by this user."
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
# Creates the Grit::Repo object for use throughout the class
|
58
|
+
def prepare_git_repository
|
59
|
+
# Allow one minute for slow repositories
|
60
|
+
Grit::Git.git_timeout = 60.0
|
61
|
+
|
62
|
+
Dir.chdir(@repository_path) do
|
63
|
+
begin
|
64
|
+
@repo = Grit::Repo.new('.')
|
65
|
+
|
66
|
+
# Figure out the remote branch
|
67
|
+
@remote = @repo.git.list_remotes.first
|
68
|
+
@branch = @repo.head.name
|
69
|
+
|
70
|
+
# Do a git-pull to make sure we have the newest changes from the repo
|
71
|
+
if @remote
|
72
|
+
puts "Pulling any changes from the remote git repository..."
|
73
|
+
@repo.git.pull({}, @remote, @branch)
|
74
|
+
end
|
75
|
+
rescue Grit::InvalidGitRepositoryError
|
76
|
+
puts "ERROR: #{@repository_path} doesn't seem to be a git repository."
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Use the repo object to commit and push the changes
|
82
|
+
def commit_git_changes
|
83
|
+
Dir.chdir(@repository_path) do
|
84
|
+
status = @repo.status
|
85
|
+
|
86
|
+
# Only add if we have untracked files
|
87
|
+
if status.untracked.size > 0
|
88
|
+
puts "Adding new files to the repository..."
|
89
|
+
@repo.add(@repository_path + '/*')
|
90
|
+
end
|
91
|
+
|
92
|
+
commit_result = @repo.commit_all("Updating files")
|
93
|
+
|
94
|
+
# Attempt to push if anything was committed and we have a remote repo
|
95
|
+
if commit_result !~ /working directory clean/
|
96
|
+
if @remote
|
97
|
+
puts "Pushing repository changes..."
|
98
|
+
@repo.git.push({}, @remote, @branch)
|
99
|
+
end
|
100
|
+
else
|
101
|
+
puts "No changes committed."
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# This just normalizes file/directory paths
|
107
|
+
def clean_path(file_path)
|
108
|
+
if File.directory?(file_path)
|
109
|
+
file_path = File.expand_path(file_path)
|
110
|
+
end
|
111
|
+
|
112
|
+
file_path
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
data/test/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gitback
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Bryce Thornton
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-17 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: grit
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 0
|
30
|
+
- 0
|
31
|
+
version: 2.0.0
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
description: Provide a list of files and/or directories and gitback will copy them to your git repo, commit and push when there are changes.
|
35
|
+
email: brycethornton@gmail.com
|
36
|
+
executables: []
|
37
|
+
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files:
|
41
|
+
- LICENSE
|
42
|
+
- README.md
|
43
|
+
files:
|
44
|
+
- .document
|
45
|
+
- .gitignore
|
46
|
+
- LICENSE
|
47
|
+
- README.md
|
48
|
+
- Rakefile
|
49
|
+
- VERSION
|
50
|
+
- lib/gitback.rb
|
51
|
+
- lib/gitback/repository.rb
|
52
|
+
- test/helper.rb
|
53
|
+
- test/test_gitback.rb
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://github.com/brycethornton/gitback
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options:
|
60
|
+
- --charset=UTF-8
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.3.6
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: A simple ruby library for backing up files to git
|
84
|
+
test_files:
|
85
|
+
- test/helper.rb
|
86
|
+
- test/test_gitback.rb
|