1. 10 Jan, 2019 4 commits
    • Eli Schwartz's avatar
      db-move: also block moving package from staging to extra without handling testing · d5970df3
      Eli Schwartz authored
      Don't allow anomalous testing packages floating around after a rebuild
      which are older than stable.
    • Eli Schwartz's avatar
      db-update: die when trying to update a package without updating a pending rebuild · 8804e63f
      Eli Schwartz authored
      A semi-common pattern is for one maintainer to stage a rebuild of a
      package due to e.g. cascading repository-wide python/boost/whatever
      rebuilds, and then for the original maintainer of the package to not
      notice and update the package in the stable repo, leaving an out of date
      rebuild in staging or testing.
      Then the the out of date package gets moved and ends up breaking things,
      possibly via a package downgrade, possibly via breaking compatibility
      with a much more targeted rebuild uploaded all at once. Ultimately,
      Things Happen™ and the repository hierarchy gets broken.
      Prevent this by enforcing for all packages that exist in
      multiple levels of the repo: staging -> testing -> stable
      That updates to one must come with an update to all the others.
    • Eli Schwartz's avatar
      testing2x: be more generic and accept multiple testing repos · 863818f2
      Eli Schwartz authored
      Currently multilib is a second-class citizen the way it is lumped into
      community, and dbscripts cannot even keep track of whether it
      constitutes a testing repo. Teach config to track both testing and
      staging repos just like the stable ones, and teach testing2x to search
      through TESTING_REPOS to determine which one it is operating on.
    • Eli Schwartz's avatar
      Fix db-archive not running at the correct time. · 948a181f
      Eli Schwartz authored
      At the point when it was being run, the signature was not yet moved to
  2. 09 Jan, 2019 1 commit
    • Eli Schwartz's avatar
      Add reproducible archive of packages. · f11a038c
      Eli Schwartz authored
      Whenever adding new package files to the pool of distributed packages,
      copy the file into a longterm archive. This is the first step to merging
      the functionality of archivetools, as this implements the shared pool
      while also guaranteeing that all packages are archived at the time of
      entry rather than once per day if they still exist.
  3. 08 Jan, 2019 1 commit
  4. 16 Oct, 2018 2 commits
    • Luke Shumaker's avatar
      test: Resolve "TODO: Does not fail if one arch is missing" · 549fe001
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
       - Implement the TODO by keeping a list/set of architectures found via
         "$repo-$arch" directory names, and another list/set of architectures
         named in arch=() in the PKGBUILD(s).  This means turning the simple
         `compgen` in to a loop.
       - While we're at it loading PKGBUILDs in a loop, fix that it clearly
         isn't doing anything with the $pkgver argument; it should verify that
         the version in the found PKGBUILD(s) matches that argument.
       - Use extglob to more strictly match the "arch" part of the "repo-arch"
         dirname; the existing glob wouldn't have behaved correctly for values
         of $repo containing a "-" (like "community-testing").  We don't
         currently test with any of those, but it makes me nervous.
       - Also make that extglob change in checkRemovedPackage.  While we're at
         it, let Bash do the glob expansion normally and check it with
         __isGlobfile, instead of compgen; it means we don't have to worry about
         escaping the non-glob part of the string.  Not that we expect it to
         contain anything needing escaping, but again, it makes me nervous.
    • Luke Shumaker's avatar
      test: db-remove: Verify that it accepts pkgname (in addition to pkgbase) · 1bf2b35e
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      It is important that db-remove be able to remove a single pkgname, without
      being able to look it up by pkgbase in SVN.  For instance, when a split
      package update removes one of its members; there will be no reference to
      the removed pkgname in SVN, and it won't be removed by db-update.  If
      db-remove doesn't accept pkgnames, then this outdated orphan could not be
  5. 08 Oct, 2018 7 commits
    • Eli Schwartz's avatar
    • Eli Schwartz's avatar
    • Eli Schwartz's avatar
      Factor out the exporting of files/folders from svn. · 37a493d3
      Eli Schwartz authored
      As of the source_pkgbuild rewrite, this is only ever done once.
    • Eli Schwartz's avatar
      Preliminary work to break out svn-specific code. · d6b48bd6
      Eli Schwartz authored
      Introduce "db-functions-$VCS" which will eventually contain all
      VCS-specific code, and make this configurable in config.
      Move private arch_svn function and svn acl handling here, and introduce
      a new source_pkgbuild function to handle discovering PKGBUILDs from the
      configured VCS and sourcing them to extract metadata.
      The PKGBUILD is the only file we ever check out from version control,
      and only ever to scrape information from it, except for when we actually
      want to db-move a whole directory (which is by necessity considerably
      dependent on the VCS in use).
      source_pkgbuild is inspired by commits from the dbscripts rewrite,
      authored by Florian Pritz <bluewind@xinu.at>
    • Luke Shumaker's avatar
      test: checkPackageDB(): Resolve "FIXME: We guess the location of the PKGBUILD" · 971181bf
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      The problem statement:
        checkPackageDB and checkRemovedPackageDB need bit of information on the
        package they're checking: a full list of pkgnames with that pkgbase, the
        list of pkgarches, and (for checkPackageDB only) the full version.  In
        dbscripts itself, we can get that directly from the .db files; however,
        since the test suite is checking the ability of dbscripts to edit those
        .db files, that's obviously not a good solution.
        The current solution is to get this information from the PKGBUILD...
        which we also count on dbscripts to correctly keep track of.  Wait,
        that's skipping ahead, let's back up.
        The current solution is to get this information from the PKGBUILD.  For
        checkRemovedPackageDB, that's easy; we just get it from trunk, as that's
        the most up-to-date information on the package as-it-would-have-existed
        (if that sounded a little hand-wavey, it was).  But for checkPackageDB,
        it's a little trickier, because of 2 factors working together: (1) there
        might be different versions on different repos, and (2) unlike
        checkRemovedPackageDB, checkPackageDB actually cares about pkgver.  So,
        checkPackageDB "guesses" the location in a slightly sloppy way, and is
        tagged with a "FIXME".
      What todo about it?
        There are a couple of things to observe:
         - Hidden in the hand-waving in assuming that "trunk" is fine for
           checkRemovedPackageDB is the assumption that neither pkgname=() nor
           arch=() is going to change between versions.  Which is a fine
           assumption, because we don't change those things between versions in
           any of our test cases.
         - We're counting on dbscripts correctly keeping track of which PKGBUILD
           is correct for which repo... which is one of the thing's we're trying
           to test, we shouldn't be counting on it.  That's actually a bigger
           problem than the original "FIXME"!
        So, putting those things together, let's (1) take the code under test out
        of the equation, and (2) remove any suggestion that the version of the
        PKGBUILD makes a difference to pkgnames/pkgarches: Let's have both
        functions that that information from the PKGBUILDs under "fixtures/",
        rather than getting PKGBUILDs from VCS.
        That just leaves one question: How to get the correct pkgver in
        checkPackageDB?  The obvious answer is: Each test case knows what the
        version should be; add it as an argument, and adjust every testcase that
        calls it.
    • Luke Shumaker's avatar
      test: Don't use "! cmd" except as the last statement in a function · a75e4ee5
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      With BATS setting up error traps, we get used to writing simple `[[ foo ]]`
      assertions and not having to check the result.  However, using `!` to
      invert the result DOESN'T trigger the trap.  It works OK when it is the
      last command in a function, as it still affects the function's return
      value, so then the trap triggers in the caller (rather than in the
      function).  This means that a check may run successfully when it should
      So, replace all uses of bare `! cmd` with `if cmd; then return 1; fi`,
      unless it is the final statement in a function (as it is in
      The mistake meant that checkRemovedPackage() was effectively equivalent to
      checkRemovedPackageDB().  This meant that no one noticed that db-updates's
      "add package with inconsistent name fails" test called checkRemovedPackage
      instead of checkRemovedPackageDB.  Fixing the ! issue means that the test
      now fails, so change which function it calls.
    • Luke Shumaker's avatar
      test: db-move: Verify that it works on single-arch packages · e712811b
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
  6. 09 Sep, 2018 2 commits
    • Levente Polyak's avatar
      fix potential bsdtar stream close error by grep · 0b630e25
      Levente Polyak authored and Eli Schwartz's avatar Eli Schwartz committed
      This silences a useless error message that confuses the user.
      bsdtar doesn't like it when the stream gets closed before it finishes
      which may be the case when grep found its match on potentially huge
      archives. Instead of suppressing the whole stderr , we find all matches
      with grep, then use a second pass with `tail` to find only the last
      match, which ensures the stream remains open for bsdtar but we may still
      catch and see useful messages on stderr.
      This works because tail has the useful property of not closing early.
    • Levente Polyak's avatar
      readme: switch to travis-ci.com build status badge · 57a307d6
      Levente Polyak authored and Eli Schwartz's avatar Eli Schwartz committed
      The old travis-ci.org is deprecated and this project was migrated.
  7. 26 Aug, 2018 1 commit
  8. 04 Jul, 2018 1 commit
  9. 27 Jun, 2018 2 commits
  10. 19 Jun, 2018 1 commit
    • Eli Schwartz's avatar
      test: BUILDDIR must be owned by build user · 05dd9be0
      Eli Schwartz authored
      pacman 5.1 enforces this restriction. OTOH it is a simpler setup to set
      this as the user homedir directly in account creation (just like
      makechrootpkg has always done) than to create an additional,
      world-writable, directory.
      dockerfile: don't use tmpfs for /build
  11. 28 May, 2018 1 commit
  12. 08 Apr, 2018 4 commits
  13. 02 Apr, 2018 2 commits
  14. 21 Mar, 2018 2 commits
    • Luke Shumaker's avatar
      Clean up printf-formatters for user messages · 8cc8e9cb
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
       - db-functions: getpkgfile: The .sig file extension should be part of
         the filename parameter, not part of the message format string.
       - db-functions: arch_repo_modify: Shouldn't use ${action}
         string-interpolation in the message format string.  Since the
         entire message is a command, and we're using @Q to escape arguments
         anyway, go ahead and just construct the entire command as a single
         string that way, and feed it to '%s'.
    • Luke Shumaker's avatar
      Fixups near unquoted variables · 0432cffc
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      Using the following command to find unquoted variables (and ignoring
      more than a a few false positives),
          grep -Prn --exclude-dir=.git '(?<!["=]|\[\[ |\[\[ -[zn] )\$(?!{?#|\(|\? )'
      one is lead to find a few cleanups that are something other than "add
      double-quotes".  That's what these are.  We'll leave dumb adding of
      double-quotes for another commit.
      Most of these are still fixing quoting issues, just with a better fix.
       - parse_pkgbuilds.sh: Avoid having to escape quotes in `eval` strings
         by using `declare -p`. Updates the logic copied from makepkg, with the
         latest logic copied from makepkg. See
       - sourceballs: Avoid using ary=($string) to do field separation by
         using `read` and test that multiple licenses actually work as
       - sourceballs: Replace `[[ -z ${ary[*]} ]]` with test for the array
       - db-functions: Replace mangling echo field separators using sed, with
         printf formatters
       - db-functions: Replace for/echo loop to print an array line by line,
         with `printf '%s\n'`
       - db-functions: set_repo_permissions: Line up error messages, quote
       - db-move: Replace `$(echo ${array[@]})` with `${array[*]}`
       - testing2x: Use `"$@"` instead of `$*` when looping over an array
      Also, not really quoting related but on the same line as a quoting
      issue, optimize:
       - db-functions: Replace
      	[[ -n "$(... | sort | uniq -D)" ]]
      	! ... | awk 'a[$0]++{exit 1}'
  15. 20 Mar, 2018 5 commits
    • Luke Shumaker's avatar
      Remove uses of the "v=true; if $v ..." anti-pattern · 36087fbd
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      Instead, compare the value of $v to 'true'.
    • Luke Shumaker's avatar
      Don't use `grep -q` when operating on piped stdin · 23c2b82c
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      (By default, prefer `grep &>/dev/null`)
      `grep -q` may exit as soon as it finds a match; this is a good optimization
      for when the input is a file.  However, if the input is the output of
      another program, then that other program will receive SIGPIPE, and further
      writes will fail.  When this happens, it might (bsdtar does) print a
      message about a "write error" to stderr.  Which is going to confuse and
      alarm the user.
      In one of the cases (in common.bash, in the test suite), this had
      already been mitigated by wrapping bsdtar in "echo "$(bsdtar ...)", as
      Bash builtin echo doesn't complain if it gets SIGPIPE.  However, that
      means we're storing the entire output of bsdtar in memory, which is
      silly.  Additionally, the way it was implemented is also wrong;
      because it was being used with `grep -qv` instead of just `grep -q`,
      it *always* found a non-matching line (even something inconsequential
      like `%NAME%`), and *never* triggered a test failure.
      Looking at a few of these cases, it might also make sense to switch to
      using `bsdtar tf` instead of `bsdtar xf` when checking membership, but
      that's work for another day.
    • Luke Shumaker's avatar
      Add "#!/hint/bash" to the beginning of several files · 97e17a59
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      It is a method of notifying text-editors that a file is in Bash syntax
      without giving it a propper shebang (which would be confusing, as it
      would suggest that the file should be executable), as well as working
      across virtually all text-editors (unlike "-*- Mode: Bash -*-" or
    • Luke Shumaker's avatar
      Normalize to tab indent · 9672d6ec
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
    • Luke Shumaker's avatar
  16. 16 Mar, 2018 4 commits
    • Eli Schwartz's avatar
      fixup! Update messages to make fuller use of printf formatters · 5c867ea3
      Eli Schwartz authored
      pkgs should be passed as a single argument
    • Luke Shumaker's avatar
      test: Fixup glob matching · da49ea61
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
       - ftpdir-cleanup.bats: Glob expansion does not occur in [[ -f ]] tests.
         The [[ ! -f .../${pkgname}-*${PKGEXT} ]] checks were checking that there
         were no files containing a literal '*' for that part of their name.
         Obviously, this isn't what was intended.
       - sourceballs.bats: [ -r ] checks explode if the glob returns >1 file.
         Avoid using them if the path being checked contains a glob.
    • Luke Shumaker's avatar
      test: common.bash:__getCheckSum: Don't rely on IFS · 4ae3ea2f
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      I managed to stumble across a bug in BATS where the run() function
      screwed with the global IFS.  The bug has been fixed in git, but isn't
      in a release yet.
      Anyway, this bug breaks __getCheckSum().  Fortunately, we have avoided
      tripping it so far because luck has it that we never call
      __getCheckSum() after run() in the same test.
      So, there's nothing actually broken here, but it makes me nervous.  So
      go ahead and modify __getCheckSum to not rely on IFS.
      And, while we're at it: declare the result variable and set it as
      separate commands.  Doing both in the same command masks the exit code
      of the subshell expansion.  We don't explicitly check the exit code,
      but BATS runs the test suite with `set -e`, so splitting it does mean
      that BATS will now detect errors from sha1sum.  We don't really expect
      that to happen, but if BATS will give us error checking on it for
      free, why not?
    • Luke Shumaker's avatar
      Update messages to make fuller use of printf formatters · 33aae318
      Luke Shumaker authored and Eli Schwartz's avatar Eli Schwartz committed
      These are things that were (IMO) missed in 5afac1ed.  I found them using:
          git grep -E '(plain|msg|msg2|warning|error|die) "[^"]*\$'
      I went a little above-and-beyond for escaping strings for the error
      messages in db-functions' arch_repo_add and arch_repo_remove.  The
      code should explain itself, but I wanted to point it out, as it's more than
      the usual "slap %s in there, and move the ${...} to the right".