Imported from pacman-2.3.1.tar.gz

This commit is contained in:
Judd Vinet 2003-03-14 17:35:57 +00:00
parent f2e50be2f5
commit 0207fad046
12 changed files with 753 additions and 53 deletions

View file

@ -1,5 +1,17 @@
VERSION DESCRIPTION VERSION DESCRIPTION
------------------------------------------------------------------ ------------------------------------------------------------------
2.3.1 - Fixed the progress bar overflow
- Pacman does not ask "Are you sure" when you use --downloadonly
- Switched up a couple makepkg options to be more consistent
with pacman's options
- If you ^C out of a file download, the package will now be
removed from the cache directory
2.3 - The beginnings of source-side dependency resolution, makepkg
can now either A) download/install missing deps with pacman
-S; or B) find missing deps in the /usr/abs tree and
build/install them.
- Added a --nodeps option to makepkg
- Improved the --search output
2.2 - More bugfixes 2.2 - More bugfixes
- Added --downloadonly switch to --sync - Added --downloadonly switch to --sync
2.1 - Lots of bugfixes 2.1 - Lots of bugfixes

View file

@ -34,7 +34,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
INSTALL_DATA = @INSTALL_DATA@ INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
PACVER = 2.3 PACVER = 2.3.1
LIBTAR_VERSION = 1.2.5 LIBTAR_VERSION = 1.2.5
TOPDIR = @srcdir@ TOPDIR = @srcdir@

6
TODO
View file

@ -1,14 +1,14 @@
- fix the broken pipe bug
- add some logging mechanism (/var/log/pacman.log) - add some logging mechanism (/var/log/pacman.log)
- handle version comparators in makepkg dep resolution (eg, glibc>=2.2.5) - handle version comparators in makepkg dep resolution (eg, glibc>=2.2.5)
- have "group" designations
- IgnorePkg option/switch in pacman.conf to ignore updates from the sync repo
- record md5sums of all files in a package - record md5sums of all files in a package
- add a way to clean /var/cache/pacman/src - add a way to clean /var/cache/pacman/src
- duplicate dep checks occur with sync (one in sync, one in add) - duplicate dep checks occur with sync (one in sync, one in add)
- if a package is removed with --nodeps and re-installed, the requiredby - if a package is removed with --nodeps and re-installed, the requiredby
fields of it's required packages are not updated fields of it's required packages are not updated
- have "group" designations
- IgnorePkg option in pacman.conf to ignore updates from the sync repo
- add an option equivalent to 'pacman -Ql pkg | grep filename' - add an option equivalent to 'pacman -Ql pkg | grep filename'
- ftp transfer progress bar breaks after ~42000 K
- add other options to config file: db location, overwrite behaviour, etc. - add other options to config file: db location, overwrite behaviour, etc.
- use the COLUMNS env var for the progress bar - use the COLUMNS env var for the progress bar
? use 'set -e' in makepkg? ? use 'set -e' in makepkg?

365
doc/makepkg.8.html Normal file
View file

@ -0,0 +1,365 @@
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,4 +1,4 @@
.TH makepkg 8 "February 18, 2003" "makepkg #VERSION#" "" .TH makepkg 8 "March 3, 2003" "makepkg #VERSION#" ""
.SH NAME .SH NAME
makepkg \- package build utility makepkg \- package build utility
.SH SYNOPSIS .SH SYNOPSIS
@ -232,7 +232,7 @@ Clean up leftover work files/directories after a successful build.
.B "\-i, \-\-install" .B "\-i, \-\-install"
Install/Upgrade the package after a successful build. Install/Upgrade the package after a successful build.
.TP .TP
.B "\-d, \-\-syncdeps" .B "\-s, \-\-syncdeps"
Install missing dependencies using pacman. When makepkg finds missing Install missing dependencies using pacman. When makepkg finds missing
dependencies, it will run pacman to try and resolve them. If successful, dependencies, it will run pacman to try and resolve them. If successful,
pacman will download the missing packages from a package repository and pacman will download the missing packages from a package repository and
@ -245,7 +245,7 @@ $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. 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. The child makepkg calls will be made with the \fB-b\fP and \fB-i\fP options.
.TP .TP
.B "\-n, \-\-nodeps" .B "\-d, \-\-nodeps"
Do not perform any dependency checks. This will let you override/ignore any 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 dependencies required. There's a good chance this option will break the build
process if all of the dependencies aren't installed. process if all of the dependencies aren't installed.

306
doc/pacman.8.html Normal file
View file

@ -0,0 +1,306 @@
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,6 +1,6 @@
#!/bin/bash #!/bin/bash
myver='2.3' myver='2.3.1'
usage() { usage() {
echo "gensync $myver" echo "gensync $myver"

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
myver='2.3' myver='2.3.1'
startdir=`pwd` startdir=`pwd`
[ -f /etc/makepkg.conf ] && source /etc/makepkg.conf [ -f /etc/makepkg.conf ] && source /etc/makepkg.conf
@ -52,9 +52,9 @@ if [ "$1" = "--help" -o "$1" = "-h" ]; then
echo "usage: $0 [options] [build_script]" echo "usage: $0 [options] [build_script]"
echo "options:" echo "options:"
echo " -c, --clean Clean up work files after build" echo " -c, --clean Clean up work files after build"
echo " -d, --syncdeps Install missing dependencies with pacman" echo " -s, --syncdeps Install missing dependencies with pacman"
echo " -b, --builddeps Build missing dependencies from source" echo " -b, --builddeps Build missing dependencies from source"
echo " -n, --nodeps Skip all dependency checks" echo " -d, --nodeps Skip all dependency checks"
echo " -i, --install Install package after successful build" echo " -i, --install Install package after successful build"
echo " -f, --force Overwrite existing package" echo " -f, --force Overwrite existing package"
echo " -h, --help This help" echo " -h, --help This help"
@ -79,13 +79,13 @@ for arg in $*; do
-c|--clean) -c|--clean)
CLEANUP=1 CLEANUP=1
;; ;;
-d|--syncdeps) -s|--syncdeps)
DEP_BIN=1 DEP_BIN=1
;; ;;
-b|--builddeps) -b|--builddeps)
DEP_SRC=1 DEP_SRC=1
;; ;;
-n|--nodeps) -d|--nodeps)
NODEPS=1 NODEPS=1
;; ;;
-i|--install) -i|--install)

View file

@ -1,16 +1,16 @@
#!/bin/bash #!/bin/bash
toplevel=`pwd` toplevel=`pwd`
version="2.3" version="2.3.1"
usage() { usage() {
echo "makeworld version $version" echo "makeworld version $version"
echo "usage: $0 [options] <destdir> <category> [category] ..." echo "usage: $0 [options] <destdir> <category> [category] ..."
echo "options:" echo "options:"
echo " -c, --clean Clean up work files after build" echo " -c, --clean Clean up work files after build"
echo " -d, --syncdeps Install missing dependencies with pacman" echo " -s, --syncdeps Install missing dependencies with pacman"
echo " -b, --builddeps Build missing dependencies from source" echo " -b, --builddeps Build missing dependencies from source"
echo " -n, --nodeps Skip all dependency checks" echo " -d, --nodeps Skip all dependency checks"
echo " -i, --install Install package after successful build" echo " -i, --install Install package after successful build"
echo " -f, --force Overwrite existing packages" echo " -f, --force Overwrite existing packages"
echo " -h, --help This help" echo " -h, --help This help"
@ -35,13 +35,13 @@ for arg in $*; do
-i|--install) -i|--install)
MAKEPKG_OPTS="$MAKEPKG_OPTS -i" MAKEPKG_OPTS="$MAKEPKG_OPTS -i"
;; ;;
-d|--syncdeps) -s|--syncdeps)
MAKEPKG_OPTS="$MAKEPKG_OPTS -d" MAKEPKG_OPTS="$MAKEPKG_OPTS -d"
;; ;;
-b|--builddeps) -b|--builddeps)
MAKEPKG_OPTS="$MAKEPKG_OPTS -b" MAKEPKG_OPTS="$MAKEPKG_OPTS -b"
;; ;;
-n|--nodeps) -d|--nodeps)
MAKEPKG_OPTS="$MAKEPKG_OPTS -n" MAKEPKG_OPTS="$MAKEPKG_OPTS -n"
;; ;;
-f|--force) -f|--force)

View file

@ -86,6 +86,7 @@ PMList *pm_packages = NULL;
PMList *pm_targets = NULL; PMList *pm_targets = NULL;
char *lckfile = "/tmp/pacman.lck"; char *lckfile = "/tmp/pacman.lck";
char *workfile = NULL;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -470,7 +471,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
allgood = 0; allgood = 0;
continue; continue;
} }
if(local) { if(local && !pmo_s_downloadonly) {
/* this is an upgrade, compare versions and determine if it is necessary */ /* this is an upgrade, compare versions and determine if it is necessary */
cmp = rpmvercmp(local->version, sync->pkg->version); cmp = rpmvercmp(local->version, sync->pkg->version);
if(cmp > 0) { if(cmp > 0) {
@ -1502,8 +1503,14 @@ int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *syncpkg, PMList *l
list_free(targ); list_free(targ);
for(i = deps; i; i = i->next) { for(i = deps; i; i = i->next) {
int found = 0; int found = 0;
syncpkg_t *sync = NULL;
depmissing_t *miss = (depmissing_t*)i->data; depmissing_t *miss = (depmissing_t*)i->data;
if(miss->type == CONFLICT) {
fprintf(stderr, "error: cannot resolve dependencies for \"%s\":\n", miss->target);
fprintf(stderr, " %s conflicts with %s\n", miss->target, miss->depend.name);
return(1);
} else if(miss->type == DEPEND) {
syncpkg_t *sync = NULL;
MALLOC(sync, sizeof(syncpkg_t)); MALLOC(sync, sizeof(syncpkg_t));
/* find the package in one of the repositories */ /* find the package in one of the repositories */
@ -1535,11 +1542,6 @@ int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *syncpkg, PMList *l
/* this dep is already in the target list */ /* this dep is already in the target list */
continue; continue;
} }
if(miss->type == CONFLICT) {
fprintf(stderr, "error: cannot resolve dependencies for \"%s\":\n", miss->target);
fprintf(stderr, " %s conflicts with %s\n", miss->target, miss->depend.name);
return(1);
} else if(miss->type == DEPEND) {
/*printf("resolving %s\n", sync->pkg->name); fflush(stdout);*/ /*printf("resolving %s\n", sync->pkg->name); fflush(stdout);*/
found = 0; found = 0;
for(j = trail; j; j = j->next) { for(j = trail; j; j = j->next) {
@ -1865,6 +1867,11 @@ void cleanup(int signum)
if(lckrm(lckfile)) { if(lckrm(lckfile)) {
fprintf(stderr, "warning: could not remove lock file %s\n", lckfile); fprintf(stderr, "warning: could not remove lock file %s\n", lckfile);
} }
if(workfile) {
/* remove the current file being downloaded (as it's not complete) */
unlink(workfile);
FREE(workfile);
}
exit(signum); exit(signum);
} }

View file

@ -22,7 +22,7 @@
#define _PAC_PACMAN_H #define _PAC_PACMAN_H
#ifndef PACVER #ifndef PACVER
#define PACVER "2.3" #define PACVER "2.3.1"
#endif #endif
#ifndef PKGDIR #ifndef PKGDIR

View file

@ -104,6 +104,7 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files)
int done = 0; int done = 0;
PMList *complete = NULL; PMList *complete = NULL;
PMList *i; PMList *i;
extern char* workfile;
if(files == NULL) { if(files == NULL) {
return(0); return(0);
@ -162,6 +163,14 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files)
FtpOptions(FTPLIB_CALLBACKARG, (long)&fsz, control); FtpOptions(FTPLIB_CALLBACKARG, (long)&fsz, control);
FtpOptions(FTPLIB_CALLBACKBYTES, (10*1024), control); FtpOptions(FTPLIB_CALLBACKBYTES, (10*1024), control);
/* declare our working file so it can be removed it on interrupt */
/* by the cleanup() function */
if(workfile) {
FREE(workfile);
}
MALLOC(workfile, PATH_MAX);
strcpy(workfile, output);
if(!FtpGet(output, lp->data, FTPLIB_IMAGE, control)) { if(!FtpGet(output, lp->data, FTPLIB_IMAGE, control)) {
fprintf(stderr, "\nfailed downloading %s from %s: %s\n", fprintf(stderr, "\nfailed downloading %s from %s: %s\n",
fn, server->server, FtpLastResponse(control)); fn, server->server, FtpLastResponse(control));
@ -171,6 +180,7 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files)
log_progress(control, fsz, &fsz); log_progress(control, fsz, &fsz);
complete = list_add(complete, fn); complete = list_add(complete, fn);
} }
FREE(workfile);
printf("\n"); printf("\n");
fflush(stdout); fflush(stdout);
} else { } else {
@ -211,7 +221,7 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files)
static int log_progress(netbuf *ctl, int xfered, void *arg) static int log_progress(netbuf *ctl, int xfered, void *arg)
{ {
int fsz = *(int*)arg; int fsz = *(int*)arg;
int pct = (unsigned int)(xfered * 100) / fsz; int pct = ((float)xfered / fsz) * 100;
int i; int i;
printf("%s [", sync_fnm); printf("%s [", sync_fnm);