diff options
author | Judd Vinet <judd@archlinux.org> | 2003-03-14 18:35:57 +0100 |
---|---|---|
committer | Judd Vinet <judd@archlinux.org> | 2003-03-14 18:35:57 +0100 |
commit | 0207fad046f76fc37c0fc7c8b6a157225024a3ed (patch) | |
tree | 56e592c62a3bf52fc2feedf1baf07e39c0c87b47 | |
parent | f2e50be2f5b15c1985f9fcfb7ee1374dd6e94927 (diff) | |
download | pacman-0207fad046f76fc37c0fc7c8b6a157225024a3ed.tar.gz pacman-0207fad046f76fc37c0fc7c8b6a157225024a3ed.tar.xz |
Imported from pacman-2.3.1.tar.gz
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | Makefile.in | 2 | ||||
-rw-r--r-- | TODO | 6 | ||||
-rw-r--r-- | doc/makepkg.8.html | 365 | ||||
-rw-r--r-- | doc/makepkg.8.in | 6 | ||||
-rw-r--r-- | doc/pacman.8.html | 306 | ||||
-rwxr-xr-x | scripts/gensync | 2 | ||||
-rwxr-xr-x | scripts/makepkg | 10 | ||||
-rwxr-xr-x | scripts/makeworld | 10 | ||||
-rw-r--r-- | src/pacman.c | 75 | ||||
-rw-r--r-- | src/pacman.h | 2 | ||||
-rw-r--r-- | src/pacsync.c | 12 |
12 files changed, 754 insertions, 54 deletions
@@ -1,5 +1,17 @@ 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 - Added --downloadonly switch to --sync 2.1 - Lots of bugfixes diff --git a/Makefile.in b/Makefile.in index 90a72ffa..b5479d6d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -34,7 +34,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ -PACVER = 2.3 +PACVER = 2.3.1 LIBTAR_VERSION = 1.2.5 TOPDIR = @srcdir@ @@ -1,14 +1,14 @@ +- fix the broken pipe bug - add some logging mechanism (/var/log/pacman.log) - 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 - add a way to clean /var/cache/pacman/src - duplicate dep checks occur with sync (one in sync, one in add) - if a package is removed with --nodeps and re-installed, the requiredby 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' -- ftp transfer progress bar breaks after ~42000 K - add other options to config file: db location, overwrite behaviour, etc. - use the COLUMNS env var for the progress bar ? use 'set -e' in makepkg? diff --git a/doc/makepkg.8.html b/doc/makepkg.8.html new file mode 100644 index 00000000..66110f90 --- /dev/null +++ b/doc/makepkg.8.html @@ -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"> </A> +<H2>NAME</H2> + +makepkg - package build utility +<A NAME="lbAC"> </A> +<H2>SYNOPSIS</H2> + +<B>makepkg</B> +<A NAME="lbAD"> </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"> </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"> </A> +<H2>PKGBUILD Example:</H2> + +<DD> +<DD> +<DL COMPACT><DT><DD> +<PRE> +pkgname=modutils +pkgver=2.4.13 +pkgrel=1 +pkgdesc="Utilities for inserting and removing modules from the linux kernel" +backup=(etc/modules.conf) +depends=('glibc>=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 "/usr" portion should be present with "prefix", but not "DESTDIR". +<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"> </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 "configure +itself" 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"> </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"> </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<>version</B>, where <> is one of these three comparisons: <B>>=</B> +(greater than equal to), <B><=</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"> </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"> </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"> </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"> </A> +<H2>AUTHOR</H2> + +<PRE> +Judd Vinet <<A HREF="mailto:jvinet@zeroflux.org">jvinet@zeroflux.org</A>> +</PRE> + +<P> + +<HR> +<A NAME="index"> </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> diff --git a/doc/makepkg.8.in b/doc/makepkg.8.in index 3cc60b2d..35ebc974 100644 --- a/doc/makepkg.8.in +++ b/doc/makepkg.8.in @@ -1,4 +1,4 @@ -.TH makepkg 8 "February 18, 2003" "makepkg #VERSION#" "" +.TH makepkg 8 "March 3, 2003" "makepkg #VERSION#" "" .SH NAME makepkg \- package build utility .SH SYNOPSIS @@ -232,7 +232,7 @@ Clean up leftover work files/directories after a successful build. .B "\-i, \-\-install" Install/Upgrade the package after a successful build. .TP -.B "\-d, \-\-syncdeps" +.B "\-s, \-\-syncdeps" 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 @@ -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. The child makepkg calls will be made with the \fB-b\fP and \fB-i\fP options. .TP -.B "\-n, \-\-nodeps" +.B "\-d, \-\-nodeps" 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. diff --git a/doc/pacman.8.html b/doc/pacman.8.html new file mode 100644 index 00000000..e10c2b27 --- /dev/null +++ b/doc/pacman.8.html @@ -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"> </A> +<H2>NAME</H2> + +pacman - package manager utility +<A NAME="lbAC"> </A> +<H2>SYNOPSIS</H2> + +<B>pacman <operation> [options] <package> [package] ...</B> +<A NAME="lbAD"> </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"> </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 "remove-then-add" +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"> </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 <path></B> + +<DD> +Specify alternative installation root (default is "/"). 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 "owned" 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"> </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 <string></B> + +<DD> +This will search each package in the package list for names or descriptions +that contains <string>. +<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"> </A> +<H2>QUERY OPTIONS</H2> + +<DL COMPACT> +<DT><B>-o, --owns <file></B> + +<DD> +Search for the package that owns <file>. +<DT><B>-l, --list</B> + +<DD> +List all files owned by <package>. 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"> </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"> </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"> </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"> </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"> </A> +<H2>SEE ALSO</H2> + +<B>makepkg</B> is the package-building tool that comes with pacman. +<A NAME="lbAN"> </A> +<H2>AUTHOR</H2> + +<PRE> +Judd Vinet <<A HREF="mailto:jvinet@zeroflux.org">jvinet@zeroflux.org</A>> +</PRE> + +<P> + +<HR> +<A NAME="index"> </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> diff --git a/scripts/gensync b/scripts/gensync index 8c6dd320..cc825f3b 100755 --- a/scripts/gensync +++ b/scripts/gensync @@ -1,6 +1,6 @@ #!/bin/bash -myver='2.3' +myver='2.3.1' usage() { echo "gensync $myver" diff --git a/scripts/makepkg b/scripts/makepkg index d8c3938c..5f39a832 100755 --- a/scripts/makepkg +++ b/scripts/makepkg @@ -1,6 +1,6 @@ #!/bin/bash -myver='2.3' +myver='2.3.1' startdir=`pwd` [ -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 "options:" 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 " -n, --nodeps Skip all dependency checks" + echo " -d, --nodeps Skip all dependency checks" echo " -i, --install Install package after successful build" echo " -f, --force Overwrite existing package" echo " -h, --help This help" @@ -79,13 +79,13 @@ for arg in $*; do -c|--clean) CLEANUP=1 ;; - -d|--syncdeps) + -s|--syncdeps) DEP_BIN=1 ;; -b|--builddeps) DEP_SRC=1 ;; - -n|--nodeps) + -d|--nodeps) NODEPS=1 ;; -i|--install) diff --git a/scripts/makeworld b/scripts/makeworld index 4591c145..3c523f9c 100755 --- a/scripts/makeworld +++ b/scripts/makeworld @@ -1,16 +1,16 @@ #!/bin/bash toplevel=`pwd` -version="2.3" +version="2.3.1" usage() { echo "makeworld version $version" echo "usage: $0 [options] <destdir> <category> [category] ..." echo "options:" 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 " -n, --nodeps Skip all dependency checks" + echo " -d, --nodeps Skip all dependency checks" echo " -i, --install Install package after successful build" echo " -f, --force Overwrite existing packages" echo " -h, --help This help" @@ -35,13 +35,13 @@ for arg in $*; do -i|--install) MAKEPKG_OPTS="$MAKEPKG_OPTS -i" ;; - -d|--syncdeps) + -s|--syncdeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -d" ;; -b|--builddeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -b" ;; - -n|--nodeps) + -d|--nodeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -n" ;; -f|--force) diff --git a/src/pacman.c b/src/pacman.c index b6714d22..5ea0c1a7 100644 --- a/src/pacman.c +++ b/src/pacman.c @@ -85,7 +85,8 @@ PMList *pm_packages = NULL; /* list of targets specified on command line */ PMList *pm_targets = NULL; -char *lckfile = "/tmp/pacman.lck"; +char *lckfile = "/tmp/pacman.lck"; +char *workfile = NULL; int main(int argc, char *argv[]) { @@ -470,7 +471,7 @@ int pacman_sync(pacdb_t *db, PMList *targets) allgood = 0; continue; } - if(local) { + if(local && !pmo_s_downloadonly) { /* this is an upgrade, compare versions and determine if it is necessary */ cmp = rpmvercmp(local->version, sync->pkg->version); if(cmp > 0) { @@ -1502,44 +1503,45 @@ int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *syncpkg, PMList *l list_free(targ); for(i = deps; i; i = i->next) { int found = 0; - syncpkg_t *sync = NULL; depmissing_t *miss = (depmissing_t*)i->data; - MALLOC(sync, sizeof(syncpkg_t)); - - /* find the package in one of the repositories */ - for(j = databases; !found && j; j = j->next) { - dbsync_t *dbs = (dbsync_t*)j->data; - for(k = dbs->pkgcache; !found && k; k = k->next) { - pkginfo_t *pkg = (pkginfo_t*)k->data; - if(!strcmp(miss->depend.name, pkg->name)) { - found = 1; - /* re-fetch the package record with dependency info */ - sync->pkg = db_scan(dbs->db, pkg->name, INFRQ_DESC | INFRQ_DEPENDS); - sync->dbs = dbs; - } - } - } - if(!found) { - fprintf(stderr, "error: cannot resolve dependencies for \"%s\":\n", miss->target); - fprintf(stderr, " \"%s\" is not in the package set\n", miss->depend.name); - return(1); - } - found = 0; - for(j = list; j; j = j->next) { - syncpkg_t *tmp = (syncpkg_t*)j->data; - if(tmp && !strcmp(tmp->pkg->name, sync->pkg->name)) { - found = 1; - } - } - if(found) { - /* this dep is already in the target list */ - 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) { + syncpkg_t *sync = NULL; + MALLOC(sync, sizeof(syncpkg_t)); + + /* find the package in one of the repositories */ + for(j = databases; !found && j; j = j->next) { + dbsync_t *dbs = (dbsync_t*)j->data; + for(k = dbs->pkgcache; !found && k; k = k->next) { + pkginfo_t *pkg = (pkginfo_t*)k->data; + if(!strcmp(miss->depend.name, pkg->name)) { + found = 1; + /* re-fetch the package record with dependency info */ + sync->pkg = db_scan(dbs->db, pkg->name, INFRQ_DESC | INFRQ_DEPENDS); + sync->dbs = dbs; + } + } + } + if(!found) { + fprintf(stderr, "error: cannot resolve dependencies for \"%s\":\n", miss->target); + fprintf(stderr, " \"%s\" is not in the package set\n", miss->depend.name); + return(1); + } + found = 0; + for(j = list; j; j = j->next) { + syncpkg_t *tmp = (syncpkg_t*)j->data; + if(tmp && !strcmp(tmp->pkg->name, sync->pkg->name)) { + found = 1; + } + } + if(found) { + /* this dep is already in the target list */ + continue; + } /*printf("resolving %s\n", sync->pkg->name); fflush(stdout);*/ found = 0; for(j = trail; j; j = j->next) { @@ -1865,6 +1867,11 @@ void cleanup(int signum) if(lckrm(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); } diff --git a/src/pacman.h b/src/pacman.h index c9b06219..2c9b19a4 100644 --- a/src/pacman.h +++ b/src/pacman.h @@ -22,7 +22,7 @@ #define _PAC_PACMAN_H #ifndef PACVER -#define PACVER "2.3" +#define PACVER "2.3.1" #endif #ifndef PKGDIR diff --git a/src/pacsync.c b/src/pacsync.c index a76da444..f61a61e0 100644 --- a/src/pacsync.c +++ b/src/pacsync.c @@ -104,6 +104,7 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files) int done = 0; PMList *complete = NULL; PMList *i; + extern char* workfile; if(files == NULL) { return(0); @@ -161,6 +162,14 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files) FtpOptions(FTPLIB_IDLETIME, (long)1000, control); FtpOptions(FTPLIB_CALLBACKARG, (long)&fsz, 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)) { fprintf(stderr, "\nfailed downloading %s from %s: %s\n", @@ -171,6 +180,7 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files) log_progress(control, fsz, &fsz); complete = list_add(complete, fn); } + FREE(workfile); printf("\n"); fflush(stdout); } else { @@ -211,7 +221,7 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files) static int log_progress(netbuf *ctl, int xfered, void *arg) { int fsz = *(int*)arg; - int pct = (unsigned int)(xfered * 100) / fsz; + int pct = ((float)xfered / fsz) * 100; int i; printf("%s [", sync_fnm); |