smc-get 0.1.0 → 0.2.0.beta1

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.
@@ -0,0 +1,119 @@
1
+ #Encoding: UTF-8
2
+ ################################################################################
3
+ # This file is part of smc-get.
4
+ # Copyright (C) 2010-2011 Entertaining Software, Inc.
5
+ # Copyright (C) 2011 Marvin Gülker
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ ################################################################################
20
+
21
+ module SmcGet
22
+
23
+ module CUICommands
24
+
25
+ class UpdateCommand < Command
26
+
27
+ def self.help
28
+ <<EOF
29
+ USAGE: #{File.basename($0)} update [PACKAGES...]
30
+
31
+ Checks for updates in the repository and tries to update the local
32
+ packages. If you modified a package, you will be prompted to
33
+ decide how to proceed.
34
+
35
+ OPTIONS:
36
+ -y\t--yes\tAssume yes on all queries
37
+ EOF
38
+ end
39
+
40
+ def self.summary
41
+ "update\tUpdate packages."
42
+ end
43
+
44
+ def parse(args)
45
+ CUI.debug("Parsing #{args.count} args for update.")
46
+ @packages = []
47
+ while(arg = args.shift)
48
+ case arg
49
+ when "-y", "--yes" then @assume_yes = true
50
+ else
51
+ @packages << arg
52
+ end
53
+ end
54
+ #Warn on package names starting with a hyphen, may be a mistyped option
55
+ @packages.each{|pkg| $stderr.puts("Warning: Treating #{pkg} as a package") if pkg.start_with?("-")}
56
+ end
57
+
58
+ def execute(config)
59
+ CUI.debug("Executing update")
60
+
61
+ #Get the packages we want to update
62
+ if @packages.empty? #None given, default to all
63
+ packages = @cui.local_repository.package_specs.map(&:name)
64
+ else
65
+ packages = @packages
66
+ end
67
+ puts "Going to check #{packages.count} packages for updates."
68
+
69
+ packages.each do |pkgname|
70
+ spec_name = "#{pkgname}.yml"
71
+ local_spec = PackageSpecification.from_file(@cui.local_repository.fetch_spec(spec_name))
72
+ remote_spec = PackageSpecification.from_file(@cui.remote_repository.fetch_spec(spec_name))
73
+
74
+ #Execute update if remote is newer than local
75
+ if remote_spec.last_update > local_spec.last_update
76
+
77
+ puts "Updating #{pkgname}."
78
+ begin
79
+ path = download_package(pkgname)
80
+
81
+ #First uninstall the old version--this is necessary, b/c a new
82
+ #version of a package may have files removed that wouldn’t be
83
+ #deleted by a simple overwrite operation.
84
+ print "Uninstalling obsolete version of #{pkgname}... "
85
+ @cui.local_repository.uninstall(pkgname) do |conflict_file|
86
+ puts "CONFLICT: The file #{conflict_file} has been modified. What now?"
87
+ puts "1) Ignore and delete anyway"
88
+ puts "2) Copy file and include MODIFIED in the name."
89
+ print "Enter a number[1]: "
90
+ $stdin.gets.chomp.to_i == 2 #True means copying
91
+ end
92
+ puts "Done."
93
+
94
+ #Then install the new version.
95
+ pkg = Package.from_file(path)
96
+ puts pkg.spec.install_message if pkg.spec.install_message
97
+ print "Installing #{pkgname}... "
98
+ @cui.local_repository.install(pkg)
99
+ puts "Done."
100
+ rescue => e
101
+ $stderr.puts(e.message)
102
+ $stderr.puts("Ignoring the problem and continuing with the next package, if any.")
103
+ if CUI.debug_mode?
104
+ $stderr.puts("Class: #{e.class}")
105
+ $stderr.puts("Message: #{e.message}")
106
+ $stderr.puts("Backtrace:")
107
+ $stderr.puts(e.backtrace.join("\n\t"))
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+ # vim:set ts=8 sts=2 sw=2 et: #
@@ -1,57 +1,58 @@
1
- #Encoding: UTF-8
2
- ################################################################################
3
- # This file is part of smc-get.
4
- # Copyright (C) 2010-2011 Entertaining Software, Inc.
5
- # Copyright (C) 2011 Marvin Gülker
6
- #
7
- # This program is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
- ################################################################################
20
-
21
- module SmcGet
22
-
23
- module CUICommands
24
-
25
- class VersionCommand < Command
26
-
27
- def self.help
28
- <<EOF
29
- USAGE: #{File.basename($0)} version
30
-
31
- Shows the version of #{File.basename($0)} and the copyright statement.
32
- EOF
33
- end
34
-
35
- def self.summary
36
- "version\tShows smc-get's version and copyright."
37
- end
38
-
39
- def parse(args)
40
- raise(InvalidCommandline, "Too many arguments.") unless args.empty?
41
- end
42
-
43
- def execute(config)
44
- puts "This is #{File.basename($0)}, version #{VERSION}."
45
- puts
46
- puts "#{File.basename($0)} Copyright (C) 2010-2011 Luiji Maryo"
47
- puts "#{File.basename($0)} Copyright (C) 2011 Marvin Gülker"
48
- puts "This program comes with ABSOLUTELY NO WARRANTY."
49
- puts "This is free software, and you are welcome to redistribute it"
50
- puts "under certain conditions; see the COPYING file for information."
51
- end
52
-
53
- end
54
-
55
- end
56
-
57
- end
1
+ #Encoding: UTF-8
2
+ ################################################################################
3
+ # This file is part of smc-get.
4
+ # Copyright (C) 2010-2011 Entertaining Software, Inc.
5
+ # Copyright (C) 2011 Marvin Gülker
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ ################################################################################
20
+
21
+ module SmcGet
22
+
23
+ module CUICommands
24
+
25
+ class VersionCommand < Command
26
+
27
+ def self.help
28
+ <<EOF
29
+ USAGE: #{File.basename($0)} version
30
+
31
+ Shows the version of #{File.basename($0)} and the copyright statement.
32
+ EOF
33
+ end
34
+
35
+ def self.summary
36
+ "version\tShows smc-get's version and copyright."
37
+ end
38
+
39
+ def parse(args)
40
+ raise(InvalidCommandline, "Too many arguments.") unless args.empty?
41
+ end
42
+
43
+ def execute(config)
44
+ puts "This is #{File.basename($0)}, version #{SmcGet.version}."
45
+ puts
46
+ puts "#{File.basename($0)} Copyright (C) 2010-2011 Luiji Maryo"
47
+ puts "#{File.basename($0)} Copyright (C) 2011 Marvin Gülker"
48
+ puts "This program comes with ABSOLUTELY NO WARRANTY."
49
+ puts "This is free software, and you are welcome to redistribute it"
50
+ puts "under certain conditions; see the COPYING file for information."
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+ # vim:set ts=8 sts=2 sw=2 et: #
@@ -1,113 +1,140 @@
1
- #Encoding: UTF-8
2
- ################################################################################
3
- # This file is part of smc-get.
4
- # Copyright (C) 2010-2011 Entertaining Software, Inc.
5
- # Copyright (C) 2011 Marvin Gülker
6
- #
7
- # This program is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
- ################################################################################
20
-
21
- module SmcGet
22
-
23
- #This module contains all errors messages that are specific to smc-get.
24
- module Errors
25
-
26
- #Superclass for all errors in this library.
27
- class SmcGetError < StandardError
28
- end
29
-
30
- #Raises when you did not call SmcGet.setup.
31
- class LibraryNotInitialized < SmcGetError
32
-
33
- #Throws an exception of this class with an appropriate error
34
- #message if smc-get has not been initialized correctly.
35
- def self.throw_if_needed!
36
- if SmcGet.datadir.nil? or SmcGet.repo_url.nil?
37
- raise(self, "You have to setup smc-get first!")
38
- end
39
- end
40
-
41
- end
42
-
43
- # Raised when the class is initialized with a non-existant settings file.
44
- class CannotFindSettings < SmcGetError
45
- # The path to the settings file that was specified.
46
- attr_reader :settings_path
47
-
48
- # Create a new instance of the exception with the settings path.
49
- def initialize(settings_path)
50
- @settings_path = settings_path
51
- end
52
- end
53
-
54
- # Raised when a package call is made but the specified package cannot be
55
- # found.
56
- class NoSuchPackageError < SmcGetError
57
- # The name of the package that could not be found.
58
- attr_reader :package_name
59
-
60
- # Create a new instance of the exception with the specified package name.
61
- def initialize(name)
62
- @package_name = name
63
- end
64
- end
65
-
66
- # Raised when a package call is made but one of the resources of the
67
- # specified package is missing.
68
- class NoSuchResourceError < SmcGetError
69
- # The type of resource (should be either :music, :graphic, or :level).
70
- attr_reader :resource_type
71
- # The name of the resource (i.e. mylevel.lvl or Stuff/Cheeseburger.png).
72
- attr_reader :resource_name
73
-
74
- # Create a new instance of the exception with the specified resource type
75
- # and name. Type should either be :music, :graphic, or :level.
76
- def initialize(type, name)
77
- @resource_type = type
78
- @resource_name = name
79
- end
80
-
81
- # Returns true if the resource type is :music. False otherwise.
82
- def is_music?
83
- @resource_type == :music
84
- end
85
-
86
- # Returns true if the resource type is :graphic. False otherwise.
87
- def is_graphic?
88
- @resource_type == :graphic
89
- end
90
-
91
- # Returns true if the resource type is :level. False otherwise.
92
- def is_level?
93
- @resource_type == :level
94
- end
95
- end
96
-
97
- # Raised when a call to download() fails.
98
- class DownloadFailedError < SmcGetError
99
- # The URL that failed to download (including everything after /raw/master
100
- # only).
101
- attr_reader :download_url
102
-
103
- def initialize(url)
104
- @download_url = url
105
- end
106
- end
107
-
108
- #Raised when SmcGet.download timed out.
109
- class ConnectionTimedOutError < DownloadFailedError
110
- end
111
-
112
- end
113
- end
1
+ #Encoding: UTF-8
2
+ ################################################################################
3
+ # This file is part of smc-get.
4
+ # Copyright (C) 2010-2011 Entertaining Software, Inc.
5
+ # Copyright (C) 2011 Marvin Gülker
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ ################################################################################
20
+
21
+ module SmcGet
22
+
23
+ #This module contains all errors messages that are specific to smc-get.
24
+ module Errors
25
+
26
+ #Superclass for all errors in this library.
27
+ class SmcGetError < StandardError
28
+ end
29
+
30
+ #Raises when you did not call SmcGet.setup.
31
+ class LibraryNotInitialized < SmcGetError
32
+
33
+ #Throws an exception of this class with an appropriate error
34
+ #message if smc-get has not been initialized correctly.
35
+ def self.throw_if_needed!
36
+ if SmcGet.datadir.nil? or SmcGet.repo_url.nil?
37
+ raise(self, "You have to setup smc-get first!")
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ # Raised when the class is initialized with a non-existant settings file.
44
+ class CannotFindSettings < SmcGetError
45
+ # The path to the settings file that was specified.
46
+ attr_reader :settings_path
47
+
48
+ # Create a new instance of the exception with the settings path.
49
+ def initialize(settings_path)
50
+ @settings_path = settings_path
51
+ end
52
+ end
53
+
54
+ # Raised when a package call is made but the specified package cannot be
55
+ # found.
56
+ class NoSuchPackageError < SmcGetError
57
+ # The name of the package that could not be found.
58
+ attr_reader :package_name
59
+
60
+ # Create a new instance of the exception with the specified package name.
61
+ def initialize(name)
62
+ @package_name = name
63
+ end
64
+ end
65
+
66
+ # Raised when a package call is made but one of the resources of the
67
+ # specified package is missing.
68
+ class NoSuchResourceError < SmcGetError
69
+ # The type of resource (should be either :music, :graphic, :level or :spec).
70
+ attr_reader :resource_type
71
+ # The name of the resource (i.e. mylevel.lvl or Stuff/Cheeseburger.png).
72
+ attr_reader :resource_name
73
+
74
+ # Create a new instance of the exception with the specified resource type
75
+ # and name. Type should either be :music, :graphic, or :level.
76
+ def initialize(type, name)
77
+ @resource_type = type
78
+ @resource_name = name
79
+ end
80
+
81
+ # Returns true if the resource type is :music. False otherwise.
82
+ def is_music?
83
+ @resource_type == :music
84
+ end
85
+
86
+ # Returns true if the resource type is :graphic. False otherwise.
87
+ def is_graphic?
88
+ @resource_type == :graphic
89
+ end
90
+
91
+ # Returns true if the resource type is :level. False otherwise.
92
+ def is_level?
93
+ @resource_type == :level
94
+ end
95
+
96
+ # Returns true if the resource type is :spec. False otherwise.
97
+ def is_spec?
98
+ @resource_type == :spec
99
+ end
100
+
101
+ end
102
+
103
+ # Raised when a call to download() fails.
104
+ class DownloadFailedError < SmcGetError
105
+ # The URL that failed to download (including everything after /raw/master
106
+ # only).
107
+ attr_reader :download_url
108
+
109
+ def initialize(url)
110
+ @download_url = url
111
+ end
112
+ end
113
+
114
+ #Raised when SmcGet.download timed out.
115
+ class ConnectionTimedOutError < DownloadFailedError
116
+ end
117
+
118
+ #Raised if a package is damaged or malformed.
119
+ class BrokenPackageError < SmcGetError
120
+ end
121
+
122
+ #Raised if a package specification file contains rubbish.
123
+ class InvalidSpecification < BrokenPackageError
124
+ end
125
+
126
+ #Raised when a repository wasn’t found or contains structure errors.
127
+ class InvalidRepository < SmcGetError
128
+
129
+ #The URL of the repository.
130
+ attr_reader :repository_uri
131
+
132
+ def initialize(repository_uri)
133
+ @repository_uri = repository_uri
134
+ end
135
+
136
+ end
137
+
138
+ end
139
+ end
140
+ # vim:set ts=8 sts=2 sw=2 et: #