Compare commits
10 commits
deff79c76c
...
ec1fc664c9
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ec1fc664c9 | ||
![]() |
1bcc87c3fe | ||
![]() |
de98f7004e | ||
![]() |
3ba0d67cb1 | ||
![]() |
08962d40c0 | ||
![]() |
d05f0047a0 | ||
![]() |
d48cc3bf5d | ||
![]() |
ad39cd7bd6 | ||
![]() |
f6b8ed22f4 | ||
![]() |
4795965caf |
33 changed files with 2111 additions and 519 deletions
56
ChangeLog
56
ChangeLog
|
@ -1,5 +1,61 @@
|
|||
VERSION DESCRIPTION
|
||||
-----------------------------------------------------------------------------
|
||||
2.9.8 - Changed behaviour with original=X,current=Y,new=Z scenario
|
||||
- keep old in place, install new as .pacnew
|
||||
- Search package provides when finding matching targets with -S
|
||||
- Frugalware: added -Qm option to find foreign packages
|
||||
- Frugalware: added DistCC support to makepkg
|
||||
- bugfix: before searching databases for a dependency, make sure
|
||||
one of the packages in the final list doesn't already provide
|
||||
that dependency
|
||||
- fix for segfaults that occurred when propagating requiredby
|
||||
fields to replaced packages where one package depended on
|
||||
another replaced package
|
||||
- a better fix for pacman-optimize integrity checks
|
||||
- fix for regex searches with -Ss (Miklos Vajna)
|
||||
- added a --noprogressbar for scripts to use
|
||||
2.9.7 - fixed the dupe listings of packages when dealing w/ groups
|
||||
- patches from Miklos Vajna:
|
||||
- add regexp search support for -Qs and -Ss
|
||||
- fixed md5sums on x86_64
|
||||
- add --sudosync to makepkg
|
||||
- show syntax help if an invalid option is used
|
||||
- added makepkg option to disable ccache support
|
||||
- changed license field to operate as an array, not a string
|
||||
- added more logic for file conflict checks - if one target
|
||||
is a file and the other is a directory, then it's a conflict
|
||||
- fixed the integrity check in pacman-optimize
|
||||
- reverted NoUpgrade to old behaviour and instead, added the
|
||||
NoExtract directive to pacman.conf, which prevents a file
|
||||
from ever being extracted on to the system
|
||||
eg, NoExtract = home/httpd/html/index.html
|
||||
2.9.6 - added a pacman-optimize script to try and defragment the DB
|
||||
- modified NoUpgrade behaviour to avoid extracting files
|
||||
that are missing from the filesystem -- this helps in
|
||||
situations where the admin does not want the file there, eg,
|
||||
remove index.html so index.php takes precedence
|
||||
- fixed a bug where files would sometimes go missing if they
|
||||
moved from one package to another
|
||||
- add db_remove() which is responsible for clearing out stale
|
||||
hash table entries when packages are removed
|
||||
- added ccache support to makepkg
|
||||
- patch from Aurelien Foret fixes a few memory leaks
|
||||
2.9.5 - bugfix: missing files after re-ordering packages wrt
|
||||
deps with --upgrade
|
||||
- added "Repository" line to -Si output
|
||||
- patch from Tommi Rantala to fix trim() behaviour with
|
||||
empty or whitespace-only strings
|
||||
- fixed removal order when using -Rc or -Rs
|
||||
2.9.4 - fixed a bug that was introduced from another bugfix :-/
|
||||
2.9.3 - fixed a couple manpage typos
|
||||
- added --ignore to -S operations, works just like IgnorePkg
|
||||
- respect IgnorePkg list when pulling in dependencies
|
||||
- numerous memleak fixes
|
||||
- some code changes to improve customizability/branding
|
||||
- Makefile fix for nonstandard lib search paths (Kevin Piche)
|
||||
- fixed the leftover directories in /tmp
|
||||
- speed improvement patches from Tommi Rantala
|
||||
2.9.2 - bugfix for 2.9.1
|
||||
2.9.1 - --refresh now only downloads fresh packages lists if they've
|
||||
been updated (currently only works with FTP)
|
||||
2.9 - Improved -Rs functionality -- pacman now tracks why a package
|
||||
|
|
|
@ -34,7 +34,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
|
|||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
|
||||
PACVER = 2.9.1
|
||||
PACVER = 2.9.8
|
||||
|
||||
TOPDIR = @srcdir@
|
||||
SRCDIR = $(TOPDIR)/src/
|
||||
|
@ -55,6 +55,7 @@ SRCS = $(SRCDIR)pacman.c \
|
|||
$(SRCDIR)pacsync.c \
|
||||
$(SRCDIR)md5.c \
|
||||
$(SRCDIR)md5driver.c \
|
||||
$(SRCDIR)strhash.c \
|
||||
$(SRCDIR)vercmp.c \
|
||||
$(SRCDIR)rpmvercmp.c
|
||||
|
||||
|
@ -66,6 +67,7 @@ OBJECTS = $(OBJDIR)pacman.o \
|
|||
$(OBJDIR)pacsync.o \
|
||||
$(OBJDIR)md5.o \
|
||||
$(OBJDIR)md5driver.o \
|
||||
$(OBJDIR)strhash.o \
|
||||
$(OBJDIR)rpmvercmp.o
|
||||
|
||||
all: libftp.a pacman vercmp convertdb man
|
||||
|
@ -78,7 +80,7 @@ vercmp: $(OBJDIR)vercmp.o $(OBJDIR)rpmvercmp.o
|
|||
$(CXX) $(OBJDIR)vercmp.o $(OBJDIR)rpmvercmp.o $(CXXFLAGS) -o $@
|
||||
|
||||
convertdb: $(OBJDIR)convertdb.o $(OBJDIR)list.o $(OBJDIR)util.o
|
||||
$(CXX) $(OBJDIR)convertdb.o $(OBJDIR)list.o $(OBJDIR)util.o $(CXXFLAGS) -lz -ltar -o $@
|
||||
$(CXX) $(OBJDIR)convertdb.o $(OBJDIR)list.o $(OBJDIR)util.o $(LDFLAGS) -o $@
|
||||
|
||||
.c.o: $(SRCS)
|
||||
$(CXX) $(CXXFLAGS) -o $@ -c $<
|
||||
|
@ -104,6 +106,7 @@ install: pacman vercmp convertdb man
|
|||
$(INSTALL) -D -m0755 $(SCRDIR)makeworld $(DESTDIR)$(BINDIR)/makeworld
|
||||
$(INSTALL) -D -m0755 $(SCRDIR)gensync $(DESTDIR)$(BINDIR)/gensync
|
||||
$(INSTALL) -D -m0755 $(SCRDIR)updatesync $(DESTDIR)$(BINDIR)/updatesync
|
||||
$(INSTALL) -D -m0755 $(SCRDIR)pacman-optimize $(DESTDIR)$(BINDIR)/pacman-optimize
|
||||
$(INSTALL) -D -m0644 $(MANSRC)pacman.8 $(DESTDIR)$(MANDIR)/man8/pacman.8
|
||||
$(INSTALL) -D -m0644 $(MANSRC)makepkg.8 $(DESTDIR)$(MANDIR)/man8/makepkg.8
|
||||
$(INSTALL) -D -m0644 etc/pacman.conf $(DESTDIR)/etc/pacman.conf
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.TH makepkg 8 "August 3, 2004" "makepkg #VERSION#" ""
|
||||
.TH makepkg 8 "January 30, 2006" "makepkg #VERSION#" ""
|
||||
.SH NAME
|
||||
makepkg \- package build utility
|
||||
.SH SYNOPSIS
|
||||
|
@ -236,9 +236,26 @@ This is the release number specific to Arch Linux packages.
|
|||
This should be a brief description of the package and its functionality.
|
||||
|
||||
.TP
|
||||
.B force
|
||||
This is used to force the package to be upgraded by \fB--sysupgrade\fP, even
|
||||
.B options
|
||||
This array allows you to override some of makepkg's default behaviour
|
||||
when building packages. To set an option, just include the option name
|
||||
in the \fBoptions\fP array.
|
||||
.TP
|
||||
.RS
|
||||
\fIAvailable Options:\fP
|
||||
.RS
|
||||
.TP
|
||||
.B FORCE
|
||||
force the package to be upgraded by \fB--sysupgrade\fP, even
|
||||
if its an older version.
|
||||
.TP
|
||||
.B KEEPDOCS
|
||||
do not remove /usr/share/doc and /usr/share/info directories.
|
||||
.TP
|
||||
.B NOSTRIP
|
||||
do not strip debugging symbols from binaries and libraries.
|
||||
.RE
|
||||
.RE
|
||||
|
||||
.TP
|
||||
.B url
|
||||
|
@ -247,8 +264,17 @@ being packaged. This is typically the project's website.
|
|||
|
||||
.TP
|
||||
.B license
|
||||
Sets the license type (eg, "GPL", "BSD", "NON-FREE"). (\fBNote\fP: This
|
||||
option is still in development and may change in the future)
|
||||
This field specifies the license(s) that apply to the package. Commonly-used
|
||||
licenses are typically found in \fI/usr/share/licenses/common\fP. If you
|
||||
see the package's license there, simply reference it in the license field
|
||||
(eg, \fBlicense="GPL"\fP). If the package provides a license not found in
|
||||
\fI/usr/share/licenses/common\fP, then you should include the license in
|
||||
the package itself and set \fBlicense="custom"\fP or \fBlicense="custom:LicenseName"\fP.
|
||||
The license itself should be placed in a directory called
|
||||
\fI$startdir/pkg/usr/share/licenses/$pkgname\fP.
|
||||
.TP
|
||||
.RE
|
||||
If multiple licenses are applied, use the array form: \fBlicenses=('GPL' 'FDL')\fP
|
||||
|
||||
.TP
|
||||
.B install
|
||||
|
@ -271,7 +297,7 @@ If this field is present, it should contain an MD5 hash for every source file
|
|||
specified in the \fIsource\fP array (in the same order). makepkg will use
|
||||
this to verify source file integrity during subsequent builds. To easily
|
||||
generate md5sums, first build using the PKGBUILD then run
|
||||
\fBmakepkg -g >>PKGBILD\fP. Then you can edit the PKGBUILD and move the
|
||||
\fBmakepkg -g >>PKGBUILD\fP. Then you can edit the PKGBUILD and move the
|
||||
\fImd5sums\fP line from the bottom to an appropriate location.
|
||||
|
||||
.TP
|
||||
|
@ -331,6 +357,9 @@ $ABSROOT (set in your /etc/makepkg.conf). If it finds them it will
|
|||
run another copy of makepkg to build and install the missing dependencies.
|
||||
The child makepkg calls will be made with the \fB-b\fP and \fB-i\fP options.
|
||||
.TP
|
||||
.B "\-B, \-\-noccache"
|
||||
Do not use ccache during build.
|
||||
.TP
|
||||
.B "\-c, \-\-clean"
|
||||
Clean up leftover work files/directories after a successful build.
|
||||
.TP
|
||||
|
@ -342,6 +371,11 @@ Do not perform any dependency checks. This will let you override/ignore any
|
|||
dependencies required. There's a good chance this option will break the build
|
||||
process if all of the dependencies aren't installed.
|
||||
.TP
|
||||
.B "\-e, \-\-noextract"
|
||||
Do not extract source files. Instead, use whatever already exists in the
|
||||
src/ directory. This is handy if you want to go into src and manually
|
||||
patch/tweak code, then make a package out of the result.
|
||||
.TP
|
||||
.B "\-f, \-\-force"
|
||||
\fBmakepkg\fP will not build a package if a \fIpkgname-pkgver-pkgrel.pkg.tar.gz\fP
|
||||
file already exists in the build directory. You can override this behaviour with
|
||||
|
@ -384,9 +418,23 @@ or run-time dependencies, it will run pacman to try and resolve them. If succes
|
|||
pacman will download the missing packages from a package repository and
|
||||
install them for you.
|
||||
.TP
|
||||
.B "\-S, \-\-sudosync"
|
||||
Install missing dependencies using pacman and sudo. This is the same as \fB-s\fP
|
||||
except that makepkg will call pacman with sudo. This means you don't have to
|
||||
build as root to use dependency auto-resolution.
|
||||
.TP
|
||||
.B "\-w <destdir>"
|
||||
Write the resulting package file to the directory \fI<destdir>\fP instead of the
|
||||
current working directory.
|
||||
.TP
|
||||
.B "\-\-noconfirm"
|
||||
When calling pacman to resolve dependencies or conflicts, makepkg can pass
|
||||
the \fI--noconfirm\fP option to it so it does not wait for any user
|
||||
input before proceeding with operations.
|
||||
.TP
|
||||
.B "\-\-noprogressbar"
|
||||
When calling pacman, makepkg can pass the \fI--noprogressbar\fP option to it.
|
||||
This is useful if one is directing makepkg's output to a non-terminal (ie, a file).
|
||||
|
||||
.SH CONFIGURATION
|
||||
Configuration options are stored in \fI/etc/makepkg.conf\fP. This file is parsed
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.TH pacman 8 "September 17, 2004" "pacman #VERSION#" ""
|
||||
.TH pacman 8 "January 21, 2006" "pacman #VERSION#" ""
|
||||
.SH NAME
|
||||
pacman \- package manager utility
|
||||
.SH SYNOPSIS
|
||||
|
@ -60,7 +60,7 @@ installed and there are no package conflicts in the system. This
|
|||
switch disables these checks.
|
||||
.TP
|
||||
.B "\-f, \-\-force"
|
||||
Bypass file conflict checks,, overwriting conflicting files. If the
|
||||
Bypass file conflict checks, overwriting conflicting files. If the
|
||||
package that is about to be installed contains files that are already
|
||||
installed, this option will cause all those files to be overwritten.
|
||||
This option should be used with care, ideally not at all.
|
||||
|
@ -81,8 +81,12 @@ Output more status and error messages.
|
|||
Specify an alternate configuration file.
|
||||
.TP
|
||||
.B "\-\-noconfirm"
|
||||
Bypass any and all "Are you sure?" messages. It's not a good to do this
|
||||
Bypass any and all "Are you sure?" messages. It's not a good idea to do this
|
||||
unless you want to run pacman from a script.
|
||||
.TP
|
||||
.B "\-\-noprogressbar"
|
||||
Do not show a progress bar when downloading files. This can be useful for
|
||||
scripts that call pacman and capture the output.
|
||||
.SH SYNC OPTIONS
|
||||
.TP
|
||||
.B "\-c, \-\-clean"
|
||||
|
@ -106,13 +110,13 @@ List all files in the specified repositories. Multiple repositories can
|
|||
be specified on the command line.
|
||||
.TP
|
||||
.B "\-p, \-\-print-uris"
|
||||
Print out URIs for each specified package and its dependencies. These
|
||||
can be piped to a file and downloaded at a later time, using a program
|
||||
like wget.
|
||||
Print out URIs for each package that will be installed, including any
|
||||
dependencies that have yet to be installed. These can be piped to a
|
||||
file and downloaded at a later time, using a program like wget.
|
||||
.TP
|
||||
.B "\-s, \-\-search <string>"
|
||||
.B "\-s, \-\-search <regexp>"
|
||||
This will search each package in the package list for names or descriptions
|
||||
that contains <string>.
|
||||
that matches <regexp>.
|
||||
.TP
|
||||
.B "\-u, \-\-sysupgrade"
|
||||
Upgrades all packages that are out of date. pacman will examine every
|
||||
|
@ -129,6 +133,11 @@ Retrieve all packages from the server, but do not install/upgrade anything.
|
|||
Download a fresh copy of the master package list from the ftp server
|
||||
defined in \fI/etc/pacman.conf\fP. This should typically be used each
|
||||
time you use \fB--sysupgrade\fP.
|
||||
.TP
|
||||
.B "\-\-ignore <pkg>"
|
||||
This option functions exactly the same as the \fBIgnorePkg\fP configuration
|
||||
directive. Sometimes it can be handy to skip some package updates without
|
||||
having to edit \fIpacman.conf\fP each time.
|
||||
.SH REMOVE OPTIONS
|
||||
.TP
|
||||
.B "\-c, \-\-cascade"
|
||||
|
@ -147,9 +156,9 @@ removed.
|
|||
.TP
|
||||
.B "\-s, \-\-recursive"
|
||||
For each target specified, remove it and all its dependencies, provided
|
||||
that (A) they are not required by other packages; and (B) they were
|
||||
explicitly installed by the user and not pulled in as a dependency for
|
||||
other packages. This option is analagous to a backwards --sync operation.
|
||||
that (A) they are not required by other packages; and (B) they were not
|
||||
explicitly installed by the user.
|
||||
This option is analagous to a backwards --sync operation.
|
||||
.SH QUERY OPTIONS
|
||||
.TP
|
||||
.B "\-e, \-\-orphans"
|
||||
|
@ -169,6 +178,10 @@ option then the .PKGINFO file will be printed.
|
|||
List all files owned by <package>. Multiple packages can be specified on
|
||||
the command line.
|
||||
.TP
|
||||
.B "\-m, \-\-foreign"
|
||||
List all packages that were not found in the sync database(s). Typically these
|
||||
are packages that were downloaded manually and installed with --add.
|
||||
.TP
|
||||
.B "\-o, \-\-owns <file>"
|
||||
Search for the package that owns <file>.
|
||||
.TP
|
||||
|
@ -177,9 +190,9 @@ Tells pacman that the package supplied on the command line is a
|
|||
file, not an entry in the database. Pacman will decompress the
|
||||
file and query it. This is useful with \fB--info\fP and \fB--list\fP.
|
||||
.TP
|
||||
.B "\-s, \-\-search <string>"
|
||||
.B "\-s, \-\-search <regexp>"
|
||||
This will search each locally-installed package for names or descriptions
|
||||
that contains <string>.
|
||||
that matches <regexp>.
|
||||
.SH HANDLING CONFIG FILES
|
||||
pacman uses the same logic as rpm to determine action against files
|
||||
that are designated to be backed up. During an upgrade, it uses 3
|
||||
|
@ -205,9 +218,9 @@ original=\fBX\fP, current=\fBY\fP, new=\fBY\fP
|
|||
The new one is identical to the current one. Win win. Install the new file.
|
||||
.TP
|
||||
original=\fBX\fP, current=\fBY\fP, new=\fBZ\fP
|
||||
All three files are different. So we install the new file, but back up the
|
||||
old one to a .pacsave extension. This way the user can move the old configuration
|
||||
file back into place if he wishes.
|
||||
All three files are different, so we install the new file with a .pacnew
|
||||
extension and warn the user, so she can manually move the file into place
|
||||
after making any necessary customizations.
|
||||
.SH CONFIGURATION
|
||||
pacman will attempt to read \fI/etc/pacman.conf\fP each time it is invoked. This
|
||||
configuration file is divided into sections or \fIrepositories\fP. Each section
|
||||
|
@ -267,6 +280,13 @@ Disables passive ftp connections when downloading packages. (aka Active Mode)
|
|||
All files listed with a \fBNoUpgrade\fP directive will never be touched during a package
|
||||
install/upgrade. \fINote:\fP do not include the leading slash when specifying files.
|
||||
.TP
|
||||
.B "NoExtract = <file> [file] ..."
|
||||
All files listed with a \fBNoExtract\fP directive will never be extracted from
|
||||
a package into the filesystem. This can be useful when you don't want part of
|
||||
a package to be installed. For example, if your httpd root uses an index.php,
|
||||
then you would not want the index.html file to be extracted from the apache
|
||||
package.
|
||||
.TP
|
||||
.B "UseSyslog"
|
||||
Log action messages through syslog(). This will insert pacman log entries into your
|
||||
/var/log/messages or equivalent.
|
||||
|
|
|
@ -2,35 +2,58 @@
|
|||
# /etc/makepkg.conf
|
||||
#
|
||||
|
||||
# The FTP/HTTP download utility that makepkg should use to acquire sources
|
||||
export FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3"
|
||||
#########################################################################
|
||||
# SOURCE ACQUISITION
|
||||
#########################################################################
|
||||
#
|
||||
#-- The FTP/HTTP download utility that makepkg should use to acquire sources
|
||||
export FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3 --no-check-certificate"
|
||||
#export FTPAGENT="/usr/bin/snarf"
|
||||
#export FTPAGENT="/usr/bin/lftpget -c"
|
||||
|
||||
#########################################################################
|
||||
# ARCHITECTURE, COMPILE FLAGS
|
||||
#########################################################################
|
||||
#
|
||||
export CARCH="i686"
|
||||
export CHOST="i686-pc-linux-gnu"
|
||||
|
||||
# Pentium Pro/Pentium II/Pentium III+/Pentium 4/Athlon exclusive (binaries
|
||||
# will use the P6 instruction set and only run on P6+ systems)
|
||||
#-- Exclusive: will only run on i686 or higher (P6, Athlon)
|
||||
export CFLAGS="-march=i686 -O2 -pipe"
|
||||
export CXXFLAGS="-march=i686 -O2 -pipe"
|
||||
# Pentium Pro/Pentium II/Pentium III+/Pentium 4/Athlon optimized (but binaries
|
||||
# will run on any x86 system)
|
||||
#-- Optimized: will run on any x86, but optimized for i686
|
||||
#export CFLAGS="-mcpu=i686 -O2 -pipe"
|
||||
#export CXXFLAGS="-mcpu=i686 -O2 -pipe"
|
||||
|
||||
# SMP Systems
|
||||
#-- Make Flags: change this for DistCC/SMP systems
|
||||
#export MAKEFLAGS="-j2"
|
||||
|
||||
# Enable fakeroot for building packages as a non-root user
|
||||
#########################################################################
|
||||
# BUILD ENVIRONMENT
|
||||
#########################################################################
|
||||
#
|
||||
#-- Fakeroot: for building packages as a non-root user
|
||||
export USE_FAKEROOT="y"
|
||||
#-- DistCC: a distributed C/C++/ObjC compiler (modify MAKEFLAGS too)
|
||||
export DISTCC="n"
|
||||
#-- A space-delimited list of hosts running in the DistCC cluster
|
||||
export DISTCC_HOSTS=""
|
||||
#-- Colorized output messages
|
||||
export USE_COLOR="y"
|
||||
|
||||
# Enable colorized output messages
|
||||
export USE_COLOR="n"
|
||||
#########################################################################
|
||||
# GLOBAL PACKAGE OPTIONS
|
||||
#########################################################################
|
||||
#
|
||||
#-- Don't strip symbols from binaries/libraries
|
||||
#export NOSTRIP="1"
|
||||
#-- Keep doc and info directories
|
||||
#export KEEPDOCS="1"
|
||||
|
||||
# Specify a fixed directory where all packages will be placed
|
||||
#########################################################################
|
||||
# PACKAGE OUTPUT
|
||||
#########################################################################
|
||||
#
|
||||
#-- Destination: specify a fixed directory where all packages will be placed
|
||||
#export PKGDEST=/home/packages
|
||||
|
||||
# If you want your name to show up in the packages you build, set this.
|
||||
#-- Packager: name/email of the person or organization building packages
|
||||
#export PACKAGER="John Doe <john@doe.com>"
|
||||
|
||||
|
|
|
@ -19,10 +19,10 @@
|
|||
[options]
|
||||
LogFile = /var/log/pacman.log
|
||||
NoUpgrade = etc/passwd etc/group etc/shadow etc/sudoers
|
||||
NoUpgrade = etc/fstab etc/raidtab etc/ld.so.conf
|
||||
NoUpgrade = etc/rc.conf etc/rc.local
|
||||
NoUpgrade = etc/fstab etc/raidtab etc/mdadm.conf etc/ld.so.conf
|
||||
NoUpgrade = etc/inittab etc/rc.conf etc/rc.local
|
||||
NoUpgrade = etc/modprobe.conf etc/modules.conf
|
||||
NoUpgrade = etc/lilo.conf boot/grub/menu.lst
|
||||
NoUpgrade = etc/lilo.conf boot/grub/menu.lst etc/mkinitrd.conf
|
||||
HoldPkg = pacman glibc
|
||||
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
|
||||
|
||||
|
|
24
scripts/aurbuild
Executable file
24
scripts/aurbuild
Executable file
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash
|
||||
|
||||
die() {
|
||||
echo $*
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ "$1" == "" ]; then
|
||||
echo "usage: aurbuild <package_name>"
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
pkgname=$1
|
||||
[ -d $pkgname ] && die "Directory '$pkgname' already exists"
|
||||
[ -f $pkgname ] && die "File '$pkgname' already exists"
|
||||
|
||||
echo "Downloading $pkgname.tar.gz"
|
||||
wget -q http://aur.archlinux.org/packages/$pkgname/$pkgname.tar.gz || die "Failed to fetch $1.pkg.tar.gz"
|
||||
|
||||
tar zxf $pkgname.tar.gz || die "Extraction failed"
|
||||
rm -f $pkgname.tar.gz
|
||||
cd $pkgname || die "Failed to cwd"
|
||||
makepkg
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# gensync
|
||||
#
|
||||
# Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
#
|
||||
# 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
|
||||
|
@ -20,7 +20,7 @@
|
|||
# USA.
|
||||
#
|
||||
|
||||
myver='2.9.1'
|
||||
myver='2.9.8'
|
||||
|
||||
usage() {
|
||||
echo "gensync $myver"
|
||||
|
@ -51,6 +51,18 @@ die() {
|
|||
exit 1
|
||||
}
|
||||
|
||||
check_option() {
|
||||
local i
|
||||
for i in ${options[@]}; do
|
||||
local uc=`echo $i | tr [:lower:] [:upper:]`
|
||||
local lc=`echo $i | tr [:upper:] [:lower:]`
|
||||
if [ "$uc" = "$1" -o "$lc" = "$1" ]; then
|
||||
echo $1
|
||||
return
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
get_md5checksum()
|
||||
{
|
||||
if [ "$pkgdir" != "" ]; then
|
||||
|
@ -69,7 +81,7 @@ get_md5checksum()
|
|||
db_write_entry()
|
||||
{
|
||||
unset pkgname pkgver pkgrel pkgdesc force
|
||||
unset groups replaces provides depends conflicts
|
||||
unset groups replaces provides depends conflicts options
|
||||
source $1 || return 1
|
||||
cd $gstmpdir
|
||||
mkdir $pkgname-$pkgver-$pkgrel || return 1
|
||||
|
@ -107,7 +119,7 @@ db_write_entry()
|
|||
done
|
||||
echo "" >>desc
|
||||
fi
|
||||
if [ "$force" = "y" -o "$force" = "Y" ]; then
|
||||
if [ "$force" = "y" -o "$force" = "Y" -o "`check_option FORCE`" ]; then
|
||||
echo "%FORCE%" >>desc
|
||||
echo "" >>desc
|
||||
fi
|
||||
|
@ -134,11 +146,13 @@ db_write_entry()
|
|||
done
|
||||
echo "" >>depends
|
||||
fi
|
||||
# preserve the modification time
|
||||
touch -r $1 desc depends
|
||||
}
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
usage
|
||||
exit 0
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$1" = "-h" -o "$1" = "--help" ]; then
|
||||
|
@ -167,12 +181,14 @@ for file in `find $rootdir/* -name PKGBUILD`; do
|
|||
else
|
||||
pkgfile="$destdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz"
|
||||
fi
|
||||
[ -f $pkgfile ] || die "missing package file: $pkgfile"
|
||||
if [ -f $pkgfile ]; then
|
||||
csize=`du -b $pkgfile | cut -f1`
|
||||
pkgmd5sum=`get_md5checksum $pkgfile`
|
||||
[ -z $pkgmd5sum ] && die "error generating checksum for $pkgfile"
|
||||
db_write_entry $file
|
||||
[ $? -gt 0 ] && die "error writing entry for $file"
|
||||
db_write_entry $file || die "error writing entry for $file"
|
||||
else
|
||||
echo "gensync: missing package: $pkgfile" >&2
|
||||
fi
|
||||
done
|
||||
|
||||
echo "gensync: compressing to $destfile..." >&2
|
||||
|
|
192
scripts/makepkg
192
scripts/makepkg
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# makepkg
|
||||
#
|
||||
# Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
#
|
||||
# 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
|
||||
|
@ -20,11 +20,31 @@
|
|||
# USA.
|
||||
#
|
||||
|
||||
myver='2.9.1'
|
||||
myver='2.9.8'
|
||||
startdir=`pwd`
|
||||
PKGDEST=$startdir
|
||||
USE_COLOR="n"
|
||||
|
||||
# Options
|
||||
BUILDSCRIPT="./PKGBUILD"
|
||||
CLEANUP=0
|
||||
CLEANCACHE=0
|
||||
DEP_BIN=0
|
||||
DEP_SRC=0
|
||||
DEP_SUDO=0
|
||||
FORCE=0
|
||||
GENMD5=0
|
||||
INSTALL=0
|
||||
KEEPDOCS=0
|
||||
NOBUILD=0
|
||||
NOCCACHE=0
|
||||
NODEPS=0
|
||||
NOEXTRACT=0
|
||||
NOSTRIP=0
|
||||
RMDEPS=0
|
||||
|
||||
PACMAN_OPTS=
|
||||
|
||||
# source Arch's abs.conf if it's present
|
||||
[ -f /etc/abs/abs.conf ] && source /etc/abs/abs.conf
|
||||
|
||||
|
@ -72,11 +92,25 @@ strip_url() {
|
|||
echo $1 | sed 's|^.*://.*/||g'
|
||||
}
|
||||
|
||||
check_option() {
|
||||
local i
|
||||
for i in ${options[@]}; do
|
||||
local uc=`echo $i | tr [:lower:] [:upper:]`
|
||||
local lc=`echo $i | tr [:upper:] [:lower:]`
|
||||
if [ "$uc" = "$1" -o "$lc" = "$1" ]; then
|
||||
echo $1
|
||||
return
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
checkdeps() {
|
||||
local missdep=""
|
||||
local deplist=""
|
||||
|
||||
missdep=`pacman -T $*`
|
||||
[ $# -gt 0 ] || return
|
||||
|
||||
missdep=`pacman $PACMAN_OPTS -T $*`
|
||||
ret=$?
|
||||
if [ "$ret" != "0" ]; then
|
||||
if [ "$ret" = "127" ]; then
|
||||
|
@ -108,7 +142,7 @@ handledeps() {
|
|||
local missingdeps=0
|
||||
local deplist="$*"
|
||||
local haveperm=0
|
||||
if [ "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then
|
||||
if [ \( "`id -u`" = "0" -a "$INFAKEROOT" != "1" \) -o "$DEP_SUDO" = 1 ]; then
|
||||
haveperm=1
|
||||
fi
|
||||
|
||||
|
@ -116,7 +150,26 @@ handledeps() {
|
|||
if [ "$DEP_BIN" = "1" ]; then
|
||||
# install missing deps from binary packages (using pacman -S)
|
||||
msg "Installing missing dependencies..."
|
||||
pacman -D $deplist
|
||||
pacman $PACMAN_OPTS -D $deplist
|
||||
if [ "$?" = "127" ]; then
|
||||
error "Failed to install missing dependencies."
|
||||
exit 1
|
||||
fi
|
||||
# TODO: check deps again to make sure they were resolved
|
||||
elif [ "$DEP_SUDO" = "1" ]; then
|
||||
# install missing deps from binary packages (using pacman -S and sudo)
|
||||
msg "Installing missing dependencies..."
|
||||
if [ "$INFAKEROOT" = "1" ]; then
|
||||
# kinda hacky, but we need to make pacman think that we're NOT
|
||||
# in fakeroot so it will go ahead and install the dependencies.
|
||||
FAKEROOTKEY2=$FAKEROOTKEY
|
||||
unset FAKEROOTKEY
|
||||
fi
|
||||
sudo pacman $PACMAN_OPTS -D $deplist
|
||||
if [ "$INFAKEROOT" = "1" ]; then
|
||||
export FAKEROOTKEY=$FAKEROOTKEY2
|
||||
unset FAKEROOTKEY2
|
||||
fi
|
||||
if [ "$?" = "127" ]; then
|
||||
error "Failed to install missing dependencies."
|
||||
exit 1
|
||||
|
@ -163,8 +216,8 @@ handledeps() {
|
|||
fi
|
||||
elif [ "$deplist" != "" -a $haveperm -eq 0 ]; then
|
||||
if [ "$DEP_SRC" = "1" -o "$DEP_BIN" = "1" ]; then
|
||||
warning "Cannot auto-install missing dependencies as a normal user!"
|
||||
plain "Run makepkg as root to resolve dependencies automatically."
|
||||
warning "Cannot auto-install missing dependencies as a normal user without sudo!"
|
||||
plain "Run makepkg as root or with -S to resolve dependencies automatically."
|
||||
fi
|
||||
missingdeps=1
|
||||
fi
|
||||
|
@ -173,9 +226,12 @@ handledeps() {
|
|||
|
||||
usage() {
|
||||
echo "makepkg version $myver"
|
||||
echo "usage: $0 [options]"
|
||||
echo "options:"
|
||||
echo
|
||||
echo "Usage: $0 [options]"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " -b, --builddeps Build missing dependencies from source"
|
||||
echo " -B, --noccache Do not use ccache during build"
|
||||
echo " -c, --clean Clean up work files after build"
|
||||
echo " -C, --cleancache Clean up source files from the cache"
|
||||
echo " -d, --nodeps Skip all dependency checks"
|
||||
|
@ -191,37 +247,32 @@ usage() {
|
|||
echo " -p <buildscript> Use an alternate build script (instead of PKGBUILD)"
|
||||
echo " -r, --rmdeps Remove installed dependencies after a successful build"
|
||||
echo " -s, --syncdeps Install missing dependencies with pacman"
|
||||
echo " -S, --sudosync Install missing dependencies with pacman and sudo"
|
||||
echo " -w <destdir> Write package to <destdir> instead of the working dir"
|
||||
echo
|
||||
echo " if -p is not specified, makepkg will look for a PKGBUILD"
|
||||
echo " file in the current directory."
|
||||
echo "These options can be passed to pacman:"
|
||||
echo
|
||||
echo " --noconfirm Do not ask for confirmation when resolving dependencies"
|
||||
echo " --noprogressbar Do not show a progress bar when downloading files"
|
||||
echo
|
||||
echo "If -p is not specified, makepkg will look for ./PKGBUILD"
|
||||
echo
|
||||
}
|
||||
|
||||
|
||||
# Options
|
||||
CLEANUP=0
|
||||
CLEANCACHE=0
|
||||
INSTALL=0
|
||||
GENMD5=0
|
||||
DEP_BIN=0
|
||||
DEP_SRC=0
|
||||
NODEPS=0
|
||||
FORCE=0
|
||||
NOEXTRACT=0
|
||||
NOSTRIP=0
|
||||
NOBUILD=0
|
||||
RMDEPS=0
|
||||
BUILDSCRIPT="./PKGBUILD"
|
||||
|
||||
ARGLIST=$@
|
||||
|
||||
while [ "$#" -ne "0" ]; do
|
||||
case $1 in
|
||||
# pacman
|
||||
--noconfirm) PACMAN_OPTS="$PACMAN_OPTS --noconfirm" ;;
|
||||
--noprogressbar) PACMAN_OPTS="$PACMAN_OPTS --noprogressbar" ;;
|
||||
# makepkg
|
||||
--clean) CLEANUP=1 ;;
|
||||
--cleancache) CLEANCACHE=1 ;;
|
||||
--syncdeps) DEP_BIN=1 ;;
|
||||
--sudosync) DEP_SUDO=1 ;;
|
||||
--builddeps) DEP_SRC=1 ;;
|
||||
--noccache) NOCCACHE=1 ;;
|
||||
--nodeps) NODEPS=1 ;;
|
||||
--noextract) NOEXTRACT=1 ;;
|
||||
--install) INSTALL=1 ;;
|
||||
|
@ -240,11 +291,12 @@ while [ "$#" -ne "0" ]; do
|
|||
exit 1
|
||||
;;
|
||||
-*)
|
||||
while getopts "cCsbdehifgj:mnorp:w:-" opt; do
|
||||
while getopts "bBcCdefghij:mnop:rsSw:-" opt; do
|
||||
case $opt in
|
||||
b) DEP_SRC=1 ;;
|
||||
B) NOCCACHE=1 ;;
|
||||
c) CLEANUP=1 ;;
|
||||
C) CLEANCACHE=1 ;;
|
||||
b) DEP_SRC=1 ;;
|
||||
d) NODEPS=1 ;;
|
||||
e) NOEXTRACT=1 ;;
|
||||
f) FORCE=1 ;;
|
||||
|
@ -261,6 +313,7 @@ while [ "$#" -ne "0" ]; do
|
|||
p) BUILDSCRIPT=$OPTARG ;;
|
||||
r) RMDEPS=1 ;;
|
||||
s) DEP_BIN=1 ;;
|
||||
S) DEP_SUDO=1 ;;
|
||||
w) PKGDEST=$OPTARG ;;
|
||||
-)
|
||||
OPTIND=0
|
||||
|
@ -280,6 +333,12 @@ while [ "$#" -ne "0" ]; do
|
|||
shift
|
||||
done
|
||||
|
||||
# check for sudo
|
||||
if [ "$DEP_SUDO" = "1" -a ! "`type -p sudo`" ]; then
|
||||
error "Cannot find the sudo binary! Is sudo installed?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# convert a (possibly) relative path to absolute
|
||||
cd $PKGDEST 2>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
|
@ -302,6 +361,9 @@ fi
|
|||
|
||||
unset pkgname pkgver pkgrel pkgdesc url license groups provides md5sums force
|
||||
unset replaces depends conflicts backup source install build makedepends
|
||||
unset options
|
||||
# some applications (eg, blackbox) will not build with some languages
|
||||
unset LC_ALL LANG
|
||||
umask 0022
|
||||
|
||||
if [ ! -f $BUILDSCRIPT ]; then
|
||||
|
@ -320,11 +382,16 @@ if [ `echo $pkgrel | grep '-'` ]; then
|
|||
error "pkgrel is not allowed to contain hyphens."
|
||||
exit 1
|
||||
fi
|
||||
if [ "$install" -a ! -f "$install" ]; then
|
||||
error "install scriptlet ($install) does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz -a "$FORCE" = "0" -a "$GENMD5" = "0" ]; then
|
||||
if [ "$INSTALL" = "1" ]; then
|
||||
warning "a package has already been built, installing existing package."
|
||||
pacman --upgrade $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz
|
||||
echo pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz
|
||||
pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz
|
||||
exit $?
|
||||
else
|
||||
error "a package has already been built. (use -f to overwrite)"
|
||||
|
@ -357,7 +424,7 @@ if [ "`id -u`" != "0" ]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
msg "Making package: $pkgname (`date`)"
|
||||
msg "Making package: $pkgname $pkgver-$pkgrel (`date`)"
|
||||
|
||||
unset deplist makedeplist
|
||||
if [ `type -p pacman` -a "$NODEPS" = "0" ]; then
|
||||
|
@ -463,16 +530,18 @@ if [ "$GENMD5" = "0" ]; then
|
|||
# extract sources
|
||||
msg "Extracting Sources..."
|
||||
for netfile in ${source[@]}; do
|
||||
unziphack=0
|
||||
file=`strip_url $netfile`
|
||||
unset cmd
|
||||
case $file in
|
||||
*.tar.gz|*.tar.Z|*.tgz)
|
||||
cmd="tar --use-compress-program=gzip -xf $file" ;;
|
||||
*.tar.bz2)
|
||||
*.tar.bz2|*.tbz2)
|
||||
cmd="tar --use-compress-program=bzip2 -xf $file" ;;
|
||||
*.tar)
|
||||
cmd="tar -xf $file" ;;
|
||||
*.zip)
|
||||
unziphack=1
|
||||
cmd="unzip -qqo $file" ;;
|
||||
*.gz)
|
||||
cmd="gunzip $file" ;;
|
||||
|
@ -483,11 +552,14 @@ if [ "$GENMD5" = "0" ]; then
|
|||
msg " $cmd"
|
||||
$cmd
|
||||
if [ $? -ne 0 ]; then
|
||||
# unzip will return a 1 as a warning, it is not an error
|
||||
if [ "$unziphack" != "1" -o $? -ne 1 ]; then
|
||||
error "Failed to extract $file"
|
||||
msg "Aborting..."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
|
@ -529,7 +601,6 @@ else
|
|||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
if [ "`id -u`" = "0" ]; then
|
||||
# chown all source files to root.root
|
||||
chown -R root.root $startdir/src
|
||||
|
@ -547,6 +618,20 @@ if [ "$NOBUILD" = "1" ]; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
# use distcc if requested
|
||||
if [ "$DISTCC" = "y" ]; then
|
||||
[ -d /usr/lib/distcc/bin ] && export PATH=/usr/lib/distcc/bin:$PATH
|
||||
if [ "$INCHROOT" = "1" ]; then
|
||||
[ -d /var/tmp/fst/.distcc ] || mkdir /var/tmp/fst/.distcc
|
||||
export DISTCC_DIR=/var/tmp/fst/.distcc
|
||||
fi
|
||||
fi
|
||||
|
||||
# use ccache if it's available
|
||||
if [ "$NOCCACHE" = "0" ]; then
|
||||
[ -d /usr/lib/ccache/bin ] && export PATH=/usr/lib/ccache/bin:$PATH
|
||||
fi
|
||||
|
||||
# build
|
||||
msg "Starting build()..."
|
||||
build 2>&1
|
||||
|
@ -555,10 +640,14 @@ if [ $? -gt 0 ]; then
|
|||
exit 2
|
||||
fi
|
||||
|
||||
if [ ! "`check_option KEEPDOCS`" -a "$KEEPDOCS" = "0" ]; then
|
||||
# remove info/doc files
|
||||
msg "Removing info/doc files..."
|
||||
cd $startdir
|
||||
rm -rf pkg/usr/info pkg/usr/share/info
|
||||
rm -rf pkg/usr/doc pkg/usr/share/doc
|
||||
rm -rf pkg/{usr,opt/gnome}/share/gtk-doc
|
||||
fi
|
||||
|
||||
# move /usr/share/man files to /usr/man
|
||||
if [ -d pkg/usr/share/man ]; then
|
||||
|
@ -593,7 +682,7 @@ done
|
|||
cd $startdir
|
||||
|
||||
# strip binaries
|
||||
if [ "$NOSTRIP" = "0" ]; then
|
||||
if [ ! "`check_option NOSTRIP`" -a "$NOSTRIP" = "0" ]; then
|
||||
msg "Stripping debugging symbols from libraries..."
|
||||
find pkg/{,usr,usr/local,opt/*}/lib -type f -not -name "*.dll" -not -name "*.exe" \
|
||||
-exec /usr/bin/strip --strip-debug '{}' \; 2>&1 \
|
||||
|
@ -604,6 +693,18 @@ if [ "$NOSTRIP" = "0" ]; then
|
|||
| grep -v "No such file" | grep -v "format not recognized"
|
||||
fi
|
||||
|
||||
# remove libtool (.la) files
|
||||
if [ "`check_option NOLIBTOOL`" ]; then
|
||||
msg "Removing libtool .la files..."
|
||||
find pkg -type f -name "*.la" -exec rm -f -- '{}' \;
|
||||
fi
|
||||
|
||||
# remove empty directories
|
||||
if [ "`check_option NOEMPTYDIRS`" ]; then
|
||||
msg "Removing empty directories..."
|
||||
find pkg -mindepth 1 -type d -empty -exec rmdir {} \;
|
||||
fi
|
||||
|
||||
# get some package meta info
|
||||
builddate=`LC_ALL= ; LANG= ; date -u "+%a %b %e %H:%M:%S %Y"`
|
||||
if [ "$PACKAGER" != "" ]; then
|
||||
|
@ -623,7 +724,6 @@ echo "pkgname = $pkgname" >>.PKGINFO
|
|||
echo "pkgver = $pkgver-$pkgrel" >>.PKGINFO
|
||||
echo "pkgdesc = $pkgdesc" >>.PKGINFO
|
||||
echo "url = $url" >>.PKGINFO
|
||||
echo "license = $license" >>.PKGINFO
|
||||
echo "builddate = $builddate" >>.PKGINFO
|
||||
echo "packager = $packager" >>.PKGINFO
|
||||
echo "size = $size" >>.PKGINFO
|
||||
|
@ -631,6 +731,9 @@ if [ "$CARCH" != "" ]; then
|
|||
echo "arch = $CARCH" >>.PKGINFO
|
||||
fi
|
||||
|
||||
for it in "${license[@]}"; do
|
||||
echo "license = $it" >>.PKGINFO
|
||||
done
|
||||
for it in "${replaces[@]}"; do
|
||||
echo "replaces = $it" >>.PKGINFO
|
||||
done
|
||||
|
@ -677,16 +780,27 @@ if [ "$CLEANUP" = "1" ]; then
|
|||
rm -rf src pkg filelist
|
||||
fi
|
||||
|
||||
if [ "$RMDEPS" = "1" -a "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then
|
||||
if [ "$RMDEPS" = "1" -a "`id -u`" = "0" -a "$INFAKEROOT" != "1" -a \( ! -z "$deplist" -o ! -z "$makedeplist" \) ]; then
|
||||
msg "Removing installed dependencies..."
|
||||
pacman -R $makedeplist $deplist
|
||||
pacman $PACMAN_OPTS -R $makedeplist $deplist
|
||||
elif [ "$RMDEPS" = "1" -a "$DEP_SUDO" = "1" ]; then
|
||||
msg "Removing installed dependencies..."
|
||||
if [ "$INFAKEROOT" = "1" ]; then
|
||||
FAKEROOTKEY2=$FAKEROOTKEY
|
||||
unset FAKEROOTKEY
|
||||
fi
|
||||
sudo pacman $PACMAN_OPTS -R $makedeplist $deplist
|
||||
if [ "$INFAKEROOT" = "1" ]; then
|
||||
export FAKEROOTKEY=$FAKEROOTKEY2
|
||||
unset FAKEROOTKEY2
|
||||
fi
|
||||
fi
|
||||
|
||||
msg "Finished making: $pkgname (`date`)"
|
||||
|
||||
if [ "$INSTALL" = "1" -a "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then
|
||||
msg "Running pacman --upgrade..."
|
||||
pacman --upgrade $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz
|
||||
msg "Installing package with pacman -U..."
|
||||
pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz
|
||||
exit $?
|
||||
fi
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# makeworld
|
||||
#
|
||||
# Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
#
|
||||
# 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
|
||||
|
@ -20,13 +20,15 @@
|
|||
# USA.
|
||||
#
|
||||
|
||||
version="2.9.8"
|
||||
toplevel=`pwd`
|
||||
version="2.9.1"
|
||||
|
||||
usage() {
|
||||
echo "makeworld version $version"
|
||||
echo "usage: $0 [options] <destdir> <category> [category] ..."
|
||||
echo "options:"
|
||||
echo
|
||||
echo "Usage: $0 [options] <destdir> <category> [category] ..."
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " -b, --builddeps Build missing dependencies from source"
|
||||
echo " -c, --clean Clean up work files after build"
|
||||
echo " -d, --nodeps Skip all dependency checks"
|
||||
|
@ -36,10 +38,15 @@ usage() {
|
|||
echo " -r, --rmdeps Remove installed dependencies after a successful build"
|
||||
echo " -s, --syncdeps Install missing dependencies with pacman"
|
||||
echo
|
||||
echo " where <category> is one or more directory names under the ABS root"
|
||||
echo "These options can be passed to pacman:"
|
||||
echo
|
||||
echo " --noconfirm Do not ask for confirmation when resolving dependencies"
|
||||
echo " --noprogressbar Do not show a progress bar when downloading files"
|
||||
echo
|
||||
echo "Where <category> is one or more directory names under the ABS root"
|
||||
echo "eg: makeworld -c /packages base lib editors"
|
||||
echo
|
||||
echo " this should be run from the toplevel directory of ABS (usually /var/abs)"
|
||||
echo "This should be run from the toplevel directory of ABS (usually /var/abs)"
|
||||
}
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
|
@ -50,6 +57,10 @@ fi
|
|||
MAKEPKG_OPTS=
|
||||
for arg in $*; do
|
||||
case $arg in
|
||||
# pacman
|
||||
--noconfirm) MAKEPKG_OPTS="$MAKEPKG_OPTS --noconfirm" ;;
|
||||
--noprogressbar) MAKEPKG_OPTS="$MAKEPKG_OPTS --noprogressbar" ;;
|
||||
# makepkg
|
||||
--clean) MAKEPKG_OPTS="$MAKEPKG_OPTS -c" ;;
|
||||
--install) MAKEPKG_OPTS="$MAKEPKG_OPTS -i" ;;
|
||||
--syncdeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -s" ;;
|
||||
|
@ -106,12 +117,12 @@ fi
|
|||
# convert a (possibly) relative path to absolute
|
||||
cd $dest
|
||||
dest=`pwd`
|
||||
cd -
|
||||
cd - &>/dev/null
|
||||
|
||||
sd=`date +"[%b %d %H:%M]"`
|
||||
|
||||
for category in $*; do
|
||||
for port in `find $toplevel/$category -type d -maxdepth 1 -mindepth 1 | sort`; do
|
||||
for port in `find $toplevel/$category -maxdepth 1 -mindepth 1 -type d | sort`; do
|
||||
cd $port
|
||||
if [ -f PKGBUILD ]; then
|
||||
. PKGBUILD
|
||||
|
|
114
scripts/pacman-optimize
Executable file
114
scripts/pacman-optimize
Executable file
|
@ -0,0 +1,114 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# pacman-optimize
|
||||
#
|
||||
# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
#
|
||||
# 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 2 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, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
# USA.
|
||||
#
|
||||
|
||||
myver='2.9.8'
|
||||
|
||||
usage() {
|
||||
echo "pacman-optimize $myver"
|
||||
echo "usage: $0 [pacman_db_root]"
|
||||
echo
|
||||
echo "pacman-optimize is a little hack that should improve the performance"
|
||||
echo "of pacman when reading/writing to its filesystem-based database."
|
||||
echo
|
||||
echo "Because pacman uses many small files to keep track of packages,"
|
||||
echo "there is a tendency for these files to become fragmented over time."
|
||||
echo "This script attempts to relocate these small files into one"
|
||||
echo "contiguous location on your hard drive. The result is that the hard"
|
||||
echo "drive should be able to read them faster, since the hard drive head"
|
||||
echo "does not have to move around the disk as much."
|
||||
echo
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "pacman-optimize: $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
die_r() {
|
||||
rm -f /tmp/pacman.lck
|
||||
die $*
|
||||
}
|
||||
|
||||
|
||||
dbroot="/var/lib/pacman"
|
||||
|
||||
if [ "$1" != "" ]; then
|
||||
if [ "$1" = "-h" -o "$1" = "--help" ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
dbroot=$1
|
||||
fi
|
||||
|
||||
if [ "`id -u`" != 0 ]; then
|
||||
die "You must be root to optimize the database"
|
||||
fi
|
||||
|
||||
# make sure pacman isn't running
|
||||
if [ -f /tmp/pacman.lck ]; then
|
||||
die "Pacman lockfile was found. Cannot run while pacman is running."
|
||||
fi
|
||||
|
||||
if [ ! -d $dbroot ]; then
|
||||
die "$dbroot does not exist or is not a directory"
|
||||
fi
|
||||
|
||||
# don't let pacman run while we do this
|
||||
touch /tmp/pacman.lck
|
||||
|
||||
# step 1: sum the old db
|
||||
echo "==> md5sum'ing the old database..."
|
||||
find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.old
|
||||
|
||||
# step 1: copy the entire db directory to a new one
|
||||
echo "==> copying $dbroot..."
|
||||
cp -a $dbroot $dbroot.new || die_r "error copying $dbroot"
|
||||
|
||||
# step 2: switch the directory names and sum the new one
|
||||
echo "==> md5sum'ing the new database..."
|
||||
mv $dbroot $dbroot.bak || die_r "error renaming $dbroot"
|
||||
mv $dbroot.new $dbroot || die_r "error renaming $dbroot.new"
|
||||
find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.new
|
||||
|
||||
# step 3: compare sums
|
||||
echo "==> checking integrity..."
|
||||
diff /tmp/pacsums.old /tmp/pacsums.new >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
# failed, move the old one back into place
|
||||
rm -rf $dbroot
|
||||
mv $dbroot.bak $dbroot
|
||||
die_r "integrity check FAILED, reverting to old database"
|
||||
fi
|
||||
|
||||
# step 4: remove the backup
|
||||
echo "==> removing old database..."
|
||||
rm -rf $dbroot.bak || die_r "error removing backup $dbroot.bak"
|
||||
|
||||
# remove the lock and sum files
|
||||
rm -f /tmp/pacman.lck /tmp/pacsums.old /tmp/pacsums.new
|
||||
|
||||
echo
|
||||
echo "Finished. Your pacman database has been optimized."
|
||||
echo
|
||||
|
||||
exit 0
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
# updatesync
|
||||
#
|
||||
# Copyright (c) 2004 by Jason Chu <jason@archlinux.org>
|
||||
# Derived from gensync (c) 2002-2004 Judd Vinet <jvinet@zeroflux.org>
|
||||
# Derived from gensync (c) 2002-2006 Judd Vinet <jvinet@zeroflux.org>
|
||||
#
|
||||
# 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
|
||||
|
@ -21,7 +21,7 @@
|
|||
# USA.
|
||||
#
|
||||
|
||||
myver='2.9.1'
|
||||
myver='2.9.8'
|
||||
|
||||
usage() {
|
||||
echo "updatesync $myver"
|
||||
|
@ -54,6 +54,18 @@ die()
|
|||
exit 1
|
||||
}
|
||||
|
||||
check_option() {
|
||||
local i
|
||||
for i in ${options[@]}; do
|
||||
local uc=`echo $i | tr [:lower:] [:upper:]`
|
||||
local lc=`echo $i | tr [:upper:] [:lower:]`
|
||||
if [ "$uc" = "$1" -o "$lc" = "$1" ]; then
|
||||
echo $1
|
||||
return
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
get_md5checksum()
|
||||
{
|
||||
if [ "$pkgdir" != "" ]; then
|
||||
|
@ -72,7 +84,7 @@ get_md5checksum()
|
|||
db_write_entry()
|
||||
{
|
||||
unset pkgname pkgver pkgrel pkgdesc force
|
||||
unset groups replaces provides depends conflicts
|
||||
unset groups replaces provides depends conflicts options
|
||||
source $1 || return 1
|
||||
cd $ustmpdir
|
||||
mkdir $pkgname-$pkgver-$pkgrel || return 1
|
||||
|
@ -110,7 +122,7 @@ db_write_entry()
|
|||
done
|
||||
echo "" >>desc
|
||||
fi
|
||||
if [ "$force" = "y" -o "$force" = "Y" ]; then
|
||||
if [ "$force" = "y" -o "$force" = "Y" -o "`check_option FORCE`" ]; then
|
||||
echo "%FORCE%" >>desc
|
||||
echo "" >>desc
|
||||
fi
|
||||
|
@ -157,7 +169,7 @@ delete_entry()
|
|||
|
||||
if [ $# -lt 3 ]; then
|
||||
usage
|
||||
exit 0
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$1" = "-h" -o "$1" = "--help" ]; then
|
||||
|
@ -210,12 +222,15 @@ if [ "$action" = "upd" ]; then
|
|||
else
|
||||
pkgfile="$destdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz"
|
||||
fi
|
||||
[ -f $pkgfile ] || die "missing package file: $pkgfile"
|
||||
if [ -f $pkgfile ]; then
|
||||
csize=`du -b $pkgfile | cut -f1`
|
||||
pkgmd5sum=`get_md5checksum $pkgfile`
|
||||
[ -z $pkgmd5sum ] && die "error generating checksum for $pkgfile"
|
||||
echo "updatesync: creating entry for $option" >&2
|
||||
db_write_entry $option || die "error writing entry for $option"
|
||||
else
|
||||
echo "updatesync: missing package: $pkgfile" >&2
|
||||
fi
|
||||
else
|
||||
# DELETE
|
||||
delete_entry $option
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* convertdb.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -28,15 +28,17 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include "pacconf.h"
|
||||
#include "list.h"
|
||||
#include "util.h"
|
||||
|
||||
unsigned short pmo_verbose = 0;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
FILE* db = NULL;
|
||||
FILE* fp = NULL;
|
||||
char* ptr = NULL;
|
||||
char* dbdir = "/var/lib/pacman/pacman.db";
|
||||
char name[256];
|
||||
char ver[256];
|
||||
char line[PATH_MAX+1];
|
||||
|
@ -44,6 +46,9 @@ int main(int argc, char* argv[])
|
|||
char path[PATH_MAX+1];
|
||||
mode_t oldumask;
|
||||
struct stat buf;
|
||||
char dbdir[PATH_MAX];
|
||||
|
||||
sprintf(dbdir, "/%s", PACDBDIR);
|
||||
|
||||
if(argc < 2) {
|
||||
printf("converts a pacman 1.x database to a pacman 2.0 format\n");
|
||||
|
|
262
src/db.c
262
src/db.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* db.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -29,6 +29,7 @@
|
|||
#include <libgen.h>
|
||||
#include <unistd.h>
|
||||
#include "package.h"
|
||||
#include "strhash.h"
|
||||
#include "util.h"
|
||||
#include "db.h"
|
||||
|
||||
|
@ -131,25 +132,74 @@ pkginfo_t* db_scan(pacdb_t *db, char *target, unsigned int inforeq)
|
|||
struct dirent *ent = NULL;
|
||||
struct stat sbuf;
|
||||
char path[PATH_MAX];
|
||||
char name[256];
|
||||
int path_len = 0;
|
||||
char *name = NULL;
|
||||
char *ptr = NULL;
|
||||
int found = 0;
|
||||
|
||||
/* initialize the hash table */
|
||||
if(!db_htable) {
|
||||
db_htable = new_strhash(951);
|
||||
}
|
||||
|
||||
snprintf(path, PATH_MAX, "%s/", db->path);
|
||||
path_len = strlen(path);
|
||||
|
||||
/* TODO:
|
||||
*
|
||||
* Currently we're using a hash table to cache the directory
|
||||
* name of each package we db_scan() for. This saves us from
|
||||
* having to scan the db directory for the full
|
||||
* pkgname-pkgver-pkgrel dir name, but we still have to issue
|
||||
* a db_read() call to get the actual package data.
|
||||
*
|
||||
* A more efficient method may be to cache the package data
|
||||
* itself.
|
||||
*/
|
||||
|
||||
if(target != NULL) {
|
||||
/* search for a specific package (by name only) */
|
||||
|
||||
/* See if we have the path cached. */
|
||||
strcat(path, target);
|
||||
if(strhash_isin(db_htable, path)) {
|
||||
struct dirent* pkgdir;
|
||||
pkginfo_t* pkg;
|
||||
|
||||
/* db_read() wants 'struct dirent' so lets give it one.
|
||||
* Actually it only uses the d_name field. */
|
||||
|
||||
MALLOC(pkgdir, sizeof(struct dirent));
|
||||
strcpy(pkgdir->d_name, strhash_get(db_htable, path));
|
||||
|
||||
pkg = db_read(db, pkgdir, inforeq);
|
||||
FREE(pkgdir);
|
||||
return pkg;
|
||||
}
|
||||
path[path_len] = '\0';
|
||||
|
||||
/* OK the entry was not in cache, so lets look for it manually. */
|
||||
|
||||
rewinddir(db->dir);
|
||||
ent = readdir(db->dir);
|
||||
|
||||
while(!found && ent != NULL) {
|
||||
if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) {
|
||||
ent = readdir(db->dir);
|
||||
continue;
|
||||
}
|
||||
strncpy(name, ent->d_name, 255);
|
||||
|
||||
/* stat the entry, make sure it's a directory */
|
||||
snprintf(path, PATH_MAX, "%s/%s", db->path, name);
|
||||
path[path_len] = '\0';
|
||||
strncat(path, ent->d_name, PATH_MAX - path_len);
|
||||
|
||||
if(stat(path, &sbuf) || !S_ISDIR(sbuf.st_mode)) {
|
||||
ent = readdir(db->dir);
|
||||
continue;
|
||||
}
|
||||
|
||||
name = path + path_len;
|
||||
|
||||
/* truncate the string at the second-to-last hyphen, */
|
||||
/* which will give us the package name */
|
||||
if((ptr = rindex(name, '-'))) {
|
||||
|
@ -175,8 +225,11 @@ pkginfo_t* db_scan(pacdb_t *db, char *target, unsigned int inforeq)
|
|||
if(ent == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* stat the entry, make sure it's a directory */
|
||||
snprintf(path, PATH_MAX, "%s/%s", db->path, ent->d_name);
|
||||
path[path_len] = '\0';
|
||||
strncat(path, ent->d_name, PATH_MAX - path_len);
|
||||
|
||||
if(!stat(path, &sbuf) && S_ISDIR(sbuf.st_mode)) {
|
||||
isdir = 1;
|
||||
}
|
||||
|
@ -184,6 +237,25 @@ pkginfo_t* db_scan(pacdb_t *db, char *target, unsigned int inforeq)
|
|||
isdir = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
name = path + path_len;
|
||||
|
||||
if((ptr = rindex(name, '-'))) {
|
||||
*ptr = '\0';
|
||||
}
|
||||
if((ptr = rindex(name, '-'))) {
|
||||
*ptr = '\0';
|
||||
}
|
||||
|
||||
/* Add entries like:
|
||||
*
|
||||
* key: /var/lib/pacman/extra/xrally
|
||||
* data: xrally-1.1.1-1
|
||||
*/
|
||||
|
||||
if(!strhash_isin(db_htable, path)) {
|
||||
strhash_add(db_htable, strdup(path), strdup(ent->d_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
return(db_read(db, ent, inforeq));
|
||||
|
@ -255,12 +327,6 @@ pkginfo_t* db_read(pacdb_t *db, struct dirent *ent, unsigned int inforeq)
|
|||
return(NULL);
|
||||
}
|
||||
trim(info->url);
|
||||
} else if(!strcmp(line, "%LICENSE%")) {
|
||||
if(fgets(info->license, sizeof(info->license), fp) == NULL) {
|
||||
FREEPKG(info);
|
||||
return(NULL);
|
||||
}
|
||||
trim(info->license);
|
||||
} else if(!strcmp(line, "%ARCH%")) {
|
||||
if(fgets(info->arch, sizeof(info->arch), fp) == NULL) {
|
||||
FREEPKG(info);
|
||||
|
@ -314,6 +380,11 @@ pkginfo_t* db_read(pacdb_t *db, struct dirent *ent, unsigned int inforeq)
|
|||
}
|
||||
trim(tmp);
|
||||
info->size = atol(tmp);
|
||||
} else if(!strcmp(line, "%LICENSE%")) {
|
||||
while(fgets(line, 512, fp) && strlen(trim(line))) {
|
||||
char *s = strdup(line);
|
||||
info->license = list_add(info->license, s);
|
||||
}
|
||||
} else if(!strcmp(line, "%REPLACES%")) {
|
||||
/* the REPLACES tag is special -- it only appears in sync repositories,
|
||||
* not the local one. */
|
||||
|
@ -457,7 +528,10 @@ int db_write(pacdb_t *db, pkginfo_t *info, unsigned int inforeq)
|
|||
fputs("%URL%\n", fp);
|
||||
fprintf(fp, "%s\n\n", info->url);
|
||||
fputs("%LICENSE%\n", fp);
|
||||
fprintf(fp, "%s\n\n", info->license);
|
||||
for(lp = info->license; lp; lp = lp->next) {
|
||||
fprintf(fp, "%s\n", (char*)lp->data);
|
||||
}
|
||||
fprintf(fp, "\n");
|
||||
fputs("%ARCH%\n", fp);
|
||||
fprintf(fp, "%s\n\n", info->arch);
|
||||
fputs("%BUILDDATE%\n", fp);
|
||||
|
@ -534,6 +608,40 @@ int db_write(pacdb_t *db, pkginfo_t *info, unsigned int inforeq)
|
|||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove a package record from the database
|
||||
*/
|
||||
void db_remove(pacdb_t *db, pkginfo_t *target)
|
||||
{
|
||||
char topdir[PATH_MAX];
|
||||
char path[PATH_MAX];
|
||||
|
||||
snprintf(topdir, PATH_MAX, "%s/%s-%s", db->path,
|
||||
target->name, target->version);
|
||||
|
||||
/* DESC */
|
||||
snprintf(path, PATH_MAX, "%s/desc", topdir);
|
||||
unlink(path);
|
||||
/* FILES */
|
||||
snprintf(path, PATH_MAX, "%s/files", topdir);
|
||||
unlink(path);
|
||||
/* DEPENDS */
|
||||
snprintf(path, PATH_MAX, "%s/depends", topdir);
|
||||
unlink(path);
|
||||
/* INSTALL */
|
||||
snprintf(path, PATH_MAX, "%s/install", topdir);
|
||||
unlink(path);
|
||||
/* directory */
|
||||
rmdir(topdir);
|
||||
|
||||
/* remove the entry from the hash table */
|
||||
if(db_htable) {
|
||||
/*clear_strhash(db_htable);*/
|
||||
snprintf(topdir, PATH_MAX, "%s/%s", db->path, target->name);
|
||||
strhash_remove(db_htable, topdir);
|
||||
}
|
||||
}
|
||||
|
||||
void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles)
|
||||
{
|
||||
PMList *i, *j;
|
||||
|
@ -543,15 +651,13 @@ void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles
|
|||
|
||||
for(i = needles; i; i = i->next) {
|
||||
char *targ = strdup(i->data);
|
||||
strtoupper(targ);
|
||||
for(j = cache; j; j = j->next) {
|
||||
pkginfo_t *pkg = (pkginfo_t*)j->data;
|
||||
char *haystack;
|
||||
int match = 0;
|
||||
/* check name */
|
||||
haystack = strdup(pkg->name);
|
||||
strtoupper(haystack);
|
||||
if(strstr(haystack, targ)) {
|
||||
if(reg_match(haystack, targ)) {
|
||||
match = 1;
|
||||
}
|
||||
FREE(haystack);
|
||||
|
@ -559,8 +665,7 @@ void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles
|
|||
/* check description */
|
||||
if(!match) {
|
||||
haystack = strdup(pkg->desc);
|
||||
strtoupper(haystack);
|
||||
if(strstr(haystack, targ)) {
|
||||
if(reg_match(haystack, targ)) {
|
||||
match = 1;
|
||||
}
|
||||
FREE(haystack);
|
||||
|
@ -573,8 +678,7 @@ void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles
|
|||
if(info != NULL) {
|
||||
for(m = info->provides; m; m = m->next) {
|
||||
haystack = strdup(m->data);
|
||||
strtoupper(haystack);
|
||||
if(strstr(haystack, targ)) {
|
||||
if(reg_match(haystack, targ)) {
|
||||
match = 1;
|
||||
}
|
||||
FREE(haystack);
|
||||
|
@ -594,7 +698,7 @@ void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles
|
|||
}
|
||||
|
||||
|
||||
PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
|
||||
PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root, PMList **skip_list)
|
||||
{
|
||||
PMList *i, *j, *k;
|
||||
char *filestr = NULL;
|
||||
|
@ -603,43 +707,32 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
|
|||
struct stat buf, buf2;
|
||||
PMList *conflicts = NULL;
|
||||
|
||||
/* CHECK 1: check every db package against every target package */
|
||||
/* XXX: I've disabled the database-against-targets check for now, as the
|
||||
* many many strcmp() calls slow it down heavily and most of the
|
||||
* checking is redundant to the targets-against-filesystem check.
|
||||
* This will be re-enabled if I can improve performance significantly.
|
||||
*
|
||||
pkginfo_t *info = NULL;
|
||||
char *dbstr = NULL;
|
||||
rewinddir(db->dir);
|
||||
while((info = db_scan(db, NULL, INFRQ_DESC | INFRQ_FILES)) != NULL) {
|
||||
for(i = info->files; i; i = i->next) {
|
||||
if(i->data == NULL) continue;
|
||||
dbstr = (char*)i->data;
|
||||
for(j = targets; j; j = j->next) {
|
||||
pkginfo_t *targ = (pkginfo_t*)j->data;
|
||||
if(strcmp(info->name, targ->name)) {
|
||||
for(k = targ->files; k; k = k->next) {
|
||||
filestr = (char*)k->data;
|
||||
if(!strcmp(dbstr, filestr)) {
|
||||
if(rindex(k->data, '/') == filestr+strlen(filestr)-1) {
|
||||
continue;
|
||||
}
|
||||
MALLOC(str, 512);
|
||||
snprintf(str, 512, "%s: exists in \"%s\" (target) and \"%s\" (installed)", dbstr,
|
||||
targ->name, info->name);
|
||||
conflicts = list_add(conflicts, str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
strhash_t** htables;
|
||||
int target_num = 0;
|
||||
int d = 0;
|
||||
int e = 0;
|
||||
|
||||
/* CHECK 2: check every target against every target */
|
||||
for(i = targets; i; i = i->next) {
|
||||
/* Create and initialise an array of hash tables.
|
||||
*
|
||||
* htables [ 0 ... target_num ] : targets' files
|
||||
* htables [ target_num ] : used later
|
||||
*/
|
||||
|
||||
target_num = list_count(targets);
|
||||
|
||||
MALLOC(htables, (target_num+1) * sizeof(strhash_t*));
|
||||
|
||||
for(d = 0, i = targets; i; i = i->next, d++) {
|
||||
htables[d] = new_strhash(151);
|
||||
strhash_add_list(htables[d], ((pkginfo_t*)i->data)->files);
|
||||
}
|
||||
|
||||
htables[target_num] = new_strhash(151);
|
||||
|
||||
/* CHECK 1: check every target against every target */
|
||||
for(d = 0, i = targets; i; i = i->next, d++) {
|
||||
pkginfo_t *p1 = (pkginfo_t*)i->data;
|
||||
for(j = i; j; j = j->next) {
|
||||
for(e = d, j = i; j; j = j->next, e++) {
|
||||
pkginfo_t *p2 = (pkginfo_t*)j->data;
|
||||
if(strcmp(p1->name, p2->name)) {
|
||||
for(k = p1->files; k; k = k->next) {
|
||||
|
@ -651,7 +744,7 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
|
|||
/* this filename has a trailing '/', so it's a directory -- skip it. */
|
||||
continue;
|
||||
}
|
||||
if(is_in(filestr, p2->files)) {
|
||||
if(strhash_isin(htables[e], filestr)) {
|
||||
MALLOC(str, 512);
|
||||
snprintf(str, 512, "%s: exists in \"%s\" (target) and \"%s\" (target)",
|
||||
filestr, p1->name, p2->name);
|
||||
|
@ -662,19 +755,41 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
|
|||
}
|
||||
}
|
||||
|
||||
/* CHECK 3: check every target against the filesystem */
|
||||
/* CHECK 2: check every target against the filesystem */
|
||||
for(i = targets; i; i = i->next) {
|
||||
pkginfo_t *p = (pkginfo_t*)i->data;
|
||||
pkginfo_t *dbpkg = NULL;
|
||||
for(j = p->files; j; j = j->next) {
|
||||
int isdir = 0;
|
||||
filestr = (char*)j->data;
|
||||
snprintf(path, PATH_MAX, "%s%s", root, filestr);
|
||||
if(!stat(path, &buf) && !S_ISDIR(buf.st_mode)) {
|
||||
/* is this target a file or directory? */
|
||||
if(path[strlen(path)-1] == '/') {
|
||||
isdir = 1;
|
||||
path[strlen(path)-1] = '\0';
|
||||
}
|
||||
if(!lstat(path, &buf)) {
|
||||
int ok = 0;
|
||||
if(!S_ISLNK(buf.st_mode) && ((isdir && !S_ISDIR(buf.st_mode)) || (!isdir && S_ISDIR(buf.st_mode)))) {
|
||||
/* if the package target is a directory, and the filesystem target
|
||||
* is not (or vice versa) then it's a conflict
|
||||
*/
|
||||
ok = 0;
|
||||
goto donecheck;
|
||||
}
|
||||
/* re-fetch with stat() instead of lstat() */
|
||||
stat(path, &buf);
|
||||
if(S_ISDIR(buf.st_mode)) {
|
||||
/* if it's a directory, then we have no conflict */
|
||||
ok = 1;
|
||||
} else {
|
||||
if(dbpkg == NULL) {
|
||||
dbpkg = db_scan(db, p->name, INFRQ_DESC | INFRQ_FILES);
|
||||
|
||||
if(dbpkg)
|
||||
strhash_add_list(htables[target_num], dbpkg->files);
|
||||
}
|
||||
if(dbpkg && is_in(j->data, dbpkg->files)) {
|
||||
if(dbpkg && strhash_isin(htables[target_num], filestr)) {
|
||||
ok = 1;
|
||||
}
|
||||
/* Make sure that the supposedly-conflicting file is not actually just
|
||||
|
@ -686,7 +801,8 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
|
|||
for(k = dbpkg->files; k; k = k->next) {
|
||||
snprintf(str, PATH_MAX, "%s%s", root, (char*)k->data);
|
||||
stat(str, &buf2);
|
||||
if(buf.st_ino == buf2.st_ino) {
|
||||
if(buf.st_ino == buf2.st_ino && buf.st_dev == buf2.st_dev) {
|
||||
/*printf("inodes match: %s and %s\n", path, str);*/
|
||||
ok = 1;
|
||||
}
|
||||
}
|
||||
|
@ -703,12 +819,33 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
|
|||
dbpkg2 = db_scan(db, p1->name, INFRQ_DESC | INFRQ_FILES);
|
||||
/* If it used to exist in there, but doesn't anymore */
|
||||
if(dbpkg2 && !is_in(filestr, p1->files) && is_in(filestr, dbpkg2->files)) {
|
||||
/*printf("file %s moved from %s to %s\n", filestr, p1->name, p->name);*/
|
||||
|
||||
ok = 1;
|
||||
/* Add to the "skip list" of files that we shouldn't remove during an upgrade.
|
||||
*
|
||||
* This is a workaround for the following scenario:
|
||||
*
|
||||
* - the old package A provides file X
|
||||
* - the new package A does not
|
||||
* - the new package B provides file X
|
||||
* - package A depends on B, so B is upgraded first
|
||||
*
|
||||
* Package B is upgraded, so file X is installed. Then package A
|
||||
* is upgraded, and it *removes* file X, since it no longer exists
|
||||
* in package A.
|
||||
*
|
||||
* Our workaround is to scan through all "old" packages and all "new"
|
||||
* ones, looking for files that jump to different packages.
|
||||
*/
|
||||
*skip_list = list_add(*skip_list, filestr);
|
||||
}
|
||||
FREEPKG(dbpkg2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
donecheck:
|
||||
if(!ok) {
|
||||
MALLOC(str, 512);
|
||||
snprintf(str, 512, "%s: %s: exists in filesystem", p->name, path);
|
||||
|
@ -719,6 +856,11 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
|
|||
FREEPKG(dbpkg);
|
||||
}
|
||||
|
||||
/* free up the hash tables */
|
||||
for(d = 0; d <= target_num; d++) {
|
||||
free_strhash(htables[d]);
|
||||
}
|
||||
|
||||
return(conflicts);
|
||||
}
|
||||
|
||||
|
|
9
src/db.h
9
src/db.h
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* db.h
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -22,6 +22,7 @@
|
|||
#define _PAC_DB_H
|
||||
|
||||
#include <dirent.h>
|
||||
#include "strhash.h"
|
||||
|
||||
/* info requests for db_read */
|
||||
#define INFRQ_DESC 0x01
|
||||
|
@ -35,6 +36,9 @@ typedef struct __pacdb_t {
|
|||
DIR* dir;
|
||||
} pacdb_t;
|
||||
|
||||
/* hash table for caching db_scan() results */
|
||||
static strhash_t* db_htable;
|
||||
|
||||
pacdb_t* db_open(char *root, char *dbpath, char *treename);
|
||||
void db_close(pacdb_t *db);
|
||||
int db_getlastupdate(const char *dbpath, char *ts);
|
||||
|
@ -43,8 +47,9 @@ PMList* db_loadpkgs(pacdb_t *db);
|
|||
pkginfo_t* db_scan(pacdb_t *db, char *target, unsigned int inforeq);
|
||||
pkginfo_t* db_read(pacdb_t *db, struct dirent *ent, unsigned int inforeq);
|
||||
int db_write(pacdb_t *db, pkginfo_t *info, unsigned int inforeq);
|
||||
void db_remove(pacdb_t *db, pkginfo_t *target);
|
||||
void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles);
|
||||
PMList* db_find_conflicts(pacdb_t *db, PMList* targets, char *root);
|
||||
PMList* db_find_conflicts(pacdb_t *db, PMList* targets, char *root, PMList **skip_list);
|
||||
PMList *whatprovides(pacdb_t *db, char* package);
|
||||
PMList *find_groups(pacdb_t *db);
|
||||
PMList *pkg_ingroup(pacdb_t *db, char *group);
|
||||
|
|
162
src/list.c
162
src/list.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* list.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -23,8 +23,33 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include "list.h"
|
||||
|
||||
/* Check PMList sanity
|
||||
*
|
||||
* 1: List seems to be OK.
|
||||
* 0: We're in deep ...
|
||||
*/
|
||||
int check_list(PMList* list)
|
||||
{
|
||||
PMList* it = NULL;
|
||||
|
||||
if(list == NULL) {
|
||||
return(1);
|
||||
}
|
||||
if(list->last == NULL) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
for(it = list; it && it->next; it = it->next);
|
||||
if(it != list->last) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
PMList* list_new()
|
||||
{
|
||||
PMList *list = NULL;
|
||||
|
@ -36,22 +61,20 @@ PMList* list_new()
|
|||
list->data = NULL;
|
||||
list->prev = NULL;
|
||||
list->next = NULL;
|
||||
list->last = list;
|
||||
return(list);
|
||||
}
|
||||
|
||||
void list_free(PMList *list)
|
||||
{
|
||||
if(list == NULL) {
|
||||
return;
|
||||
PMList *ptr, *it = list;
|
||||
|
||||
while(it) {
|
||||
ptr = it->next;
|
||||
free(it->data);
|
||||
free(it);
|
||||
it = ptr;
|
||||
}
|
||||
if(list->data != NULL) {
|
||||
free(list->data);
|
||||
list->data = NULL;
|
||||
}
|
||||
if(list->next != NULL) {
|
||||
list_free(list->next);
|
||||
}
|
||||
free(list);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -62,6 +85,8 @@ PMList* list_add(PMList *list, void *data)
|
|||
ptr = list;
|
||||
if(ptr == NULL) {
|
||||
ptr = list_new();
|
||||
if (!ptr)
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
lp = list_last(ptr);
|
||||
|
@ -73,12 +98,67 @@ PMList* list_add(PMList *list, void *data)
|
|||
return(NULL);
|
||||
}
|
||||
lp->next->prev = lp;
|
||||
lp->last = NULL;
|
||||
lp = lp->next;
|
||||
}
|
||||
|
||||
lp->data = data;
|
||||
ptr->last = lp;
|
||||
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
/* list: the beginning of the list
|
||||
* item: the item in the list to be removed
|
||||
*
|
||||
* returns:
|
||||
* list with item removed
|
||||
*/
|
||||
|
||||
PMList* list_remove(PMList* list, PMList* item)
|
||||
{
|
||||
assert(check_list(list));
|
||||
|
||||
if (list == NULL || item == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Remove first item in list. */
|
||||
if (item == list) {
|
||||
if (list->next == NULL) { /* Only item in list. */
|
||||
list_free(item);
|
||||
return NULL;
|
||||
} else {
|
||||
list->next->prev = NULL;
|
||||
list->next->last = list->last;
|
||||
list = list->next;
|
||||
item->prev = item->next = NULL;
|
||||
list_free(item);
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove last item in list. */
|
||||
if (list->last == item) {
|
||||
list->last = item->prev;
|
||||
item->prev->next = NULL;
|
||||
item->prev = item->next = NULL;
|
||||
list_free(item);
|
||||
return list;
|
||||
}
|
||||
|
||||
/* Remove middle item in list. */
|
||||
assert(item->prev != NULL &&
|
||||
item->next != NULL);
|
||||
|
||||
item->prev->next = item->next;
|
||||
item->next->prev = item->prev;
|
||||
item->prev = item->next = NULL;
|
||||
list_free(item);
|
||||
|
||||
assert(check_list(list));
|
||||
return list;
|
||||
}
|
||||
|
||||
int list_count(PMList *list)
|
||||
{
|
||||
int i;
|
||||
|
@ -141,10 +221,11 @@ PMList* list_merge(PMList *one, PMList *two)
|
|||
|
||||
PMList* list_last(PMList *list)
|
||||
{
|
||||
PMList *ptr;
|
||||
if (list == NULL)
|
||||
return NULL;
|
||||
|
||||
for(ptr = list; ptr && ptr->next; ptr = ptr->next);
|
||||
return(ptr);
|
||||
assert(list->last != NULL);
|
||||
return list->last;
|
||||
}
|
||||
|
||||
/* Helper function for sorting a list of strings
|
||||
|
@ -157,6 +238,8 @@ int list_strcmp(const void *s1, const void *s2)
|
|||
return(strcmp(*str1, *str2));
|
||||
}
|
||||
|
||||
/* Sort a list of strings.
|
||||
*/
|
||||
PMList *list_sort(PMList *list)
|
||||
{
|
||||
char **arr = NULL;
|
||||
|
@ -189,6 +272,42 @@ PMList *list_sort(PMList *list)
|
|||
return(lp);
|
||||
}
|
||||
|
||||
/* Filter out any duplicate strings in a list.
|
||||
*
|
||||
* Not the most efficient way, but simple to implement -- we assemble
|
||||
* a new list, using is_in() to check for dupes at each iteration.
|
||||
*
|
||||
*/
|
||||
PMList* list_remove_dupes(PMList *list)
|
||||
{
|
||||
PMList *i, *newlist = NULL;
|
||||
|
||||
for(i = list; i; i = i->next) {
|
||||
if(!is_in(i->data, newlist)) {
|
||||
newlist = list_add(newlist, strdup(i->data));
|
||||
}
|
||||
}
|
||||
return newlist;
|
||||
}
|
||||
|
||||
/* Reverse the order of a list
|
||||
*
|
||||
* The caller is responsible for freeing the old list
|
||||
*/
|
||||
PMList* list_reverse(PMList *list)
|
||||
{
|
||||
/* simple but functional -- we just build a new list, starting
|
||||
* with the old list's tail
|
||||
*/
|
||||
PMList *newlist = NULL;
|
||||
PMList *lp;
|
||||
|
||||
for(lp = list->last; lp; lp = lp->prev) {
|
||||
newlist = list_add(newlist, lp->data);
|
||||
}
|
||||
return(newlist);
|
||||
}
|
||||
|
||||
void list_display(const char *title, PMList *list)
|
||||
{
|
||||
PMList *lp;
|
||||
|
@ -257,10 +376,23 @@ PMList* list_add_sorted(PMList *list, void *data, cmp_fn sortfunc)
|
|||
/* Insert node before insertion point. */
|
||||
add->prev = prev;
|
||||
add->next = iter;
|
||||
if(iter != NULL) iter->prev = add; /* Not at end. */
|
||||
|
||||
if(iter != NULL) {
|
||||
iter->prev = add; /* Not at end. */
|
||||
} else {
|
||||
if (list != NULL)
|
||||
list->last = add; /* Added new to end, so update the link to last. */
|
||||
}
|
||||
|
||||
if(prev != NULL) {
|
||||
prev->next = add; /* In middle. */
|
||||
} else {
|
||||
if (list == NULL) {
|
||||
add->last = add;
|
||||
} else {
|
||||
add->last = list->last;
|
||||
list->last = NULL;
|
||||
}
|
||||
list = add; /* Start or empty, new list head. */
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* list.h
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -28,6 +28,7 @@ typedef struct __pmlist_t {
|
|||
void* data;
|
||||
struct __pmlist_t* prev;
|
||||
struct __pmlist_t* next;
|
||||
struct __pmlist_t* last; /* Quick access to last item in list */
|
||||
} PMList;
|
||||
|
||||
|
||||
|
@ -38,6 +39,7 @@ typedef int (*cmp_fn) (const void *, const void *);
|
|||
PMList* list_new();
|
||||
void list_free(PMList* list);
|
||||
PMList* list_add(PMList* list, void* data);
|
||||
PMList* list_remove(PMList* list, PMList* item);
|
||||
int list_count(PMList* list);
|
||||
int list_isin(PMList *haystack, void *needle);
|
||||
PMList* is_in(char *needle, PMList *haystack);
|
||||
|
@ -45,6 +47,8 @@ PMList* list_merge(PMList *one, PMList *two);
|
|||
PMList* list_last(PMList* list);
|
||||
int list_strcmp(const void *s1, const void *s2);
|
||||
PMList *list_sort(PMList *list);
|
||||
PMList* list_remove_dupes(PMList *list);
|
||||
PMList *list_reverse(PMList *list);
|
||||
void list_display(const char *title, PMList *list);
|
||||
|
||||
int strlist_cmp(const void *s1, const void *s2);
|
||||
|
|
24
src/md5.c
24
src/md5.c
|
@ -23,6 +23,7 @@ These notices must be retained in any copies of any part of this
|
|||
documentation and/or software.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "md5.h"
|
||||
|
||||
/* Constants for MD5Transform routine.
|
||||
|
@ -48,8 +49,8 @@ documentation and/or software.
|
|||
static void MD5Transform(UINT4 [4], unsigned char [64]);
|
||||
static void Encode(unsigned char *, UINT4 *, unsigned int);
|
||||
static void Decode(UINT4 *, unsigned char *, unsigned int);
|
||||
static void MD5_memcpy(POINTER, POINTER, unsigned int);
|
||||
static void MD5_memset(POINTER, int, unsigned int);
|
||||
/* static void MD5_memcpy(POINTER, POINTER, unsigned int); */
|
||||
/* static void MD5_memset(POINTER, int, unsigned int); */
|
||||
|
||||
static unsigned char PADDING[64] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
|
@ -132,8 +133,7 @@ unsigned int inputLen; /* length of input block */
|
|||
/* Transform as many times as possible.
|
||||
*/
|
||||
if (inputLen >= partLen) {
|
||||
MD5_memcpy
|
||||
((POINTER)&context->buffer[index], (POINTER)input, partLen);
|
||||
memcpy ((POINTER)&context->buffer[index], (POINTER)input, partLen);
|
||||
MD5Transform (context->state, context->buffer);
|
||||
|
||||
for (i = partLen; i + 63 < inputLen; i += 64)
|
||||
|
@ -145,9 +145,7 @@ unsigned int inputLen; /* length of input block */
|
|||
i = 0;
|
||||
|
||||
/* Buffer remaining input */
|
||||
MD5_memcpy
|
||||
((POINTER)&context->buffer[index], (POINTER)&input[i],
|
||||
inputLen-i);
|
||||
memcpy ((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i);
|
||||
}
|
||||
|
||||
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
|
||||
|
@ -177,7 +175,7 @@ MD5_CTX *context; /* context */
|
|||
|
||||
/* Zeroize sensitive information.
|
||||
*/
|
||||
MD5_memset ((POINTER)context, 0, sizeof (*context));
|
||||
memset ((POINTER)context, 0, sizeof (*context));
|
||||
}
|
||||
|
||||
/* MD5 basic transformation. Transforms state based on block.
|
||||
|
@ -271,7 +269,7 @@ unsigned char block[64];
|
|||
/* Zeroize sensitive information.
|
||||
|
||||
*/
|
||||
MD5_memset ((POINTER)x, 0, sizeof (x));
|
||||
memset ((POINTER)x, 0, sizeof (x));
|
||||
}
|
||||
|
||||
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
|
||||
|
@ -310,7 +308,7 @@ unsigned int len;
|
|||
/* Note: Replace "for loop" with standard memcpy if possible.
|
||||
*/
|
||||
|
||||
static void MD5_memcpy (output, input, len)
|
||||
/* static void MD5_memcpy (output, input, len)
|
||||
POINTER output;
|
||||
POINTER input;
|
||||
unsigned int len;
|
||||
|
@ -321,10 +319,10 @@ unsigned int len;
|
|||
|
||||
output[i] = input[i];
|
||||
}
|
||||
|
||||
*/
|
||||
/* Note: Replace "for loop" with standard memset if possible.
|
||||
*/
|
||||
static void MD5_memset (output, value, len)
|
||||
/* static void MD5_memset (output, value, len)
|
||||
POINTER output;
|
||||
int value;
|
||||
unsigned int len;
|
||||
|
@ -334,5 +332,5 @@ unsigned int len;
|
|||
for (i = 0; i < len; i++)
|
||||
((char *)output)[i] = (char)value;
|
||||
}
|
||||
|
||||
*/
|
||||
/* vim: set ts=2 sw=2 noet: */
|
||||
|
|
|
@ -31,7 +31,7 @@ typedef unsigned char *POINTER;
|
|||
typedef unsigned short int UINT2;
|
||||
|
||||
/* UINT4 defines a four byte word */
|
||||
typedef unsigned long int UINT4;
|
||||
typedef unsigned int UINT4;
|
||||
|
||||
|
||||
/* MD5 context. */
|
||||
|
|
46
src/pacconf.h
Normal file
46
src/pacconf.h
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* pacconf.h
|
||||
*
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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 2 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, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
* USA.
|
||||
*/
|
||||
#ifndef _PAC_PACCONF_H
|
||||
#define _PAC_PACCONF_H
|
||||
|
||||
#ifndef PACVER
|
||||
#define PACVER "2.9.8"
|
||||
#endif
|
||||
|
||||
#ifndef PACDBDIR
|
||||
#define PACDBDIR "var/lib/pacman"
|
||||
#endif
|
||||
|
||||
#ifndef PKGEXT
|
||||
#define PKGEXT ".pkg.tar.gz"
|
||||
#endif
|
||||
|
||||
#ifndef PACCONF
|
||||
#define PACCONF "/etc/pacman.conf"
|
||||
#endif
|
||||
|
||||
#ifndef CACHEDIR
|
||||
#define CACHEDIR "var/cache/pacman/pkg"
|
||||
#endif
|
||||
|
||||
#endif /* PACCONF_H */
|
||||
|
||||
/* vim: set ts=2 sw=2 noet: */
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* package.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -27,6 +27,7 @@
|
|||
#include <string.h>
|
||||
#include <libtar.h>
|
||||
#include <zlib.h>
|
||||
#include "pacconf.h"
|
||||
#include "util.h"
|
||||
#include "package.h"
|
||||
|
||||
|
@ -62,21 +63,28 @@ pkginfo_t* load_pkg(char *pkgfile)
|
|||
}
|
||||
if(!strcmp(th_get_pathname(tar), ".PKGINFO")) {
|
||||
char *descfile;
|
||||
int fd;
|
||||
|
||||
/* extract this file into /tmp. it has info for us */
|
||||
descfile = strdup("/tmp/pacman_XXXXXX");
|
||||
mkstemp(descfile);
|
||||
fd = mkstemp(descfile);
|
||||
tar_extract_file(tar, descfile);
|
||||
/* parse the info file */
|
||||
parse_descfile(descfile, info, &backup, 0);
|
||||
if(!strlen(info->name)) {
|
||||
fprintf(stderr, "load_pkg: missing package name in %s.\n", pkgfile);
|
||||
FREEPKG(info);
|
||||
unlink(descfile);
|
||||
FREE(descfile);
|
||||
close(fd);
|
||||
return(NULL);
|
||||
}
|
||||
if(!strlen(info->version)) {
|
||||
fprintf(stderr, "load_pkg: missing package version in %s.\n", pkgfile);
|
||||
FREEPKG(info);
|
||||
unlink(descfile);
|
||||
FREE(descfile);
|
||||
close(fd);
|
||||
return(NULL);
|
||||
}
|
||||
for(lp = backup; lp; lp = lp->next) {
|
||||
|
@ -85,7 +93,9 @@ pkginfo_t* load_pkg(char *pkgfile)
|
|||
}
|
||||
}
|
||||
config = 1;
|
||||
unlink(descfile);
|
||||
FREE(descfile);
|
||||
close(fd);
|
||||
continue;
|
||||
} else if(!strcmp(th_get_pathname(tar), "._install") || !strcmp(th_get_pathname(tar), ".INSTALL")) {
|
||||
info->scriptlet = 1;
|
||||
|
@ -95,10 +105,11 @@ pkginfo_t* load_pkg(char *pkgfile)
|
|||
FILE *fp;
|
||||
char *fn;
|
||||
char *str;
|
||||
int fd;
|
||||
|
||||
MALLOC(str, PATH_MAX);
|
||||
fn = strdup("/tmp/pacman_XXXXXX");
|
||||
mkstemp(fn);
|
||||
fd = mkstemp(fn);
|
||||
tar_extract_file(tar, fn);
|
||||
fp = fopen(fn, "r");
|
||||
while(!feof(fp)) {
|
||||
|
@ -114,6 +125,7 @@ pkginfo_t* load_pkg(char *pkgfile)
|
|||
fprintf(stderr, "warning: could not remove tempfile %s\n", fn);
|
||||
}
|
||||
FREE(fn);
|
||||
close(fd);
|
||||
filelist = 1;
|
||||
continue;
|
||||
} else {
|
||||
|
@ -143,6 +155,8 @@ pkginfo_t* load_pkg(char *pkgfile)
|
|||
return(NULL);
|
||||
}
|
||||
|
||||
info->filename = strdup(pkgfile);
|
||||
|
||||
return(info);
|
||||
}
|
||||
|
||||
|
@ -194,8 +208,6 @@ int parse_descfile(char *descfile, pkginfo_t *info, PMList **backup, int output)
|
|||
info->groups = list_add(info->groups, strdup(ptr));
|
||||
} else if(!strcmp(key, "URL")) {
|
||||
strncpy(info->url, ptr, sizeof(info->url));
|
||||
} else if(!strcmp(key, "LICENSE")) {
|
||||
strncpy(info->license, ptr, sizeof(info->license));
|
||||
} else if(!strcmp(key, "BUILDDATE")) {
|
||||
strncpy(info->builddate, ptr, sizeof(info->builddate));
|
||||
} else if(!strcmp(key, "INSTALLDATE")) {
|
||||
|
@ -208,6 +220,8 @@ int parse_descfile(char *descfile, pkginfo_t *info, PMList **backup, int output)
|
|||
char tmp[32];
|
||||
strncpy(tmp, ptr, sizeof(tmp));
|
||||
info->size = atol(tmp);
|
||||
} else if(!strcmp(key, "LICENSE")) {
|
||||
info->license = list_add(info->license, strdup(ptr));
|
||||
} else if(!strcmp(key, "DEPEND")) {
|
||||
info->depends = list_add(info->depends, strdup(ptr));
|
||||
} else if(!strcmp(key, "CONFLICT")) {
|
||||
|
@ -241,7 +255,6 @@ pkginfo_t* newpkg()
|
|||
pkg->version[0] = '\0';
|
||||
pkg->desc[0] = '\0';
|
||||
pkg->url[0] = '\0';
|
||||
pkg->license[0] = '\0';
|
||||
pkg->builddate[0] = '\0';
|
||||
pkg->installdate[0] = '\0';
|
||||
pkg->packager[0] = '\0';
|
||||
|
@ -251,6 +264,7 @@ pkginfo_t* newpkg()
|
|||
pkg->scriptlet = 0;
|
||||
pkg->force = 0;
|
||||
pkg->reason = REASON_EXPLICIT;
|
||||
pkg->license = NULL;
|
||||
pkg->requiredby = NULL;
|
||||
pkg->conflicts = NULL;
|
||||
pkg->files = NULL;
|
||||
|
@ -259,6 +273,7 @@ pkginfo_t* newpkg()
|
|||
pkg->groups = NULL;
|
||||
pkg->provides = NULL;
|
||||
pkg->replaces = NULL;
|
||||
pkg->filename = NULL;
|
||||
|
||||
return(pkg);
|
||||
}
|
||||
|
@ -277,6 +292,7 @@ void freepkg(pkginfo_t *pkg)
|
|||
FREELIST(pkg->groups);
|
||||
FREELIST(pkg->provides);
|
||||
FREELIST(pkg->replaces);
|
||||
FREE(pkg->filename);
|
||||
FREE(pkg);
|
||||
return;
|
||||
}
|
||||
|
@ -335,7 +351,9 @@ void dump_pkg_full(pkginfo_t *info)
|
|||
FREELIST(pm);
|
||||
printf("Packager : %s\n", info->packager);
|
||||
printf("URL : %s\n", info->url);
|
||||
printf("License : %s\n", info->license);
|
||||
pm = list_sort(info->license);
|
||||
list_display("License :", pm);
|
||||
FREELIST(pm);
|
||||
printf("Architecture : %s\n", info->arch);
|
||||
printf("Size : %ld\n", info->size);
|
||||
printf("Build Date : %s %s\n", info->builddate, strlen(info->builddate) ? "UTC" : "");
|
||||
|
@ -366,7 +384,7 @@ void dump_pkg_full(pkginfo_t *info)
|
|||
|
||||
/* Display the content of a sync package
|
||||
*/
|
||||
void dump_pkg_sync(pkginfo_t *info)
|
||||
void dump_pkg_sync(pkginfo_t *info, char *treename)
|
||||
{
|
||||
PMList *pm;
|
||||
|
||||
|
@ -374,6 +392,7 @@ void dump_pkg_sync(pkginfo_t *info)
|
|||
return;
|
||||
}
|
||||
|
||||
printf("Repository : %s\n", treename);
|
||||
printf("Name : %s\n", info->name);
|
||||
printf("Version : %s\n", info->version);
|
||||
pm = list_sort(info->groups);
|
||||
|
@ -410,7 +429,7 @@ int split_pkgname(char *pkgfile, char *name, char *version)
|
|||
}
|
||||
strncpy(tmp, p, 512);
|
||||
/* trim file extension (if any) */
|
||||
if((p = strstr(tmp, ".pkg.tar.gz"))) {
|
||||
if((p = strstr(tmp, PKGEXT))) {
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* package.h
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -50,7 +50,6 @@ typedef struct __pkginfo_t {
|
|||
char version[64];
|
||||
char desc[512];
|
||||
char url[256];
|
||||
char license[128];
|
||||
char builddate[32];
|
||||
char installdate[32];
|
||||
char packager[64];
|
||||
|
@ -60,6 +59,7 @@ typedef struct __pkginfo_t {
|
|||
unsigned short scriptlet;
|
||||
unsigned short force;
|
||||
unsigned short reason;
|
||||
PMList *license;
|
||||
PMList *replaces;
|
||||
PMList *groups;
|
||||
PMList *files;
|
||||
|
@ -68,6 +68,10 @@ typedef struct __pkginfo_t {
|
|||
PMList *requiredby;
|
||||
PMList *conflicts;
|
||||
PMList *provides;
|
||||
/* if the package has an associated filename on the local system
|
||||
* (eg, filename.pkg.tar.gz) then it will be stored here, otherwise NULL
|
||||
*/
|
||||
char *filename;
|
||||
} pkginfo_t;
|
||||
|
||||
typedef struct __depend_t {
|
||||
|
@ -89,7 +93,7 @@ void freepkg(pkginfo_t *pkg);
|
|||
int pkgcmp(const void *p1, const void *p2);
|
||||
int is_pkgin(pkginfo_t *needle, PMList *haystack);
|
||||
void dump_pkg_full(pkginfo_t *info);
|
||||
void dump_pkg_sync(pkginfo_t *info);
|
||||
void dump_pkg_sync(pkginfo_t *info, char *treename);
|
||||
int split_pkgname(char *pkgfile, char *name, char *version);
|
||||
|
||||
#endif
|
||||
|
|
693
src/pacman.c
693
src/pacman.c
File diff suppressed because it is too large
Load diff
23
src/pacman.h
23
src/pacman.h
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* pacman.h
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -21,22 +21,6 @@
|
|||
#ifndef _PAC_PACMAN_H
|
||||
#define _PAC_PACMAN_H
|
||||
|
||||
#ifndef PACVER
|
||||
#define PACVER "2.9.1"
|
||||
#endif
|
||||
|
||||
#ifndef PKGDIR
|
||||
#define PKGDIR "var/lib/pacman"
|
||||
#endif
|
||||
|
||||
#ifndef PACCONF
|
||||
#define PACCONF "/etc/pacman.conf"
|
||||
#endif
|
||||
|
||||
#ifndef CACHEDIR
|
||||
#define CACHEDIR "var/cache/pacman/pkg"
|
||||
#endif
|
||||
|
||||
/* Operations */
|
||||
#define PM_MAIN 1
|
||||
#define PM_ADD 2
|
||||
|
@ -49,13 +33,13 @@
|
|||
#define min(X, Y) ((X) < (Y) ? (X) : (Y))
|
||||
|
||||
int pacman_add(pacdb_t *db, PMList *targets, PMList *dependonly);
|
||||
int pacman_remove(pacdb_t *db, PMList *targets);
|
||||
int pacman_remove(pacdb_t *db, PMList *targets, PMList *skiplist);
|
||||
int pacman_upgrade(pacdb_t *db, PMList *targets, PMList *dependonly);
|
||||
int pacman_query(pacdb_t *db, PMList *targets);
|
||||
int pacman_sync(pacdb_t *db, PMList *targets);
|
||||
int pacman_deptest(pacdb_t *db, PMList *targets);
|
||||
|
||||
PMList* sortbydeps(PMList *targets);
|
||||
PMList* sortbydeps(PMList *targets, int mode);
|
||||
PMList* checkdeps(pacdb_t *db, unsigned short op, PMList *targets);
|
||||
PMList* removedeps(pacdb_t *db, PMList *targs);
|
||||
int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *sync, PMList *list, PMList *trail);
|
||||
|
@ -69,7 +53,6 @@ int parseconfig(char *configfile);
|
|||
void usage(int op, char *myname);
|
||||
void version(void);
|
||||
|
||||
void vprint(char *fmt, ...);
|
||||
void logaction(FILE *fp, char *fmt, ...);
|
||||
char* buildstring(PMList *strlist);
|
||||
int yesno(char* fmt, ...);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* pacsync.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -28,12 +28,12 @@
|
|||
#include <sys/time.h>
|
||||
#include <ftplib.h>
|
||||
/* pacman */
|
||||
#include "pacconf.h"
|
||||
#include "list.h"
|
||||
#include "package.h"
|
||||
#include "db.h"
|
||||
#include "util.h"
|
||||
#include "pacsync.h"
|
||||
#include "pacman.h"
|
||||
|
||||
/* progress bar */
|
||||
static int log_progress(netbuf *ctl, int xfered, void *arg);
|
||||
|
@ -52,6 +52,8 @@ extern char *pmo_xfercommand;
|
|||
|
||||
extern unsigned short pmo_proxyport;
|
||||
extern unsigned short pmo_nopassiveftp;
|
||||
extern unsigned short pmo_noprogressbar;
|
||||
extern unsigned short pmo_chomp;
|
||||
|
||||
/* sync servers */
|
||||
extern PMList *pmc_syncs;
|
||||
|
@ -205,7 +207,7 @@ int downloadfiles_forreal(PMList *servers, const char *localpath,
|
|||
char *host;
|
||||
unsigned port;
|
||||
host = (pmo_proxyhost) ? pmo_proxyhost : server->server;
|
||||
port = (pmo_proxyhost) ? pmo_proxyport : 80;
|
||||
port = (pmo_proxyport) ? pmo_proxyport : 80;
|
||||
if(strchr(host, ':')) {
|
||||
vprint("connecting to %s\n", host);
|
||||
} else {
|
||||
|
@ -306,7 +308,7 @@ int downloadfiles_forreal(PMList *servers, const char *localpath,
|
|||
if(ptr && (ptr-fn) < 24) {
|
||||
sync_fnm[ptr-fn] = '\0';
|
||||
}
|
||||
ptr = strstr(fn, ".pkg.tar.gz");
|
||||
ptr = strstr(fn, PKGEXT);
|
||||
if(ptr && (ptr-fn) < 24) {
|
||||
sync_fnm[ptr-fn] = '\0';
|
||||
}
|
||||
|
@ -440,6 +442,13 @@ int downloadfiles_forreal(PMList *servers, const char *localpath,
|
|||
snprintf(completefile, PATH_MAX, "%s/%s", localpath, fn);
|
||||
rename(output, completefile);
|
||||
} else if(filedone < 0) {
|
||||
if(!pmo_xfercommand) {
|
||||
if(!strcmp(server->protocol, "ftp") && !pmo_proxyhost) {
|
||||
FtpQuit(control);
|
||||
} else if(!strcmp(server->protocol, "http") || (pmo_proxyhost && strcmp(server->protocol, "file"))) {
|
||||
HttpQuit(control);
|
||||
}
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
printf("\n");
|
||||
|
@ -469,6 +478,15 @@ static int log_progress(netbuf *ctl, int xfered, void *arg)
|
|||
int i, cur;
|
||||
struct timeval t1;
|
||||
float timediff;
|
||||
/* a little hard to conceal easter eggs in open-source software, but
|
||||
* they're still fun. ;)
|
||||
*/
|
||||
static unsigned short mouth;
|
||||
static unsigned int lastcur = 0;
|
||||
|
||||
if(pmo_noprogressbar) {
|
||||
return(1);
|
||||
}
|
||||
|
||||
gettimeofday(&t1, NULL);
|
||||
if(xfered+offset == fsz) {
|
||||
|
@ -501,13 +519,39 @@ static int log_progress(netbuf *ctl, int xfered, void *arg)
|
|||
printf(" %s [", sync_fnm);
|
||||
cur = (int)((maxcols-64)*pct/100);
|
||||
for(i = 0; i < maxcols-64; i++) {
|
||||
if(pmo_chomp) {
|
||||
if(i < cur) {
|
||||
printf("-");
|
||||
} else {
|
||||
if(i == cur) {
|
||||
if(lastcur == cur) {
|
||||
if(mouth) {
|
||||
printf("\033[1;33mC\033[m");
|
||||
} else {
|
||||
printf("\033[1;33mc\033[m");
|
||||
}
|
||||
} else {
|
||||
mouth = mouth == 1 ? 0 : 1;
|
||||
if(mouth) {
|
||||
printf("\033[1;33mC\033[m");
|
||||
} else {
|
||||
printf("\033[1;33mc\033[m");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
printf("\033[0;37m*\033[m");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
(i < cur) ? printf("#") : printf(" ");
|
||||
}
|
||||
}
|
||||
if(rate > 1000) {
|
||||
printf("] %3d%% %6dK %6.0fK/s %02d:%02d:%02d\r", pct, ((xfered+offset) / 1024), rate, eta_h, eta_m, eta_s);
|
||||
} else {
|
||||
printf("] %3d%% %6dK %6.1fK/s %02d:%02d:%02d\r", pct, ((xfered+offset) / 1024), rate, eta_h, eta_m, eta_s);
|
||||
}
|
||||
lastcur = cur;
|
||||
fflush(stdout);
|
||||
return(1);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* pacsync.h
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* rpmvercmp.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* rpmvercmp.h
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
|
202
src/strhash.c
Normal file
202
src/strhash.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/* evtgen string hash functions.
|
||||
Copyright (C) 2003 Julien Olivain and LSV, CNRS UMR 8643 & ENS Cachan.
|
||||
|
||||
This file is part of evtgen.
|
||||
|
||||
evtgen 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 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
evtgen 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 evtgen; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/* Copyright (C) 2004 Tommi Rantala <tommi.rantala@cs.helsinki.fi>
|
||||
*
|
||||
* Modified for usage in Pacman.
|
||||
*/
|
||||
|
||||
/*
|
||||
** strhash.c -- string hash utility functions
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "list.h"
|
||||
#include "strhash.h"
|
||||
|
||||
void strhash_add_list(strhash_t *hash, PMList* list)
|
||||
{
|
||||
for(; list; list = list->next) {
|
||||
strhash_add(hash, list->data, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
strhash_t* new_strhash(size_t hsize)
|
||||
{
|
||||
strhash_t *h;
|
||||
|
||||
MALLOC(h, sizeof(strhash_t));
|
||||
h->size = hsize;
|
||||
h->elmts = 0;
|
||||
h->hash = DEFAULT_STRHASH_FUNCTION;
|
||||
MALLOC(h->htable, hsize * sizeof(strhash_elmt_t *));
|
||||
memset(h->htable, 0, hsize * sizeof(strhash_elmt_t *));
|
||||
|
||||
return(h);
|
||||
}
|
||||
|
||||
void clear_strhash(strhash_t *hash)
|
||||
{
|
||||
int i;
|
||||
strhash_elmt_t *tmp;
|
||||
strhash_elmt_t *tmp_next;
|
||||
|
||||
for(i = 0; i < hash->size; i++) {
|
||||
tmp = hash->htable[i];
|
||||
while(tmp) {
|
||||
tmp_next = tmp->next;
|
||||
free(tmp);
|
||||
tmp = tmp_next;
|
||||
}
|
||||
}
|
||||
hash->elmts = 0;
|
||||
memset(hash->htable, 0, hash->size * sizeof(void *));
|
||||
}
|
||||
|
||||
void free_strhash(strhash_t *hash)
|
||||
{
|
||||
int i;
|
||||
strhash_elmt_t *tmp;
|
||||
strhash_elmt_t *tmp_next;
|
||||
|
||||
for(i = 0; i < hash->size; i++) {
|
||||
tmp = hash->htable[i];
|
||||
while(tmp) {
|
||||
tmp_next = tmp->next;
|
||||
free(tmp);
|
||||
tmp = tmp_next;
|
||||
}
|
||||
}
|
||||
|
||||
free(hash->htable);
|
||||
free(hash);
|
||||
}
|
||||
|
||||
void strhash_add(strhash_t *hash, char *key, char *data)
|
||||
{
|
||||
strhash_elmt_t *elmt;
|
||||
unsigned long hcode;
|
||||
|
||||
MALLOC(elmt, sizeof(strhash_elmt_t));
|
||||
elmt->key = key;
|
||||
elmt->data = data;
|
||||
|
||||
hcode = hash->hash(key) % hash->size;
|
||||
elmt->next = hash->htable[hcode];
|
||||
hash->htable[hcode] = elmt;
|
||||
hash->elmts++;
|
||||
}
|
||||
|
||||
void strhash_remove(strhash_t *hash, char *key)
|
||||
{
|
||||
unsigned long hcode;
|
||||
strhash_elmt_t *elmt;
|
||||
strhash_elmt_t *prev = NULL;
|
||||
|
||||
hcode = hash->hash(key) % hash->size;
|
||||
|
||||
elmt = hash->htable[hcode];
|
||||
for(; elmt; elmt = elmt->next) {
|
||||
if(!strcmp(key, elmt->key)) {
|
||||
if(prev) {
|
||||
prev->next = elmt->next;
|
||||
} else {
|
||||
hash->htable[hcode] = elmt->next;
|
||||
}
|
||||
FREE(elmt);
|
||||
return;
|
||||
}
|
||||
prev = elmt;
|
||||
}
|
||||
}
|
||||
|
||||
/* 1: Yes, the key exists in the hash table.
|
||||
* 0: No, it's not here.
|
||||
*/
|
||||
int strhash_isin(strhash_t *hash, char* key)
|
||||
{
|
||||
strhash_elmt_t *elmt;
|
||||
|
||||
elmt = hash->htable[hash->hash(key) % hash->size];
|
||||
for(; elmt; elmt = elmt->next) {
|
||||
if(!strcmp(key, elmt->key)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* strhash_get(strhash_t *hash, char* key)
|
||||
{
|
||||
strhash_elmt_t *elmt;
|
||||
|
||||
elmt = hash->htable[hash->hash(key) % hash->size];
|
||||
for(; elmt; elmt = elmt->next) {
|
||||
if(!strcmp(key, elmt->key)) {
|
||||
return elmt->data;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
** fast hash function samples
|
||||
*/
|
||||
unsigned long strhash_pjw(char *key)
|
||||
{
|
||||
unsigned long h;
|
||||
unsigned long g;
|
||||
|
||||
h = 0;
|
||||
while(*key) {
|
||||
h = (h << 4) + *key++;
|
||||
if((g = h & 0xF0000000U) != 0) {
|
||||
h = h ^ (g >> 24);
|
||||
h = h ^ g;
|
||||
}
|
||||
}
|
||||
|
||||
return (h);
|
||||
}
|
||||
|
||||
int strhash_collide_count(strhash_t *hash)
|
||||
{
|
||||
int count;
|
||||
int i;
|
||||
|
||||
count = 0;
|
||||
for(i = 0; i < hash->size; i++) {
|
||||
strhash_elmt_t *tmp;
|
||||
|
||||
for(tmp = hash->htable[i]; tmp; tmp = tmp->next) {
|
||||
if(tmp->next) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(count);
|
||||
}
|
66
src/strhash.h
Normal file
66
src/strhash.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
/* evtgen string hash headers.
|
||||
Copyright (C) 2003 Julien Olivain and LSV, CNRS UMR 8643 & ENS Cachan.
|
||||
|
||||
This file is part of evtgen.
|
||||
|
||||
evtgen 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 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
evtgen 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 evtgen; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/* Copyright (C) 2004 Tommi Rantala <tommi.rantala@cs.helsinki.fi>
|
||||
*
|
||||
* Modified for usage in Pacman.
|
||||
*/
|
||||
|
||||
/*
|
||||
** strhash.h --
|
||||
*/
|
||||
|
||||
#ifndef STRHASH_H
|
||||
#define STRHASH_H
|
||||
|
||||
#define DEFAULT_STRHASH_FUNCTION strhash_pjw
|
||||
|
||||
typedef struct strhash_elmt_s strhash_elmt_t;
|
||||
struct strhash_elmt_s
|
||||
{
|
||||
char *key;
|
||||
char *data;
|
||||
strhash_elmt_t *next;
|
||||
};
|
||||
|
||||
typedef unsigned long (*strhashfunc_t)(char *key);
|
||||
|
||||
typedef struct strhash_s strhash_t;
|
||||
struct strhash_s
|
||||
{
|
||||
strhash_elmt_t **htable;
|
||||
size_t size;
|
||||
int elmts;
|
||||
strhashfunc_t hash;
|
||||
};
|
||||
|
||||
void strhash_add_list(strhash_t *hash, PMList* list);
|
||||
strhash_t *new_strhash(size_t hsize);
|
||||
void free_strhash(strhash_t *hash);
|
||||
void clear_strhash(strhash_t *hash);
|
||||
void strhash_remove(strhash_t *hash, char *key);
|
||||
void strhash_add(strhash_t *hash, char *key, char *data);
|
||||
int strhash_isin(strhash_t *hash, char* key);
|
||||
char* strhash_get(strhash_t *hash, char* key);
|
||||
int strhash_collide_count(strhash_t *hash);
|
||||
|
||||
unsigned long strhash_pjw(char *key);
|
||||
|
||||
#endif /* STRHASH_H */
|
142
src/util.c
142
src/util.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* util.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -30,8 +30,25 @@
|
|||
#include <dirent.h>
|
||||
#include <zlib.h>
|
||||
#include <libtar.h>
|
||||
#include <regex.h>
|
||||
#include "util.h"
|
||||
|
||||
extern unsigned short pmo_verbose;
|
||||
|
||||
/* Check verbosity option and, if set, print the
|
||||
* string to stdout
|
||||
*/
|
||||
void vprint(char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
if(pmo_verbose) {
|
||||
va_start(args, fmt);
|
||||
vprintf(fmt, args);
|
||||
va_end(args);
|
||||
fflush(stdout);
|
||||
}
|
||||
}
|
||||
|
||||
/* borrowed and modified from Per Liden's pkgutils (http://crux.nu) */
|
||||
long gzopen_frontend(char *pathname, int oflags, int mode)
|
||||
{
|
||||
|
@ -203,6 +220,103 @@ int rmrf(char *path)
|
|||
return(0);
|
||||
}
|
||||
|
||||
/* Convert a relative path to an absolute path
|
||||
*
|
||||
* This function was taken from the pathconvert library and massaged
|
||||
* to match our coding style. The pathconvert version is
|
||||
* Copyright (c) 1997 Shigio Yamaguchi.
|
||||
*/
|
||||
char *rel2abs(const char *path, char *result, const size_t size)
|
||||
{
|
||||
const char *pp, *bp;
|
||||
/* endp points the last position which is safe in the result buffer. */
|
||||
const char *endp = result + size - 1;
|
||||
char *rp;
|
||||
int length;
|
||||
char base[PATH_MAX+1];
|
||||
|
||||
getcwd(base, PATH_MAX);
|
||||
|
||||
if(*path == '/') {
|
||||
if(strlen(path) >= size) {
|
||||
goto erange;
|
||||
}
|
||||
strcpy(result, path);
|
||||
goto finish;
|
||||
} else if(*base != '/' || !size) {
|
||||
errno = EINVAL;
|
||||
return (NULL);
|
||||
} else if(size == 1) {
|
||||
goto erange;
|
||||
}
|
||||
|
||||
length = strlen(base);
|
||||
|
||||
if(!strcmp(path, ".") || !strcmp(path, "./")) {
|
||||
if(length >= size) {
|
||||
goto erange;
|
||||
}
|
||||
strcpy(result, base);
|
||||
/* rp points the last char. */
|
||||
rp = result + length - 1;
|
||||
/* remove the last '/'. */
|
||||
if(*rp == '/') {
|
||||
if(length > 1) {
|
||||
*rp = 0;
|
||||
}
|
||||
} else {
|
||||
rp++;
|
||||
}
|
||||
/* rp point NULL char */
|
||||
if(*++path == '/') {
|
||||
/* Append '/' to the tail of path name. */
|
||||
*rp++ = '/';
|
||||
if(rp > endp) {
|
||||
goto erange;
|
||||
}
|
||||
*rp = 0;
|
||||
}
|
||||
goto finish;
|
||||
}
|
||||
bp = base + length;
|
||||
if(*(bp - 1) == '/') {
|
||||
--bp;
|
||||
}
|
||||
/* up to root. */
|
||||
for(pp = path; *pp && *pp == '.'; ) {
|
||||
if(!strncmp(pp, "../", 3)) {
|
||||
pp += 3;
|
||||
while(bp > base && *--bp != '/');
|
||||
} else if(!strncmp(pp, "./", 2)) {
|
||||
pp += 2;
|
||||
} else if(!strncmp(pp, "..\0", 3)) {
|
||||
pp += 2;
|
||||
while(bp > base && *--bp != '/');
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* down to leaf. */
|
||||
length = bp - base;
|
||||
if(length >= size) {
|
||||
goto erange;
|
||||
}
|
||||
strncpy(result, base, length);
|
||||
rp = result + length;
|
||||
if(*pp || *(pp - 1) == '/' || length == 0) {
|
||||
*rp++ = '/';
|
||||
}
|
||||
if(rp + strlen(pp) > endp) {
|
||||
goto erange;
|
||||
}
|
||||
strcpy(rp, pp);
|
||||
finish:
|
||||
return result;
|
||||
erange:
|
||||
errno = ERANGE;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* output a string, but wrap words properly with a specified indentation
|
||||
*/
|
||||
void indentprint(char *str, int indent)
|
||||
|
@ -265,6 +379,11 @@ char* strtoupper(char *str)
|
|||
char* trim(char *str)
|
||||
{
|
||||
char *pch = str;
|
||||
|
||||
if(*str == '\0')
|
||||
/* string is empty, so we're done. */
|
||||
return(str);
|
||||
|
||||
while(isspace(*pch)) {
|
||||
pch++;
|
||||
}
|
||||
|
@ -272,13 +391,18 @@ char* trim(char *str)
|
|||
memmove(str, pch, (strlen(pch) + 1));
|
||||
}
|
||||
|
||||
/* check if there wasn't anything but whitespace in the string. */
|
||||
if(*str == '\0') {
|
||||
return(str);
|
||||
}
|
||||
|
||||
pch = (char*)(str + (strlen(str) - 1));
|
||||
while(isspace(*pch)) {
|
||||
pch--;
|
||||
}
|
||||
*++pch = '\0';
|
||||
|
||||
return str;
|
||||
return(str);
|
||||
}
|
||||
|
||||
/* A cheap grep for text files, returns 1 if a substring
|
||||
|
@ -304,5 +428,19 @@ int grep(const char *fn, const char *needle)
|
|||
return(0);
|
||||
}
|
||||
|
||||
int reg_match(char *string, char *pattern)
|
||||
{
|
||||
int result;
|
||||
regex_t reg;
|
||||
|
||||
if (regcomp(®, pattern, REG_EXTENDED | REG_NOSUB | REG_ICASE) != 0)
|
||||
{
|
||||
fprintf(stderr, "error: %s is not a valid regular expression.\n", pattern);
|
||||
exit(1);
|
||||
}
|
||||
result = regexec(®, string, 0, 0, 0);
|
||||
regfree(®);
|
||||
return(!(result));
|
||||
}
|
||||
|
||||
/* vim: set ts=2 sw=2 noet: */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* util.h
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -28,15 +28,18 @@
|
|||
|
||||
#define FREE(p) { if (p) { free(p); (p)= NULL; }}
|
||||
|
||||
void vprint(char *fmt, ...);
|
||||
long gzopen_frontend(char *pathname, int oflags, int mode);
|
||||
int unpack(char *archive, const char *prefix, const char *fn);
|
||||
int copyfile(char *src, char *dest);
|
||||
int makepath(char *path);
|
||||
int rmrf(char *path);
|
||||
char *rel2abs(const char *path, char *result, const size_t size);
|
||||
void indentprint(char *str, int indent);
|
||||
char* trim(char *str);
|
||||
char* strtoupper(char *str);
|
||||
int grep(const char *fn, const char *needle);
|
||||
int reg_match(char *string, char *pattern);
|
||||
|
||||
#endif
|
||||
/* vim: set ts=2 sw=2 noet: */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* vercmp.c
|
||||
*
|
||||
* Copyright (c) 2002-2004 by Judd Vinet <jvinet@zeroflux.org>
|
||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||
*
|
||||
* 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
|
||||
|
|
Loading…
Add table
Reference in a new issue