Browse Source

Add first iteration of packages info

keep-around/c6c62d3cdd7fcd08c28c5ef9e04c62beda6e83c6
hellekin 4 years ago
parent
commit
6732685b3d
14 changed files with 29470 additions and 243 deletions
  1. +467
    -0
      bin/update-packages
  2. +28819
    -47
      data/devuan.yml
  3. +0
    -61
      data/devuan_packages.yml
  4. +59
    -0
      data/distro.yml
  5. +47
    -0
      data/fonts.yml
  6. +1
    -0
      locales/en.yml
  7. +5
    -0
      source/os/packages/package.md.erb
  8. +21
    -16
      source/pages/os/packages/index.en.html.md.erb
  9. +43
    -0
      source/partials/_devuan_package.erb
  10. +0
    -32
      source/partials/_package.erb
  11. +0
    -3
      source/partials/_package_dependencies.erb
  12. +0
    -4
      source/partials/_package_issues.erb
  13. +8
    -77
      source/partials/_package_search_form.erb
  14. +0
    -3
      source/partials/_package_summary.erb

+ 467
- 0
bin/update-packages View File

@@ -0,0 +1,467 @@
#!/usr/bin/env ruby
#
## Update data/devuan_packages.yml

require 'fileutils'
require 'net/https'
require 'uri'
require 'yaml'
require 'xz'

BASE = File.expand_path(File.dirname(File.dirname(__FILE__)))

module Devuan

module Constants
PACKAGES_HOST = "packages.devuan.org"
DISTS_PATH = "merged/dists"
RELEASES = {
stable: :jessie,
testing: :ascii,
unstable: :ceres
}.freeze
end

module Helpers

include Devuan::Constants

def tmp_path(path = '')
path = path.gsub('/', '-').gsub(/[^\w\.-]+/, '').gsub(/[-]+/, '-').strip
[ BASE, 'tmp', path ].compact.join('/')
end

def packages_url(path = '')
suite = RELEASES[@suite] || RELEASES[:stable]
URI.parse("https://#{PACKAGES_HOST}/#{DISTS_PATH}/#{suite}/#{path}")
end

def wget(url)
http = wconnect(url)
http.request(Net::HTTP::Get.new(url.request_uri))
end

def wconnect(url)
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http
end

end

class WebFile

include ::Devuan::Helpers

attr_reader :data

def initialize(options = {})
@options = default_options.merge(options)
@suite = options[:suite] || RELEASES[:stable]
@uri = packages_url(@options[:uri])
@copy = tmp_path(@options[:uri])

# pass: `fetch: false` to use existing copy
@options[:fetch] = options.key?(:fetch) ? (options[:fetch] === true) : true

@data = {}

_ensure_tmp_dir
end

def uri=(uri)
@options[:uri] = uri
@options[:fetch] = true
@uri = packages_url(@options[:uri])
@copy = tmp_path(@options[:uri])
end

def fetch
if @options[:fetch]
res = wget(@uri)
File.open(@copy, 'w+') { |f| f.puts res.body }
end
if @copy =~ /.xz$/
_decompress_xz(@copy) if @options[:fetch]
@copy.gsub!(/.xz$/, '')
end
end

# Override in inherited class, return @data
def parse
lines = File.readlines(@copy)
raise NotImplementedError
end

protected

def method_missing(*args)
return @data[args.first] if @data.key?(args.first)
super
end

def value_at(line)
line.split(':').last.strip
end

private

def default_options
{ uri: 'Release' }
end

def _decompress_xz(file)
XZ.decompress_file(file, file.gsub(/.xz$/, ''))
end

def _ensure_tmp_dir()
FileUtils.mkdir_p(tmp_path, mode: 1700)
end

end

class GlobalReleaseFile < WebFile
def parse
lines = File.readlines(@copy)
@data[:origin] = value_at(lines[0])
@data[:label] = value_at(lines[1])
@data[:suite] = value_at(lines[2])
@data[:version] = value_at(lines[3])
@data[:codename] = value_at(lines[4])
@data[:valid_from] = value_at(lines[5])
@data[:valid_until] = value_at(lines[6])
@data[:architectures] = value_at(lines[7]).split(' ')
@data[:components] = value_at(lines[8]).split(' ')
@data[:description] = value_at(lines[9])
# Line 10 is the "MD5Sum" title
unless lines[10] =~ /^MD5Sum:$/
$stderr.puts "Changing times! MD5Sum line not found, but: '#{lines[10].strip}'"
return
end
# Grab all the MD5sums for verification
lines.shift 11
sums = lines.inject([]) do |x, l|
s, z, f = l.strip.split(/\s+/, 3)
x << { sum: s, size: z, file: f }
x
end
@data[:sums] = sums.sort_by { |x| x[:file] } rescue sums
@data
end
end

class ArchReleaseFile < WebFile
def parse
lines = File.readlines(@copy)
@data[:archive] = value_at(lines[0])
@data[:origin] = value_at(lines[1])
@data[:label] = value_at(lines[2])
@data[:version] = value_at(lines[3])
@data[:component] = value_at(lines[4])
@data[:architecture] = value_at(lines[5])
@data
end
end

class ArchPackagesFile < WebFile
def count
@data[:packages].size
end

def current_package
@data[:packages][@cursor]
end

def each(&block)
@data[:packages].each(&block)
end

def select(&block)
@data[:packages].select(&block)
end

def first
@cursor = 0
current_package
end

def next
@cursor += 1
current_package
end

def previous
@cursor -= 1
current_package
end

def last
@cursor = count
current_package
end

def parse
lines = File.read(@copy)
pkgs = lines.split("\n\n")
@data[:packages] = []
pkgs.each do |pkg|
x = {}
Devuan::Packages::Fields.each do |field|
key = field.downcase.gsub('-', '_').intern
if Devuan::Packages.stupid_field?(field)
x[:stupid] ||= []
x[:stupid] << field
end
if Devuan::Packages.multiline_field?(field)
x[key] = value_for(field, pkg, :multiline => true)
else
x[key] = value_for(field, pkg)
end
end
@data[:packages] << package_ds(x)
end
reset_cursor!
@data
end

protected

def reset_cursor!
@cursor = 0
end

def value_for(field, string, options = {})
if options[:multiline] # cut to next Field:
$1 if string =~ /^#{field}: (.*?)(\n[A-Z][\w-]+:)/m
else
$1 if string =~ /^#{field}: (.*)$/
end
end

protected

# Turn raw data from Packages into a proper data structure
def package_ds(raw)
pkg = {
name: raw[:package],
provides: raw[:provides],
description: raw[:description],
maintainer: raw[:maintainer],
essential: raw[:essential],
origin: raw[:origin],
priority: raw[:priority],
section: raw[:section],
task: raw[:task],
popcon: popcon_for(raw[:package]),
download_size: raw[:size],
installed_size: raw[:installed_size],
architectures: raw[:architectures],
multi_arch: raw[:multi_arch],
sums: {
md5: raw[:md5sum],
sha1: raw[:sha1],
sha256: raw[:sha256]
},
links: {
avatar: avatar_for(raw[:package]),
homepage: raw[:homepage],
issues: "https://git.devuan.org/devuan-packages/#{raw[:package]}/issues",
milestones: "https://git.devuan.org/devuan-packages/#{raw[:package]}/milestones"
},
upstream: upstream_info_for(raw[:package]),
dependencies: {
breaks: raw[:breaks],
conflicts: raw[:conflicts],
depends: raw[:depends],
pre_depends: raw[:pre_depends],
recommends: raw[:recommends],
suggests: raw[:suggests]
},
releases: {
stable: {
filename: "https://packages.devuan.org/#{raw[:filename]}",
tarball: nil,
version: raw[:version]
},
testing: {
filename: "https://packages.devuan.org/#{raw[:filename]}",
tarball: nil,
version: raw[:version]
},
unstable: {
filename: "https://packages.devuan.org/#{raw[:filename]}",
tarball: nil,
version: raw[:version]
}
},
meta: {
broken_home: raw[:homepage].nil?,
stupid: !raw[:stupid].empty?,
stupid_fields: raw[:stupid]
}
}
end

# Get avatar from gitlab
def avatar_for(pkg)
nil
end

# Get popcon info for package
def popcon_for(pkg)
nil
end

# Get upstream info for package
def upstream_info_for(pkg)
upstream = {
homepage: nil,
issues: nil,
maintainer: nil,
version: nil
}
end
end

module Packages

# grep -e '^[^ :]*: ' tmp/main-binary-amd64-Packages | cut -d: -f1 | sort | uniq
Fields = %w(Apport Architecture Breaks Bugs Build-Essential
Built-Using Conflicts Depends Description Description-md5 Enhances
Essential Filename Ghc-Package Gstreamer-Decoders Gstreamer-Elements
Gstreamer-Encoders Gstreamer-Uri-Sinks Gstreamer-Uri-Sources
Gstreamer-Version Homepage Installed-Size Lua-Versions Maintainer
MD5sum Modaliases Multi-Arch Npp-Applications Npp-Description
Npp-File Npp-Mimetype Npp-Name Origin Original-Maintainer
Original-Source-Maintainer Package Package-Type Postgresql-Version
Pre-Depends Priority Provides Python-Version Python-Versions
Recommends Replaces Ruby-Versions Section SHA1 SHA256 Size Source
Suggests Tag Task Version Xul-Appid)

# Multiline fields
MFields = %w(Description)

# Stupid fields
SFields = %w(Ghc-Package Gstreamer-Decoders Gstreamer-Elements
Gstreamer-Encoders Gstreamer-Uri-Sinks Gstreamer-Uri-Sources
Gstreamer-Version Lua-Versions Npp-Applications Npp-Description
Npp-File Npp-Mimetype Npp-Name Postgresql-Version Python-Version
Python-Versions Ruby-Versions Xul-Appid)

class << self

def multiline_field?(field)
MFields.include?(field)
end

def stupid_field?(field)
SFields.include?(field)
end

def release
return @release unless @release.nil?

@release = Devuan::GlobalReleaseFile.new
@release.fetch
@release.parse
@release
end

def packages
return @packages unless @packages.nil?

@packages = Devuan::ArchPackagesFile.new(uri: "main/binary-amd64/Packages.xz", fetch: false)
@packages.fetch
@packages.parse
@packages
end

# TODO: ask amprolla instead
def blacklisted
[ 'systemd', 'systemd-sysvinit' ]
end

def named(name)
packages.select { |x| x[:package] =~ /#{name}/ }
end

def depending_on(package)
pattern = Regexp.new(package)
packages.select do |x|
x[:pre_depends] =~ pattern || x[:depends] =~ pattern
end
end

def from_devuan
packages.select { |x| x[:releases][:stable][:version] =~ /[+]devuan/ }
end

def save_to_yml
File.open(BASE + '/tmp/packages.yml', 'w+') do |f|
f.puts(YAML.dump(packages))
end
File.open(BASE + '/tmp/devuan_packages.yml', 'w+') do |f|
f.puts(YAML.dump(from_devuan))
end
File.open(BASE + '/tmp/suspicious_packages.yml', 'w+') do |f|
f.puts(YAML.dump(depending_on('libsystemd0')))
end
end

protected

def method_missing(*args)
if packages.respond_to?(args.first)
packages.send(args.shift, *args)
else
super
end
end
end # class << self
end # Module Packages
end # Module Devuan


release = Devuan::GlobalReleaseFile.new(fetch: false)
release.fetch
release.parse

puts "Origin: #{release.origin}, version #{release.version}"
puts "Architectures: #{release.architectures}"
puts "Retrieving package information... Might take a while..."
puts "Retrieved information about #{Devuan::Packages.count} packages."
puts "Among those, #{Devuan::Packages.from_devuan.count} packages were modified by Devuan."

puts "E.g., #{Devuan::Packages.from_devuan.first[:name]}..."

puts "Saving to YAML format"
Devuan::Packages.save_to_yml

puts "Here comes the list of devuan-modified packages..."
puts Devuan::Packages.from_devuan.map { |x| x[:name] }.join(', ')

puts "Here is a list of packages starting with devuan:"
p Devuan::Packages.named('^devuan')
#.map { |x| x[:name] }.join(', ')

puts "#{Devuan::Packages.named('systemd').count} packages contain `systemd` in their name."

# Suspicious packages
libsystemd0_dependent = Devuan::Packages.depending_on('libsystemd0')
systemd_dependent = Devuan::Packages.depending_on('systemd')
remaining_packages_to_fix = libsystemd0_dependent - systemd_dependent
count = remaining_packages_to_fix.count

puts "There are #{libsystemd0_dependent.count} packages depending on libsystemd0:"
p libsystemd0_dependent.class
puts libsystemd0_dependent.map { |e| e[:name] }.join(', ')

p libsystemd0_dependent.first

if count > 0
puts "There are #{count} packages with dependency on systemd."
puts remaining_packages_to_fix.map(&:name).join(', ') unless count > 42
else
puts "Devuan #{release.version} is free from systemd dependencies!"
end

+ 28819
- 47
data/devuan.yml
File diff suppressed because it is too large
View File


+ 0
- 61
data/devuan_packages.yml View File

@@ -1,61 +0,0 @@
packages:
- example:
id: 123
name: "example"
web_url: "https://git.devuan.org/devuan-packages/example"
bugs_url: "https://git.devuan.org/devuan-packages/example/issues"
license: "GPL"
description: "An example package for testing"
long_description: "The `example` package provides some important functionality."
upstream:
url: "https://upstream.example.org/example"
version: "1.2.0"
stable:
url: "https://git.devuan.org/devuan-packages/example/tree/suites/jessie"
version: "1.1.6"
testing:
url: "https://git.devuan.org/devuan-packages/example/tree/suites/ascii"
version: "1.1.8"
unstable:
url: "https://git.devuan.org/devuan-packages/example/tree/suites/ceres"
version: "1.2.0"
- 'example-dev':
id: 125
name: "example-dev"
web_url: "https://git.devuan.org/devuan-packages/example-dev"
bugs_url: "https://git.devuan.org/devuan-packages/example-dev/issues"
license: "GPL"
description: "An example-dev package for testing"
long_description: "The `example-dev` package provides some important functionality."
upstream:
url: "https://upstream.example.org/example"
version: "1.2.0"
stable:
url: "https://git.devuan.org/devuan-packages/example-dev/tree/suites/jessie"
version: "1.1.6"
testing:
url: "https://git.devuan.org/devuan-packages/example-dev/tree/suites/ascii"
version: "1.1.8"
unstable:
url: "https://git.devuan.org/devuan-packages/example-dev/tree/suites/ceres"
version: "1.2.0"
- libexample:
id: 126
name: "libexample"
web_url: "https://git.devuan.org/devuan-packages/libexample"
bugs_url: "https://git.devuan.org/devuan-packages/libexample/issues"
license: "LGPL"
description: "An example library package for testing"
long_description: "The `libexample` package provides some important functionality."
upstream:
url: "https://upstream.example.org/example"
version: "1.2.0"
stable:
url: "https://git.devuan.org/devuan-packages/libexample/tree/suites/jessie"
version: "1.1.6"
testing:
url: "https://git.devuan.org/devuan-packages/libexample/tree/suites/ascii"
version: "1.1.8"
unstable:
url: "https://git.devuan.org/devuan-packages/libexample/tree/suites/ceres"
version: "1.2.0"

+ 59
- 0
data/distro.yml View File

@@ -0,0 +1,59 @@
---
sections:
admin:
title: System Administration
description: Utilities to administer system resources, manage user accounts, etc.
debug:
title: Package Debugging
description: Packages providing debugging information for executables and shared libraries.
devel:
title: Development
description: Development utilities, compilers, development environments, libraries, etc.
doc:
title: Documentation
description: Manuals, FAQs, HOWTO guides, and packages to browse Devuan documentation.
graphics:
title: Graphics
description: Image viewers, converters, and editors.
introspection:
title: Introspection
description: Machine-readable introspection data used by development programs.
libdevel:
title: Library Development
description: Development files to write programs depending on respective libraries.
libs:
title: Library Runtime
description: Shared libraries for runtime dependency on their functionality.
metapackages:
title: Meta-Packages
description: Meta-packages provide dependencies on a set of other packages.
misc:
title: Miscellaneous
description: Packages that don't fit in other sections.
net:
title: Network
description: Packages to connect your machine to the Internet.
oldlibs:
title: Old Libraries
description: Older versions of libraries kept for backwards-compatibility with old applications.
otherosfs:
title: Foreign OS and Filesystems
description: Software to run programs compiled for other operating systems, and to use their filesystems.
shells:
title: Shells
description: Command-line interpreters to access the OS services.
sound:
title: Sound
description: Sound players, converters, editors, mixers, soundcard and MIDI support, etc.
tasks:
title: Tasks
description: Package groups for specific tasks, used by `tasksel`.
utils:
title: System Utilities
description: Packages for file/disk manipulation, backup, archival, system monitoring, input systems, etc.
x11:
title: X Window System Software
description: Graphical servers, libraries, fonts, window managers, terminal emulators, desktop applications.
xfce:
title: XFCE Desktop Environment
description: XFCE-specific applications.

+ 47
- 0
data/fonts.yml View File

@@ -0,0 +1,47 @@
devuan_icons:
devuan: \e91b
gnu: \e901
linux: \e90a
devulcan: \e900
smile: \e91d
hand-spock: \e903
heart-empty: \e806
heart: \e924
star-empty: \e805
star: \e804
mail-empty: \e802
mail: \e807
bell-empty: \e80f
bell: \e810
quote-left: \e90c
quote-right: \e90b
ok: \e809
cancel: \e80a
chevron-down: \e912
chevron-up: \e913
link-ext: \e80b
spinner: \e800
search: \e801
git: \e81c
magnet: \e914
rss: \e811
share: \e80e
flask: \e90d
compass: \e902
users: \e90e
bullhorn: \e90f
loading: \e916
reload: \e917
cog: \e918
comments: \e91e
bookmark: \e91f
docs: \e920
download: \e921
youtube: \e81e
twitter: \e911
cc-visa: \e909
cc-mastercard: \e908
cc-amex: \e906
cc-discover: \e907
cc-paypal: \e905
cc-stripe: \e904

+ 1
- 0
locales/en.yml View File

@@ -14,6 +14,7 @@ en:
donate_now: "donate now!"
download: Download
download_more: more download options
essential: essential
essentials: Essentials
featured: Featured
free_software: Free Software


+ 5
- 0
source/os/packages/package.md.erb View File

@@ -0,0 +1,5 @@
---
title: "Devuan Package #{pkg.name}"
---

<%= partial 'devuan_package', :locals => { pkg: pkg, summary: false } %>

+ 21
- 16
source/pages/os/packages/index.en.html.md.erb View File

@@ -4,24 +4,29 @@ title: Devuan Packages

# Browse Devuan Packages

<%= partial :package_search_form %>

<%
<section id="sections" class="container row">
<h2>Sections</h2>
<% i=0; data.distro.sections.each do |(name, section)| %>
<div class="six columns">
<h3><%= link_to section.title, "/os/packages/by-section/#{name}" %></h3>

milestone_stable = "1.0-jessie"
milestone_testing = "2.0-ascii"
milestone_unstable = "ceres"
<p><%= section.description %></p>
</div>

%>
<% i+=1; end %>
</section>

<ul>
<% data.devuan_packages.packages.each do |pkg|
name, deb = pkg.keys.first, pkg.values.first
%>
<li>
<article class="package row">
<%= partial :package, :locals => { pkg: deb, summary: true } %>
</article>
</li>
<section id="packages" class="container row">
<h2>Package List</h2>
<ul>
<% data.devuan.packages.each do |pkg| %>
<li id="pkg-<%= pkg.name %>">
<h3><%= link_to pkg.name, "/os/packages/#{pkg.name}" %></h3>
<%= pkg_classification(pkg) %>
<!-- p class="description"><%= pkg.description.split("\n").first %></p> -->
</li>
<% end %>
</ul>
</ul>
</section>

+ 43
- 0
source/partials/_devuan_package.erb View File

@@ -0,0 +1,43 @@
<article class="package">
<header>
<% unless pkg.links.avatar.nil? %>
<a class="avatar" href="<%= pkg.links.homepage %>"><img src="<%= pkg.links.avatar %>" alt="<%= pkg.links.homepage %>"></a>
<% end %>
<h1><%= "apt install #{pkg.name}" %></h1>
<%= pkg_classification(pkg) %>
<p class="description"><%= pkg.description %></p>
<p class="maintainer">Maintained by <%= link_to_maintainer(pkg) %>.</p>
<p>Package SHA256 Sum: <span class="sha256 sum"><%= pkg.sums.sha256 %></span></p>
</header>
<% unless summary %>
<div class="row">
<section class="six columns"><h3>Versions</h3>
<dl>
<% pkg.releases.each do |(suite,v)| %>
<dt><%= suite %></dt>
<dd><%= link_to(v.version, "https://packages.devuan.org/devuan/#{v.filename}") %></dd>
<% end %>
</dl>
</section>
<section class="six columns"><h3>Metrics</h3>
<dl>
<dt><span title="Popularity Contest">Popcon</span> Score</dt>
<dd><%= pkg.popcon || 'no info' %></dd>
<dt>Download Size</dt><dd><%= pkg.download_size %></dd>
<dt>Installed Size</dt><dd><%= pkg.installed_size %></dd>
</dl>
</section>
</div>

<div class="row">
<section class="six columns"><h3>Dependencies</h3>
<% pkg.dependencies.each do |(does, deps)|
next unless deps.nil?
%>
<h4><%= does.gsub('_', '-') %></h4>
<p><%= deps %></p>
<% end %>
</section>
</div>
<% end %>
</article>

+ 0
- 32
source/partials/_package.erb View File

@@ -1,32 +0,0 @@
<header class="summary" id="<%= pkg_id(pkg, 'summary') %>">
<%= partial :package_summary, :locals => { :pkg => pkg } %>
</header>
<% unless :summary %>
<section class="description" id="<%= pkg_id(pkg, 'description') %>">
<h3>Description</h3>
<%= r(pkg.long_description) %>
</section>
<section class="releases" id="<%= pkg_id(pkg, 'releases') %>">
<h3>Released Versions</h3>
<dl>
<dt>Upstream</dt><dd><%= link_to pkg.upstream.version, pkg.upstream.url %></dd>
<dt>Stable</dt><dd><%= link_to pkg.stable.version, pkg.stable.url %></dd>
<dt>Testing</dt><dd><%= link_to pkg.testing.version, pkg.testing.url %></dd>
<dt>Unstable</dt><dd><%= link_to pkg.unstable.version, pkg.unstable.url %></dd>
</dl>
</section>
<section class="issues" id="<%= pkg_id(pkg, 'issues') %>">
<h3>Issues</h3>
<%= partial :package_issues, :locals => { :pkg => pkg } %>
</section>
<section class="dependencies" id="<%= pkg_id(pkg, 'dependencies') %>">
<h3>Dependencies</h3>
<%= partial :package_dependencies, :locals => { :pkg => pkg } %>
</section>
<footer>
<dl>
<dt>
<dt>License</dt><dd><%= pkg_license(pkg) %></dd>
</dl>
</footer>
<% end %>

+ 0
- 3
source/partials/_package_dependencies.erb View File

@@ -1,3 +0,0 @@
<section class="package dependencies">
<h2>Package Dependencies</h2>
</section>

+ 0
- 4
source/partials/_package_issues.erb View File

@@ -1,4 +0,0 @@
<section class="package issues">
<h2>Package Issues</h2>
<p>Showing issues from <%= link_to("<code>#{pkg.name}</code> issue tracker", pkg.bugs_url) %></p>
</section>

+ 8
- 77
source/partials/_package_search_form.erb View File

@@ -1,77 +1,8 @@
<% content_for :footer do %>

<script>

function package_filter() {
var f = $('form[action^="javascript:package_filter"]');
var q = f.q;
var args = {};
var w = q.split(' ');
w.each(function(s){
if (s.indexOf(':')) {
var k, v = s.split(':');
} else {
var k, v = '', s
}
switch k {
case 'group':
if (v+1 > 1) {
args['group_id'] = v;
} else {
args['group_name'] = v;
}
break;
case 'user':
if (v+1 > 1) {
args['user_id'] = v;
} else {
args['user_name'] = v;
}
break;
case 'milestone':
case 'tag':
default:
throw(NotImplementedError);
}
}
filter_with(args);

return false;
}

function filter_with(args) {
args.each(function(k, v) {
switch(k) {
case 'package_id':
$('.package article').addClass('hidden');
$('#pkg-'+v).removeClass('hidden');
break;
default:
$('.package article').animate('fadein', '1s');
}
}
}

$(document).ready(function() {

var noscript = $('#package-search-noscript')
var f = noscript.form;
f.action = 'javascript:package_filter';
$(document).removeChild(noscript);
$(document).html(f);

})

</script>


<% end %>
<noscript id="package-search-noscript">
<form method="GET" action"https://git.devuan.org/search">
<fieldset>
<legend>Search Packages (remote only--Active JavaScript for local filter)</legend>
<input type="text" placeholder="group:devuan-packages name:devuan-sdk suite:stable" value="" name="q" id="q">
<input type="submit" name="go" value="search packages">
</fieldset>
</form>
</noscript>
<form method="GET" action="https://git.devuan.org/search">
<fieldset>
<label for="search">Find package, issue, group, project...</label>
<input type="text" placeholder="devuan" value="" name="search" id="search">
<input type="hidden" name="utf8" value="✓">
<input type="submit" name="go" value="search packages">
</fieldset>
</form>

+ 0
- 3
source/partials/_package_summary.erb View File

@@ -1,3 +0,0 @@
<h2><%= link_to pkg.name, "/os/packages/#{pkg.name}" %></h2>
<p><%= pkg.description %></p>
<p>Stable version: <%= link_to pkg.stable.version, pkg.stable.url %>.</p>

Loading…
Cancel
Save