From 7b5a7d87d7a1b37fdf912839c3a8a783eab08456 Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 10:58:53 +0100 Subject: [PATCH 1/8] Add route to retrieve latest version with dependencies --- lib/puppet_library/server.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/puppet_library/server.rb b/lib/puppet_library/server.rb index 5c91759..c067239 100644 --- a/lib/puppet_library/server.rb +++ b/lib/puppet_library/server.rb @@ -139,6 +139,20 @@ def initialize(forge) end end + get "/:author/:module/pack" do + author = params[:author] + module_name = params[:module] + + begin + this = @forge.get_module_metadata(author, module_name) + version = this["releases"].last["version"] + metadata = @forge.get_module_metadata_with_dependencies(author, module_name, version).to_json + haml :pack, { :locals => { "this" => this, "metadata" => metadata } } + rescue Forge::ModuleNotFound + halt 404, haml(:module_not_found, { :locals => { "author" => author, "name" => module_name } }) + end + end + post "/api/forge/clear-cache" do @forge.clear_cache end From 19745efe421d5963c1735b11382275bd3c4555fc Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 11:39:52 +0100 Subject: [PATCH 2/8] First draft of pack view --- lib/puppet_library/app/views/pack.haml | 24 ++++++++++++++++++++++++ lib/puppet_library/server.rb | 5 +++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 lib/puppet_library/app/views/pack.haml diff --git a/lib/puppet_library/app/views/pack.haml b/lib/puppet_library/app/views/pack.haml new file mode 100644 index 0000000..4878131 --- /dev/null +++ b/lib/puppet_library/app/views/pack.haml @@ -0,0 +1,24 @@ +-# -*- encoding: utf-8 -*- +-# Puppet Library +-# Copyright (C) 2014 Javier Palacios +-# +-# This program is free software: you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation, either version 3 of the License, or +-# (at your option) any later version. +-# +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program. If not, see . + +%h1= "Module #{this["full_name"]}" +%div= "Name: #{this["author"]}-#{this["name"]}" +%div= "Version: #{this["version"]}" +%div= "Description: #{this["desc"]}" +%ul + - metadata.each do |name,mod| + %li= " #{name} -> #{mod["version"]} #{mod["dependencies"]}" diff --git a/lib/puppet_library/server.rb b/lib/puppet_library/server.rb index c067239..93c2fb0 100644 --- a/lib/puppet_library/server.rb +++ b/lib/puppet_library/server.rb @@ -145,8 +145,9 @@ def initialize(forge) begin this = @forge.get_module_metadata(author, module_name) - version = this["releases"].last["version"] - metadata = @forge.get_module_metadata_with_dependencies(author, module_name, version).to_json + this.merge( this["releases"].last ) + all_results = @forge.get_module_metadata_with_dependencies(author, module_name, this["version"]) + metadata = all_results.inject({}){ |h,(k,v)| h.update( k => v.first ) } haml :pack, { :locals => { "this" => this, "metadata" => metadata } } rescue Forge::ModuleNotFound halt 404, haml(:module_not_found, { :locals => { "author" => author, "name" => module_name } }) From 425cee11269dbf8478e7b0524db079d6eddaf0cf Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 11:44:45 +0100 Subject: [PATCH 3/8] BUGFIX : remove packed module from dependency list --- lib/puppet_library/server.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/puppet_library/server.rb b/lib/puppet_library/server.rb index 93c2fb0..4778c42 100644 --- a/lib/puppet_library/server.rb +++ b/lib/puppet_library/server.rb @@ -147,6 +147,7 @@ def initialize(forge) this = @forge.get_module_metadata(author, module_name) this.merge( this["releases"].last ) all_results = @forge.get_module_metadata_with_dependencies(author, module_name, this["version"]) + all_results.reject!{ |k| k == this["full_name"] } metadata = all_results.inject({}){ |h,(k,v)| h.update( k => v.first ) } haml :pack, { :locals => { "this" => this, "metadata" => metadata } } rescue Forge::ModuleNotFound From 89ddb9322f5bf58302a8513e6abe97a7899346fa Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 12:08:03 +0100 Subject: [PATCH 4/8] Pick right dependency version --- lib/puppet_library/app/views/pack.haml | 3 ++- lib/puppet_library/server.rb | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/puppet_library/app/views/pack.haml b/lib/puppet_library/app/views/pack.haml index 4878131..3115e2d 100644 --- a/lib/puppet_library/app/views/pack.haml +++ b/lib/puppet_library/app/views/pack.haml @@ -19,6 +19,7 @@ %div= "Name: #{this["author"]}-#{this["name"]}" %div= "Version: #{this["version"]}" %div= "Description: #{this["desc"]}" +%div= "Dependencies:" %ul - metadata.each do |name,mod| - %li= " #{name} -> #{mod["version"]} #{mod["dependencies"]}" + %li= " #{name} - #{mod["version"]}" diff --git a/lib/puppet_library/server.rb b/lib/puppet_library/server.rb index 4778c42..540a595 100644 --- a/lib/puppet_library/server.rb +++ b/lib/puppet_library/server.rb @@ -147,8 +147,14 @@ def initialize(forge) this = @forge.get_module_metadata(author, module_name) this.merge( this["releases"].last ) all_results = @forge.get_module_metadata_with_dependencies(author, module_name, this["version"]) + deplist = all_results[this["full_name"]].first["dependencies"].inject({}){ |h,i| h.update( i.first => i.last ) } + deplist[this["full_name"]] = this["version"] all_results.reject!{ |k| k == this["full_name"] } - metadata = all_results.inject({}){ |h,(k,v)| h.update( k => v.first ) } + metadata = all_results.inject({}) do |h,(k,v)| + s = v.sort{ |x,y| x["version"] <=> y["version"] } + item = s.find{ |i| i["version"] == deplist[k] } + h.update( k => item || s.last ) + end haml :pack, { :locals => { "this" => this, "metadata" => metadata } } rescue Forge::ModuleNotFound halt 404, haml(:module_not_found, { :locals => { "author" => author, "name" => module_name } }) From 6d56900cd34cd42cdde8ec95aa1129191dfd1934 Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 12:51:37 +0100 Subject: [PATCH 5/8] Basic implementation of pack download route --- lib/puppet_library/server.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/puppet_library/server.rb b/lib/puppet_library/server.rb index 540a595..8aeaa1f 100644 --- a/lib/puppet_library/server.rb +++ b/lib/puppet_library/server.rb @@ -161,6 +161,25 @@ def initialize(forge) end end + get "/:author/:module/download" do + author = params[:author] + module_name = params[:module] + + begin + this = @forge.get_module_metadata(author, module_name) + this.merge( this["releases"].last ) + all_results = @forge.get_module_metadata_with_dependencies(author, module_name, this["version"]) + deplist = all_results[this["full_name"]].first["dependencies"].inject({}){ |h,i| h.update( i.first => i.last ) } + filelist = all_results.inject([]) do |a,(k,v)| + s = v.sort{ |x,y| x["version"] <=> y["version"] } + item = s.find{ |i| i["version"] == deplist[k] } || s.last + a << item["file"] + end + rescue Forge::ModuleNotFound + halt 404, haml(:module_not_found, { :locals => { "author" => author, "name" => module_name } }) + end + end + post "/api/forge/clear-cache" do @forge.clear_cache end From 2b61aeef8aee1e0cb4ecd7e68123a1957f9db6b4 Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 13:53:12 +0100 Subject: [PATCH 6/8] Implement download of packed requirements --- lib/puppet_library/server.rb | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/puppet_library/server.rb b/lib/puppet_library/server.rb index 8aeaa1f..65216dc 100644 --- a/lib/puppet_library/server.rb +++ b/lib/puppet_library/server.rb @@ -165,18 +165,34 @@ def initialize(forge) author = params[:author] module_name = params[:module] + tempdir = Dir.mktmpdir begin this = @forge.get_module_metadata(author, module_name) this.merge( this["releases"].last ) all_results = @forge.get_module_metadata_with_dependencies(author, module_name, this["version"]) deplist = all_results[this["full_name"]].first["dependencies"].inject({}){ |h,i| h.update( i.first => i.last ) } - filelist = all_results.inject([]) do |a,(k,v)| + + all_results.each do |k,v| s = v.sort{ |x,y| x["version"] <=> y["version"] } item = s.find{ |i| i["version"] == deplist[k] } || s.last - a << item["file"] + parts = item["file"].split('-',3) + parts[0].slice! "/modules/" + parts[2].slice! ".tar.gz" + FileUtils.cp @forge.get_module_buffer(*parts), tempdir + end + + require 'puppet_library/archive/archiver' + buffer = Archive::Archiver.archive_dir(tempdir, ".").tap do + attachment "pack-#{author}-#{module_name}-#{this["version"]}.tar.gz" end + + content_type "application/x-tar" + download buffer + rescue Forge::ModuleNotFound halt 404, haml(:module_not_found, { :locals => { "author" => author, "name" => module_name } }) + ensure + FileUtils.rm_rf tempdir end end From 38a08907c9d63812f7823202e97f40d1a31af99f Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 13:53:44 +0100 Subject: [PATCH 7/8] BUGFIX: hash merging does not produce intended results --- lib/puppet_library/server.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/puppet_library/server.rb b/lib/puppet_library/server.rb index 65216dc..27537df 100644 --- a/lib/puppet_library/server.rb +++ b/lib/puppet_library/server.rb @@ -145,7 +145,7 @@ def initialize(forge) begin this = @forge.get_module_metadata(author, module_name) - this.merge( this["releases"].last ) + this.update( this["releases"].last ) all_results = @forge.get_module_metadata_with_dependencies(author, module_name, this["version"]) deplist = all_results[this["full_name"]].first["dependencies"].inject({}){ |h,i| h.update( i.first => i.last ) } deplist[this["full_name"]] = this["version"] @@ -168,7 +168,7 @@ def initialize(forge) tempdir = Dir.mktmpdir begin this = @forge.get_module_metadata(author, module_name) - this.merge( this["releases"].last ) + this.update( this["releases"].last ) all_results = @forge.get_module_metadata_with_dependencies(author, module_name, this["version"]) deplist = all_results[this["full_name"]].first["dependencies"].inject({}){ |h,i| h.update( i.first => i.last ) } From a69843f7137f05fd1297aceba866cab60461e32d Mon Sep 17 00:00:00 2001 From: Javier Palacios Date: Tue, 24 Mar 2015 14:19:21 +0100 Subject: [PATCH 8/8] Add download link to pack view --- lib/puppet_library/app/views/pack.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/puppet_library/app/views/pack.haml b/lib/puppet_library/app/views/pack.haml index 3115e2d..7cd5238 100644 --- a/lib/puppet_library/app/views/pack.haml +++ b/lib/puppet_library/app/views/pack.haml @@ -16,9 +16,11 @@ -# along with this program. If not, see . %h1= "Module #{this["full_name"]}" -%div= "Name: #{this["author"]}-#{this["name"]}" -%div= "Version: #{this["version"]}" %div= "Description: #{this["desc"]}" +%div + Version: #{this["version"]} + %a(href="download") + [Download] %div= "Dependencies:" %ul - metadata.each do |name,mod|