update_repo 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3926de9bbf9ba13b8bebedaede82c6e90fccb4b7
4
- data.tar.gz: e942798a0c3515517b299f8c06699ac4b347fe84
3
+ metadata.gz: 83505a5c407a8a9b4b1d83270037dd9bea6bad1b
4
+ data.tar.gz: 367640e56d880c7aa011fb499748d4544c96c1fd
5
5
  SHA512:
6
- metadata.gz: 4866838796629cffeaa336039303abb5b7588254e7f8038b2d323203f667ccd0b4d648c15bc24faf8f51838b66b147635b784f7cfcae660468d4eeabe68b7506
7
- data.tar.gz: 88c0782ce18314e1320c68b287daddcdbfd9d89bd45e755473642f7e9f03baf0b17345333da63e2e52405bce95a304171e7bc232c9373416cb6cb93503433ec1
6
+ metadata.gz: a22861bff02f7e0ef0dfa0920256f506d33a951448a988cb4ef0e05f4ff6babfb57125225eb0c1d117fa879aa428ea6d5354d8ab539bb218af77bc4f346ba883
7
+ data.tar.gz: c341cd60fd33e4692b948309caadd7d44b0a1866b2c4ea3764891c1a3b38235aa08d7255bbfd96c1e36bbe36a9bafc13078b7601d08f40770292fc96097da9e8
data/.travis.yml CHANGED
@@ -3,6 +3,7 @@ rvm:
3
3
  - 1.9.3-p551
4
4
  - 2.0.0-p648
5
5
  - 2.1.10
6
- - 2.2.5
7
- - 2.3.1
8
- before_install: gem install bundler -v 1.13.6
6
+ - 2.2.6
7
+ - 2.3.3
8
+ - 2.4.0
9
+ before_install: gem install bundler -v 1.13.7
data/README.md CHANGED
@@ -17,10 +17,7 @@ __Note:__ From version 0.9.0 onwards, the default mode of operation is non-verbo
17
17
 
18
18
  #### Pre-requirements
19
19
 
20
- It goes without saying that at the very least a working copy of both [`Git`][git] (version 1.8.5 or greater, the script will not run with an older version) and [`Ruby`][ruby] need to be installed on your machine. Also, the script has currently only been tested under Linux, not windows.
21
-
22
- [git]: http://git-scm.com
23
- [ruby]: http://www.ruby-lang.org
20
+ It goes without saying that at the very least a working copy of both [`Git`][git] (version 1.8.5 or greater, the script will not run with an older version) and [`Ruby`][ruby] (version 1.9.3 and newer) need to be installed on your machine. Also, the script has currently only been tested under Linux, not windows.
24
21
 
25
22
  Install this from the shell prompt as you would any other Ruby Gem
26
23
 
@@ -31,14 +28,14 @@ $ gem install update_repo
31
28
  ## Usage
32
29
 
33
30
  #### Quick start
34
- 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 :
31
+ Create a [YAML][yaml]-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 :
35
32
  ```yaml
36
33
  ---
37
34
  location:
38
35
  - /media/myuser/git-repos
39
36
  - /data/RepoDir
40
37
  ```
41
- This is the most basic example of a configuration file and there are other options that can be added to fine-tune the operation - see the description of configuration options below and the [Website](http://updaterepo.seapagan.net) for more information.
38
+ This is the most basic example of a configuration file and there are other options that can be added to fine-tune the operation - see the description of configuration options below and the [Website][website] for more information.
42
39
 
43
40
  This file should be located in the users home directory (`~/.updaterepo`).
44
41
 
@@ -48,9 +45,9 @@ $ update_repo
48
45
  ```
49
46
 
50
47
  ## Configuration
51
- The below is a summary of the most common configuration options, see the [Website](http://updaterepo.seapagan.net) for complete details and usage.
48
+ The below is a summary of the most common configuration options, see the [Website][website] for complete details and usage.
52
49
  #### Configuration file
53
- The configuration file defaults to `~/.updaterepo` and is a standard [YAML](http://yaml.org/)-formatted text file. If this configuration file is not found, the script will terminate with an error.
50
+ The configuration file defaults to `~/.updaterepo` and is a standard [YAML][yaml]-formatted text file. If this configuration file is not found, the script will terminate with an error.
54
51
  The first line must contain the YAML frontmatter of 3 dashes (`---`). After that, the following sections can follow in any order. Only the `location:` section is compulsory, and that must contain at least one entry.
55
52
 
56
53
  `location:` - at least one directory which contains the locally cloned repository(s) to update. There is no limit on how many directories can be listed :
@@ -89,7 +86,7 @@ quiet: true
89
86
  ```
90
87
 
91
88
  #### Command line switches
92
- 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. Command line options will take preference over those specified in the configuration file.
89
+ 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. Command line options will take preference over those specified in the configuration file. Again, see the [Website][website] for complete details and usage.
93
90
 
94
91
  Enter `update_repo --help` at the command prompt to get a list of available options :
95
92
  ```
@@ -123,6 +120,8 @@ Add functionality, not in any specific order :
123
120
  * ability to export a text dump of each repo location and remote as a CSV file. `[DONE]`
124
121
  * re-import the above dump on a different machine or after reinstall. Modify the '--prune' command to apply to this function also, removing the required number of directory levels before importing.
125
122
  - 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.
123
+ - Implement the option `--log-local` to put log file into the local directory.
124
+ - Add option to specify a completely different directory for the log file other than the 2 current (planned, local not yet implemented) options (home dir and local)
126
125
  - Document configuration file format and options. `[IN PROGRESS]`
127
126
 
128
127
  Internal Changes and refactoring :
@@ -133,8 +132,6 @@ Internal Changes and refactoring :
133
132
  * Add more failure cases, there may be more git errors than "fatal:" or "error:"
134
133
  - Retry for connection issues etc (config setting).
135
134
 
136
- [confoog]: http://confoog.seapagan.net
137
-
138
135
  ## Development
139
136
 
140
137
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests (or simply `rake`). You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -154,10 +151,6 @@ Run `rake` to run the RSpec tests, which also runs `RuboCop`, `Reek` and `inch -
154
151
  Please note - This Gem currently aims to pass 100% on [RuboCop][rubocop], [Reek][reek] and [Inch-CI][inch] (on pedantic mode), so all pull requests should do likewise. Ask for guidance if needed.
155
152
  Running `rake` will automatically test all 3 of those along with the RSpec tests.
156
153
 
157
- [rubocop]: https://github.com/bbatsov/rubocop
158
- [reek]: https://github.com/troessner/reek
159
- [inch]: https://inch-ci.org
160
-
161
154
  ## Versioning
162
155
 
163
156
  This Gem aims to adhere to [Semantic Versioning 2.0.0][semver]. Violations
@@ -169,9 +162,19 @@ introduced with new major versions.
169
162
 
170
163
  Of course, currently we have not even reached version 1, so leave off the version requirement completely. Expect any and all of the API and interface to change!
171
164
 
165
+ ## License
166
+
167
+ The gem is available as open source under the terms of the [MIT License][mit].
168
+
169
+ [website]: http://updaterepo.seapagan.net
170
+ [git]: http://git-scm.com
171
+ [ruby]: http://www.ruby-lang.org
172
+ [yaml]: http://yaml.org
173
+ [rubocop]: https://github.com/bbatsov/rubocop
174
+ [reek]: https://github.com/troessner/reek
175
+ [inch]: https://inch-ci.org
172
176
  [semver]: http://semver.org/
173
177
  [pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
178
+ [confoog]: http://confoog.seapagan.net
179
+ [mit]: http://opensource.org/licenses/MIT
174
180
 
175
- ## License
176
-
177
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -12,12 +12,18 @@ module UpdateRepo
12
12
  class CmdConfig
13
13
  include Helpers
14
14
 
15
+ # This constant holds the path to the config file, default to home dir.
16
+ CONFIG_PATH = '~/'.freeze
17
+ # This constant holds the filename of the config file.
18
+ CONFIG_FILE = '.updaterepo'.freeze
19
+
15
20
  def initialize
16
21
  # read the options from Trollop and store in temp variable.
17
22
  # we do it this way around otherwise if configuration file is missing it
18
23
  # gives the error messages even on '--help' and '--version'
19
24
  temp_opt = set_options
20
25
  @conf = Confoog::Settings.new(filename: CONFIG_FILE,
26
+ location: CONFIG_PATH,
21
27
  prefix: 'update_repo',
22
28
  autoload: true, autosave: false)
23
29
  config_error unless @conf.status[:errors] == Status::INFO_FILE_LOADED
@@ -34,6 +40,15 @@ module UpdateRepo
34
40
  @conf
35
41
  end
36
42
 
43
+ # return the specified TRUE configuration variable, using '[]' notation
44
+ # @param key [string] Which cmd variable to return
45
+ # @return [various] The value of the specified cmd variable
46
+ # @example
47
+ # quiet = @cmd[quiet]
48
+ def [](key)
49
+ true_cmd(key.to_sym)
50
+ end
51
+
37
52
  # This will return the 'true' version of a command, taking into account
38
53
  # both command line (given preference) and the configuration file.
39
54
  # @param command [symbol] The symbol of the defined command
@@ -10,16 +10,16 @@ module UpdateRepo
10
10
  # Constructor for the ConsoleOutput class.
11
11
  # @param logger [class] Pointer to the Logger class
12
12
  # @param metrics [class] Pointer to the Metrics class
13
- # @param config [class] Pointer to the Confoog class
13
+ # @param cmd [class] Pointer to the CmdConfig class
14
14
  # @return [void]
15
15
  # @example
16
16
  # console = ConsoleOutput.new(@log)
17
- def initialize(logger, metrics, config)
17
+ def initialize(logger, metrics, cmd)
18
18
  @summary = { processed: 'green', updated: 'cyan', skipped: 'yellow',
19
19
  failed: 'red', unchanged: 'white' }
20
20
  @metrics = metrics
21
21
  @log = logger
22
- @config = config.getconfig
22
+ @cmd = cmd
23
23
  end
24
24
 
25
25
  # Display a simple header to the console
@@ -31,7 +31,9 @@ module UpdateRepo
31
31
  # print an informative header before starting
32
32
  print_log "\nGit Repo update utility (v", VERSION, ')',
33
33
  " \u00A9 Grant Ramsay <seapagan@gmail.com>\n"
34
- print_log "Using Configuration from '#{@config.config_path}'\n"
34
+ print_log "Using Configuration from '#{@cmd.getconfig.config_path}'\n"
35
+ # show the logfile location, but only if it is enabled
36
+ show_logfile
35
37
  # list out the locations that will be searched
36
38
  list_locations
37
39
  # list any exceptions that we have from the config file
@@ -93,7 +95,7 @@ module UpdateRepo
93
95
  # @return [void]
94
96
  # @param [none]
95
97
  def list_exceptions
96
- exceptions = @config['exceptions']
98
+ exceptions = @cmd['exceptions']
97
99
  return unless exceptions
98
100
  print_log "\nExclusions:".underline, ' ',
99
101
  exceptions.join(', ').yellow, "\n"
@@ -104,9 +106,16 @@ module UpdateRepo
104
106
  # @return [void]
105
107
  def list_locations
106
108
  print_log "\nRepo location(s):\n".underline
107
- @config['location'].each do |loc|
109
+ @cmd['location'].each do |loc|
108
110
  print_log '-> ', loc.cyan, "\n"
109
111
  end
110
112
  end
113
+
114
+ # print out the logfile name and location, if we are logging to file
115
+ # @return [void]
116
+ def show_logfile
117
+ return unless @cmd[:log]
118
+ print_log "\nLogging to file:".underline, " #{@log.logfile}\n".cyan
119
+ end
111
120
  end
112
121
  end
@@ -8,22 +8,18 @@ module UpdateRepo
8
8
  include Helpers
9
9
 
10
10
  # Constructor for the Logger class.
11
- # @param enabled [boolean] True if we log to file
12
- # @param timestamp [boolean] True if we timestamp the filename
13
- # @param verbose [boolean] True if verbose flag is set
14
- # @param quiet [boolean] True if quiet flag is set
11
+ # @param cmd [instance] - pointer to the CmdConfig class
15
12
  # @return [void]
16
13
  # @example
17
- # log = Logger.new(true, false)
18
- def initialize(enabled, timestamp, verbose, quiet)
19
- @settings = { enabled: enabled, timestamp: timestamp, verbose: verbose,
20
- quiet: quiet }
14
+ # log = Logger.new(@cmd)
15
+ def initialize(cmd)
16
+ @cmd = cmd
21
17
  @legend = { failed: { char: 'x', color: 'red' },
22
18
  updated: { char: '^', color: 'green' },
23
19
  unchanged: { char: '.', color: 'white' },
24
20
  skipped: { char: 's', color: 'yellow' } }
25
21
  # don't prepare a logfile unless it's been requested.
26
- return unless @settings[:enabled]
22
+ return unless @cmd[:log]
27
23
  # generate a filename depending on 'timestamp' setting.
28
24
  filename = generate_filename
29
25
  # open the logfile and set sync mode.
@@ -35,7 +31,7 @@ module UpdateRepo
35
31
  # @param [none]
36
32
  # @return [string] Filename for the logfile.
37
33
  def generate_filename
38
- if @settings[:timestamp]
34
+ if @cmd[:timestamp]
39
35
  name = 'updaterepo-' + Time.new.strftime('%y%m%d-%H%M%S') + '.log'
40
36
  else
41
37
  name = 'updaterepo.log'
@@ -49,12 +45,12 @@ module UpdateRepo
49
45
  # @return [void]
50
46
  def output(*string)
51
47
  # nothing to screen if we want to be --quiet
52
- unless @settings[:quiet]
48
+ unless @cmd[:quiet]
53
49
  # log header and footer to screen regardless
54
- print(*string) if @settings[:verbose] || !repo_text?
50
+ print(*string) if @cmd[:verbose] || !repo_text?
55
51
  end
56
52
  # log to file if that has been enabled
57
- return unless @settings[:enabled]
53
+ return unless @cmd[:log]
58
54
  @logfile.write(string.join('').gsub(/\e\[(\d+)(;\d+)*m/, ''))
59
55
  end
60
56
 
@@ -64,12 +60,18 @@ module UpdateRepo
64
60
  # @return [void]
65
61
  def repostat(status)
66
62
  # only print if not quiet and not verbose!
67
- return if @settings[:quiet] || @settings[:verbose]
63
+ return if @cmd[:quiet] || @cmd[:verbose]
68
64
  @legend.each do |key, value|
69
65
  print value[:char].send(value[:color].to_sym) if status[key]
70
66
  end
71
67
  end
72
68
 
69
+ # Return a string containing the logfile name and full path.
70
+ # @return [string]
71
+ def logfile
72
+ @logfile.path
73
+ end
74
+
73
75
  # returns non nil if we have been called originally by one of the Repo
74
76
  # update output functions.
75
77
  # @param [none]
@@ -80,8 +82,8 @@ module UpdateRepo
80
82
  calling_fn = caller_locations[2].label.gsub(/block in /, '')
81
83
  # array with the functions we want to skip
82
84
  repo_output = %w(do_update handle_output skip_repo update)
83
- # return the name in string if DOES match.
84
- calling_fn if repo_output.include?(calling_fn)
85
+ # return TRUE if DOES match, FALSE otherwise.
86
+ repo_output.include?(calling_fn) ? true : false
85
87
  end
86
88
 
87
89
  # close the logfile, if it exists
@@ -1,4 +1,4 @@
1
1
  module UpdateRepo
2
2
  # constant, current version of this Gem
3
- VERSION = '0.9.2'.freeze
3
+ VERSION = '0.9.3'.freeze
4
4
  end
data/lib/update_repo.rb CHANGED
@@ -14,9 +14,6 @@ require 'versionomy'
14
14
  # Overall module with classes performing the functionality
15
15
  # Contains Class UpdateRepo::WalkRepo
16
16
  module UpdateRepo
17
- # This constant holds the name to the config file, located in ~/
18
- CONFIG_FILE = '.updaterepo'.freeze
19
-
20
17
  # An encapsulated class to walk the repo directories and update all Git
21
18
  # repositories found therein.
22
19
  class WalkRepo
@@ -27,7 +24,7 @@ module UpdateRepo
27
24
  # create a new instance of the CmdConfig class then read the config var
28
25
  @cmd = CmdConfig.new
29
26
  # set up the output and logging class
30
- @log = Logger.new(cmd(:log), cmd(:timestamp), cmd(:verbose), cmd(:quiet))
27
+ @log = Logger.new(@cmd)
31
28
  # create instance of the Metrics class
32
29
  @metrics = Metrics.new(@log)
33
30
  # instantiate the console output class for header, footer etc
@@ -39,13 +36,13 @@ module UpdateRepo
39
36
  # walk_repo = UpdateRepo::WalkRepo.new
40
37
  # walk_repo.start
41
38
  def start
42
- String.disable_colorization = !cmd(:color)
39
+ String.disable_colorization = !@cmd[:color]
43
40
  # check for existence of 'Git' and exit otherwise...
44
41
  checkgit
45
42
  # print out our header unless we are dumping / importing ...
46
43
  @cons.show_header unless dumping?
47
44
  config['location'].each do |loc|
48
- cmd(:dump_tree) ? dump_tree(File.join(loc)) : recurse_dir(loc)
45
+ @cmd[:dump_tree] ? dump_tree(File.join(loc)) : recurse_dir(loc)
49
46
  end
50
47
  # print out an informative footer unless dump / import ...
51
48
  @cons.show_footer unless dumping?
@@ -67,7 +64,7 @@ module UpdateRepo
67
64
  end
68
65
 
69
66
  def dumping?
70
- cmd(:dump) || cmd(:dump_remote) || cmd(:dump_tree)
67
+ @cmd[:dump] || @cmd[:dump_remote] || @cmd[:dump_tree]
71
68
  end
72
69
 
73
70
  # returns the Confoog class which can then be used to access any config var
@@ -77,17 +74,6 @@ module UpdateRepo
77
74
  @cmd.getconfig
78
75
  end
79
76
 
80
- # Return the true value of the specified configuration parameter. This is a
81
- # helper function that simply calls the 'true_cmd' function in the @cmd
82
- # class
83
- # @param command [symbol] The defined command symbol that is to be returned
84
- # @return [various] The value of the requested command option
85
- # @example
86
- # logging = cmd(:log)
87
- def cmd(command)
88
- @cmd.true_cmd(command.to_sym)
89
- end
90
-
91
77
  # take each directory contained in the Repo directory, if it is detected as
92
78
  # a Git repository then update it (or as directed by command line)
93
79
  # @param dirname [string] Contains the directory to search for Git repos.]
@@ -163,7 +149,7 @@ module UpdateRepo
163
149
  # @return [void]
164
150
  def dump_repo(dir)
165
151
  Dir.chdir(dir.chomp!('/')) do
166
- print_log "#{trunc_dir(dir, config['cmd'][:prune])}," if cmd(:dump)
152
+ print_log "#{trunc_dir(dir, @cmd[:prune])}," if @cmd[:dump]
167
153
  print_log `git -C #{dir} config remote.origin.url`
168
154
  end
169
155
  end
data/update_repo.gemspec CHANGED
@@ -43,12 +43,11 @@ Gem::Specification.new do |spec|
43
43
  if RUBY_VERSION < '2.0'
44
44
  spec.add_development_dependency 'json', '= 1.8.3'
45
45
  spec.add_development_dependency 'tins', '= 1.6.0'
46
+ spec.add_dependency 'term-ansicolor', '= 1.3.2'
46
47
  end
47
48
 
48
49
  spec.add_dependency 'colorize'
49
50
  spec.add_dependency 'confoog'
50
51
  spec.add_dependency 'trollop'
51
52
  spec.add_dependency 'versionomy'
52
- # on Ruby 1.9.3 we lock the 'term-ansicolor' gem to version 1.3.2
53
- spec.add_dependency 'term-ansicolor', '= 1.3.2' if RUBY_VERSION < '2.0'
54
53
  end
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.9.2
4
+ version: 0.9.3
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-10 00:00:00.000000000 Z
11
+ date: 2017-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler