update_repo 0.7.1 → 0.7.2
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/.gitignore +0 -0
- data/.reek +3 -0
- data/.rubocop.yml +0 -0
- data/.travis.yml +0 -0
- data/README.md +30 -10
- data/Rakefile +0 -0
- data/lib/update_repo.rb +29 -83
- data/lib/update_repo/cmd_config.rb +99 -0
- data/lib/update_repo/helpers.rb +1 -21
- data/lib/update_repo/version.rb +1 -1
- data/update_repo.gemspec +0 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3822c75393026d76642b13ef90987f7cfbf19d7
|
4
|
+
data.tar.gz: d09ea3b9e447eac5b1e0db00ad0535a09702f804
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f59a14c1b0639a846520f1283c13d6e5f6eb2b98ca271a65f48089ea3d49481286b79f61866858bc7e60aa750552aad4db97384d75e42c235eff1d022409298
|
7
|
+
data.tar.gz: 2a16193e25d7b68e13520b8cd6bfa83452de675b372f2d7864f900142fa72bcd5b8a917c66571855e29145adc33d95f5f5bdb7d0ea54ef4fe3dbea3fa829c81c
|
data/.gitignore
CHANGED
File without changes
|
data/.reek
CHANGED
data/.rubocop.yml
CHANGED
File without changes
|
data/.travis.yml
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -11,15 +11,23 @@ A Simple Gem to keep multiple locally-cloned Git Repositories up to date.
|
|
11
11
|
This is the conversion to a Gem of one of my standalone Ruby scripts. Still very much a work in progress but the required basic functionality is there.
|
12
12
|
The script will simply run `git pull` on every local clone of a git repository that it finds under the specified directory or directories.
|
13
13
|
|
14
|
-
##
|
14
|
+
## Installation
|
15
15
|
|
16
16
|
#### Pre-requirements
|
17
17
|
|
18
|
-
It goes without saying that at the very least a working copy of both [`Git`][git] and [`Ruby`][ruby] need to be installed on your machine. Also, the script has only been tested under Linux, not windows.
|
18
|
+
It goes without saying that at the very least a working copy of both [`Git`][git] and [`Ruby`][ruby] need to be installed on your machine. Also, the script has currently only been tested under Linux, not windows.
|
19
19
|
|
20
20
|
[git]: http://git-scm.com
|
21
21
|
[ruby]: http://www.ruby-lang.org
|
22
22
|
|
23
|
+
Install this from the shell prompt as you would any other Ruby Gem
|
24
|
+
|
25
|
+
```
|
26
|
+
$ gem install update_repo
|
27
|
+
```
|
28
|
+
|
29
|
+
## Usage
|
30
|
+
|
23
31
|
#### Quick start
|
24
32
|
Create a [YAML](http://yaml.org/)-formatted configuration file `.updaterepo` **in your home directory** that contains at least a 'location' tag pointing to the directory containing the git repositories you wish to have updated :
|
25
33
|
```yaml
|
@@ -57,6 +65,16 @@ exceptions:
|
|
57
65
|
- update_repo
|
58
66
|
```
|
59
67
|
|
68
|
+
`log:` - Log all output to the file `./.updaterepo`, defaults to FALSE (optional)
|
69
|
+
```yaml
|
70
|
+
log: true
|
71
|
+
```
|
72
|
+
|
73
|
+
`timestamp:` - timestamp the output files instead of overwriting them, defaults to FALSE (optional)
|
74
|
+
```yaml
|
75
|
+
timestamp: true
|
76
|
+
```
|
77
|
+
|
60
78
|
#### Command line switches
|
61
79
|
Options are not required. If none are specified then the program will read from the standard configuration file (~/.updaterepo) and automatically update the specified Repositories.
|
62
80
|
|
@@ -67,8 +85,6 @@ Options:
|
|
67
85
|
-d, --dump Dump a list of Directories and Git URL's to STDOUT in CSV format
|
68
86
|
-p, --prune=<i> Number of directory levels to remove from the --dump output.
|
69
87
|
Only valid when --dump or -d specified (Default: 0)
|
70
|
-
-i, --import Import a previous dump of directories and Git repository URL's,
|
71
|
-
(created using --dump) then proceed to clone them locally.
|
72
88
|
-l, --log Create a logfile of all program output to './update_repo.log'.
|
73
89
|
Any older logs will be overwritten.
|
74
90
|
-t, --timestamp Timestamp the logfile instead of overwriting. Does nothing unless the
|
@@ -78,14 +94,9 @@ Options:
|
|
78
94
|
```
|
79
95
|
|
80
96
|
## To-Do
|
81
|
-
|
97
|
+
Add functionality, not in any specific order :
|
82
98
|
|
83
|
-
- Improve error-checking and recovery while parsing the configuration file
|
84
|
-
* Ignore and report invalid or missing directories
|
85
99
|
- Either add an option 'variants' or similar to allow non-standard git pull commands (eg Ubuntu kernel), or update the 'exceptions' option to do same.
|
86
|
-
- Error checking and reporting for the git processes `[IN PROGRESS]`
|
87
|
-
* Add more failure cases, not all git errors fail with "fatal:"
|
88
|
-
- retry for connection issues etc (config setting).
|
89
100
|
- Improve the stats / info at end-of-job :
|
90
101
|
* errors or connection problems `[IN PROGRESS]`
|
91
102
|
* _more..._
|
@@ -100,7 +111,16 @@ Not in any specific order :
|
|
100
111
|
* re-import the above dump on a different machine or after reinstall
|
101
112
|
- Add option to use alternative git command if required, either globally or on a case-by-case basis (see also comments on 'variants' above). Currently the script just uses a blanket `git pull` command on all repositories.
|
102
113
|
- Document configuration file format and options.
|
114
|
+
|
115
|
+
Internal Changes and refactoring :
|
103
116
|
- Add testing!
|
117
|
+
- Refactor all command-line handling into a separate class and file
|
118
|
+
- Error checking and reporting for the git processes `[IN PROGRESS]`
|
119
|
+
- Improve error-checking and recovery while parsing the configuration file
|
120
|
+
* Ignore and report invalid or missing directories
|
121
|
+
* Add more failure cases, not all git errors fail with "fatal:"
|
122
|
+
- Retry for connection issues etc (config setting).
|
123
|
+
- Fix functionality so that command line options will override those in the config file
|
104
124
|
|
105
125
|
[confoog]: http://confoog.seapagan.net
|
106
126
|
|
data/Rakefile
CHANGED
File without changes
|
data/lib/update_repo.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'update_repo/version'
|
2
2
|
require 'update_repo/helpers'
|
3
|
+
require 'update_repo/cmd_config'
|
3
4
|
require 'yaml'
|
4
5
|
require 'colorize'
|
5
6
|
require 'confoog'
|
@@ -24,18 +25,10 @@ module UpdateRepo
|
|
24
25
|
start_time: 0 }
|
25
26
|
@summary = { processed: 'green', updated: 'cyan', skipped: 'yellow',
|
26
27
|
failed: 'red' }
|
27
|
-
#
|
28
|
-
|
29
|
-
#
|
30
|
-
|
31
|
-
# @config - Class. Reads the configuration from a file in YAML format and
|
32
|
-
# allows easy access to the configuration data
|
33
|
-
@config = Confoog::Settings.new(filename: CONFIG_FILE,
|
34
|
-
prefix: 'update_repo',
|
35
|
-
autoload: true, autosave: false)
|
36
|
-
# store the command line variables in a configuration variable
|
37
|
-
@config['cmd'] = temp_opt
|
38
|
-
config_error unless @config.status[:errors] == Status::INFO_FILE_LOADED
|
28
|
+
# create a new instance of the CmdConfig class then read the config var
|
29
|
+
@cmd = CmdConfig.new
|
30
|
+
# set up the logfile if needed
|
31
|
+
setup_logfile if cmd(:log)
|
39
32
|
end
|
40
33
|
|
41
34
|
# This function will perform the required actions to traverse the Repo.
|
@@ -43,86 +36,40 @@ module UpdateRepo
|
|
43
36
|
# walk_repo = UpdateRepo::WalkRepo.new
|
44
37
|
# walk_repo.start
|
45
38
|
def start
|
46
|
-
String.disable_colorization =
|
39
|
+
String.disable_colorization = !cmd(:color)
|
47
40
|
# make sure we dont have bad cmd-line parameter combinations ...
|
48
|
-
check_params
|
49
|
-
# print out our header ...
|
50
|
-
|
51
|
-
|
41
|
+
@cmd.check_params
|
42
|
+
# print out our header unless we are dumping / importing ...
|
43
|
+
no_header = cmd(:dump) || cmd(:import)
|
44
|
+
show_header unless no_header
|
45
|
+
config['location'].each do |loc|
|
52
46
|
recurse_dir(loc)
|
53
47
|
end
|
54
|
-
# print out an informative footer ...
|
55
|
-
footer unless
|
48
|
+
# print out an informative footer unless dump / import ...
|
49
|
+
footer unless no_header
|
56
50
|
end
|
57
51
|
|
58
|
-
private
|
52
|
+
# private
|
59
53
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
54
|
+
# returns the Confoog class which can then be used to access any config var
|
55
|
+
def config
|
56
|
+
@cmd.getconfig
|
57
|
+
end
|
58
|
+
|
59
|
+
def cmd(command)
|
60
|
+
@cmd.true_cmd(command.to_sym)
|
68
61
|
end
|
69
62
|
|
70
63
|
def setup_logfile
|
71
|
-
filename = if
|
64
|
+
filename = if cmd(:timestamp)
|
72
65
|
'updaterepo-' + Time.new.strftime('%y%m%d-%H%M%S') + '.log'
|
73
66
|
else
|
74
67
|
'updaterepo.log'
|
75
68
|
end
|
76
|
-
# filename = 'updaterepo' + prefix + '.log'
|
77
69
|
@logfile = File.open(filename, 'w')
|
78
70
|
@logfile.sync = true
|
79
71
|
end
|
80
72
|
|
81
|
-
# Determine options from the command line and configuration file. Command
|
82
|
-
# line takes precedence
|
83
|
-
def param_set(option)
|
84
|
-
@config['cmd'][option.to_sym] || @config[option]
|
85
|
-
end
|
86
|
-
|
87
|
-
def config_error
|
88
|
-
if @config.status[:errors] == Status::ERR_CANT_LOAD
|
89
|
-
print_log 'Note that the the default configuration file was '.red,
|
90
|
-
"changed to ~/#{CONFIG_FILE} from v0.4.0 onwards\n\n".red
|
91
|
-
end
|
92
|
-
exit 1
|
93
|
-
end
|
94
|
-
|
95
|
-
# rubocop:disable Metrics/MethodLength
|
96
|
-
# rubocop:disable Metrics/LineLength
|
97
|
-
def set_options
|
98
|
-
Trollop.options do
|
99
|
-
version "update_repo version #{VERSION} (C)2016 G. Ramsay\n"
|
100
|
-
banner <<-EOS
|
101
|
-
|
102
|
-
Keep multiple local Git-Cloned Repositories up to date with one command.
|
103
|
-
|
104
|
-
Usage:
|
105
|
-
update_repo [options]
|
106
|
-
|
107
|
-
Options are not required. If none are specified then the program will read from
|
108
|
-
the standard configuration file (~/#{CONFIG_FILE}) and automatically update the
|
109
|
-
specified Repositories.
|
110
|
-
|
111
|
-
Options:
|
112
|
-
EOS
|
113
|
-
opt :color, 'Use colored output', default: true
|
114
|
-
opt :dump, 'Dump a list of Directories and Git URL\'s to STDOUT in CSV format', default: false
|
115
|
-
opt :prune, "Number of directory levels to remove from the --dump output.\nOnly valid when --dump or -d specified", default: 0
|
116
|
-
opt :import, "Import a previous dump of directories and Git repository URL's,\n(created using --dump) then proceed to clone them locally.", default: false
|
117
|
-
opt :log, "Create a logfile of all program output to './update_repo.log'. Any older logs will be overwritten.", default: false
|
118
|
-
opt :timestamp, 'Timestamp the logfile instead of overwriting. Does nothing unless the --log option is also specified.', default: false
|
119
|
-
# opt :quiet, 'Only minimal output to the terminal', default: false
|
120
|
-
# opt :silent, 'Completely silent, no output to terminal at all.', default: false
|
121
|
-
end
|
122
|
-
end
|
123
|
-
# rubocop:enable Metrics/MethodLength
|
124
|
-
# rubocop:enable Metrics/LineLength
|
125
|
-
|
126
73
|
# take each directory contained in the Repo directory, if it is detected as
|
127
74
|
# a Git repository then update it (or as directed by command line)
|
128
75
|
# @param dirname [string] Contains the directory to search for Git repos.
|
@@ -130,7 +77,7 @@ EOS
|
|
130
77
|
Dir.chdir(dirname) do
|
131
78
|
Dir['**/'].each do |dir|
|
132
79
|
next unless gitdir?(dir)
|
133
|
-
if
|
80
|
+
if cmd(:dump)
|
134
81
|
dump_repo(File.join(dirname, dir))
|
135
82
|
else
|
136
83
|
notexception?(dir) ? update_repo(dir) : skip_repo(dir)
|
@@ -143,7 +90,7 @@ EOS
|
|
143
90
|
# @param dir [string] Directory to be checked
|
144
91
|
# @return [boolean] True if this is NOT an exception, False otherwise
|
145
92
|
def notexception?(dir)
|
146
|
-
|
93
|
+
!config['exceptions'].include?(File.basename(dir))
|
147
94
|
end
|
148
95
|
|
149
96
|
# Display a simple header to the console
|
@@ -152,11 +99,10 @@ EOS
|
|
152
99
|
# @return [void]
|
153
100
|
def show_header
|
154
101
|
# print an informative header before starting
|
155
|
-
# unless we are dumping the repo information
|
156
102
|
print_log "\nGit Repo update utility (v", VERSION, ')',
|
157
103
|
" \u00A9 Grant Ramsay <seapagan@gmail.com>\n"
|
158
|
-
print_log "Using Configuration from '#{
|
159
|
-
|
104
|
+
print_log "Using Configuration from '#{config.config_path}'\n"
|
105
|
+
print_log "Command line is : #{config['cmd']}\n"
|
160
106
|
# list out the locations that will be searched
|
161
107
|
list_locations
|
162
108
|
# list any exceptions that we have from the config file
|
@@ -186,7 +132,7 @@ EOS
|
|
186
132
|
end
|
187
133
|
|
188
134
|
def list_exceptions
|
189
|
-
exceptions =
|
135
|
+
exceptions = config['exceptions']
|
190
136
|
if exceptions
|
191
137
|
print_log "\nExclusions:".underline, ' ',
|
192
138
|
exceptions.join(', ').yellow, "\n"
|
@@ -195,7 +141,7 @@ EOS
|
|
195
141
|
|
196
142
|
def list_locations
|
197
143
|
print_log "\nRepo location(s):\n".underline
|
198
|
-
|
144
|
+
config['location'].each do |loc|
|
199
145
|
print_log '-> ', loc.cyan, "\n"
|
200
146
|
end
|
201
147
|
end
|
@@ -244,7 +190,7 @@ EOS
|
|
244
190
|
def dump_repo(dir)
|
245
191
|
Dir.chdir(dir.chomp!('/')) do
|
246
192
|
repo_url = `git config remote.origin.url`.chomp
|
247
|
-
print_log "#{trunc_dir(dir,
|
193
|
+
print_log "#{trunc_dir(dir, config['cmd'][:prune])},#{repo_url}\n"
|
248
194
|
end
|
249
195
|
end
|
250
196
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'update_repo/version'
|
2
|
+
require 'update_repo/helpers'
|
3
|
+
require 'confoog'
|
4
|
+
require 'trollop'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
# this class will encapsulate the command line fucntionality and processing
|
8
|
+
# as well as reading from the config file. It will also merge the 2 sources
|
9
|
+
# into the final definitive option hash.
|
10
|
+
module UpdateRepo
|
11
|
+
# This class takes care of reading and parsing the command line and conf file
|
12
|
+
class CmdConfig
|
13
|
+
include Helpers
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
# read the options from Trollop and store in temp variable.
|
17
|
+
# we do it this way around otherwise if configuration file is missing it
|
18
|
+
# gives the error messages even on '--help' and '--version'
|
19
|
+
temp_opt = set_options
|
20
|
+
@conf = Confoog::Settings.new(filename: CONFIG_FILE,
|
21
|
+
prefix: 'update_repo',
|
22
|
+
autoload: true, autosave: false)
|
23
|
+
@conf['cmd'] = temp_opt
|
24
|
+
config_error unless @conf.status[:errors] == Status::INFO_FILE_LOADED
|
25
|
+
end
|
26
|
+
|
27
|
+
# return the configuration hash variable
|
28
|
+
def getconfig
|
29
|
+
@conf
|
30
|
+
end
|
31
|
+
|
32
|
+
# This will return the 'true' version of a command, taking into account
|
33
|
+
# both command line (given preference) and the configuration file.
|
34
|
+
# parameter is a :symbol
|
35
|
+
def true_cmd(command)
|
36
|
+
cmd_given = @conf['cmd'][(command.to_s + '_given').to_sym]
|
37
|
+
cmd_line = @conf['cmd'][command.to_sym]
|
38
|
+
|
39
|
+
if cmd_given
|
40
|
+
# if we specify something on the cmd line, that takes precedence
|
41
|
+
cmd_line
|
42
|
+
elsif !@conf[command.to_s].nil?
|
43
|
+
# if we have a value in the config file we use that.
|
44
|
+
@conf[command.to_s]
|
45
|
+
else
|
46
|
+
# this will catch any 'default' values in the cmd setup.
|
47
|
+
cmd_line
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# make sure the parameter combinations are valid
|
52
|
+
def check_params
|
53
|
+
if true_cmd(:dump) && true_cmd(:import)
|
54
|
+
Trollop.die 'Sorry, you cannot specify both --dump and --import '.red
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def config_error
|
61
|
+
if @conf.status[:errors] == Status::ERR_CANT_LOAD
|
62
|
+
print_log 'Note that the the default configuration file was '.red,
|
63
|
+
"changed to ~/#{CONFIG_FILE} from v0.4.0 onwards\n\n".red
|
64
|
+
end
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
|
68
|
+
# rubocop:disable Metrics/MethodLength
|
69
|
+
# rubocop:disable Metrics/LineLength
|
70
|
+
def set_options
|
71
|
+
Trollop.options do
|
72
|
+
version "update_repo version #{VERSION} (C)2016 G. Ramsay\n"
|
73
|
+
banner <<-EOS
|
74
|
+
|
75
|
+
Keep multiple local Git-Cloned Repositories up to date with one command.
|
76
|
+
|
77
|
+
Usage:
|
78
|
+
update_repo [options]
|
79
|
+
|
80
|
+
Options are not required. If none are specified then the program will read from
|
81
|
+
the standard configuration file (~/#{CONFIG_FILE}) and automatically update the
|
82
|
+
specified Repositories.
|
83
|
+
|
84
|
+
Options:
|
85
|
+
EOS
|
86
|
+
opt :color, 'Use colored output', default: true
|
87
|
+
opt :dump, 'Dump a list of Directories and Git URL\'s to STDOUT in CSV format', default: false
|
88
|
+
opt :prune, "Number of directory levels to remove from the --dump output.\nOnly valid when --dump or -d specified", default: 0
|
89
|
+
# opt :import, "Import a previous dump of directories and Git repository URL's,\n(created using --dump) then proceed to clone them locally.", default: false
|
90
|
+
opt :log, "Create a logfile of all program output to './update_repo.log'. Any older logs will be overwritten.", default: false
|
91
|
+
opt :timestamp, 'Timestamp the logfile instead of overwriting. Does nothing unless the --log option is also specified.', default: false
|
92
|
+
# opt :quiet, 'Only minimal output to the terminal', default: false
|
93
|
+
# opt :silent, 'Completely silent, no output to terminal at all.', default: false
|
94
|
+
end
|
95
|
+
end
|
96
|
+
# rubocop:enable Metrics/MethodLength
|
97
|
+
# rubocop:enable Metrics/LineLength
|
98
|
+
end
|
99
|
+
end
|
data/lib/update_repo/helpers.rb
CHANGED
@@ -14,28 +14,13 @@ module Helpers
|
|
14
14
|
File.join(path_array)
|
15
15
|
end
|
16
16
|
|
17
|
-
# true if we are dumping the file structure and git urls instead of updating.
|
18
|
-
def dumping?
|
19
|
-
param_set('dump')
|
20
|
-
end
|
21
|
-
|
22
|
-
# true if we are importing a previously dumped list of Git repos.
|
23
|
-
def importing?
|
24
|
-
param_set('import')
|
25
|
-
end
|
26
|
-
|
27
|
-
# true if we are logging to file.
|
28
|
-
def logging?
|
29
|
-
param_set('log')
|
30
|
-
end
|
31
|
-
|
32
17
|
# this function will simply pass the given string to 'print', and also
|
33
18
|
# log to file if that is specified.
|
34
19
|
def print_log(*string)
|
35
20
|
# log to screen regardless
|
36
21
|
print(*string)
|
37
22
|
# log to file if that has been enabled
|
38
|
-
@logfile.write(string.join('').gsub(/\e\[(\d+)(;\d+)*m/, '')) if
|
23
|
+
@logfile.write(string.join('').gsub(/\e\[(\d+)(;\d+)*m/, '')) if cmd('log')
|
39
24
|
end
|
40
25
|
|
41
26
|
# mark these as private simply so that 'reek' wont flag as utility function.
|
@@ -50,9 +35,4 @@ module Helpers
|
|
50
35
|
time_taken = Time.at(duration).utc
|
51
36
|
time_taken.strftime('%-H hours, %-M Minutes and %-S seconds')
|
52
37
|
end
|
53
|
-
|
54
|
-
# we cant use --dump and --import on the same command line
|
55
|
-
def no_import_export
|
56
|
-
Trollop.die 'update_repo : Cannot specify both --dump and --import'
|
57
|
-
end
|
58
38
|
end
|
data/lib/update_repo/version.rb
CHANGED
data/update_repo.gemspec
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: update_repo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grant Ramsay
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -285,6 +285,7 @@ files:
|
|
285
285
|
- bin/update_repo
|
286
286
|
- exe/update_repo
|
287
287
|
- lib/update_repo.rb
|
288
|
+
- lib/update_repo/cmd_config.rb
|
288
289
|
- lib/update_repo/helpers.rb
|
289
290
|
- lib/update_repo/version.rb
|
290
291
|
- update_repo.gemspec
|