aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorB. Watson <yalhcru@gmail.com>2015-04-08 01:09:31 -0400
committerB. Watson <yalhcru@gmail.com>2015-04-08 01:09:31 -0400
commit09e8113d7c05157cd54e16f820f6c7ce471d53b7 (patch)
tree3a481b2f6f13e827495e90e83c509204fa19582a
parentc09112454417693693c265963b1f829695611b2d (diff)
downloadsbostuff-09e8113d7c05157cd54e16f820f6c7ce471d53b7.tar.gz
Add some more scripts
-rw-r--r--README7
-rwxr-xr-xmkslackdesc72
-rwxr-xr-xmkslackinfo211
-rwxr-xr-xsbrename73
4 files changed, 361 insertions, 2 deletions
diff --git a/README b/README
index 647fee4..0e1c7bf 100644
--- a/README
+++ b/README
@@ -1,15 +1,18 @@
sbostuff - Miscellaneous tools for working with SlackBuild.org (SBo)
build scripts. Included tools:
+mkslackdesc - make a valid slack-desc from a README
+mkslackinfo - generate .info and template SlackBuild
sbodeps - generate a queue file based on .info file contents
sbodl - download the sources (from the .info file)
sbofixinfo - try to fix malformed .info files
sbolint - examine a SBo tarball or dir, look for common errors
sbosearch - search local SBo repo
sbosubmit - submit to SBo, from command line
+sbrename - rename a build
-Each script supports a --help option. Further documentation will be
-in the form of comments in the scripts.
+Most scripts support a --help option. Further documentation will be in
+the form of comments in the scripts.
Some of these are shell scripts, some are perl. Comments are hopefully
in English :)
diff --git a/mkslackdesc b/mkslackdesc
new file mode 100755
index 0000000..4795a74
--- /dev/null
+++ b/mkslackdesc
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+
+# mkslackdesc
+
+# Convert a README into a valid slack-desc.
+
+# Usage: mkslackdesc [input]
+
+# If input not given, reads the file README in the current dir.
+# To read from standard input, give - as the input file.
+
+# Output: a slack-desc, including the "how to edit" comments
+# and the "handy ruler" line. If the input text won't fit into
+# 11 72-characters lines, the output will not be a valid slack-desc,
+# and you'll get a warning to that effect.
+
+# Output is to slack-desc in the current directory, and is also echoed
+# to standard output.
+
+if(-e "slack-desc") {
+ die "slack-desc already exists in current directory!\n";
+}
+
+chomp ($pkg = `pwd`);
+$pkg =~ s,.*/,,;
+
+if(!@ARGV) {
+ push @ARGV, "README";
+}
+
+open my $f, ">slack-desc" or die $!;
+print "Writing to slack-desc:\n\n";
+
+$ruler = <<EOF;
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+EOF
+
+$ruler .= (' ' x length($pkg)) . <<EOF;
+|-----handy-ruler------------------------------------------------------|
+EOF
+
+print $ruler;
+print $f $ruler;
+
+$lines = 11;
+open my $pipe, "fmt -s -w 71 < $ARGV[0] |" or die $!;
+while($_ = <$pipe>) {
+ --$lines;
+ chomp;
+ my $outline = "$pkg:";
+ $outline .= " $_" if $_;
+ $outline .= "\n";
+ print $outline;
+ print $f $outline;
+}
+
+close $pipe;
+
+if($lines < 0) {
+ warn "slack-desc is too long (should be 11 lines), output not valid\n";
+} else {
+ print "$pkg:\n" for 1..$lines;
+ print $f "$pkg:\n" for 1..$lines;
+}
+
+close $f;
diff --git a/mkslackinfo b/mkslackinfo
new file mode 100755
index 0000000..db11244
--- /dev/null
+++ b/mkslackinfo
@@ -0,0 +1,211 @@
+#!/usr/bin/perl -w
+
+# Create a SB.o compliant .info file
+# (and a .SlackBuild from a template, if one doesn't already exist,
+# and a slack-desc if a README exists)
+
+# Fill in your name and email address here:
+$name = 'B. Watson';
+$email = 'yalhcru@gmail.com';
+
+use LWP::Simple;
+use Digest::MD5 'md5_hex';
+
+sub usage {
+ die "usage: mkslackinfo url [homepage] [version]\n";
+}
+
+$url = shift || &usage;
+
+# Take package name from the current dir
+chomp ($package = `pwd`);
+$package =~ s,.*/,,;
+
+# Take filename from last part of URL
+($file = $url) =~ s,.*/,,;
+
+# Generate appropriate extract command
+if($file =~ /\.zip$/i) {
+ $extract = "unzip \$CWD/\$PRGNAM-\$VERSION.zip";
+} elsif($file =~ /\.rar$/i) {
+ $extract = "unrar x \$CWD/\$PRGNAM-\$VERSION.rar";
+} elsif($file =~ /\.7z$/i) {
+ $extract = "7za x \$CWD/\$PRGNAM-\$VERSION.rar";
+} elsif($file =~ /(\.tar(?:$|\..*)|\.t[bxg]z)/i) {
+ $extract = "tar xvf \$CWD/\$PRGNAM-\$VERSION$1";
+}
+
+$homepage = shift;
+if(!$homepage) {
+ if($url =~ m{http://downloads.(?:sourceforge|sf).net/([^/]+)/}) {
+ $homepage = "http://sourceforge.net/projects/$1/";
+ } elsif($url =~ m,((?:ht|f)tp://[^/]+/),) {
+ $homepage = $1;
+ } else {
+ die "Can't figure out homepage\n";
+ }
+
+ warn "Assuming homepage is $homepage\n";
+}
+
+$version = shift || 0;
+if(!$version) {
+ # Try to figure out the version number. The regex is fairly dumb.
+ if($file =~ /-(\d[\d._]+(?:[a-z]+)?)\.(?:tar|t[gzb]z|zip|rar|7z)/) {
+ $version = $1;
+ warn "Version appears to be $version\n";
+ } else {
+ die "Can't figure out version number\n";
+ }
+}
+
+if(not -e "$package.SlackBuild") {
+ warn "$package.SlackBuild does not exist, creating from template\n";
+ open my $build, ">$package.SlackBuild" or die $!;
+ while(<DATA>) {
+ s/__NAME__/$name/g;
+ s/__EMAIL__/$email/g;
+ s/__PRGNAM__/$package/g;
+ s/__VERSION__/$version/g;
+ s/__EXTRACT__/$extract/g;
+ print $build "$_";
+ }
+ close $build;
+ chmod 0755, "$package.SlackBuild";
+}
+
+if((-e "README") && (! -e "slack-desc")) {
+ warn "slack-desc does not exist, creating from existing README\n";
+ system("mkslackdesc");
+}
+
+print STDERR "Downloading $url...";
+$content = get($url);
+if($content) {
+ $md5 = md5_hex($content);
+ print STDERR "OK\nWriting $package.info\n";
+} else {
+ warn "Can't download $url with LWP::Simple, MD5SUM will be wrong in .info\n";
+ $md5 = "FIXME";
+}
+
+open $f, ">$package.info" or die $!;
+$content = <<EOF;
+PRGNAM="$package"
+VERSION="$version"
+HOMEPAGE="$homepage"
+DOWNLOAD="$url"
+MD5SUM="$md5"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="$name"
+EMAIL="$email"
+EOF
+print $content;
+print $f $content;
+close $f;
+
+if($url =~ /sourceforge\.net/i) {
+ $extra_wget_params = "--user-agent wget";
+} else {
+ $extra_wget_params = "--referer='$url'";
+}
+
+exec("wget $extra_wget_params $url");
+
+__DATA__
+#!/bin/sh
+
+# Slackware build script for __PRGNAM__
+
+# Written by __NAME__ (__EMAIL__)
+
+# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.
+
+PRGNAM=__PRGNAM__
+VERSION=${VERSION:-__VERSION__}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i486 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+CWD=$(pwd)
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i486" ]; then
+ SLKCFLAGS="-O2 -march=i486 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+__EXTRACT__
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --docdir=/usr/doc/$PRGNAM-$VERSION \
+ --build=$ARCH-slackware-linux
+
+make
+make install-strip DESTDIR=$PKG
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+rm -f $PKG/usr/info/dir
+gzip -9 $PKG/usr/info/*.info*
+
+find $PKG -name perllocal.pod \
+ -o -name ".packlist" \
+ -o -name "*.bs" \
+ | xargs rm -f
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a <documentation> \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}
diff --git a/sbrename b/sbrename
new file mode 100755
index 0000000..9031674
--- /dev/null
+++ b/sbrename
@@ -0,0 +1,73 @@
+#!/bin/bash
+
+NAME=$( echo "$0" | sed 's,.*/,,' )
+
+# Trim trailing slash from SRC and DEST, if present
+SRC="$( echo "$1" | sed 's,/$,,' )"
+DEST="$( echo "$2" | sed 's,/$,,' )"
+
+if [ ! -d "$SRC" ]; then
+ if [ -e "$SRC" ]; then
+ echo "$NAME: $SRC is not a directory"
+ else
+ echo "$NAME: $SRC not found or can't access"
+ fi
+ SRC=""
+fi
+
+if [ "$SRC" = "" -o "$DEST" = "" ]; then
+ cat <<EOF
+$NAME - rename a SlackBuild
+
+Usage: $NAME slackbuild_dir new_name
+
+slackbuild_dir must be a directory containing at least a SlackBuild
+script, named after the directory (e.g. directory foo must contain
+foo.SlackBuild). It may also contain a README, .info file, and/or
+slack-desc. All these files that exist will be updated, replacing the
+old name with the new, and the directory will be renamed to the new name
+as well.
+
+The original directory's contents will be saved to slackbuild_dir.bak
+rather than being deleted, in case anything goes wrong.
+
+The renamed files will probably need some editing before they can be
+used. In particular, the commands to extract the source and cd into the
+source directory will be using the new name (which won't work with the
+old source).
+EOF
+ exit 1
+fi
+
+if [ -e "$DEST" ]; then
+ echo "$NAME: $DEST already exists"
+ exit 1
+fi
+
+set -e
+
+cp -a "$SRC" "$DEST"
+mv "$SRC" "$SRC.bak"
+
+cd "$DEST"
+
+if [ -e "$SRC.SlackBuild" ]; then
+ sed "/^ *P[RK]GNAM=/s,$SRC,$DEST," "$SRC.SlackBuild" > "$DEST.SlackBuild"
+ rm -f "$SRC.SlackBuild"
+ chmod 755 "$DEST.SlackBuild"
+fi
+
+if [ -e slack-desc ]; then
+ sed -i "s,^$SRC,$DEST," slack-desc
+ newindent="$(echo $DEST|sed 's,., ,g')"
+ sed -i "s,^ *\(|--*handy.*\),$newindent\1," slack-desc
+fi
+
+if [ -e README ]; then
+ sed -i "s,$SRC,$DEST,g" README
+fi
+
+if [ -e "$SRC.info" ]; then
+ sed "/^PRGNAM=/s,$SRC,$DEST," "$SRC.info" > "$DEST.info"
+ rm -f "$SRC.info"
+fi