Imported from pacman-2.4.tar.gz

This commit is contained in:
Judd Vinet 2003-04-11 16:58:50 +00:00
parent 185ce5454e
commit 37e13ea2d0
21 changed files with 1987 additions and 1684 deletions

View file

@ -1,7 +1,20 @@
VERSION DESCRIPTION
------------------------------------------------------------------
2.4 - Added getopt-style options to makeworld
- Added -w <destdir> to makepkg
- makeworld now properly handles packages with --builddeps
- Added patches from Aurelien Foret:
- Cascading package removals. -Rc will remove a package and
all packages that require it
- Support for getopt-style options in makepkg
- the REQUIREDBY field is now updated when a package is
removed with --nodeps, then re-installed.
- Avoids duplicate dependency checks with sync
- Added a "NoPassiveFtp" option in pacman.conf
- Improvements to the --query listings
2.3.2 - Added patches from Aurelien Foret:
- FTP resume feature
- removed the hit-^C-and-delete-the-downloading-file safety
- IgnorePkg option in pacman.conf
- FTPAGENT setting in makepkg.conf
- Added --cleancache option to makepkg

View file

@ -34,8 +34,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
PACVER = 2.3.2
LIBTAR_VERSION = 1.2.5
PACVER = 2.4
TOPDIR = @srcdir@
SRCDIR = $(TOPDIR)/src/
@ -44,11 +43,9 @@ MANSRC = $(TOPDIR)/doc/
SCRDIR = $(TOPDIR)/scripts/
CXX = @CC@
CXXFLAGS += @CFLAGS@ -Wall -pedantic -fno-exceptions -fno-rtti \
-D_GNU_SOURCE -DPACVER=\"$(PACVER)\" -I. \
-Ilibtar-$(LIBTAR_VERSION)/lib -Ilibftp
LDFLAGS += @LDFLAGS@ -static -Llibtar-$(LIBTAR_VERSION)/lib -Llibftp \
-lftp -ltar -lz
CXXFLAGS += @CFLAGS@ -g -Wall -pedantic -fno-exceptions -fno-rtti \
-D_GNU_SOURCE -DPACVER=\"$(PACVER)\" -I. -Ilibftp
LDFLAGS += @LDFLAGS@ -static -Llibftp -lftp -ltar -lz
SRCS = $(SRCDIR)pacman.c \
$(SRCDIR)db.c \
@ -70,7 +67,7 @@ OBJECTS = $(OBJDIR)pacman.o \
$(OBJDIR)md5.o \
$(OBJDIR)md5driver.o
all: libtar ftplib pacman vercmp convertdb man
all: ftplib pacman vercmp convertdb man
pacman: $(OBJECTS)
$(CXX) $(OBJECTS) -o $@ $(LDFLAGS)
@ -96,12 +93,6 @@ dist: distclean
ftplib:
(cd libftp; make libftp.a)
libtar:
(tar xzf libtar-$(LIBTAR_VERSION).tar.gz; \
cd libtar-$(LIBTAR_VERSION); \
LDFLAGS="" ./configure --disable-encap --disable-encap-install; \
make;)
install: pacman vercmp convertdb man
$(INSTALL) -D -m0755 pacman $(DESTDIR)$(BINDIR)/pacman
$(INSTALL) -D -m0755 vercmp $(DESTDIR)$(BINDIR)/vercmp
@ -120,6 +111,5 @@ clean:
distclean: clean
rm -f pacman convertdb vercmp
rm -rf libtar-$(LIBTAR_VERSION)
# End of file

3
README
View file

@ -2,6 +2,7 @@
pacman - Package Management Utility
by Judd Vinet <jvinet@zeroflux.org>
<http://www.archlinux.org/pacman/>
DESCRIPTION:
------------
@ -37,7 +38,7 @@ If your man files are located in a directory other than /usr/man, you may
want to edit Makefile and modify the MANDIR line accordingly.
Note: Since pacman is compiled statically, you will need the static libraries
for glibc and zlib.
for libtar, glibc and zlib.
BUGS:

View file

@ -41,7 +41,8 @@
zero-length file name argument. */
#undef HAVE_LSTAT_EMPTY_STRING_BUG
/* Define to 1 if your system has a working `malloc' function. */
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
to 0 otherwise. */
#undef HAVE_MALLOC
/* Define to 1 if you have the `memmove' function. */
@ -146,6 +147,9 @@
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to rpl_malloc if the replacement function should be used. */
#undef malloc
/* Define to `int' if <sys/types.h> does not define. */
#undef mode_t

2531
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -1,35 +1,46 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([acconfig.h])
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_CXX
# Checks for libraries.
# AC_CHECK_LIB([tar], [tar_open])
AC_CHECK_LIB([z], [gzread])
AC_CHECK_LIB([c], [printf], , AC_MSG_ERROR([your libc is broken!]))
AC_CHECK_LIB([tar], [tar_open], , AC_MSG_ERROR([missing libtar]))
AC_CHECK_LIB([z], [gzread], , AC_MSG_ERROR([missing zlib]))
# Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h string.h unistd.h])
AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_MODE_T
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_TYPE_UID_T
# Checks for library functions.
AC_FUNC_ALLOCA
AC_FUNC_CLOSEDIR_VOID
AC_FUNC_LSTAT
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_FUNC_SELECT_ARGTYPES
AC_TYPE_SIGNAL
AC_FUNC_STAT
AC_FUNC_VPRINTF
AC_CHECK_FUNCS([getpass memmove mkdir realpath rmdir strdup strerror strstr strverscmp])
AC_CHECK_FUNCS([gethostbyname memmove memset mkdir realpath rmdir select socket strcasecmp strchr strdup strerror strstr strverscmp])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

View file

@ -1,365 +0,0 @@
Content-type: text/html
<HTML><HEAD><TITLE>Manpage of makepkg</TITLE>
</HEAD><BODY>
<H1>makepkg</H1>
Section: (8)<BR>Updated: March 3, 2003<BR><A HREF="#index">Index</A>
<A HREF="http://localhost/cgi-bin/man/man2html">Return to Main Contents</A><HR>
<A NAME="lbAB">&nbsp;</A>
<H2>NAME</H2>
makepkg - package build utility
<A NAME="lbAC">&nbsp;</A>
<H2>SYNOPSIS</H2>
<B>makepkg</B>
<A NAME="lbAD">&nbsp;</A>
<H2>DESCRIPTION</H2>
<B>makepkg</B> will build packages for you. All it needs is
a build-capable linux platform, wget, and some build scripts. The advantage
to a script-based build is that you only really do the work once. Once you
have the build script for a package, you just need to run makepkg and it
will do the rest: download source files, check dependencies,
configure the buildtime settings, build the package, install the package
into a temporary root, make customizations, generate meta-info, and package
the whole thing up for <B>pacman</B> to use.
<P>
<B>makeworld</B> can be used to rebuild an entire package group, or the
entire build tree.
<A NAME="lbAE">&nbsp;</A>
<H2>BUILD PROCESS (or How To Build Your Own Packages)</H2>
Start in an isolated directory (ie, it's not used for anything other
than building this package). The build script should be called PKGBUILD
and it should bear resemblance to the example below.
<P>
<B>NOTE:</B> If you have a local copy of the Arch Build System (ABS) tree
on your computer, you can copy the PKGBUILD.proto file to your new package
build directory and edit it from there. To acquire/sync the ABS tree, use
the <B>abs</B> script included with pacman/makepkg.
<P>
<DL COMPACT>
<DT><DT></DL>
<A NAME="lbAF">&nbsp;</A>
<H2>PKGBUILD Example:</H2>
<DD>
<DD>
<DL COMPACT><DT><DD>
<PRE>
pkgname=modutils
pkgver=2.4.13
pkgrel=1
pkgdesc=&quot;Utilities for inserting and removing modules from the linux kernel&quot;
backup=(etc/modules.conf)
depends=('glibc&gt;=2.2.5' 'bash' 'zlib')
source=(<A HREF="ftp://ftp.server.com/$pkgname-$pkgver.tar.gz">ftp://ftp.server.com/$pkgname-$pkgver.tar.gz</A> modules.conf)
build() {
cd $startdir/src/$pkgname-$pkgver
./configure --prefix=/usr
make || return 1
make prefix=$startdir/pkg/usr install
# copy our custom modules.conf into the package root
mkdir -p $startdir/pkg/etc
cp ../modules.conf $startdir/pkg/etc
}
</PRE>
</DL>
<P>
As you can see, the setup is fairly simple. The first three lines define
the package name and version info. They also define the final package name
which will be of the form <I>$pkgname-$pkgver-$pkgrel.pkg.tar.gz</I>. The fourth
line provides a brief description of the package. These four lines should
be present in every PKGBUILD script.
<P>
The line with <I>backup=</I> specifies files that should be treated specially
when removing or upgrading packages. See <B>HANDLING CONFIG FILES</B> in
the <I>pacman</I> manpage for more information on this.
<P>
The sixth line lists the dependencies for this package. In order to build/run
the package, all dependencies must be satisifed first. makepkg will check this
before attempting to build the package.
<P>
Once your PKGBUILD is created, you can run <I>makepkg</I> from the build directory.
makepkg will then check dependencies and look for the source files required to
build. If some are missing it will attempt to download them, provided there is
a fully-qualified URL in the <I>source</I> array.
<P>
The sources are then extracted into a directory called ./src and
the <I>build</I> function is called. This is where all package configuration,
building, and installing should be done. Any customization will likely take
place here.
<P>
After a package is built, the <I>build</I> function must install the package
files into a special package root, which can be referenced by <B>$startdir/pkg</B>
in the <I>build</I> function. The typical way to do this is one of the following:
<DL COMPACT><DT><DD>
<PRE>
make DESTDIR=$startdir/pkg install
or
make prefix=$startdir/pkg/usr install
</PRE>
</DL>
Notice that the &quot;/usr&quot; portion should be present with &quot;prefix&quot;, but not &quot;DESTDIR&quot;.
<P>
Once the package is successfully installed into the package root, <I>makepkg</I>
will remove some directories (as per Arch Linux package guidelines; if you use
this elsewhere, feel free to change it) like /usr/doc and /usr/info. It will
then strip debugging info from libraries and binaries and generate a meta-info
file. Finally, it will compress everything into a .pkg.tar.gz file and leave it
in the directory you ran <B>makepkg</B> from.
<P>
At this point you should have a package file in the current directory, named
something like name-version-release.pkg.tar.gz. Done!
<P>
<A NAME="lbAG">&nbsp;</A>
<H2>Install/Upgrade/Remove Scripting</H2>
Pacman has the ability to store and execute a package-specific script when it
installs, removes, or upgrades a package. This allows a package to &quot;configure
itself&quot; after installation and do the opposite right before it is removed.
<P>
The exact time the script is run varies with each operation:
<DL COMPACT>
<DT><B>post_install</B>
<DD>
script is run right after files are installed.
<P>
<DT><B>post_upgrade</B>
<DD>
script is run after all files have been upgraded.
<P>
<DT><B>pre_remove</B>
<DD>
script is run right before files are removed.
<P>
To use this feature, just create a file (eg, pkgname.install) and put it in
the same directory as the PKGBUILD script. Then use the <I>install</I> directive:
<DL COMPACT><DT><DD>
<PRE>
install=pkgname.install
</PRE>
</DL>
<P>
The install script does not need to be specified in the <I>source</I> array.
<P>
<DT><DT></DL>
<A NAME="lbAH">&nbsp;</A>
<H2>Install scripts must follow this format:</H2>
<DD>
<DD>
<DL COMPACT><DT><DD>
<PRE>
# arg 1: the new package version
post_install() {
#
# do post-install stuff here
#
/bin/true
}
# arg 1: the new package version
# arg 2: the old package version
post_upgrade() {
#
# do post-upgrade stuff here
#
/bin/true
}
# arg 1: the old package version
pre_remove() {
#
# do pre-remove stuff here
#
/bin/true
}
op=$1
shift
$op $*
</PRE>
</DL>
<P>
This template is also available in your ABS tree (/usr/abs/install.proto).
<P>
<A NAME="lbAI">&nbsp;</A>
<H2>PKGBUILD Directives</H2>
<DL COMPACT>
<DT><B>pkgname</B>
<DD>
The name of the package. This has be a unix-friendly name as it will be
used in the package filename.
<P>
<DT><B>pkgver</B>
<DD>
This is the version of the software as released from the author (eg, 2.7.1).
<P>
<DT><B>pkgrel</B>
<DD>
This is the release number specific to Arch Linux packages.
<P>
<DT><B>pkgdesc</B>
<DD>
This should be a brief description of the package and its functionality.
<P>
<DT><B>backup</B>
<DD>
A space-delimited array of filenames (without a preceding slash). The
<I>backup</I> line will be propagated to the package meta-info file for
pacman. This will designate all files listed there to be backed up if this
package is ever removed from a system. See <B>HANDLING CONFIG FILES</B> in
the <I>pacman</I> manpage for more information.
<P>
<DT><B>install</B>
<DD>
Specified a special install script that is to be included in the package.
This file should reside in the same directory as the PKGBUILD, and will be
copied into the package by makepkg. It does not need to be included in the
<I>source</I> array. (eg, install=modutils.install)
<P>
<DT><B>depends</B>
<DD>
An array of packages that this package depends on to build and run. Packages
in this list should be surrounded with single quotes and contain at least the
package name. They can also include a version requirement of the form
<B>name&lt;&gt;version</B>, where &lt;&gt; is one of these three comparisons: <B>&gt;=</B>
(greater than equal to), <B>&lt;=</B> (less than or equal to), or <B>=</B> (equal to).
See the PKGBUILD example above for an example of the <I>depends</I> directive.
<P>
<DT><B>conflicts</B>
<DD>
An array of packages that will conflict with this package (ie, they cannot both
be installed at the same time). This directive follows the same format as
<I>depends</I> except you cannot specify versions here, only package names.
<P>
<DT><B>source</B>
<DD>
The <I>source</I> line is an array of source files required to build the
package. Source files must reside in the same directory as the PKGBUILD
file, unless they have a fully-qualified URL. Then if the source file
does not already exist in /var/cache/pacman/src, the file is downloaded
by wget.
<P>
</DL>
<A NAME="lbAJ">&nbsp;</A>
<H2>MAKEPKG OPTIONS</H2>
<DL COMPACT>
<DT><B>-c, --clean</B>
<DD>
Clean up leftover work files/directories after a successful build.
<DT><B>-i, --install</B>
<DD>
Install/Upgrade the package after a successful build.
<DT><B>-s, --syncdeps</B>
<DD>
Install missing dependencies using pacman. When makepkg finds missing
dependencies, it will run pacman to try and resolve them. If successful,
pacman will download the missing packages from a package repository and
install them for you.
<DT><B>-b, --builddeps</B>
<DD>
Build missing dependencies from source. When makepkg finds missing
dependencies, it will look for the dependencies' PKGBUILD files under
$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 <B>-b</B> and <B>-i</B> options.
<DT><B>-d, --nodeps</B>
<DD>
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.
<DT><B>-f, --force</B>
<DD>
<B>makepkg</B> will not build a package if a <I>pkgname-pkgver-pkgrel.pkg.tar.gz</I>
file already exists in the build directory. You can override this behaviour with
the <B>--force</B> switch.
<P>
</DL>
<A NAME="lbAK">&nbsp;</A>
<H2>CONFIGURATION</H2>
Configuration options are stored in <I>/etc/makepkg.conf</I>. This file is parsed
as a bash script, so you can export any special compiler flags you wish
to use. This is helpful for building for different architectures, or with
different optimizations.
<P>
<B>NOTE:</B> This does not guarantee that all package Makefiles will use
your exported variables. Some of them are flaky...
<A NAME="lbAL">&nbsp;</A>
<H2>SEE ALSO</H2>
<B>pacman</B> is the package manager that uses packages built by makepkg.
<P>
See the Arch Linux Documentation for package-building guidelines if you wish
to contribute packages to the Arch Linux project.
<A NAME="lbAM">&nbsp;</A>
<H2>AUTHOR</H2>
<PRE>
Judd Vinet &lt;<A HREF="mailto:jvinet@zeroflux.org">jvinet@zeroflux.org</A>&gt;
</PRE>
<P>
<HR>
<A NAME="index">&nbsp;</A><H2>Index</H2>
<DL>
<DT><A HREF="#lbAB">NAME</A><DD>
<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
<DT><A HREF="#lbAD">DESCRIPTION</A><DD>
<DT><A HREF="#lbAE">BUILD PROCESS (or How To Build Your Own Packages)</A><DD>
<DT><A HREF="#lbAF">PKGBUILD Example:</A><DD>
<DT><A HREF="#lbAG">Install/Upgrade/Remove Scripting</A><DD>
<DT><A HREF="#lbAH">Install scripts must follow this format:</A><DD>
<DT><A HREF="#lbAI">PKGBUILD Directives</A><DD>
<DT><A HREF="#lbAJ">MAKEPKG OPTIONS</A><DD>
<DT><A HREF="#lbAK">CONFIGURATION</A><DD>
<DT><A HREF="#lbAL">SEE ALSO</A><DD>
<DT><A HREF="#lbAM">AUTHOR</A><DD>
</DL>
<HR>
This document was created by
<A HREF="http://localhost/cgi-bin/man/man2html">man2html</A>,
using the manual pages.<BR>
Time: 17:22:11 GMT, March 04, 2003
</BODY>
</HTML>

View file

@ -1,8 +1,8 @@
.TH makepkg 8 "March 3, 2003" "makepkg #VERSION#" ""
.TH makepkg 8 "April 10, 2003" "makepkg #VERSION#" ""
.SH NAME
makepkg \- package build utility
.SH SYNOPSIS
\fBmakepkg\fP
\fBmakepkg [options] [build_script]\fP
.SH DESCRIPTION
\fBmakepkg\fP will build packages for you. All it needs is
a build-capable linux platform, wget, and some build scripts. The advantage
@ -13,8 +13,8 @@ configure the buildtime settings, build the package, install the package
into a temporary root, make customizations, generate meta-info, and package
the whole thing up for \fBpacman\fP to use.
\fBmakeworld\fP can be used to rebuild an entire package group, or the
entire build tree.
\fBmakeworld\fP can be used to rebuild an entire package group or the
entire build tree. See \fBmakeworld --help\fP for syntax.
.SH BUILD PROCESS (or How To Build Your Own Packages)
Start in an isolated directory (ie, it's not used for anything other
than building this package). The build script should be called PKGBUILD
@ -229,6 +229,9 @@ by wget.
.B "\-c, \-\-clean"
Clean up leftover work files/directories after a successful build.
.TP
.B "\-C, \-\-cleancache"
Removes all source files from the cache directory to free up diskspace.
.TP
.B "\-i, \-\-install"
Install/Upgrade the package after a successful build.
.TP
@ -254,6 +257,10 @@ process if all of the dependencies aren't installed.
\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
the \fB--force\fP switch.
.TP
.B "\-w <destdir>"
Write the resulting package file to the directory \fI<destdir>\fP instead of the
current working directory.
.SH CONFIGURATION
Configuration options are stored in \fI/etc/makepkg.conf\fP. This file is parsed

View file

@ -1,306 +0,0 @@
Content-type: text/html
<HTML><HEAD><TITLE>Manpage of pacman</TITLE>
</HEAD><BODY>
<H1>pacman</H1>
Section: (8)<BR>Updated: January 20, 2003<BR><A HREF="#index">Index</A>
<A HREF="http://localhost/cgi-bin/man/man2html">Return to Main Contents</A><HR>
<A NAME="lbAB">&nbsp;</A>
<H2>NAME</H2>
pacman - package manager utility
<A NAME="lbAC">&nbsp;</A>
<H2>SYNOPSIS</H2>
<B>pacman &lt;operation&gt; [options] &lt;package&gt; [package] ...</B>
<A NAME="lbAD">&nbsp;</A>
<H2>DESCRIPTION</H2>
<B>pacman</B> is a <I>package management</I> utility that tracks installed
packages on a linux system. It has simple dependency support and the ability
to connect to a remote ftp server and automatically upgrade packages on
the local system. pacman package are <I>gzipped tar</I> format.
<A NAME="lbAE">&nbsp;</A>
<H2>OPERATIONS</H2>
<DL COMPACT>
<DT><B>-A, --add</B>
<DD>
Add a package to the system. Package will be uncompressed
into the installation root and the database will be updated.
<DT><B>-R, --remove</B>
<DD>
Remove a package from the system. Files belonging to the
specified package will be deleted, and the database will
be updated. Most configuration files will be saved with a
<I>.pacsave</I> extension unless the <B>--nosave</B> option was
used.
<DT><B>-U, --upgrade</B>
<DD>
Upgrade a package. This is essentially a &quot;remove-then-add&quot;
process. See <B>HANDLING CONFIG FILES</B> for an explanation
on how pacman takes care of config files.
<DT><B>-F, --freshen</B>
<DD>
This is like --upgrade except that, unlike --upgrade, this will only
upgrade packages that are already installed on your system.
<DT><B>-Q, --query</B>
<DD>
Query the package database. This operation allows you to
view installed packages and their files, as well as meta-info
about individual packages (dependencies, conflicts, install date,
build date, size). This can be run against the local package
database or can be used on individual .tar.gz packages. See
<B>QUERY OPTIONS</B> below.
<DT><B>-S, --sync</B>
<DD>
Synchronize packages. With this function you can install packages
directly from the ftp servers, complete with all dependencies required
to run the packages. For example, <B>pacman -S qt</B> will download
qt and all the packages it depends on and install them. You could also use
<B>pacman -Su</B> to upgrade all packages that are out of date (see below).
<DT><B>-V, --version</B>
<DD>
Display version and exit.
<DT><B>-h, --help</B>
<DD>
Display syntax for the given operation. If no operation was
supplied then the general syntax is shown.
</DL>
<A NAME="lbAF">&nbsp;</A>
<H2>OPTIONS</H2>
<DL COMPACT>
<DT><B>-v, --verbose</B>
<DD>
Output more status and error messages.
<DT><B>-f, --force</B>
<DD>
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.
<DT><B>-d, --nodeps</B>
<DD>
Skips all dependency checks. Normally, pacman will always check
a package's dependency fields to ensure that all dependencies are
installed and there are no package conflicts in the system. This
switch disables these checks.
<DT><B>-n, --nosave</B>
<DD>
(only used with <B>--remove</B>)
Instructs pacman to ignore file backup designations. Normally, when
a file is about to be <I>removed</I> from the system the database is first
checked to see if the file should be renamed to a .pacsave extension. If
<B>--nosave</B> is used, these designations are ignored and the files are
removed.
<DT><B>-r, --root &lt;path&gt;</B>
<DD>
Specify alternative installation root (default is &quot;/&quot;). This
should <I>not</I> be used as a way to install software into
e.g. /usr/local instead of /usr. Instead this should be used
if you want to install a package on a temporary mounted partition,
which is &quot;owned&quot; by another system. By using this option you not only
specify where the software should be installed, but you also
specify which package database to use.
</DL>
<A NAME="lbAG">&nbsp;</A>
<H2>SYNC OPTIONS</H2>
<DL COMPACT>
<DT><B>-y, --refresh</B>
<DD>
Download a fresh copy of the master package list from the ftp server
defined in <I>/etc/pacman.conf</I>. This should typically be used each
time you use <B>--sysupgrade</B>.
<DT><B>-u, --sysupgrade</B>
<DD>
Upgrades all packages that are out of date. pacman will examine every
package installed on the system, and if a newer package exists on the
server it will upgrade. pacman will present a report of all packages
it wants to upgrade and will not proceed without user confirmation.
Dependencies are automatically resolved at this level and will be
installed/upgraded if necessary.
<DT><B>-s, --search &lt;string&gt;</B>
<DD>
This will search each package in the package list for names or descriptions
that contains &lt;string&gt;.
<DT><B>-w, --downloadonly</B>
<DD>
Retrieve all packages from the server, but do not install/upgrade anything.
<DT><B>-c, --clean</B>
<DD>
Remove packages from the cache. When pacman downloads packages,
it saves them in <I>/var/cache/pacman/pkg</I>. If you need to free up
diskspace, you can remove these packages by using the --clean option.
</DL>
<A NAME="lbAH">&nbsp;</A>
<H2>QUERY OPTIONS</H2>
<DL COMPACT>
<DT><B>-o, --owns &lt;file&gt;</B>
<DD>
Search for the package that owns &lt;file&gt;.
<DT><B>-l, --list</B>
<DD>
List all files owned by &lt;package&gt;. Multiple packages can be specified on
the command line.
<DT><B>-i, --info</B>
<DD>
Display information on a given package. If it is used with the <B>-p</B>
option then the .PKGINFO file will be printed.
<DT><B>-p, --file</B>
<DD>
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 <B>--info</B> and <B>--list</B>.
</DL>
<A NAME="lbAI">&nbsp;</A>
<H2>HANDLING CONFIG FILES</H2>
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
md5 hashes for each backup file to determine the required action:
one for the original file installed, one for the new file that's about
to be installed, and one for the actual file existing on the filesystem.
After comparing these 3 hashes, the follow scenarios can result:
<DL COMPACT>
<DT>original=<B>X</B>, current=<B>X</B>, new=<B>X</B><DD>
All three files are the same, so we win either way. Install the new file.
<DT>original=<B>X</B>, current=<B>X</B>, new=<B>Y</B><DD>
The current file is un-altered from the original but the new one is
different. Since the user did not ever modify the file, and the new
one may contain improvements/bugfixes, we install the new file.
<DT>original=<B>X</B>, current=<B>Y</B>, new=<B>X</B><DD>
Both package versions contain the exact same file, but the one
on the filesystem has been modified since. In this case, we leave
the current file in place.
<DT>original=<B>X</B>, current=<B>Y</B>, new=<B>Y</B><DD>
The new one is identical to the current one. Win win. Install the new file.
<DT>original=<B>X</B>, current=<B>Y</B>, new=<B>Z</B><DD>
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.
</DL>
<A NAME="lbAJ">&nbsp;</A>
<H2>CONFIGURATION</H2>
pacman will attempt to read <I>/etc/pacman.conf</I> each time it is invoked. This
configuration file is divided into sections or <I>repositories</I>. Each section
defines a package repository that pacman can use when searching for packages in
--sync mode. The exception to this is the <I>options</I> section, which defines
global options.
<DL COMPACT>
<DT></DL>
<A NAME="lbAK">&nbsp;</A>
<H2>Example:</H2>
<DD>
<DL COMPACT><DT><DD>
<PRE>
[options]
NoUpgrade = etc/passed etc/group etc/shadow
NoUpgrade = etc/fstab
[current]
Server = <A HREF="ftp://ftp.server.org/linux/archlinux/current">ftp://ftp.server.org/linux/archlinux/current</A>
Server = <A HREF="ftp://ftp.mirror.com/arch/current">ftp://ftp.mirror.com/arch/current</A>
[custom]
Server = <A HREF="local:///home/pkgs">local:///home/pkgs</A>
</PRE>
</DL>
All files listed with a <I>NoUpgrade</I> directive will never be touched during a package
install/upgrade. This directive is only valid in the options section.
<P>
Each repository section defines a section name and at least one location where the packages
can be found. The section name is defined by the string within square brackets (eg, the two
above are 'current' and 'custom'). Locations are defined with the <I>Server</I> directive and
follow a URL naming structure. Currently only ftp is supported for remote servers. If you
want to use a local directory, you can specify the full path with a '<A HREF="local://'">local://'</A> prefix, as
shown above.
<A NAME="lbAL">&nbsp;</A>
<H2>USING YOUR OWN REPOSITORY</H2>
Let's say you have a bunch of custom packages in <I>/home/pkgs</I> and their respective PKGBUILD
files are all in <I>/usr/abs/local</I>. All you need to do is generate a compressed package database
in the <I>/home/pkgs</I> directory so pacman can find it when run with --refresh.
<P>
<DL COMPACT><DT><DD>
<PRE>
# gensync /usr/abs/local /home/pkgs/custom.db.tar.gz
</PRE>
</DL>
<P>
The above command will read all PKGBUILD files in /usr/abs/local and generate a compressed
database called /home/pkgs/custom.db.tar.gz. Note that the database must be of the form
<I>{treename}.db.tar.gz</I>, where {treename} is the name of the section defined in the
configuration file.
That's it! Now configure your <I>custom</I> section in the configuration file as shown in the
config example above. Pacman will now use your package repository. If you add new packages to
the repository, remember to re-generate the database and use pacman's --refresh option.
<A NAME="lbAM">&nbsp;</A>
<H2>SEE ALSO</H2>
<B>makepkg</B> is the package-building tool that comes with pacman.
<A NAME="lbAN">&nbsp;</A>
<H2>AUTHOR</H2>
<PRE>
Judd Vinet &lt;<A HREF="mailto:jvinet@zeroflux.org">jvinet@zeroflux.org</A>&gt;
</PRE>
<P>
<HR>
<A NAME="index">&nbsp;</A><H2>Index</H2>
<DL>
<DT><A HREF="#lbAB">NAME</A><DD>
<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
<DT><A HREF="#lbAD">DESCRIPTION</A><DD>
<DT><A HREF="#lbAE">OPERATIONS</A><DD>
<DT><A HREF="#lbAF">OPTIONS</A><DD>
<DT><A HREF="#lbAG">SYNC OPTIONS</A><DD>
<DT><A HREF="#lbAH">QUERY OPTIONS</A><DD>
<DT><A HREF="#lbAI">HANDLING CONFIG FILES</A><DD>
<DT><A HREF="#lbAJ">CONFIGURATION</A><DD>
<DT><A HREF="#lbAK">Example:</A><DD>
<DT><A HREF="#lbAL">USING YOUR OWN REPOSITORY</A><DD>
<DT><A HREF="#lbAM">SEE ALSO</A><DD>
<DT><A HREF="#lbAN">AUTHOR</A><DD>
</DL>
<HR>
This document was created by
<A HREF="http://localhost/cgi-bin/man/man2html">man2html</A>,
using the manual pages.<BR>
Time: 17:22:16 GMT, March 04, 2003
</BODY>
</HTML>

View file

@ -1,4 +1,4 @@
.TH pacman 8 "January 20, 2003" "pacman #VERSION#" ""
.TH pacman 8 "April 10, 2003" "pacman #VERSION#" ""
.SH NAME
pacman \- package manager utility
.SH SYNOPSIS
@ -76,6 +76,11 @@ checked to see if the file should be renamed to a .pacsave extension. If
\fB--nosave\fP is used, these designations are ignored and the files are
removed.
.TP
.B "\-c, \-\-cascade"
(only used with \fB--remove\fP)
Remove all target packages, as well as all packages that depend on one
or more target packages. This operation is recursive.
.TP
.B "\-r, \-\-root <path>"
Specify alternative installation root (default is "/"). This
should \fInot\fP be used as a way to install software into
@ -170,17 +175,28 @@ NoUpgrade = etc/passed etc/group etc/shadow
NoUpgrade = etc/fstab
[current]
Server = ftp://ftp.server.org/linux/archlinux/current
Server = ftp://ftp.mirror.com/arch/current
Server = ftp://ftp.archlinux.org/current
Server = ftp://ftp.mirror.com/archlinux/current
[custom]
Server = local:///home/pkgs
.fi
.RE
All files listed with a \fINoUpgrade\fP directive will never be touched during a package
install/upgrade. This directive is only valid in the options section.
.SH CONFIG: OPTIONS
.TP
.B "NoUpgrade = <file> [file] ..."
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 "IgnorePkg = <package> [package] ..."
Instructs pacman to ignore any upgrades for this package when performing a
\fB--sysupgrade\fP.
.TP
.B "NoPassiveFtp"
Disables passive ftp connections when downloading packages. (aka Active Mode)
.SH CONFIG: REPOSITORIES
Each repository section defines a section name and at least one location where the packages
can be found. The section name is defined by the string within square brackets (eg, the two
above are 'current' and 'custom'). Locations are defined with the \fIServer\fP directive and

View file

@ -2,12 +2,11 @@
# /etc/pacman.conf
#
# See the pacman manpage for option directives
#
# GENERAL OPTIONS
# NoUpgrade: a space-delimited list of files that should never
# be touched by pacman during an install/upgrade.
# (note: do not include the leading slash)
# IgnorePkg: a space-delimited list of packages that pacman should NOT
# upgrade when doing a --sysupgrade
#
[options]
NoUpgrade = etc/passwd etc/group etc/shadow
NoUpgrade = etc/fstab etc/rc.conf etc/rc.local
@ -24,6 +23,7 @@ Server = ftp://ftp.webtrek.com/pub/mirrors/archlinux/current
Server = ftp://ftp.mpi-sb.mpg.de/pub/linux/mirror/ftp.ibiblio.org/pub/Linux/distributions/archlinux/current
Server = ftp://ftp.oit.unc.edu/pub/Linux/distributions/archlinux/current
Server = ftp://ftp.tu-chemnitz.de/pub/linux/sunsite.unc-mirror/distributions/archlinux/current
Server = ftp://ftp.parrswood.net/Mirrors/ftp.archlinux.org/current
Server = ftp://gd.tuwien.ac.at/opsys/linux/archlinux/current
Server = ftp://saule.mintis.lt/pub/linux/current
Server = ftp://ftp.rez-gif.supelec.fr/pub/Linux/distrib/archlinux/current
@ -38,6 +38,7 @@ Server = ftp://ftp.rez-gif.supelec.fr/pub/Linux/distrib/archlinux/current
#Server = ftp://ftp.mpi-sb.mpg.de/pub/linux/mirror/ftp.ibiblio.org/pub/Linux/distributions/archlinux/stable
#Server = ftp://ftp.oit.unc.edu/pub/Linux/distributions/archlinux/stable
#Server = ftp://ftp.tu-chemnitz.de/pub/linux/sunsite.unc-mirror/distributions/archlinux/stable
#Server = ftp://ftp.parrswood.net/Mirrors/ftp.archlinux.org/stable
#Server = ftp://gd.tuwien.ac.at/opsys/linux/archlinux/stable
#Server = ftp://saule.mintis.lt/pub/linux/stable
#Server = ftp://ftp.rez-gif.supelec.fr/pub/Linux/distrib/archlinux/stable
@ -51,6 +52,7 @@ Server = ftp://ftp.rez-gif.supelec.fr/pub/Linux/distrib/archlinux/current
#Server = ftp://ftp.mpi-sb.mpg.de/pub/linux/mirror/ftp.ibiblio.org/pub/Linux/distributions/archlinux/unofficial
#Server = ftp://ftp.oit.unc.edu/pub/Linux/distributions/archlinux/unofficial
#Server = ftp://ftp.tu-chemnitz.de/pub/linux/sunsite.unc-mirror/distributions/archlinux/unofficial
#Server = ftp://ftp.parrswood.net/Mirrors/ftp.archlinux.org/unofficial
#Server = ftp://gd.tuwien.ac.at/opsys/linux/archlinux/unofficial
#Server = ftp://saule.mintis.lt/pub/linux/unofficial
#Server = ftp://ftp.rez-gif.supelec.fr/pub/Linux/distrib/archlinux/unofficial
@ -64,40 +66,13 @@ Server = ftp://ftp.rez-gif.supelec.fr/pub/Linux/distrib/archlinux/current
#Server = ftp://ftp.mpi-sb.mpg.de/pub/linux/mirror/ftp.ibiblio.org/pub/Linux/distributions/archlinux/unstable
#Server = ftp://ftp.oit.unc.edu/pub/Linux/distributions/archlinux/unstable
#Server = ftp://ftp.tu-chemnitz.de/pub/linux/sunsite.unc-mirror/distributions/archlinux/unstable
#Server = ftp://ftp.parrswood.net/Mirrors/ftp.archlinux.org/unstable
#Server = ftp://gd.tuwien.ac.at/opsys/linux/archlinux/unstable
#Server = ftp://saule.mintis.lt/pub/linux/unstable
#Server = ftp://ftp.rez-gif.supelec.fr/pub/Linux/distrib/archlinux/unstable
# This is a typical setup for a local package repository. To have pacman
# resolve dependencies and install your custom packages with the --sync
# operation, you must generate a sync db from your custom PKGBUILDs and
# place it in the directory specified by the Server directive.
#
# # gensync /usr/abs/local /home/custompkgs/custom.db.tar.gz
#
# The sync database must be of the form {treename}.db.gz, where treename
# is the name of the package tree (in this case, 'custom').
#
# Then you can activate this custom repository by uncommenting the last
# two lines and using pacman as usual:
#
# # pacman -S --refresh
# :: Synchronizing package databases...
# current.db.tar.gz [#################################] 100% | 20K
# custom.db.tar.gz [/home/custompkgs/ ] 100% | LOCAL
#
# # pacman -S my_custom_pkg
#
# Targets: my_custom_pkg-0.12-1
#
# Do you want to install/upgrade these packages? [Y/n]
#
# :: Retrieving packages from custom...
# my_custom_pkg-0.12-1.pkg [/home/custompkgs/ ] 100% | LOCAL
#
# checking for conflicts... done.
# installing my_custom_pkg... done.
#
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#Server = local:///home/custompkgs

Binary file not shown.

View file

@ -1,6 +1,6 @@
#!/bin/bash
myver='2.3.2'
myver='2.4'
usage() {
echo "gensync $myver"

View file

@ -1,6 +1,6 @@
#!/bin/bash
myver='2.3.2'
myver='2.4'
startdir=`pwd`
[ -f /etc/makepkg.conf ] && source /etc/makepkg.conf
@ -46,8 +46,7 @@ checkdeps() {
}
if [ "$1" = "--help" -o "$1" = "-h" ]; then
shift
usage() {
echo "makepkg version $myver"
echo "usage: $0 [options] [build_script]"
echo "options:"
@ -58,13 +57,14 @@ if [ "$1" = "--help" -o "$1" = "-h" ]; then
echo " -d, --nodeps Skip all dependency checks"
echo " -i, --install Install package after successful build"
echo " -f, --force Overwrite existing package"
echo " -w <destdir> Write package to <destdir> instead of the working dir"
echo " -h, --help This help"
echo
echo " if build_script is not specified, makepkg will look for a PKGBUILD"
echo " file in the current directory."
echo
exit 0
fi
}
# Options
CLEANUP=0
@ -74,35 +74,54 @@ DEP_BIN=0
DEP_SRC=0
NODEPS=0
FORCE=0
PKGDEST=$startdir
BUILDSCRIPT="./PKGBUILD"
for arg in $*; do
case $arg in
-c|--clean)
CLEANUP=1
while [ "$#" -ne "0" ]; do
case $1 in
--clean) CLEANUP=1 ;;
--cleancache) CLEANCACHE=1 ;;
--syncdeps) DEP_BIN=1 ;;
--builddeps) DEP_SRC=1 ;;
--nodeps) NODEPS=1 ;;
--install) INSTALL=1 ;;
--force) FORCE=1 ;;
--*)
usage
exit 1
;;
-C|--cleancache)
CLEANCACHE=1
;;
-s|--syncdeps)
DEP_BIN=1
;;
-b|--builddeps)
DEP_SRC=1
;;
-d|--nodeps)
NODEPS=1
;;
-i|--install)
INSTALL=1
;;
-f|--force)
FORCE=1
-*)
while getopts "cCsbdifw:-" opt; do
case $opt in
c) CLEANUP=1 ;;
C) CLEANCACHE=1 ;;
s) DEP_BIN=1 ;;
b) DEP_SRC=1 ;;
d) NODEPS=1 ;;
i) INSTALL=1 ;;
f) FORCE=1 ;;
w)
PKGDEST=$OPTARG
shift
;;
-)
OPTIND=0
break
;;
*)
usage
;;
esac
done
;;
*)
BUILDSCRIPT=$arg
if [ "$#" -ne "1" ]; then
usage
fi
BUILDSCRIPT=$1
;;
esac
shift
done
if [ "$CLEANCACHE" = "1" ]; then
@ -132,7 +151,7 @@ if [ `echo $pkgrel | grep '-'` ]; then
exit 1
fi
if [ -f ${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz -a "$FORCE" = "0" ]; then
if [ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz -a "$FORCE" = "0" ]; then
msg "==> ERROR: a package has already been built. (use -f to overwrite)"
exit 1
fi
@ -170,7 +189,7 @@ if [ `type -p pacman` -a "$NODEPS" = "0" ]; then
for pkgdir in $candidates; do
if [ -f $pkgdir/PKGBUILD ]; then
cd $pkgdir
makepkg -i -c -b
makepkg -i -c -b -w $PKGDEST
if [ $? -eq 0 ]; then
success=1
break
@ -356,9 +375,9 @@ fi
msg "==> Compressing package..."
cd $startdir/pkg
if [ -f $startdir/pkg/._install ]; then
tar czvf $startdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz .PKGINFO ._install * >../filelist
tar czvf $PKGDEST/$pkgname-$pkgver-$pkgrel.pkg.tar.gz .PKGINFO ._install * >../filelist
else
tar czvf $startdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz .PKGINFO * >../filelist
tar czvf $PKGDEST/$pkgname-$pkgver-$pkgrel.pkg.tar.gz .PKGINFO * >../filelist
fi
cd $startdir
@ -372,7 +391,7 @@ msg "==> Finished making $pkgname ($d)"
if [ "$INSTALL" = "1" ]; then
msg "==> Running pacman --upgrade"
pacman --upgrade $pkgname-$pkgver-$pkgrel.pkg.tar.gz
pacman --upgrade $PKGDEST/$pkgname-$pkgver-$pkgrel.pkg.tar.gz
fi
exit 0

View file

@ -1,7 +1,7 @@
#!/bin/bash
toplevel=`pwd`
version="2.3.2"
version="2.4"
usage() {
echo "makeworld version $version"
@ -29,23 +29,31 @@ fi
MAKEPKG_OPTS=
for arg in $*; do
case $arg in
-c|--clean)
MAKEPKG_OPTS="$MAKEPKG_OPTS -c"
--clean) MAKEPKG_OPTS="$MAKEPKG_OPTS -c" ;;
--install) MAKEPKG_OPTS="$MAKEPKG_OPTS -i" ;;
--syncdeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -s" ;;
--builddeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -b" ;;
--nodeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -d" ;;
--force) MAKEPKG_OPTS="$MAKEPKG_OPTS -f" ;;
--*)
usage
exit 1
;;
-i|--install)
MAKEPKG_OPTS="$MAKEPKG_OPTS -i"
;;
-s|--syncdeps)
MAKEPKG_OPTS="$MAKEPKG_OPTS -d"
;;
-b|--builddeps)
MAKEPKG_OPTS="$MAKEPKG_OPTS -b"
;;
-d|--nodeps)
MAKEPKG_OPTS="$MAKEPKG_OPTS -n"
;;
-f|--force)
MAKEPKG_OPTS="$MAKEPKG_OPTS -f"
-*)
while getopts "cisbdf-" opt; do
case $opt in
c) MAKEPKGS_OPTS="$MAKEPKGS_OPTS -c" ;;
i) MAKEPKGS_OPTS="$MAKEPKGS_OPTS -i" ;;
s) MAKEPKGS_OPTS="$MAKEPKGS_OPTS -s" ;;
b) MAKEPKGS_OPTS="$MAKEPKGS_OPTS -b" ;;
d) MAKEPKGS_OPTS="$MAKEPKGS_OPTS -d" ;;
f) MAKEPKGS_OPTS="$MAKEPKGS_OPTS -f" ;;
-)
OPTIND=0
break
;;
esac
done
;;
*)
dest=$arg
@ -73,13 +81,10 @@ for category in $*; do
. PKGBUILD
buildstatus=0
if [ ! -f $dest/$pkgname-$pkgver-$pkgrel.pkg.tar.gz ]; then
makepkg $MAKEPKG_OPTS 2>>$toplevel/makepkg.log
makepkg $MAKEPKG_OPTS -w $dest 2>>$toplevel/makepkg.log
if [ $? -gt 0 ]; then
buildstatus=2
else
rm -rf pkg src
# some packages (mozilla) have been split into multiple packages
mv -v $pkgname-*.pkg.tar.gz $dest/
buildstatus=1
fi
fi

Binary file not shown.

View file

@ -124,16 +124,13 @@ int parse_descfile(char *descfile, pkginfo_t *info, PMList **backup, int output)
while(!feof(fp)) {
fgets(line, PATH_MAX, fp);
if(output) {
printf("%s", line);
}
linenum++;
trim(line);
if(line[0] == '#') {
if(strlen(line) == 0 || line[0] == '#') {
continue;
}
if(strlen(line) == 0) {
continue;
if(output) {
printf("%s\n", line);
}
ptr = line;
key = strsep(&ptr, "=");

View file

@ -53,7 +53,7 @@ char* MDFile(char *);
*
*/
/* pacman options */
/* command line options */
char *pmo_root = NULL;
unsigned short pmo_op = PM_MAIN;
unsigned short pmo_verbose = 0;
@ -70,13 +70,16 @@ unsigned short pmo_q_isfile = 0;
unsigned short pmo_q_info = 0;
unsigned short pmo_q_list = 0;
unsigned short pmo_q_owns = 0;
unsigned short pmo_r_cascade = 0;
unsigned short pmo_s_upgrade = 0;
unsigned short pmo_s_downloadonly = 0;
unsigned short pmo_s_sync = 0;
unsigned short pmo_s_search = 0;
unsigned short pmo_s_clean = 0;
PMList *pmo_noupgrade = NULL;
PMList *pmo_ignorepkg = NULL;
/* configuration file options */
PMList *pmo_noupgrade = NULL;
PMList *pmo_ignorepkg = NULL;
unsigned short pmo_nopassiveftp = 0;
/* list of sync_t structs for sync locations */
@ -776,7 +779,9 @@ int pacman_add(pacdb_t *db, PMList *targets)
}
printf("done.\n");
if(!pmo_nodeps) {
/* No need to check deps if pacman_add was called during a sync:
* it is already done in pacman_sync. */
if(!pmo_nodeps && pmo_op != PM_SYNC) {
vprint("checking dependencies...\n");
lp = checkdeps(db, (pmo_upgrade ? PM_UPGRADE : PM_ADD), alltargs);
if(lp) {
@ -1052,13 +1057,25 @@ int pacman_add(pacdb_t *db, PMList *targets)
} /*else*/ {
time_t t = time(NULL);
/* if this is an upgrade then propagate the old package's requiredby list over to
* the new package */
if(pmo_upgrade && oldpkg) {
list_free(info->requiredby);
info->requiredby = NULL;
for(lp = oldpkg->requiredby; lp; lp = lp->next) {
info->requiredby = list_add(info->requiredby, strdup(lp->data));
/* Update the requiredby field by scaning the whole database
* looking for packages depending on the package to add */
for(lp = pm_packages; lp; lp = lp->next) {
pkginfo_t *tmpp = NULL;
PMList *tmppm = NULL;
tmpp = db_scan(db, ((pkginfo_t*)lp->data)->name, INFRQ_DEPENDS);
if (tmpp == NULL) {
continue;
}
for(tmppm = tmpp->depends; tmppm; tmppm = tmppm->next) {
depend_t depend;
if(splitdep(tmppm->data, &depend)) {
continue;
}
if(tmppm->data && !strcmp(depend.name, info->name)) {
info->requiredby = list_add(info->requiredby, strdup(tmpp->name));
continue;
}
}
}
@ -1156,13 +1173,50 @@ int pacman_remove(pacdb_t *db, PMList *targets)
vprint("Checking dependencies...\n");
lp = checkdeps(db, PM_REMOVE, alltargs);
if(lp) {
fprintf(stderr, "error: this will break the following dependencies:\n");
for(j = lp; j; j = j->next) {
depmissing_t* miss = (depmissing_t*)j->data;
printf(" %s: is required by %s\n", miss->target, miss->depend.name);
if(pmo_r_cascade) {
int cols;
while(lp) {
for(j = lp; j; j = j->next) {
depmissing_t* miss = (depmissing_t*)j->data;
miss = (depmissing_t*)j->data;
info = db_scan(db, miss->depend.name, INFRQ_ALL);
list_add(alltargs, info);
}
list_free(lp);
lp = checkdeps(db, PM_REMOVE, alltargs);
}
/* list targets */
fprintf(stderr, "\nTargets: ");
cols = 9;
for(j = alltargs; j; j = j->next) {
char t[PATH_MAX];
int len;
snprintf(t, PATH_MAX, "%s ", (char*)j->data);
len = strlen(t);
if(len+cols > 78) {
cols = 9;
fprintf(stderr, "\n%9s", " ");
}
fprintf(stderr, "%s", t);
cols += len;
}
printf("\n");
/* get confirmation */
if(yesno("\nDo you want to remove these packages? [Y/n] ") == 0) {
list_free(alltargs);
list_free(lp);
return(1);
}
} else {
fprintf(stderr, "error: this will break the following dependencies:\n");
for(j = lp; j; j = j->next) {
depmissing_t* miss = (depmissing_t*)j->data;
printf(" %s: is required by %s\n", miss->target, miss->depend.name);
}
list_free(alltargs);
list_free(lp);
return(1);
}
list_free(lp);
return(1);
}
list_free(lp);
}
@ -1286,6 +1340,8 @@ int pacman_remove(pacdb_t *db, PMList *targets)
}
}
list_free(alltargs);
/* run ldconfig if it exists */
snprintf(line, PATH_MAX, "%setc/ld.so.conf", pmo_root);
if(!stat(line, &buf)) {
@ -1321,7 +1377,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
/* output info for a .tar.gz package */
if(pmo_q_isfile) {
if(package == NULL) {
fprintf(stderr, "error: no package file was specified (-p)\n");
fprintf(stderr, "error: no package file was specified for --file\n");
return(1);
}
info = load_pkg(package, pmo_q_info);
@ -1329,16 +1385,16 @@ int pacman_query(pacdb_t *db, PMList *targets)
fprintf(stderr, "error: %s is not a package\n", package);
return(1);
}
if(pmo_q_list) {
if(pmo_q_info) {
printf("\n");
} else if(pmo_q_list) {
for(lp = info->files; lp; lp = lp->next) {
if(strcmp(lp->data, ".PKGINFO")) {
printf("%s\n", (char*)lp->data);
printf("%s %s\n", info->name, (char*)lp->data);
}
}
} else {
if(!pmo_q_info) {
printf("%s %s\n", info->name, info->version);
}
} else if(!pmo_q_info) {
printf("%s %s\n", info->name, info->version);
}
continue;
}
@ -1357,7 +1413,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
for(lp = info->files; lp; lp = lp->next) {
sprintf(path, "%s%s", pmo_root, (char*)lp->data);
if(!strcmp(path, rpath)) {
printf("%s %s\n", info->name, info->version);
printf("%s is owned by %s %s\n", package, info->name, info->version);
gotcha = 1;
}
}
@ -1365,7 +1421,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
if(!gotcha) {
fprintf(stderr, "No package owns %s\n", package);
}
return(2);
continue;
} else {
fprintf(stderr, "error: %s is not a file.\n", package);
return(1);
@ -1384,7 +1440,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
return(1);
}
for(q = info->files; q; q = q->next) {
printf("%s%s\n", pmo_root, (char*)q->data);
printf("%s %s%s\n", info->name, pmo_root, (char*)q->data);
}
} else {
printf("%s %s\n", tmpp->name, tmpp->version);
@ -1392,16 +1448,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
}
} else {
/* find a target */
if(pmo_q_list) {
info = db_scan(db, package, INFRQ_DESC | INFRQ_FILES);
if(info == NULL) {
fprintf(stderr, "Package \"%s\" was not found.\n", package);
return(2);
}
for(lp = info->files; lp; lp = lp->next) {
printf("%s%s\n", pmo_root, (char*)lp->data);
}
} else if(pmo_q_info) {
if(pmo_q_info) {
int cols;
info = db_scan(db, package, INFRQ_DESC | INFRQ_DEPENDS);
@ -1467,6 +1514,15 @@ int pacman_query(pacdb_t *db, PMList *targets)
}
printf("Description : %s\n", info->desc);
printf("\n");
} else if(pmo_q_list) {
info = db_scan(db, package, INFRQ_DESC | INFRQ_FILES);
if(info == NULL) {
fprintf(stderr, "Package \"%s\" was not found.\n", package);
return(2);
}
for(lp = info->files; lp; lp = lp->next) {
printf("%s %s%s\n", info->name, pmo_root, (char*)lp->data);
}
} else {
info = db_scan(db, package, INFRQ_DESC);
if(info == NULL) {
@ -1833,20 +1889,20 @@ int splitdep(char *depstr, depend_t *depend)
} else {
/* no version specified - accept any */
depend->mod = DEP_ANY;
strcpy(depend->name, str);
strcpy(depend->version, "");
strncpy(depend->name, str, sizeof(depend->name));
strncpy(depend->version, "", sizeof(depend->version));
}
if(ptr == NULL) {
return(0);
}
*ptr = '\0';
strcpy(depend->name, str);
strncpy(depend->name, str, sizeof(depend->name));
ptr++;
if(depend->mod != DEP_EQ) {
ptr++;
}
strcpy(depend->version, ptr);
strncpy(depend->version, ptr, sizeof(depend->version));
FREE(str);
return(0);
}

View file

@ -22,7 +22,7 @@
#define _PAC_PACMAN_H
#ifndef PACVER
#define PACVER "2.3.2"
#define PACVER "2.4"
#endif
#ifndef PKGDIR

View file

@ -42,6 +42,7 @@ static int offset;
/* pacman options */
extern char *pmo_root;
extern unsigned char pmo_nopassiveftp;
/* sync servers */
extern PMList *pmc_syncs;
@ -150,10 +151,12 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files)
sync_fnm[24] = '\0';
if(!server->islocal) {
/* passive mode */
/* TODO: make passive ftp an option */
if(!FtpOptions(FTPLIB_CONNMODE, FTPLIB_PASSIVE, control)) {
fprintf(stderr, "warning: failed to set passive mode\n");
if(!pmo_nopassiveftp) {
if(!FtpOptions(FTPLIB_CONNMODE, FTPLIB_PASSIVE, control)) {
fprintf(stderr, "warning: failed to set passive mode\n");
}
} else {
vprint("FTP passive mode not set\n");
}
if(!FtpSize(fn, &fsz, FTPLIB_IMAGE, control)) {
fprintf(stderr, "warning: failed to get filesize for %s\n", fn);

View file

@ -37,6 +37,7 @@
#include "pacsync.h"
#include "pacman.h"
/* command line options */
extern char* pmo_root;
extern unsigned short pmo_op;
extern unsigned short pmo_version;
@ -53,13 +54,16 @@ extern unsigned short pmo_q_isfile;
extern unsigned short pmo_q_info;
extern unsigned short pmo_q_list;
extern unsigned short pmo_q_owns;
extern unsigned short pmo_r_cascade;
extern unsigned short pmo_s_sync;
extern unsigned short pmo_s_search;
extern unsigned short pmo_s_clean;
extern unsigned short pmo_s_upgrade;
extern unsigned short pmo_s_downloadonly;
/* configuration file options */
extern PMList *pmo_noupgrade;
extern PMList *pmo_ignorepkg;
extern unsigned short pmo_nopassiveftp;
extern PMList *pmc_syncs;
extern PMList *pm_targets;
@ -164,6 +168,7 @@ int parseargs(int op, int argc, char **argv)
{"sysupgrade", no_argument, 0, 'u'},
{"downloadonly", no_argument, 0, 'w'},
{"refresh", no_argument, 0, 'y'},
{"cascade", no_argument, 0, 'c'},
{0, 0, 0, 0}
};
@ -196,7 +201,7 @@ int parseargs(int op, int argc, char **argv)
case 'w': pmo_s_downloadonly = 1; break;
case 'y': pmo_s_sync = 1; break;
case 's': pmo_s_search = 1; break;
case 'c': pmo_s_clean = 1; break;
case 'c': pmo_s_clean = 1; pmo_r_cascade = 1; break;
case 'r': if(realpath(optarg, pmo_root) == NULL) {
perror("bad root path");
return(1);
@ -249,10 +254,7 @@ int parseconfig(char *configfile)
while(fgets(line, PATH_MAX, fp)) {
linenum++;
trim(line);
if(strlen(line) == 0) {
continue;
}
if(line[0] == '#') {
if(strlen(line) == 0 || line[0] == '#') {
continue;
}
if(line[0] == '[' && line[strlen(line)-1] == ']') {
@ -286,12 +288,21 @@ int parseconfig(char *configfile)
}
ptr = line;
key = strsep(&ptr, "=");
if(key == NULL || ptr == NULL) {
if(key == NULL) {
fprintf(stderr, "config: line %d: syntax error\n", linenum);
return(1);
}
trim(key);
key = strtoupper(key);
if(ptr == NULL) {
if(!strcmp(key, "NOPASSIVEFTP")) {
pmo_nopassiveftp = 1;
vprint("config: nopassiveftp\n");
} else {
fprintf(stderr, "config: line %d: syntax error\n", linenum);
return(1);
}
} else {
trim(key);
key = strtoupper(key);
trim(ptr);
if(!strcmp(section, "options")) {
if(!strcmp(key, "NOUPGRADE")) {
@ -517,6 +528,7 @@ void usage(int op, char *myname)
printf("options:\n");
printf(" -d, --nodeps skip dependency checks\n");
printf(" -n, --nosave remove configuration files as well\n");
printf(" -c, --cascade remove packages and all packages that depend on them\n");
} else if(op == PM_UPGRADE) {
if(pmo_freshen) {
printf("usage: %s {-F --freshen} [options] <file>\n", myname);