backup-github 1.1.0 → 2.0.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/.rvmrc +81 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +1 -1
- data/README.md +10 -6
- data/VERSION +1 -1
- data/backup-github.gemspec +3 -2
- data/lib/backup-github.rb +51 -36
- metadata +22 -21
data/.rvmrc
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
7
|
+
environment_id="ruby-1.9.3-p0@backup-github"
|
8
|
+
|
9
|
+
#
|
10
|
+
# Uncomment the following lines if you want to verify rvm version per project
|
11
|
+
#
|
12
|
+
# rvmrc_rvm_version="1.10.2" # 1.10.1 seams as a safe start
|
13
|
+
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
|
+
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
|
+
# return 1
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
|
19
|
+
#
|
20
|
+
# Uncomment following line if you want options to be set only for given project.
|
21
|
+
#
|
22
|
+
# PROJECT_JRUBY_OPTS=( --1.9 )
|
23
|
+
#
|
24
|
+
# The variable PROJECT_JRUBY_OPTS requires the following to be run in shell:
|
25
|
+
#
|
26
|
+
# chmod +x ${rvm_path}/hooks/after_use_jruby_opts
|
27
|
+
#
|
28
|
+
|
29
|
+
#
|
30
|
+
# First we attempt to load the desired environment directly from the environment
|
31
|
+
# file. This is very fast and efficient compared to running through the entire
|
32
|
+
# CLI and selector. If you want feedback on which environment was used then
|
33
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
34
|
+
#
|
35
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
36
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
37
|
+
then
|
38
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
39
|
+
|
40
|
+
if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
|
41
|
+
then
|
42
|
+
. "${rvm_path:-$HOME/.rvm}/hooks/after_use"
|
43
|
+
fi
|
44
|
+
else
|
45
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
46
|
+
if ! rvm --create "$environment_id"
|
47
|
+
then
|
48
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
49
|
+
return 1
|
50
|
+
fi
|
51
|
+
fi
|
52
|
+
|
53
|
+
#
|
54
|
+
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
55
|
+
# it be automatically loaded. Uncomment the following and adjust the filename if
|
56
|
+
# necessary.
|
57
|
+
#
|
58
|
+
# filename=".gems"
|
59
|
+
# if [[ -s "$filename" ]]
|
60
|
+
# then
|
61
|
+
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
62
|
+
# fi
|
63
|
+
|
64
|
+
# If you use bundler, this might be useful to you:
|
65
|
+
# if [[ -s Gemfile ]] && ! command -v bundle >/dev/null
|
66
|
+
# then
|
67
|
+
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
|
68
|
+
# gem install bundler
|
69
|
+
# fi
|
70
|
+
# if [[ -s Gemfile ]] && command -v bundle
|
71
|
+
# then
|
72
|
+
# bundle install
|
73
|
+
# fi
|
74
|
+
|
75
|
+
if [[ $- == *i* ]] # check for interactive shells
|
76
|
+
then
|
77
|
+
echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
|
78
|
+
else
|
79
|
+
echo "Using: $GEM_HOME" # don't use colors in interactive shells
|
80
|
+
fi
|
81
|
+
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# backup-github
|
2
2
|
|
3
|
-
Utility tool to backup github repository issues. It will backup
|
3
|
+
Utility tool to backup github repository issues. It will backup all repositories from a given github account. The backup comprises the git repostory, the wiki and the issues.
|
4
4
|
|
5
5
|
It works with a local git repository, on which issues from all repositories of a github account are serialized to json and commited. Thanks to git, all changes are versioned, and saved.
|
6
6
|
|
@@ -13,7 +13,7 @@ To install you can just download the gem with:
|
|
13
13
|
Then, to run the backup command:
|
14
14
|
|
15
15
|
```bash
|
16
|
-
backup-github -r path/to/my/backup/dir -u github_user -p github_pwd
|
16
|
+
backup-github -r path/to/my/backup/dir -u github_user -p github_pwd
|
17
17
|
```
|
18
18
|
|
19
19
|
If, instead you want to backup up all the issues from an Organization within github, then you run:
|
@@ -26,19 +26,23 @@ If, instead you want to backup up all the issues from an Organization within git
|
|
26
26
|
|
27
27
|
To properly configure the backup system, we recommend setting a cron job to run the command once a day.
|
28
28
|
|
29
|
+
## Dependencies
|
30
|
+
|
31
|
+
Besides the gem dependencies, the git binary is required.
|
32
|
+
|
29
33
|
## Contributing to backup-github
|
30
|
-
|
34
|
+
|
31
35
|
* Check out the latest master to make sure the feature hasn't been implemented
|
32
36
|
or the bug hasn't been fixed yet.
|
33
|
-
* Check out the issue tracker to make sure someone already hasn't requested it
|
37
|
+
* Check out the issue tracker to make sure someone already hasn't requested it
|
34
38
|
and/or contributed it.
|
35
39
|
* Fork the project.
|
36
40
|
* Start a feature/bugfix branch.
|
37
41
|
* Commit and push until you are happy with your contribution.
|
38
42
|
* Make sure to add tests for it. This is important so I don't break it in a
|
39
43
|
future version unintentionally.
|
40
|
-
* Please try not to mess with the Rakefile, version, or history. If you want to
|
41
|
-
have your own version, or is otherwise necessary, that is fine, but please
|
44
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to
|
45
|
+
have your own version, or is otherwise necessary, that is fine, but please
|
42
46
|
isolate to its own commit so I can cherry-pick around it.
|
43
47
|
|
44
48
|
## Copyright
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
data/backup-github.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "backup-github"
|
8
|
-
s.version = "
|
8
|
+
s.version = "2.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Mariano A. Cortesi"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-03-06"
|
13
13
|
s.description = "Command to backup Github Issues as JSON files in a Git Repository"
|
14
14
|
s.email = "mariano@zauberlabs.com"
|
15
15
|
s.executables = ["gh-backup-issues"]
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.files = [
|
21
21
|
".document",
|
22
22
|
".rspec",
|
23
|
+
".rvmrc",
|
23
24
|
"Gemfile",
|
24
25
|
"Gemfile.lock",
|
25
26
|
"LICENSE.txt",
|
data/lib/backup-github.rb
CHANGED
@@ -7,8 +7,11 @@ require 'ostruct'
|
|
7
7
|
require 'pathname'
|
8
8
|
require 'logger'
|
9
9
|
|
10
|
+
#Grit.debug=true
|
11
|
+
|
12
|
+
Issue = Struct.new "Issue", :number, :content
|
10
13
|
$logger = Logger.new($stdout)
|
11
|
-
|
14
|
+
|
12
15
|
class GithubBackup
|
13
16
|
|
14
17
|
def initialize(github)
|
@@ -19,58 +22,71 @@ class GithubBackup
|
|
19
22
|
JSON.pretty_generate( issue.content )
|
20
23
|
end
|
21
24
|
|
22
|
-
def save_issue(
|
23
|
-
|
24
|
-
file.open('w') { |f| f.write(serialize_issue(issue)) }
|
25
|
-
@gitrepo.add(file.to_s)
|
25
|
+
def save_issue(issue)
|
26
|
+
File.open('%04d.js' % issue.number, "w") { |f| f.write(serialize_issue(issue)) }
|
26
27
|
end
|
27
28
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
def backup_gitrepo( giturl, path )
|
30
|
+
$logger.info "Backuping #{path.to_path}"
|
31
|
+
if path.directory?
|
32
|
+
$logger.info "Backuping #{path.to_path} -> UPDATE"
|
33
|
+
gritty = Grit::Git.new(path.realpath.to_path)
|
34
|
+
gritty.fetch({:timeout=>false})
|
35
|
+
else
|
36
|
+
$logger.info "Backuping #{path.to_path} -> NEW"
|
37
|
+
path.mkpath
|
38
|
+
gritty = Grit::Git.new(".")
|
39
|
+
gritty.clone({:mirror=>true, :timeout=>false}, giturl, path.realpath.to_path)
|
35
40
|
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def run( orgname, local_repo )
|
44
|
+
@github.repositories(orgname)[0,3].each do |repo|
|
45
|
+
reponame = "#{orgname}/#{repo.name}"
|
46
|
+
$logger.info "Backuping #{reponame}"
|
47
|
+
|
48
|
+
repopath = Pathname.new(local_repo) + repo.name
|
49
|
+
repopath.mkpath
|
36
50
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
$logger.info("Backup Reporsitory")
|
52
|
+
backup_gitrepo(repo.ssh_url, repopath + "git-bare" )
|
53
|
+
|
54
|
+
$logger.info("Backup Wiki")
|
55
|
+
backup_gitrepo(repo.ssh_url.gsub(".git", ".wiki.git"), repopath + "wiki-bare" )
|
56
|
+
|
57
|
+
# Backup Issues
|
58
|
+
if @github.has_issues? reponame
|
59
|
+
issuespath = repopath + "issues"
|
60
|
+
issuespath.mkpath
|
61
|
+
Dir.chdir(issuespath) do
|
62
|
+
# After endless problems with Grit, fallback to sytem exec
|
63
|
+
`git init` unless File.directory? ".git"
|
64
|
+
$logger.info("Fetching issues")
|
65
|
+
@github.on_issues(reponame) {|issue| save_issue(issue)}
|
66
|
+
|
67
|
+
$logger.info("Add & Commit issues")
|
68
|
+
`git add .`
|
69
|
+
`git commit -m backup`
|
52
70
|
end
|
71
|
+
else
|
72
|
+
$logger.info "No issues for #{reponame}"
|
53
73
|
end
|
54
|
-
|
55
|
-
@gitrepo.commit_index("Backup...")
|
56
|
-
$logger.info 'Backup Finished'
|
57
74
|
end
|
58
75
|
end
|
59
|
-
|
60
76
|
end
|
61
77
|
|
62
78
|
|
63
79
|
class GithubAPIAdapter
|
64
80
|
@@ISSUE_STATES = %w{open closed}
|
65
|
-
|
66
|
-
def initialize(client)
|
81
|
+
|
82
|
+
def initialize(client)
|
67
83
|
@client = client
|
68
84
|
end
|
69
85
|
|
70
86
|
def has_issues?(reponame)
|
71
87
|
@client.repository(reponame).has_issues
|
72
88
|
end
|
73
|
-
|
89
|
+
|
74
90
|
def on_issues(reponame, &block)
|
75
91
|
@@ISSUE_STATES.each do |status|
|
76
92
|
page = 0
|
@@ -78,8 +94,7 @@ class GithubAPIAdapter
|
|
78
94
|
begin
|
79
95
|
issues = @client.list_issues( reponame, :page => page, :state => status )
|
80
96
|
issues.each do |issue|
|
81
|
-
yield
|
82
|
-
:content => @client.issue(reponame, issue.number))
|
97
|
+
yield Issue.new(issue.number, @client.issue(reponame, issue.number))
|
83
98
|
end
|
84
99
|
page += 1
|
85
100
|
end until issues.length != 10
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backup-github
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: octokit
|
16
|
-
requirement: &
|
16
|
+
requirement: &70334031341660 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.6.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70334031341660
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: json
|
27
|
-
requirement: &
|
27
|
+
requirement: &70334031341180 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.6.4
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70334031341180
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: grit
|
38
|
-
requirement: &
|
38
|
+
requirement: &70334031340700 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.4.1
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70334031340700
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: trollop
|
49
|
-
requirement: &
|
49
|
+
requirement: &70334031340220 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.16.2
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70334031340220
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &70334031339740 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 2.8.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70334031339740
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rdoc
|
71
|
-
requirement: &
|
71
|
+
requirement: &70334031339260 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '3.12'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70334031339260
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: bundler
|
82
|
-
requirement: &
|
82
|
+
requirement: &70334031338780 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.0.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70334031338780
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: jeweler
|
93
|
-
requirement: &
|
93
|
+
requirement: &70334031338300 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 1.8.3
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70334031338300
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: mocha
|
104
|
-
requirement: &
|
104
|
+
requirement: &70334031337820 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
version: 0.10.3
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70334031337820
|
113
113
|
description: Command to backup Github Issues as JSON files in a Git Repository
|
114
114
|
email: mariano@zauberlabs.com
|
115
115
|
executables:
|
@@ -121,6 +121,7 @@ extra_rdoc_files:
|
|
121
121
|
files:
|
122
122
|
- .document
|
123
123
|
- .rspec
|
124
|
+
- .rvmrc
|
124
125
|
- Gemfile
|
125
126
|
- Gemfile.lock
|
126
127
|
- LICENSE.txt
|
@@ -148,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
148
149
|
version: '0'
|
149
150
|
segments:
|
150
151
|
- 0
|
151
|
-
hash:
|
152
|
+
hash: -2566165398545649519
|
152
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
154
|
none: false
|
154
155
|
requirements:
|