gitti-backup 0.2.0 → 0.4.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.
- checksums.yaml +4 -4
- data/{HISTORY.md → CHANGELOG.md} +0 -0
- data/Manifest.txt +2 -2
- data/README.md +28 -3
- data/Rakefile +4 -4
- data/lib/gitti/backup.rb +4 -10
- data/lib/gitti/backup/backup.rb +66 -29
- data/lib/gitti/backup/base.rb +11 -0
- data/lib/gitti/backup/version.rb +2 -3
- data/test/data/repos.yml +2 -2
- data/test/helper.rb +2 -5
- data/test/test_backup.rb +13 -10
- metadata +12 -12
- data/lib/gitti/backup/repo.rb +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da31fe3c40e34387650d37bac81a8a4c15ce858c
|
4
|
+
data.tar.gz: 595414af6e4655bb6dddc552db194794ac31cb72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3881867d7f7513f4af361c9a15b96092ce026ed122055d960ef24f3158f777b293dda7a01c1819bf6fee6673060639c29d1720d761ee43ad7a5734d0ba7de312
|
7
|
+
data.tar.gz: e4d6a6066aebdc6e12b2ddaeac156583b78bdba87fac097d80fb2875ef7b5c37983d76b8c730f7772530aa07f1e08a85f306b0ee83929c56cdcb0edaecb893a0
|
data/{HISTORY.md → CHANGELOG.md}
RENAMED
File without changes
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -2,15 +2,40 @@
|
|
2
2
|
|
3
3
|
gitti-backup gem - (yet) another (lite) git backup command line script
|
4
4
|
|
5
|
-
* home :: [github.com/
|
6
|
-
* bugs :: [github.com/
|
5
|
+
* home :: [github.com/rubycoco/gitti](https://github.com/rubycoco/gitti)
|
6
|
+
* bugs :: [github.com/rubycoco/gitti/issues](https://github.com/rubycoco/gitti/issues)
|
7
7
|
* gem :: [rubygems.org/gems/gitti-backup](https://rubygems.org/gems/gitti-backup)
|
8
8
|
* rdoc :: [rubydoc.info/gems/gitti-backup](http://rubydoc.info/gems/gitti-backup)
|
9
9
|
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
13
|
-
|
13
|
+
|
14
|
+
``` ruby
|
15
|
+
require 'gitti/backup'
|
16
|
+
|
17
|
+
## step 1: setup the root backup directory - defaults to ~/backup
|
18
|
+
backup = GitBackup.new
|
19
|
+
|
20
|
+
## step 2: pass in all repos to backup by using
|
21
|
+
## 1) git clone --mirror or
|
22
|
+
## 2) git remote update (if local backup already exists)
|
23
|
+
backup.backup( GitRepoSet.read( './repos.yml' ) )
|
24
|
+
```
|
25
|
+
|
26
|
+
That's all for now.
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
## Installation
|
31
|
+
|
32
|
+
Use
|
33
|
+
|
34
|
+
gem install gitti-backup
|
35
|
+
|
36
|
+
or add to your Gemfile
|
37
|
+
|
38
|
+
gem 'gitti-backup'
|
14
39
|
|
15
40
|
|
16
41
|
## License
|
data/Rakefile
CHANGED
@@ -8,23 +8,23 @@ Hoe.spec 'gitti-backup' do
|
|
8
8
|
self.summary = 'gitti-backup - (yet) another (lite) git backup command line script'
|
9
9
|
self.description = summary
|
10
10
|
|
11
|
-
self.urls =
|
11
|
+
self.urls = { home: 'https://github.com/rubycoco/gitti' }
|
12
12
|
|
13
13
|
self.author = 'Gerald Bauer'
|
14
14
|
self.email = 'ruby-talk@ruby-lang.org'
|
15
15
|
|
16
16
|
# switch extension to .markdown for gihub formatting
|
17
17
|
self.readme_file = 'README.md'
|
18
|
-
self.history_file = '
|
18
|
+
self.history_file = 'CHANGELOG.md'
|
19
19
|
|
20
20
|
self.extra_deps = [
|
21
|
-
['gitti' ],
|
21
|
+
['gitti', '>= 0.3.0' ],
|
22
22
|
]
|
23
23
|
|
24
24
|
self.licenses = ['Public Domain']
|
25
25
|
|
26
26
|
self.spec_extras = {
|
27
|
-
required_ruby_version: '>=
|
27
|
+
required_ruby_version: '>= 2.2.2'
|
28
28
|
}
|
29
29
|
|
30
30
|
end
|
data/lib/gitti/backup.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
|
-
|
1
|
+
require_relative 'backup/base'
|
2
2
|
|
3
|
-
require 'gitti'
|
4
3
|
|
5
|
-
|
6
|
-
require
|
7
|
-
require 'gitti/backup/repo'
|
8
|
-
require 'gitti/backup/backup'
|
9
|
-
|
10
|
-
|
11
|
-
# say hello
|
12
|
-
puts GittiBackup.banner if defined?($RUBYLIBS_DEBUG)
|
4
|
+
## note: auto include Gitti; for "modular" version use ("Sinatra-style")
|
5
|
+
## require "gitti/backup/base"
|
13
6
|
|
7
|
+
include Gitti
|
data/lib/gitti/backup/backup.rb
CHANGED
@@ -1,53 +1,90 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
|
4
2
|
module Gitti
|
5
3
|
|
6
4
|
|
7
5
|
class GitBackup
|
8
6
|
|
9
|
-
def initialize(
|
10
|
-
@
|
11
|
-
pp @
|
12
|
-
|
7
|
+
def initialize( root= '~/backup' )
|
8
|
+
@root = File.expand_path( root )
|
9
|
+
pp @root
|
10
|
+
|
11
|
+
## use current working dir for the log path; see do_with_log helper for use
|
12
|
+
@log_path = File.expand_path( '.' )
|
13
|
+
pp @log_path
|
13
14
|
end
|
14
15
|
|
16
|
+
|
15
17
|
def backup( repos )
|
18
|
+
count_orgs = 0
|
19
|
+
count_repos = 0
|
20
|
+
|
21
|
+
total_repos = repos.size
|
22
|
+
|
16
23
|
## default to adding folder per day ## e.g. 2015-11-20
|
17
|
-
|
18
|
-
pp
|
19
|
-
|
20
|
-
FileUtils.mkdir_p( backup_dir ) ## make sure path exists
|
24
|
+
backup_path = "#{@root}/#{Date.today.strftime('%Y-%m-%d')}"
|
25
|
+
pp backup_path
|
21
26
|
|
22
|
-
|
23
|
-
repo_count = 0
|
27
|
+
FileUtils.mkdir_p( backup_path ) ## make sure path exists
|
24
28
|
|
25
|
-
repos.each do |
|
26
|
-
|
27
|
-
FileUtils.mkdir_p(
|
29
|
+
repos.each do |org, names|
|
30
|
+
org_path = "#{backup_path}/#{org}"
|
31
|
+
FileUtils.mkdir_p( org_path ) ## make sure path exists
|
28
32
|
|
29
|
-
|
30
|
-
puts "
|
33
|
+
names.each do |name|
|
34
|
+
puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..."
|
31
35
|
|
32
|
-
|
36
|
+
repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
|
33
37
|
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
success = Dir.chdir( org_path ) do
|
39
|
+
if Dir.exist?( "#{repo.name}.git" )
|
40
|
+
GitMirror.open( "#{repo.name}.git" ) do |mirror|
|
41
|
+
do_with_retries { mirror.update } ## note: defaults to two tries
|
42
|
+
end
|
43
|
+
else
|
44
|
+
do_with_retries { Git.mirror( repo.https_clone_url ) }
|
45
|
+
end
|
46
|
+
end
|
37
47
|
|
38
|
-
|
48
|
+
## todo/check: fail if success still false after x retries? -- why? why not?
|
39
49
|
|
40
|
-
|
50
|
+
count_repos += 1
|
41
51
|
end
|
42
|
-
|
43
|
-
org_count += 1
|
52
|
+
count_orgs += 1
|
44
53
|
end
|
45
|
-
|
46
|
-
## print stats
|
47
54
|
|
48
|
-
|
55
|
+
## print stats
|
56
|
+
puts " #{count_repos} repo(s) @ #{count_orgs} org(s)"
|
49
57
|
end ## backup
|
50
58
|
|
51
|
-
end ## GitBackup
|
52
59
|
|
60
|
+
######
|
61
|
+
# private helpers
|
62
|
+
|
63
|
+
def do_with_log( &blk )
|
64
|
+
blk.call
|
65
|
+
true ## return true ## success/ok
|
66
|
+
rescue GitError => ex
|
67
|
+
puts "!! ERROR: #{ex.message}"
|
68
|
+
|
69
|
+
File.open( "#{@log_path}/errors.log", 'a' ) do |f|
|
70
|
+
f.write "#{Time.now} -- #{ex.message}\n"
|
71
|
+
end
|
72
|
+
false ## return false ## error/nok
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
def do_with_retries( retries: 2, sleep: 5, &blk )
|
77
|
+
retries_count = 0
|
78
|
+
success = false
|
79
|
+
loop do
|
80
|
+
success = do_with_log( &blk )
|
81
|
+
retries_count += 1
|
82
|
+
break if success || retries_count >= retries
|
83
|
+
puts "retrying in #{sleep}secs... sleeping..."
|
84
|
+
sleep( sleep ) ## sleep 5secs or such
|
85
|
+
end
|
86
|
+
success ## return if success or not (true/false)
|
87
|
+
end
|
88
|
+
|
89
|
+
end ## class GitBackup
|
53
90
|
end ## module Gitti
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'gitti/base' # note: include "modular" base without (auto)include Gitti
|
2
|
+
|
3
|
+
|
4
|
+
# our own code
|
5
|
+
require 'gitti/backup/version' # note: let version always go first
|
6
|
+
require 'gitti/backup/backup'
|
7
|
+
|
8
|
+
|
9
|
+
# say hello
|
10
|
+
puts GittiBackup.banner ## if defined?($RUBYCOCO_DEBUG)
|
11
|
+
|
data/lib/gitti/backup/version.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
|
3
2
|
module GittiBackup
|
4
3
|
|
5
4
|
MAJOR = 0 ## todo: namespace inside version or something - why? why not??
|
6
|
-
MINOR =
|
5
|
+
MINOR = 4
|
7
6
|
PATCH = 0
|
8
7
|
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
9
8
|
|
@@ -18,6 +17,6 @@ module GittiBackup
|
|
18
17
|
def self.root
|
19
18
|
"#{File.expand_path( File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))) )}"
|
20
19
|
end
|
21
|
-
|
20
|
+
|
22
21
|
end # module GittiBackup
|
23
22
|
|
data/test/data/repos.yml
CHANGED
data/test/helper.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
## $:.unshift(File.dirname(__FILE__))
|
1
|
+
## note: use the local version of gitti gems
|
2
|
+
$LOAD_PATH.unshift( File.expand_path( '../gitti/lib' ))
|
4
3
|
|
5
4
|
## minitest setup
|
6
5
|
require 'minitest/autorun'
|
7
6
|
|
8
7
|
|
9
|
-
$RUBYLIBS_DEBUG = true
|
10
|
-
|
11
8
|
## our own code
|
12
9
|
require 'gitti/backup'
|
13
10
|
|
data/test/test_backup.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
###
|
4
2
|
# to run use
|
5
3
|
# ruby -I ./lib -I ./test test/test_backup.rb
|
@@ -10,17 +8,22 @@ require 'helper'
|
|
10
8
|
|
11
9
|
class TestBackup < MiniTest::Test
|
12
10
|
|
11
|
+
def test_backup_i
|
12
|
+
repos = GitRepoSet.read( "#{GittiBackup.root}/test/data/repos.yml" )
|
13
|
+
pp repos
|
14
|
+
|
15
|
+
backup = GitBackup.new
|
16
|
+
assert true ## assume everything ok if get here
|
17
|
+
end
|
13
18
|
|
14
|
-
def
|
15
|
-
|
16
|
-
repos = Gitti::GitRepoSet.from_file( "#{GittiBackup.root}/test/data/repos.yml" )
|
19
|
+
def test_backup_ii
|
20
|
+
repos = GitRepoSet.read( "#{GittiBackup.root}/test/data/repos.yml" )
|
17
21
|
pp repos
|
18
|
-
|
19
|
-
backup =
|
22
|
+
|
23
|
+
backup = GitBackup.new
|
20
24
|
backup.backup( repos )
|
21
|
-
|
22
|
-
assert true
|
23
|
-
## assume everything ok if get here
|
25
|
+
|
26
|
+
assert true ## assume everything ok if get here
|
24
27
|
end
|
25
28
|
|
26
29
|
end # class TestBackup
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitti-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gitti
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.3.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rdoc
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,35 +44,35 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.16'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.16'
|
55
55
|
description: gitti-backup - (yet) another (lite) git backup command line script
|
56
56
|
email: ruby-talk@ruby-lang.org
|
57
57
|
executables: []
|
58
58
|
extensions: []
|
59
59
|
extra_rdoc_files:
|
60
|
-
-
|
60
|
+
- CHANGELOG.md
|
61
61
|
- Manifest.txt
|
62
62
|
- README.md
|
63
63
|
files:
|
64
|
-
-
|
64
|
+
- CHANGELOG.md
|
65
65
|
- Manifest.txt
|
66
66
|
- README.md
|
67
67
|
- Rakefile
|
68
68
|
- lib/gitti/backup.rb
|
69
69
|
- lib/gitti/backup/backup.rb
|
70
|
-
- lib/gitti/backup/
|
70
|
+
- lib/gitti/backup/base.rb
|
71
71
|
- lib/gitti/backup/version.rb
|
72
72
|
- test/data/repos.yml
|
73
73
|
- test/helper.rb
|
74
74
|
- test/test_backup.rb
|
75
|
-
homepage: https://github.com/
|
75
|
+
homepage: https://github.com/rubycoco/gitti
|
76
76
|
licenses:
|
77
77
|
- Public Domain
|
78
78
|
metadata: {}
|
@@ -86,7 +86,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 2.2.2
|
90
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
92
|
- - ">="
|
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
version: '0'
|
95
95
|
requirements: []
|
96
96
|
rubyforge_project:
|
97
|
-
rubygems_version: 2.2
|
97
|
+
rubygems_version: 2.5.2
|
98
98
|
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: gitti-backup - (yet) another (lite) git backup command line script
|
data/lib/gitti/backup/repo.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Gitti
|
4
|
-
|
5
|
-
|
6
|
-
class GitHubBareRepo ## use/rename to GitHubServerRepo - why? why not?
|
7
|
-
def initialize( owner, name )
|
8
|
-
@owner = owner ## use/rename to login or something - why? why not??
|
9
|
-
@name = name # e.g. "rubylibs/webservice"
|
10
|
-
end
|
11
|
-
|
12
|
-
def http_clone_url ## use clone_url( http: true ) -- why? why not?
|
13
|
-
## check: use https: as default? for github - http:// still supported? or redirected?
|
14
|
-
"http://github.com/#{@owner}/#{@name}"
|
15
|
-
end
|
16
|
-
|
17
|
-
def git_dir
|
18
|
-
## todo: rename to use bare_git_dir or mirror_dir or something ??
|
19
|
-
"#{@name}.git"
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
|
-
def backup_with_retries( dest_dir, retries: 2 )
|
24
|
-
retries_count = 0
|
25
|
-
success = false
|
26
|
-
begin
|
27
|
-
success = backup( dest_dir )
|
28
|
-
retries_count += 1
|
29
|
-
end until success || retries_count >= retries
|
30
|
-
success ## return if success or not (true/false)
|
31
|
-
end
|
32
|
-
|
33
|
-
def backup( dest_dir )
|
34
|
-
###
|
35
|
-
## use --mirror
|
36
|
-
## use -n (--no-checkout) -- needed - why? why not?
|
37
|
-
|
38
|
-
Dir.chdir( dest_dir ) do
|
39
|
-
if Dir.exist?( git_dir )
|
40
|
-
Dir.chdir( git_dir ) do
|
41
|
-
Git.remote_update
|
42
|
-
end
|
43
|
-
else
|
44
|
-
Git.mirror( http_clone_url )
|
45
|
-
end
|
46
|
-
end
|
47
|
-
true ## return true ## success/ok
|
48
|
-
rescue GitError => ex
|
49
|
-
puts "*** error: #{ex.message}"
|
50
|
-
|
51
|
-
File.open( './errors.log', 'a' ) do |f|
|
52
|
-
f.write "#{Time.now} -- repo #{@owner}/#{@name} - #{ex.message}\n"
|
53
|
-
end
|
54
|
-
false ## return false ## error/nok
|
55
|
-
end ## method backup
|
56
|
-
|
57
|
-
end ## class Repo
|
58
|
-
|
59
|
-
end ## module Gitti
|
60
|
-
|