repo_manager 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemfiles +115 -0
- data/.gitattributes +1 -0
- data/.gitignore +7 -0
- data/.rspec +3 -0
- data/.yardopts +11 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +99 -0
- data/Guardfile +63 -0
- data/HISTORY.markdown +12 -0
- data/LICENSE +20 -0
- data/README.markdown +192 -0
- data/Rakefile +94 -0
- data/TODO.markdown +15 -0
- data/VERSION +1 -0
- data/bin/repo +151 -0
- data/cucumber.yml +28 -0
- data/examples/pc_saved_game_backup/.gitignore +2 -0
- data/examples/pc_saved_game_backup/INSTALL.markdown +420 -0
- data/examples/pc_saved_game_backup/README.markdown +108 -0
- data/examples/pc_saved_game_backup/remote/.gitignore +2 -0
- data/examples/pc_saved_game_backup/repo_manager/Gemfile +12 -0
- data/examples/pc_saved_game_backup/repo_manager/Gemfile.lock +66 -0
- data/examples/pc_saved_game_backup/repo_manager/assets/.gitignore +2 -0
- data/examples/pc_saved_game_backup/repo_manager/features/support/aruba.rb +15 -0
- data/examples/pc_saved_game_backup/repo_manager/features/support/env.rb +11 -0
- data/examples/pc_saved_game_backup/repo_manager/features/support/steps.rb +3 -0
- data/examples/pc_saved_game_backup/repo_manager/features/tasks/update.feature +144 -0
- data/examples/pc_saved_game_backup/repo_manager/global/default/asset.conf +2 -0
- data/examples/pc_saved_game_backup/repo_manager/repo.conf +64 -0
- data/examples/pc_saved_game_backup/repo_manager/tasks/.gitignore +0 -0
- data/examples/pc_saved_game_backup/repo_manager/tasks/remote.rb +57 -0
- data/examples/pc_saved_game_backup/repo_manager/tasks/update.rb +65 -0
- data/examples/pc_saved_game_backup/saved_games/hearts/save1 +1 -0
- data/examples/pc_saved_game_backup/saved_games/hearts/save2 +1 -0
- data/examples/pc_saved_game_backup/saved_games/mines/my_profile.ini +1 -0
- data/examples/pc_saved_game_backup/saved_games/mines/saves/save1 +1 -0
- data/examples/pc_saved_game_backup/saved_games/mines/saves/save2 +1 -0
- data/features/actions/git.feature +296 -0
- data/features/actions/help.feature +53 -0
- data/features/actions/list.feature +624 -0
- data/features/actions/path.feature +195 -0
- data/features/actions/status.feature +261 -0
- data/features/actions/task.feature +127 -0
- data/features/assets/configuration.feature +204 -0
- data/features/assets/rendering.feature +42 -0
- data/features/assets/user_attributes.feature +98 -0
- data/features/bin.feature +42 -0
- data/features/logger.feature +218 -0
- data/features/settings.feature +240 -0
- data/features/support/aruba.rb +15 -0
- data/features/support/env.rb +11 -0
- data/features/support/steps.rb +3 -0
- data/features/tasks/add/asset.feature +178 -0
- data/features/tasks/generate/init.feature +56 -0
- data/lib/repo_manager.rb +36 -0
- data/lib/repo_manager/actions.rb +8 -0
- data/lib/repo_manager/actions/action_helper.rb +39 -0
- data/lib/repo_manager/actions/app_action.rb +30 -0
- data/lib/repo_manager/actions/base_action.rb +296 -0
- data/lib/repo_manager/actions/git_action.rb +113 -0
- data/lib/repo_manager/actions/help_action.rb +52 -0
- data/lib/repo_manager/actions/list_action.rb +123 -0
- data/lib/repo_manager/actions/path_action.rb +22 -0
- data/lib/repo_manager/actions/status_action.rb +192 -0
- data/lib/repo_manager/actions/task_action.rb +71 -0
- data/lib/repo_manager/app.rb +116 -0
- data/lib/repo_manager/assets.rb +3 -0
- data/lib/repo_manager/assets/app_asset.rb +15 -0
- data/lib/repo_manager/assets/asset_accessors.rb +67 -0
- data/lib/repo_manager/assets/asset_configuration.rb +137 -0
- data/lib/repo_manager/assets/asset_manager.rb +72 -0
- data/lib/repo_manager/assets/base_asset.rb +199 -0
- data/lib/repo_manager/assets/repo_asset.rb +30 -0
- data/lib/repo_manager/core.rb +2 -0
- data/lib/repo_manager/core/array.rb +21 -0
- data/lib/repo_manager/core/hash.rb +83 -0
- data/lib/repo_manager/errors.rb +10 -0
- data/lib/repo_manager/extensions/hash.rb +86 -0
- data/lib/repo_manager/git.rb +2 -0
- data/lib/repo_manager/git/lib.rb +69 -0
- data/lib/repo_manager/git/status.rb +196 -0
- data/lib/repo_manager/logger.rb +39 -0
- data/lib/repo_manager/settings.rb +98 -0
- data/lib/repo_manager/tasks.rb +3 -0
- data/lib/repo_manager/tasks/add/asset.rb +213 -0
- data/lib/repo_manager/tasks/generate/init.rb +42 -0
- data/lib/repo_manager/tasks/generate/templates/config/repo.conf.tt +61 -0
- data/lib/repo_manager/tasks/generate/templates/init/assets/.gitignore +0 -0
- data/lib/repo_manager/tasks/generate/templates/init/global/default/asset.conf +2 -0
- data/lib/repo_manager/tasks/generate/templates/init/tasks/.gitignore +0 -0
- data/lib/repo_manager/tasks/task_manager.rb +166 -0
- data/lib/repo_manager/tasks/thor_helper.rb +29 -0
- data/lib/repo_manager/test/asset_steps.rb +19 -0
- data/lib/repo_manager/test/base_steps.rb +152 -0
- data/lib/repo_manager/test/repo_api.rb +41 -0
- data/lib/repo_manager/test/repo_steps.rb +83 -0
- data/lib/repo_manager/test/test_api.rb +88 -0
- data/lib/repo_manager/views.rb +2 -0
- data/lib/repo_manager/views/app_view.rb +15 -0
- data/lib/repo_manager/views/base_view.rb +137 -0
- data/lib/repo_manager/views/templates/css/basic.css +26 -0
- data/lib/repo_manager/views/templates/default.erb +40 -0
- data/lib/repo_manager/views/templates/default.slim +37 -0
- data/lib/repo_manager/views/view_helper.rb +55 -0
- data/repo_manager.gemspec +75 -0
- data/spec/basic_app/actions/action_helper_spec.rb +54 -0
- data/spec/basic_app/assets/base_asset_spec.rb +210 -0
- data/spec/basic_app/core_spec.rb +78 -0
- data/spec/basic_app/settings_spec.rb +64 -0
- data/spec/basic_app/views/view_helper_spec.rb +28 -0
- data/spec/basic_gem/aruba_helper_spec.rb +33 -0
- data/spec/basic_gem/basic_gem_spec.rb +84 -0
- data/spec/basic_gem/gemspec_spec.rb +68 -0
- data/spec/repo_manager/git_spec.rb +31 -0
- data/spec/spec_helper.rb +25 -0
- metadata +472 -0
@@ -0,0 +1,108 @@
|
|
1
|
+
Using RepoManager to Backup and Synchronize PC Game Saves
|
2
|
+
=====================================================
|
3
|
+
|
4
|
+
Use case: Backup and synchronization of PC save games folders to a
|
5
|
+
central repository (ie Drop Box folder) using Git. Game saves are
|
6
|
+
typically scattered across multiple folders and drives.
|
7
|
+
|
8
|
+
This example demonstrates the following features:
|
9
|
+
|
10
|
+
* Adding RepoManager user tasks, see repo_manager/tasks/
|
11
|
+
* Adding destructive git commands to the default whitelisted non-destructive git commands
|
12
|
+
* Testing user tasks with Cucumber, see repo_manager/features/
|
13
|
+
* Relative paths (not absolute) in repo_manager/repo.conf making the folder portable
|
14
|
+
* Bash completion for repo names, works on Win32 using Cygwin or MSYS Bash
|
15
|
+
* Bash function to 'cd' into a repo's working folder
|
16
|
+
|
17
|
+
|
18
|
+
Bootstrapping this example folder
|
19
|
+
--------------------------------
|
20
|
+
|
21
|
+
In order to try out the example commands below, you will need to bootstrap the
|
22
|
+
sample data git repositories and create the configuration files using the
|
23
|
+
following commands. See [INSTALL.markdown](INSTALL.markdown) for a more
|
24
|
+
complete explanation.
|
25
|
+
|
26
|
+
repo generate:remote mines --path=saved_games/mines/saves
|
27
|
+
repo generate:remote hearts --path=saved_games/hearts
|
28
|
+
|
29
|
+
repo add:asset saved_games/mines/saves --name=mines --force
|
30
|
+
repo add:asset saved_games/hearts --force
|
31
|
+
|
32
|
+
|
33
|
+
Get information on configured saved game repositories
|
34
|
+
-----------------------------------------------------
|
35
|
+
|
36
|
+
repo list --short
|
37
|
+
repo status --unmodified DOTS
|
38
|
+
|
39
|
+
|
40
|
+
User tasks
|
41
|
+
---------
|
42
|
+
|
43
|
+
The task 'generate:remote' is a user task, it doesn't ship with RepoManager.
|
44
|
+
|
45
|
+
To view all the available tasks
|
46
|
+
|
47
|
+
repo --tasks
|
48
|
+
|
49
|
+
or just
|
50
|
+
|
51
|
+
repo -T
|
52
|
+
|
53
|
+
### Running tests on user tasks
|
54
|
+
|
55
|
+
gem install bundler
|
56
|
+
|
57
|
+
cd repo_manager
|
58
|
+
bundle
|
59
|
+
bundle exec cucumber
|
60
|
+
|
61
|
+
Backup
|
62
|
+
------
|
63
|
+
|
64
|
+
To backup the saved games, we will need another user task. This on is called
|
65
|
+
'action:update'. See [repo_manager/tasks/update.rb](repo_manager/tasks/update.rb)
|
66
|
+
|
67
|
+
repo action:update
|
68
|
+
|
69
|
+
Synchronize
|
70
|
+
----------
|
71
|
+
|
72
|
+
Synchronizing saved games to another PC can be accomplished using Git's 'pull' command.
|
73
|
+
|
74
|
+
verify working folders are clean, if they are not, either revert them or commit and push
|
75
|
+
|
76
|
+
repo status
|
77
|
+
|
78
|
+
pull from remote to all configured repos
|
79
|
+
|
80
|
+
repo pull
|
81
|
+
|
82
|
+
Bash completion
|
83
|
+
---------------
|
84
|
+
|
85
|
+
Handy functions for use under Bash. These work fine on Win32 using
|
86
|
+
Git-Bash.
|
87
|
+
|
88
|
+
* rcd: repo cd (change directory). Wrapper for 'cd', allows for simple cd
|
89
|
+
<repo name> to the working folder on the filesystem referenced by the 'path'
|
90
|
+
configuration variable.
|
91
|
+
* rpushd: repo pushd (push directory). Wrapper for 'pushd'.
|
92
|
+
|
93
|
+
Clean
|
94
|
+
-----
|
95
|
+
Resetting this example folder back to its shipping defaults
|
96
|
+
|
97
|
+
### Delete the git repositories
|
98
|
+
|
99
|
+
rm -rf remote/hearts.git
|
100
|
+
rm -rf remote/mines.git
|
101
|
+
|
102
|
+
rm -rf saved_games/mines/saves/.git
|
103
|
+
rm -rf saved_games/hearts/.git
|
104
|
+
|
105
|
+
### Remove the asset config files
|
106
|
+
|
107
|
+
rm -rf repo_manager/assets/mines
|
108
|
+
rm -rf repo_manager/assets/hearts
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# this Gemfile is not required for RepoManager normal usage, it exists
|
2
|
+
# to support testing tasks in the user 'tasks' folder
|
3
|
+
source "http://rubygems.org"
|
4
|
+
|
5
|
+
gem "repo_manager"
|
6
|
+
|
7
|
+
gem "bundler", ">= 1.0.14"
|
8
|
+
gem "rspec", ">= 2.6.0"
|
9
|
+
gem "cucumber", "~> 1.0"
|
10
|
+
gem "aruba", "= 0.4.5"
|
11
|
+
|
12
|
+
gem "win32console", :platforms => [:mingw, :mswin]
|
@@ -0,0 +1,66 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
aruba (0.4.5)
|
5
|
+
bcat (>= 0.6.1)
|
6
|
+
childprocess (>= 0.1.9)
|
7
|
+
cucumber (>= 0.10.7)
|
8
|
+
rdiscount (>= 1.6.8)
|
9
|
+
rspec (>= 2.6.0)
|
10
|
+
bcat (0.6.2)
|
11
|
+
rack (~> 1.0)
|
12
|
+
builder (3.0.0)
|
13
|
+
childprocess (0.3.4)
|
14
|
+
ffi (~> 1.0, >= 1.0.6)
|
15
|
+
chronic (0.6.7)
|
16
|
+
cucumber (1.2.1)
|
17
|
+
builder (>= 2.1.2)
|
18
|
+
diff-lcs (>= 1.1.3)
|
19
|
+
gherkin (~> 2.11.0)
|
20
|
+
json (>= 1.4.6)
|
21
|
+
diff-lcs (1.1.3)
|
22
|
+
ffi (1.1.0)
|
23
|
+
gherkin (2.11.1)
|
24
|
+
json (>= 1.4.6)
|
25
|
+
git (1.2.5)
|
26
|
+
json (1.7.4)
|
27
|
+
little-plugger (1.1.3)
|
28
|
+
logging (1.7.2)
|
29
|
+
little-plugger (>= 1.1.3)
|
30
|
+
mustache (0.99.4)
|
31
|
+
rack (1.4.1)
|
32
|
+
rdiscount (1.6.8)
|
33
|
+
repo_manager (0.7.1)
|
34
|
+
chronic (>= 0.6.5)
|
35
|
+
git (= 1.2.5)
|
36
|
+
logging (>= 1.6.2)
|
37
|
+
mustache (>= 0.99.4)
|
38
|
+
slim (>= 1.0.4)
|
39
|
+
term-ansicolor (>= 1.0.4)
|
40
|
+
thor (~> 0.15.0)
|
41
|
+
rspec (2.11.0)
|
42
|
+
rspec-core (~> 2.11.0)
|
43
|
+
rspec-expectations (~> 2.11.0)
|
44
|
+
rspec-mocks (~> 2.11.0)
|
45
|
+
rspec-core (2.11.1)
|
46
|
+
rspec-expectations (2.11.2)
|
47
|
+
diff-lcs (~> 1.1.3)
|
48
|
+
rspec-mocks (2.11.1)
|
49
|
+
slim (1.2.2)
|
50
|
+
temple (~> 0.4.0)
|
51
|
+
tilt (~> 1.3.3)
|
52
|
+
temple (0.4.0)
|
53
|
+
term-ansicolor (1.0.7)
|
54
|
+
thor (0.15.3)
|
55
|
+
tilt (1.3.3)
|
56
|
+
|
57
|
+
PLATFORMS
|
58
|
+
ruby
|
59
|
+
|
60
|
+
DEPENDENCIES
|
61
|
+
aruba (= 0.4.5)
|
62
|
+
bundler (>= 1.0.14)
|
63
|
+
cucumber (~> 1.0)
|
64
|
+
repo_manager
|
65
|
+
rspec (>= 2.6.0)
|
66
|
+
win32console
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'aruba/api'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Aruba
|
5
|
+
module Api
|
6
|
+
|
7
|
+
# override aruba avoid 'current_ruby' call and make sure
|
8
|
+
# that binary run on Win32 without the binstubs
|
9
|
+
def detect_ruby(cmd)
|
10
|
+
wrapper = which('repo')
|
11
|
+
cmd = cmd.gsub(/^repo/, "ruby -S #{wrapper}") if wrapper
|
12
|
+
cmd
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
@announce
|
2
|
+
Feature: Automatically add, commit, and push multiple repos
|
3
|
+
|
4
|
+
This task will run:
|
5
|
+
|
6
|
+
repo add -A, repo commit, and repo push on all dirty repos
|
7
|
+
|
8
|
+
Examples
|
9
|
+
|
10
|
+
Interactive
|
11
|
+
|
12
|
+
repo action:update
|
13
|
+
|
14
|
+
Non-interactive
|
15
|
+
|
16
|
+
repo action:update --force
|
17
|
+
|
18
|
+
Filter repos
|
19
|
+
|
20
|
+
repo action:update --repos=repo1,repo2
|
21
|
+
|
22
|
+
Background: Test repositories and a valid config file
|
23
|
+
Given a repo in folder "test_path_1" with the following:
|
24
|
+
| filename | status | content |
|
25
|
+
| .gitignore | C | |
|
26
|
+
And a repo in folder "test_path_2" with the following:
|
27
|
+
| filename | status | content |
|
28
|
+
| .gitignore | C | |
|
29
|
+
And a file named "repo.conf" with:
|
30
|
+
"""
|
31
|
+
---
|
32
|
+
folders:
|
33
|
+
assets : repo/asset/configuration/files
|
34
|
+
tasks : ../../tasks
|
35
|
+
commands:
|
36
|
+
- status
|
37
|
+
- log
|
38
|
+
- add
|
39
|
+
- commit
|
40
|
+
- push
|
41
|
+
"""
|
42
|
+
And the folder "repo/asset/configuration/files" with the following asset configurations:
|
43
|
+
| name | path |
|
44
|
+
| test1 | test_path_1 |
|
45
|
+
| test2 | test_path_2 |
|
46
|
+
|
47
|
+
|
48
|
+
Scenario: No uncommitted changes
|
49
|
+
When I run `repo action:update`
|
50
|
+
Then its output should contain:
|
51
|
+
"""
|
52
|
+
no changed repos
|
53
|
+
"""
|
54
|
+
|
55
|
+
Scenario: Uncommitted changes filtered out with the '--repos' param
|
56
|
+
Given a repo in folder "test_path_1" with the following:
|
57
|
+
| filename | status | content |
|
58
|
+
| .gitignore | M | tmp/* |
|
59
|
+
And a repo in folder "test_path_2" with the following:
|
60
|
+
| filename | status | content |
|
61
|
+
| .gitignore | M | tmp/* |
|
62
|
+
| test | ? | test |
|
63
|
+
And a repo in folder "my_clean_repo" with the following:
|
64
|
+
| filename | status | content |
|
65
|
+
| .gitignore | C | tmp/* |
|
66
|
+
When I run `repo action:update --force --repos=my_clean_repo`
|
67
|
+
Then its output should contain:
|
68
|
+
"""
|
69
|
+
no changed repos
|
70
|
+
"""
|
71
|
+
|
72
|
+
Scenario: Uncommitted changes in multiple repos, non-interactive, custom commit message
|
73
|
+
Given a repo in folder "test_path_1" with the following:
|
74
|
+
| filename | status | content |
|
75
|
+
| .gitignore | M | tmp/* |
|
76
|
+
And a repo in folder "test_path_2" with the following:
|
77
|
+
| filename | status | content |
|
78
|
+
| .gitignore | M | tmp/* |
|
79
|
+
| test | ? | test |
|
80
|
+
And the repo in folder "test_path_1" has a remote named "origin" in folder "test_path_1.remote.git"
|
81
|
+
And the repo in folder "test_path_2" has a remote named "origin" in folder "test_path_2.remote.git"
|
82
|
+
When I run `repo action:update --force --message="my custom commit message"`
|
83
|
+
Then its output should contain:
|
84
|
+
"""
|
85
|
+
updating test1,test2
|
86
|
+
"""
|
87
|
+
And its output should contain:
|
88
|
+
"""
|
89
|
+
update finished
|
90
|
+
"""
|
91
|
+
And its output should not contain:
|
92
|
+
"""
|
93
|
+
failed
|
94
|
+
"""
|
95
|
+
When I run `repo status --no-verbose`
|
96
|
+
Then the exit status should be 0
|
97
|
+
When I run `repo --no-verbose git log -1 --pretty=format:'%s' --repos test1`
|
98
|
+
Then its output should contain:
|
99
|
+
"""
|
100
|
+
my custom commit message
|
101
|
+
"""
|
102
|
+
Then its output should not contain:
|
103
|
+
"""
|
104
|
+
automatic commit
|
105
|
+
"""
|
106
|
+
When I run `repo push --no-verbose --repos test1`
|
107
|
+
Then its output should contain:
|
108
|
+
"""
|
109
|
+
up-to-date
|
110
|
+
"""
|
111
|
+
|
112
|
+
@slow_process
|
113
|
+
Scenario: Uncommitted changes in a single repo, interactive prompt to continue
|
114
|
+
And a repo in folder "test_path_2" with the following:
|
115
|
+
| filename | status | content |
|
116
|
+
| .gitignore | M | tmp/* |
|
117
|
+
| test | ? | test |
|
118
|
+
And the repo in folder "test_path_2" has a remote named "origin" in folder "test_path_2.remote.git"
|
119
|
+
When I run `repo action:update` interactively
|
120
|
+
And I type "y"
|
121
|
+
Then its output should contain:
|
122
|
+
"""
|
123
|
+
updating test2
|
124
|
+
"""
|
125
|
+
And its output should contain:
|
126
|
+
"""
|
127
|
+
update finished
|
128
|
+
"""
|
129
|
+
And its output should not contain:
|
130
|
+
"""
|
131
|
+
failed
|
132
|
+
"""
|
133
|
+
When I run `repo status --no-verbose`
|
134
|
+
Then the exit status should be 0
|
135
|
+
When I run `repo --no-verbose git log -1 --pretty=format:'%s' --repos test2`
|
136
|
+
Then its output should contain:
|
137
|
+
"""
|
138
|
+
automatic commit
|
139
|
+
"""
|
140
|
+
When I run `repo push --no-verbose --repos test2`
|
141
|
+
Then its output should contain:
|
142
|
+
"""
|
143
|
+
up-to-date
|
144
|
+
"""
|
@@ -0,0 +1,64 @@
|
|
1
|
+
---
|
2
|
+
# default CLI options
|
3
|
+
options:
|
4
|
+
color : AUTO
|
5
|
+
verbose : false
|
6
|
+
short : false
|
7
|
+
unmodified : HIDE
|
8
|
+
match : ALL
|
9
|
+
list : ALL
|
10
|
+
|
11
|
+
folders:
|
12
|
+
|
13
|
+
# main repo configuration files
|
14
|
+
assets : assets
|
15
|
+
|
16
|
+
#
|
17
|
+
# repo user tasks, file extentions can be '.rb' or '.thor'
|
18
|
+
#
|
19
|
+
# @examples:
|
20
|
+
#
|
21
|
+
# linux:
|
22
|
+
#
|
23
|
+
# ~/.repoman/tasks
|
24
|
+
#
|
25
|
+
# win32
|
26
|
+
#
|
27
|
+
# c:/dat/condenser/tasks
|
28
|
+
#
|
29
|
+
tasks : tasks
|
30
|
+
|
31
|
+
# git commands must be whitelisted
|
32
|
+
commands:
|
33
|
+
- diff
|
34
|
+
- grep
|
35
|
+
- log
|
36
|
+
- ls-files
|
37
|
+
- show
|
38
|
+
- status
|
39
|
+
- push
|
40
|
+
- add
|
41
|
+
- commit
|
42
|
+
|
43
|
+
logging:
|
44
|
+
loggers:
|
45
|
+
- name : root
|
46
|
+
appenders:
|
47
|
+
- logfile
|
48
|
+
- stdout
|
49
|
+
appenders:
|
50
|
+
- type : Stdout
|
51
|
+
name : stdout
|
52
|
+
level : info
|
53
|
+
layout:
|
54
|
+
type : Pattern
|
55
|
+
pattern : '%l %c : %m\n'
|
56
|
+
color_scheme: default
|
57
|
+
- type : File
|
58
|
+
name : logfile
|
59
|
+
level : info
|
60
|
+
truncate : true
|
61
|
+
filename : 'repo.log'
|
62
|
+
layout:
|
63
|
+
type : Pattern
|
64
|
+
pattern : '[%d] %l %c : %m\n'
|