git-confident 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -41,6 +41,23 @@ If that is the case, just create the branch locally and check it out.
41
41
  $ crontab -e
42
42
  13 23 * * * cd ~/my_backup && git-confident
43
43
 
44
+ = Advanced Use
45
+
46
+ == Ignore files and folders
47
+ You can store extra files in your backup repository (like text notes) adding them to a .gcignore file:
48
+ $ echo SETUP_NOTES >> .gcignore
49
+ $ git add .gcignore
50
+ so git-confident won't restore them. Similarly to .gitignore behaviour, you can ignore an entire folder
51
+ by adding a .gcignore file inside it.
52
+
53
+
54
+ == Folder scan
55
+ git-confident keeps a copy of each file added to git. This is not very useful when you have
56
+ an entire folder to backup. You can track a whole folder using a .gcrecusrive file (acts like .gitignore):
57
+ $ touch etc/apache2/.gcrecusive
58
+ $ git add etc/apache2/.gcrecusive
59
+
60
+
44
61
  = Online
45
62
 
46
63
  * {Source code}[http://github.com/joeyates/git-confident]
data/lib/git/confident.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'rubygems' if RUBY_VERSION < '1.9'
2
2
  require 'git'
3
+ require 'git/elements'
3
4
 
4
5
  module Git
5
6
 
@@ -8,11 +9,13 @@ module Git
8
9
  module VERSION #:nodoc:
9
10
  MAJOR = 0
10
11
  MINOR = 0
11
- TINY = 6
12
+ TINY = 7
12
13
 
13
14
  STRING = [ MAJOR, MINOR, TINY ].join( '.' )
14
15
  end
15
16
 
17
+ attr_reader :elements
18
+
16
19
  def initialize( options )
17
20
  @path = options[ :path ].clone
18
21
  @no_commit = options[ :no_commit ] ? true : false
@@ -20,21 +23,23 @@ module Git
20
23
  raise "Git repository not found at '#{ @path }'" if ! File.directory?( "#{ @path }/.git" )
21
24
 
22
25
  super( { :working_directory => @path } )
26
+ @elements = Git::Elements.new( @path )
23
27
 
24
28
  case options[ :action ]
25
29
  when :backup
26
30
  backup
27
31
  when :list
28
- puts files
32
+ puts "Files:"
33
+ puts @elements.files
34
+ puts "Folders:"
35
+ puts @elements.folders
36
+ puts "Ignored:"
37
+ puts @elements.ignored
29
38
  when :restore
30
39
  restore
31
40
  end
32
41
  end
33
42
 
34
- def files
35
- ls_files.keys.sort
36
- end
37
-
38
43
  private
39
44
 
40
45
  def backup
@@ -45,22 +50,22 @@ module Git
45
50
  end
46
51
 
47
52
  def restore
48
- IO.popen( "rsync --no-perms --executability --keep-dirlinks --files-from=- #{ @path }/ /", "w+" ) do | pipe |
49
- files.each { | pathname | pipe.puts pathname }
53
+ IO.popen( "rsync --no-perms --executability --keep-dirlinks --delete --files-from=- #{ @path }/ /", "w+" ) do | pipe |
54
+ (@elements.files + @elements.folders).each { | pathname | pipe.puts pathname }
50
55
  end
51
56
  end
52
57
 
53
58
  def local_backup
54
- IO.popen( "rsync -av --files-from=- / #{ @path }/", "w+" ) do | pipe |
55
- files.each { | pathname | pipe.puts pathname }
59
+ IO.popen( "rsync -a --recursive --delete --files-from=- / #{ @path }/", "w+" ) do | pipe |
60
+ (@elements.files + @elements.folders).each { | pathname | pipe.puts pathname }
56
61
  end
57
62
  end
58
63
 
59
64
  def commit
60
- needs_commit = status.changed.size > 0
65
+ needs_commit = (status.changed.size + status.untracked.size) > 0
61
66
  return if ! needs_commit
62
67
  add
63
- super( "Automatic commit at #{ Time.now }" )
68
+ super( "Automatic commit at #{ Time.now }", {:add_all => true} )
64
69
  end
65
70
 
66
71
  def push
@@ -0,0 +1,69 @@
1
+ require 'rubygems' if RUBY_VERSION < '1.9'
2
+ require 'git'
3
+
4
+ module Git
5
+
6
+ class Elements < Git::Base
7
+ IGNORE = 'gcignore'
8
+ RECURSIVE = 'gcrecursive'
9
+
10
+ def initialize( path )
11
+ @path = path.clone
12
+ super( { :working_directory => @path } )
13
+ @gcfiles, @gitfiles = elements_scan
14
+ end
15
+
16
+ def ignored
17
+ return @ignored if @ignored
18
+ ignores = @gcfiles.select do | f |
19
+ File.basename( f ) =~ /^\.#{IGNORE}$/i
20
+ end
21
+ @ignored = gcfiles_scan( ignores )
22
+ end
23
+
24
+ def folders
25
+ return @folders if @folders
26
+ recursives = @gcfiles.select do | f |
27
+ File.basename( f ) =~ /^\.#{RECURSIVE}$/i
28
+ end
29
+ @folders = gcfiles_scan( recursives ).collect { |f| File.join f, '/' }
30
+ end
31
+
32
+ def files
33
+ return @files if @files
34
+ @files = @gitfiles.reject do | f |
35
+ (ignored + folders).find { |i| f =~ /^#{i}/ }
36
+ end.sort
37
+ end
38
+
39
+
40
+ private
41
+
42
+ # result[0] = git-confident special files
43
+ # result[1] = other git tracked files
44
+ def elements_scan
45
+ result = ls_files.keys.sort.partition do | f |
46
+ name = File.basename( f )
47
+ name =~ /^\.#{IGNORE}$/i or name =~ /^\.#{RECURSIVE}$/i or name =~ /^\.gitignore$/i
48
+ end
49
+ end
50
+
51
+ def gcfiles_scan( files )
52
+ files.collect do | file |
53
+ full_path = File.expand_path( file, @path )
54
+ relative_path = File.dirname( file )
55
+
56
+ next [relative_path] if File.zero?( full_path )
57
+
58
+ File.open( full_path ).collect do | line |
59
+ line.chomp!
60
+ next if line.empty?
61
+ next line if relative_path == '.'
62
+ File.join( relative_path, line )
63
+ end.compact
64
+ end.flatten.sort
65
+ end
66
+
67
+ end
68
+
69
+ end
data/spec/git_spec.rb CHANGED
@@ -6,24 +6,83 @@ SPEC_PATH = File.expand_path( File.dirname( __FILE__ ) )
6
6
  ROOT_PATH = File.dirname( SPEC_PATH )
7
7
  require File.join( ROOT_PATH, 'lib', 'git', 'confident' )
8
8
 
9
+ Joiner = lambda do |base|
10
+ lambda do |*others|
11
+ File.join(base, *others)
12
+ end
13
+ end
14
+
9
15
  describe 'when handling the repository' do
10
16
 
11
- before( :each ) do
12
- @repo_path = File.join( SPEC_PATH, 'repo' )
13
- repo = Git::Base.init( @repo_path )
14
- File.open( File.join( @repo_path, 'test_file' ), 'w' ) do | file |
15
- file.write "Hello"
16
- end
17
- repo.add 'test_file'
17
+ before( :all ) do
18
+ @backup_path = Joiner[ SPEC_PATH ][ 'gcbkp' ]
19
+ @source_path = Joiner[ 'tmp' ][ 'gcsrc' ]
20
+ @backup_join = Joiner[ @backup_path ]
21
+ @source_join = Joiner[ @source_path ]
22
+ repo = Git::Base.init( @backup_path )
23
+
24
+ test_files = [ 'file',
25
+ 'folder/file2',
26
+ 'folder/file3',
27
+ 'folder/folder2/file4',
28
+ 'folder/folder2/file5',
29
+ 'folder/folder3/file6',
30
+ 'folder/folder3/file7',
31
+ 'ignore_me' ]
32
+ FileUtils.mkdir_p( @backup_join[ @source_path, 'folder/folder2' ] )
33
+ FileUtils.mkdir_p( @backup_join[ @source_path, 'folder/folder3' ] )
34
+ test_files.each { |tf| File.open( @backup_join[ @source_path, tf ], 'w' ) }
35
+ File.open( @backup_join[ @source_path, 'folder/folder3/.gcignore' ], 'w' ) { |file| file.write 'file7' }
36
+ File.open( @backup_join[ '.gcignore' ], 'w' ) { |file| file.write <<ASD
37
+ #{@source_join[ 'ignore_me' ]}
38
+ #{@source_join[ 'wrong_file' ]}
39
+ ASD
40
+ }
41
+ File.open( @backup_join[ '.gcrecursive' ], 'w' ) { |file| file.write @source_join[ 'folder/folder2' ] }
42
+ repo.add '*'
18
43
  end
19
44
 
20
- after( :each ) do
21
- `rm -rf '#{ @repo_path }'`
45
+ after( :all ) do
46
+ `rm -rf '#{ @backup_path }'`
47
+ `rm -rf '/#{ @source_path }'`
22
48
  end
23
49
 
24
50
  it 'lists files' do
25
- conf = Git::Confident.new( @repo_path )
26
- conf.files.should == [ 'test_file' ]
51
+ conf = Git::Confident.new( :path => @backup_path )
52
+ expected = [ 'file',
53
+ 'folder/file2',
54
+ 'folder/file3',
55
+ 'folder/folder3/file6' ]
56
+ conf.elements.files.should == expected.collect { |e| @source_join[ e ] }
57
+ end
58
+
59
+ it 'lists ignored files' do
60
+ conf = Git::Confident.new( :path => @backup_path )
61
+ expected = [ 'folder/folder3/file7',
62
+ 'ignore_me',
63
+ 'wrong_file' ]
64
+ conf.elements.ignored.should == expected.collect { |e| @source_join[ e ] }
65
+ end
66
+
67
+ it 'lists recursive folders' do
68
+ conf = Git::Confident.new( :path => @backup_path )
69
+ conf.elements.folders.should == [ @source_join[ 'folder/folder2/' ] ]
70
+ end
71
+
72
+ it 'restores backup' do
73
+ conf = Git::Confident.new( :path => @backup_path, :action => :restore )
74
+ source_abs_join = Joiner[ '/' + @source_path ]
75
+ restored = Dir.glob( source_abs_join[ '**/*' ] )
76
+ expected = [ 'file',
77
+ 'folder',
78
+ 'folder/file2',
79
+ 'folder/file3',
80
+ 'folder/folder2',
81
+ 'folder/folder2/file4',
82
+ 'folder/folder2/file5',
83
+ 'folder/folder3',
84
+ 'folder/folder3/file6' ]
85
+ restored.sort.should == expected.collect { |e| source_abs_join[ e ] }.sort
27
86
  end
28
87
 
29
88
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-confident
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ version: 0.0.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joe Yates
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-23 00:00:00 +01:00
18
+ date: 2010-10-18 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -60,11 +60,13 @@ extra_rdoc_files:
60
60
  - README.rdoc
61
61
  - bin/git-confident
62
62
  - lib/git/confident.rb
63
+ - lib/git/elements.rb
63
64
  files:
64
65
  - Rakefile
65
66
  - README.rdoc
66
67
  - bin/git-confident
67
68
  - lib/git/confident.rb
69
+ - lib/git/elements.rb
68
70
  - spec/git_spec.rb
69
71
  has_rdoc: true
70
72
  homepage: http://github.com/joeyates/git-confident