# ChangeLog for dev-perl/XML-XPath
# Copyright 1999-2016 Gentoo Foundation; Distributed under the GPL v2
# (auto-generated from git log)

*XML-XPath-1.130.0-r1 (09 Aug 2015)

  09 Aug 2015; Robin H. Johnson <robbat2@gentoo.org>
  +XML-XPath-1.130.0-r1.ebuild, +metadata.xml:
  proj/gentoo: Initial commit

  This commit represents a new era for Gentoo:
  Storing the gentoo-x86 tree in Git, as converted from CVS.

  This commit is the start of the NEW history.
  Any historical data is intended to be grafted onto this point.

  Creation process:
  1. Take final CVS checkout snapshot
  2. Remove ALL ChangeLog* files
  3. Transform all Manifests to thin
  4. Remove empty Manifests
  5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$
  5.1. Do not touch files with -kb/-ko keyword flags.

  Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
  X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration
  tests
  X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this
  project
  X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo
  developer, wrote Git features for the migration
  X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve
  cvs2svn
  X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts
  X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014
  work in migration
  X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging
  X-Thanks: All of other Gentoo developers - many ideas and lots of paint on
  the bikeshed

  24 Aug 2015; Justin Lecher <jlec@gentoo.org> metadata.xml:
  Use https by default

  Convert all URLs for sites supporting encrypted connections from http to
  https

  Signed-off-by: Justin Lecher <jlec@gentoo.org>

  24 Aug 2015; Mike Gilbert <floppym@gentoo.org> metadata.xml:
  Revert DOCTYPE SYSTEM https changes in metadata.xml

  repoman does not yet accept the https version.
  This partially reverts eaaface92ee81f30a6ac66fe7acbcc42c00dc450.

  Bug: https://bugs.gentoo.org/552720

  24 Jan 2016; Michał Górny <mgorny@gentoo.org> metadata.xml:
  Replace all herds with appropriate projects (GLEP 67)

  Replace all uses of herd with appropriate project maintainers, or no
  maintainers in case of herds requested to be disbanded.

  24 Jan 2016; Michał Górny <mgorny@gentoo.org> metadata.xml:
  Set appropriate maintainer types in metadata.xml (GLEP 67)

*XML-XPath-1.360.0 (29 Apr 2016)

  29 Apr 2016; Andreas K. Hüttel <dilfridge@gentoo.org>
  +XML-XPath-1.360.0.ebuild:
  Bump to version 1.360.0

  - EAPI6
  - Add USE="examples"
  - Cleaned up annoying tests

  Upstream:
  - /. and /.. selectors now work ( RT 30813 )
  - Duplicates now removed from search results. ( RT 6362 )
  - PrimaryExpr uses carp() instead of die() to give a stacktrace when parsing
  fails ( RT 32233 )
  - Avoid regex slowdown implied by $` by removing $` usage. ( RT 23924 )
  - Unabbreviated "axis" syntax of "attribute::id" now works as well as the
  equivalent "@id" does in setNodeText() ( RT 26143 )
  - "namespace_uri()" implemented to set and read namespace URIs ( RT 68703 )
  - substring matching functions in paths fixed ( RT 14957 )
  - findvalue() computations that would yield infinities/NAN now match Literal
  NaN and Infinitities ( RT 30818 )
  - creatingNode() using a namespaced path properly creates namespaced nodes (
  RT 80277 )
  - "<" in a query no longer acts like a "<=" query. ( RT 6363 )
  - XML::XPath::PerlSAX no longer fails to compile ( RT 111278 )
  - NodeSet's now implement a greater variety of comparison/casting overloads
  ( Github PR 2 )
  - position()=last() conditions now work ( RT 32012 )
  - createNode() now honors position() predicate ( RT 26144 )
  - using translate() in an XPath expression no longer warns ( RT 15902 )
  - translate() now removes characters as per XPath 1.0 Spec ( RT 21154 )
  - xpath script now defaults to UTF-8 for IO to support wide characters ( RT
  112017 )
  - Warnings about /d used in translate() represssed ( RT 112584 )
  - xpath script now has parameters parsed more obviously, and supports
  additional parameters
  - getAttributeNode() no longer relies on pre-perl-5.23.8 implicit return
  values from loops ( RT 113576 )

  Keywords:
  - New Dependency on Path-Tiny for tests
  - Dropped ~alpha ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~sparc

  Package-Manager: portage-2.2.28
  RepoMan-Options: --include-arches="alpha amd64 amd64-fbsd arm arm64 hppa
  ia64 m68k mips nios2 ppc ppc64 riscv s390 sh sparc sparc-fbsd x86 x86-fbsd"

*XML-XPath-1.370.0 (29 Sep 2016)

  29 Sep 2016; Andreas K. Hüttel <dilfridge@gentoo.org>
  +XML-XPath-1.370.0.ebuild:
  Version bump

  Package-Manager: portage-2.3.0

