@@ -31,7 +31,7 @@ class Cookbook
3131
3232 attr_accessor :definition_files , :template_files , :remote_files ,
3333 :lib_files , :resource_files , :provider_files , :name , :manifest ,
34- :metadata , :metadata_files , :status , :couchdb_rev , :couchdb , :version
34+ :metadata , :metadata_files , :status , :couchdb_rev , :couchdb
3535 attr_reader :recipe_files , :attribute_files , :couchdb_id
3636
3737 DESIGN_DOCUMENT = {
@@ -55,7 +55,50 @@ class Cookbook
5555 }
5656 }
5757 EOJS
58- }
58+ } ,
59+ "all_latest_version" => {
60+ "map" => %q@
61+ function(doc) {
62+ if (doc.chef_type == "cookbook") {
63+ emit(doc.cookbook_name, [doc.cookbook_name, doc.version]);
64+ }
65+ }
66+ @ ,
67+ "reduce" => %q@
68+ function(keys, values, rereduce) {
69+ var result = null;
70+
71+ for (var idx in values) {
72+ var value = values[idx];
73+
74+ if (idx == 0) {
75+ result = value;
76+ continue;
77+ }
78+
79+ var valueParts = value[1].split('.').map(function(v) { return parseInt(v); });
80+ var resultParts = result[1].split('.').map(function(v) { return parseInt(v); });
81+
82+ if (valueParts[0] != resultParts[0]) {
83+ if (valueParts[0] > resultParts[0]) {
84+ result = value;
85+ }
86+ }
87+ else if (valueParts[1] != resultParts[1]) {
88+ if (valueParts[1] > resultParts[1]) {
89+ result = value;
90+ }
91+ }
92+ else if (valueParts[2] != resultParts[2]) {
93+ if (valueParts[2] > resultParts[2]) {
94+ result = value;
95+ }
96+ }
97+ }
98+ return result;
99+ }
100+ @
101+ } ,
59102 }
60103 }
61104
@@ -81,9 +124,16 @@ def initialize(name, couchdb=nil)
81124 @couchdb_rev = nil
82125 @status = :ready
83126 @manifest = nil
84- @version = nil
85127 @metadata = { }
86128 end
129+
130+ def version
131+ @metadata [ 'version' ]
132+ end
133+
134+ def version = ( new_version )
135+ @metadata [ 'version' ] = new_version
136+ end
87137
88138 def full_name
89139 "#{ name } -#{ version } "
@@ -329,8 +379,7 @@ def generate_manifest(&url_generation)
329379 end
330380 response [ :cookbook_name ] = name . to_s
331381 response [ :metadata ] = metadata
332- response [ :version ] = metadata . version
333- @version = metadata . version
382+ response [ :version ] = metadata [ 'version' ]
334383 response [ :name ] = full_name
335384 @manifest = response
336385 end
@@ -348,7 +397,7 @@ def self.chef_server_rest
348397
349398 # Save this cookbook via the REST API
350399 def save
351- chef_server_rest . put_rest ( "cookbooks/#{ @name } /#{ @ version} " , self )
400+ chef_server_rest . put_rest ( "cookbooks/#{ @name } /#{ version } " , self )
352401 self
353402 end
354403
0 commit comments